diff --git a/readme.md b/readme.md index 5241d3c..e2c67d8 100644 --- a/readme.md +++ b/readme.md @@ -2,7 +2,7 @@ Workshop: https://steamcommunity.com/sharedfiles/filedetails/?id=1379304937 -#### Version: 2.7.1 +#### Version: 2.7.2 Adds a little bit more complex logic to ACE jamming effect. diff --git a/source/dzn_EJAM/Enums.hpp b/source/dzn_EJAM/Enums.hpp new file mode 100644 index 0000000..5779b58 --- /dev/null +++ b/source/dzn_EJAM/Enums.hpp @@ -0,0 +1,48 @@ +// --- Causes +#define CAUSE_FEED_FAILURE "feed_failure" +#define CAUSE_CHAMBER_FAILURE "chamber_failure" +#define CAUSE_DUD "dud" +#define CAUSE_EXTRACTION_FAILURE "fail_to_extract" +#define CAUSE_EJECTION_FAILURE "fail_to_eject" + +// --- States +#define STATE_BOLT_CLOSED "bolt_closed" +#define STATE_BOLT_NOT_CLOSED "bolt_not_closed" +#define STATE_BOLT_OPENED "bolt_opened" + +#define STATE_CHAMBER_EMPTY "chamber_empty" +#define STATE_CHAMBER_READY "chamber_ready" +#define STATE_CHAMBER_STUCK "chamber_stuck" +#define STATE_CHAMBER_DOUBLE_FED "chamber_double_fed" // Not used +#define STATE_CHAMBER_NOT_EXTRACTABLE "chamber_not_extracted" + +#define STATE_CASE_EJECTED "case_ejected" +#define STATE_CASE_NOT_EJECTED "case_not_ejected" + +#define STATE_MAG_ATTACHED "mag_attached" +#define STATE_MAG_DETACHED "mag_detached" + +// --- Actions +#define ACTION_PULL_BOLT "pull_bolt" +#define ACTION_OPEN_BOLT "open_bolt" +#define ACTION_CLEAR_CHAMBER "clear_chamber" +#define ACTION_REMOVE_CASE "remove_case" +#define ACTION_DETACH_MAG "detach_mag" +#define ACTION_ATTACH_MAG "attach_mag" +#define ACTION_INSPECT "inspect" + + +// --- Compares + +#define CHECK_BOLT_OPENED(X) (X isEqualTo STATE_BOLT_OPENED) +#define CHECK_BOLT_CLOSED(X) (X isEqualTo STATE_BOLT_CLOSED) + +#define CHECK_CHAMBER_READY(X) (X isEqualTo STATE_CHAMBER_READY) +#define CHECK_CHAMBER_EMPTY(X) (X isEqualTo STATE_CHAMBER_EMPTY) +#define CHECK_CHAMBER_STUCK(X) (X isEqualTo STATE_CHAMBER_STUCK) +#define CHECK_CHAMBER_DOUBLE_FED(X) (X isEqualTo STATE_CHAMBER_DOUBLE_FED) +#define CHECK_CHAMBER_NOT_EXTRACTED(X) (X isEqualTo STATE_CHAMBER_NOT_EXTRACTABLE) + +#define CHECK_CASE_EJECTED(X) (X isEqualTo STATE_CASE_EJECTED) + +#define CHECK_MAG_ATTACHED(X) (X isEqualTo STATE_MAG_ATTACHED) diff --git a/source/dzn_EJAM/Enums.sqf b/source/dzn_EJAM/Enums.sqf index 43d03da..491a9df 100644 --- a/source/dzn_EJAM/Enums.sqf +++ b/source/dzn_EJAM/Enums.sqf @@ -1,89 +1,97 @@ #include "macro.hpp" +#include "Enums.hpp" // Causes list in format: [ @ID, [@BoltState, @ChamberState, @CaseState, @MagState] ] GVAR(Causes) = [ [ /* "Неподача патрона" */ - /* To fix: "pull_bolt" */ - "feed_failure" - ,["bolt_closed","chamber_empty","case_ejected","mag_attached"] + /* To fix: ACTION_PULL_BOLT */ + CAUSE_FEED_FAILURE + ,[STATE_BOLT_CLOSED, STATE_CHAMBER_EMPTY, STATE_CASE_EJECTED, STATE_MAG_ATTACHED] ] ,[ /* "Утыкание патрона" */ - /* To fix: "open_bolt","detach_mag","clear_chamber" */ - "feed_failure_2" - ,["bolt_not_closed","chamber_stucked","case_ejected","mag_attached"] - + /* To fix: ACTION_OPEN_BOLT, ACTION_DETACH_MAG, ACTION_CLEAR_CHAMBER */ + CAUSE_CHAMBER_FAILURE + ,[STATE_BOLT_NOT_CLOSED, STATE_CHAMBER_STUCK, STATE_CASE_EJECTED, STATE_MAG_ATTACHED] + ] ,[ /* "Осечка" */ - /* To fix: "pull_bolt" */ - "dud" - ,["bolt_closed","chamber_ready","case_ejected","mag_attached"] + /* To fix: ACTION_PULL_BOLT */ + CAUSE_DUD + ,[STATE_BOLT_CLOSED, STATE_CHAMBER_READY, STATE_CASE_EJECTED, STATE_MAG_ATTACHED] ] ,[ /* "Неизвлечение гильзы" */ - /* To fix: "open_bolt","detach_mag","remove_case","clear_chamber" */ - "fail_to_extract" - ,["bolt_not_closed","chamber_not_extracted","case_not_ejected","mag_attached"] + /* To fix: ACTION_OPEN_BOLT, ACTION_DETACH_MAG, ACTION_CLEAR_CHAMBER */ + CAUSE_EXTRACTION_FAILURE + ,[STATE_BOLT_NOT_CLOSED, STATE_CHAMBER_NOT_EXTRACTABLE, STATE_CASE_EJECTED, STATE_MAG_ATTACHED] ] ,[ /* "Прихват гильзы" */ - /* To fix: "open_bolt","remove_case" */ - "fail_to_eject" - ,["bolt_not_closed","chamber_empty","case_not_ejected","mag_attached"] + /* To fix: ACTION_OPEN_BOLT, ACTION_REMOVE_CASE */ + CAUSE_EJECTION_FAILURE + ,[STATE_BOLT_NOT_CLOSED, STATE_CHAMBER_EMPTY, STATE_CASE_NOT_EJECTED, STATE_MAG_ATTACHED] ] ]; // , [ // /* Затяжной выстрел */ -// /* To fix: "pull_bolt" */ +// /* To fix: ACTION_PULL_BOLT */ // "hang_fire" -// , ["bolt_closed","chamber_ready","case_ejected","mag_attached"] +// , [STATE_BOLT_CLOSED,STATE_CHAMBER_READY,STATE_CASE_EJECTED,STATE_MAG_ATTACHED] // ] // , [ // /* Неконтролируемый автоматический огонь */ -// /* To fix: "detach_mag" or reload */ +// /* To fix: ACTION_DETACH_MAG or reload */ // "unmanned_fire" -// , ["bolt_closed","chamber_ready","case_ejected","mag_attached"] +// , [STATE_BOLT_CLOSED,STATE_CHAMBER_READY,STATE_CASE_EJECTED,STATE_MAG_ATTACHED] // ] // Weapon States; In format [@ID, @DisplayName] GVAR(States) = [ - ["bolt_closed" ,localize "STR_EJAM_State_BoltClosed"] - ,["bolt_not_closed" ,localize "STR_EJAM_State_BoltNotClosed"] - ,["bolt_opened" ,localize "STR_EJAM_State_BoltOpened"] - ,["chamber_empty" ,localize "STR_EJAM_State_ChamberEmpty"] - ,["chamber_ready" ,localize "STR_EJAM_State_ChamberReady"] - ,["chamber_stucked" ,localize "STR_EJAM_State_ChamberStucked"] - ,["chamber_not_extracted" ,localize "STR_EJAM_State_ChamberNotExtracted"] - ,["case_not_ejected" ,localize "STR_EJAM_State_ChamberNotEjected"] - ,["case_ejected" ,localize "STR_EJAM_State_CaseEjected"] - ,["mag_attached" ,localize "STR_EJAM_State_MagAttached"] - ,["mag_detached" ,localize "STR_EJAM_State_MagDetached"] + [STATE_BOLT_CLOSED, LSTR(State_BoltClosed)], + [STATE_BOLT_NOT_CLOSED, LSTR(State_BoltNotClosed)], + [STATE_BOLT_OPENED, LSTR(State_BoltOpened)], + [STATE_CHAMBER_EMPTY, LSTR(State_ChamberEmpty)], + [STATE_CHAMBER_READY, LSTR(State_ChamberReady)], + [STATE_CHAMBER_STUCK, LSTR(State_ChamberStucked)], + [STATE_CHAMBER_NOT_EXTRACTABLE, LSTR(State_ChamberNotExtracted)], + [STATE_CASE_EJECTED, LSTR(State_CaseEjected)], + [STATE_CASE_NOT_EJECTED, LSTR(State_ChamberNotEjected)], + [STATE_MAG_ATTACHED, LSTR(State_MagAttached)], + [STATE_MAG_DETACHED, LSTR(State_MagDetached)] ]; // Actions; In format [@ID, @DisplayName, @ProgressBarDisplayText, @TimeSpent] GVAR(FixActions) = [ - ["pull_bolt" ,localize "STR_EJAM_Action_PullBolt" , localize "STR_EJAM_Action_PullBolt_Process" , 0.5] - ,["open_bolt" ,localize "STR_EJAM_Action_OpenBolt" , localize "STR_EJAM_Action_OpenBolt_Process" , 0.5] - ,["clear_chamber" ,localize "STR_EJAM_Action_ClearChamber" , localize "STR_EJAM_Action_ClearChamber_Process" , 3] - ,["remove_case" ,localize "STR_EJAM_Action_RemoveCase" , localize "STR_EJAM_Action_RemoveCase_Process" , 1.5] - ,["detach_mag" ,localize "STR_EJAM_Action_MagDetach" , localize "STR_EJAM_Action_MagDetach_Process" , 0.3] - ,["attach_mag" ,localize "STR_EJAM_Action_MagAttach" , localize "STR_EJAM_Action_MagAttach_Process" , 0.75] - ,["inspect" ,localize "STR_EJAM_Action_Inspect" , localize "STR_EJAM_Action_Inspect_Process" , 0.5] + [ACTION_PULL_BOLT, + LSTR(Action_PullBolt), LSTR(Action_PullBolt_Process), 0.5], + [ACTION_OPEN_BOLT, + LSTR(Action_OpenBolt), LSTR(Action_OpenBolt_Process), 0.5], + [ACTION_CLEAR_CHAMBER, + LSTR(Action_ClearChamber), LSTR(Action_ClearChamber_Process), 3], + [ACTION_REMOVE_CASE, + LSTR(Action_RemoveCase), LSTR(Action_RemoveCase_Process), 1.5], + [ACTION_DETACH_MAG, + LSTR(Action_MagDetach), LSTR(Action_MagDetach_Process), 0.3], + [ACTION_ATTACH_MAG, + LSTR(Action_MagAttach), LSTR(Action_MagAttach_Process), 0.75], + [ACTION_INSPECT, + LSTR(Action_Inspect), LSTR(Action_Inspect_Process), 0.5] ]; GVAR(Defaults) = [ - "bolt_closed" - , "chamber_ready" - , "case_ejected" - , "mag_attached" + STATE_BOLT_CLOSED + , STATE_CHAMBER_READY + , STATE_CASE_EJECTED + , STATE_MAG_ATTACHED ]; GVAR(Mapping) = [ [ - "arifle_MX_F", 0.05, 45, 10, 45, 0, 0 + "arifle_MX_F", 0.01, 45, 10, 45, 0, 0 ] -]; \ No newline at end of file +]; diff --git a/source/dzn_EJAM/Functions.sqf b/source/dzn_EJAM/Functions.sqf deleted file mode 100644 index 40f2de5..0000000 --- a/source/dzn_EJAM/Functions.sqf +++ /dev/null @@ -1,36 +0,0 @@ -#include "macro.hpp" - -COMPILE_FUNCTION(fnc_initPlayer); -COMPILE_FUNCTION(fnc_firedEH); -COMPILE_FUNCTION(fnc_getMappingData); -COMPILE_FUNCTION(fnc_processMappingData); -COMPILE_FUNCTION(fnc_isInVehicleCrew); - -COMPILE_FUNCTION(fnc_checkJammed); -COMPILE_FUNCTION(fnc_setJammed); -COMPILE_FUNCTION(fnc_setUnjammed); - -COMPILE_FUNCTION(fnc_getJamCause); -COMPILE_FUNCTION(fnc_setWeaponState); -COMPILE_FUNCTION(fnc_getWeaponState); - -COMPILE_FUNCTION(fnc_inspectWeapon); -COMPILE_FUNCTION(fnc_doAction); -COMPILE_FUNCTION(fnc_doHotkeyAction); - -COMPILE_FUNCTION(fnc_pullBolt); -COMPILE_FUNCTION(fnc_manageMagazine); -COMPILE_FUNCTION(fnc_processWeaponFixed); -COMPILE_FUNCTION(fnc_isMagAttached); -COMPILE_FUNCTION(fnc_hasMagazine); - -COMPILE_FUNCTION(fnc_playActionSound); -COMPILE_FUNCTION(fnc_getEnumText); -COMPILE_FUNCTION(fnc_getClassFamily); - -COMPILE_FUNCTION(fnc_uiShowUnjamMenu); -COMPILE_FUNCTION(fnc_uiShowBriefState); -COMPILE_FUNCTION(fnc_uiShowProgressBar); -COMPILE_FUNCTION(fnc_uiShowConfig); - -GVAR(Configure) = { [] spawn GVAR(fnc_uiShowConfig); }; \ No newline at end of file diff --git a/source/dzn_EJAM/Init.sqf b/source/dzn_EJAM/Init.sqf deleted file mode 100644 index 2852907..0000000 --- a/source/dzn_EJAM/Init.sqf +++ /dev/null @@ -1,84 +0,0 @@ -#include "macro.hpp" - -call compile preprocessFileLineNumbers format ["%1\Enums.sqf", PATH]; -call compile preprocessFileLineNumbers format ["%1\Functions.sqf", PATH]; -call compile preprocessFileLineNumbers format ["%1\Settings.sqf", PATH]; - -// Exit at dedicated or headless client -if (!hasInterface) exitWith {}; - - - -// Init main -[] spawn { - waitUntil { !isNull player && local player }; // Handle 3DEN and/or specator - sleep 5; - - GVAR(ClassFamiliesCache) = call CBA_fnc_createNamespace; - GVAR(ConfigData) = call CBA_fnc_createNamespace; - GVAR(ACEUnjamFailChance) = 0.1; - - player addEventHandler ["Respawn", { - params ["_unit", "_corpse"]; - call GVAR(fnc_initPlayer); - }]; - - if (missionNamespace getVariable ["ace_overheating_enabled",false]) then { - // Wait ACE init - waitUntil { - !isNil "ace_overheating_cacheWeaponData" - && !isNil "ace_overheating_cacheSilencerData" - }; - - GVAR(ACEUnjamFailChance) = ace_overheating_unJamFailChance; - - // Update ACE Overheating data with custom mapping - call GVAR(fnc_processMappingData); - - // Run ACE Jammed handler if ACE Overheating enabled - GVAR(ACE_Jammed_EH) = [ - "ace_weaponJammed" - , { - if (_this select 1 != primaryWeapon player) exitWith {}; - call GVAR(fnc_setJammed); - } - ] call CBA_fnc_addEventHandler; - }; - - [] call GVAR(fnc_initPlayer); - - // Add ACE Self-Interecation action if ACE Interaction is running - if (!isNil "ace_interact_menu_fnc_createAction") exitWith { - GVAR(ACE_InspectActionClass) = [ - SVAR(ACE_Action_Inspect) - , LOCALIZE_FORMAT_STR("Action_Inspect") - , getText (configFile >> "CfgWeapons" >> primaryWeapon player >> "picture") - , { call GVAR(fnc_inspectWeapon) } - , { true } - ] call ace_interact_menu_fnc_createAction; - - [ - typeof player, 1 - , ["ACE_SelfActions", "ACE_Equipment"] - , GVAR(ACE_InspectActionClass) - ] call ace_interact_menu_fnc_addActionToClass; - - // Loop to handle gun icon change - GVAR(CurrentWeapon) = primaryWeapon player; - GVAR(UnjamChanceOverridePFH) = [{ - if (!alive player) exitWith {}; - - private _pw = primaryWeapon player; - if (_pw != "" && GVAR(CurrentWeapon) != _pw) then { - GVAR(CurrentWeapon) = _pw; - GVAR(ACE_InspectActionClass) set [2, getText(configFile >> "CfgWeapons" >> _pw >> "picture")]; - // Cache weapon family - _pw spawn GVAR(fnc_getClassFamily); - }; - - if (GVAR(Force)) then { - ace_overheating_unJamFailChance = [GVAR(ACEUnjamFailChance), 1] select (currentWeapon player == _pw); - }; - }] call CBA_fnc_addPerFrameHandler; - }; -}; diff --git a/source/dzn_EJAM/PostInit.sqf b/source/dzn_EJAM/PostInit.sqf new file mode 100644 index 0000000..4a5c828 --- /dev/null +++ b/source/dzn_EJAM/PostInit.sqf @@ -0,0 +1,63 @@ +#include "macro.hpp" + +// Init for script +#ifdef _SCRIPT_MACRO +call compile preprocessFileLineNumbers format ["%1\PreInit.sqf", PATH]; +#endif + +// Exit at dedicated or headless client +if (!hasInterface) exitWith {}; + +GVAR(ClassFamiliesCache) = call CBA_fnc_createNamespace; +GVAR(ConfigData) = call CBA_fnc_createNamespace; + +[{ time > 0 && !isNull player && local player },{ + // Run EJAM's FiredEH if ACE Overheating disabled OR EJAM Jam chance forced + if (!(missionNamespace getVariable ["ace_overheating_enabled",false]) || GVAR(ForceOverallChance)) then { + GVAR(FiredEH) = player addEventHandler ["Fired", { + [] call FUNC(firedEH) + }]; + }; + + // Reload EH to handle magazine state & pull bolt on reload + GVAR(ReloadedEH) = player addEventHandler ["Reloaded", { + [] call FUNC(reloadedEH) + }]; + + // Respawn EH to drop jammed state + GVAR(RespawnEH) = player addEventHandler ["Respawn", { + [] call FUNC(initPlayer); + }]; + + // Handle ACE Overheating if enabled + if (missionNamespace getVariable ["ace_overheating_enabled",false]) then { + // Wait ACE init + [{!isNil "ace_overheating_cacheWeaponData" && !isNil "ace_overheating_cacheSilencerData"},{ + // Save actual Unjam chance (to use for sidearms) + GVAR(ACEUnjamFailChance) = ace_overheating_unJamFailChance; + + // Update ACE Overheating data with custom mapping + [] call FUNC(processMappingData); + // Run ACE Jammed handler if ACE Overheating enabled + GVAR(ACE_Jammed_EH) = ["ace_weaponJammed", { + if (_this select 1 != primaryWeapon player) exitWith {}; + [false] call FUNC(setJammed); + }] call CBA_fnc_addEventHandler; + }] call CBA_fnc_waitUntilAndExecute; + }; + + [] call FUNC(initPlayer); + + // Add ACE Self-Interecation action if ACE Interaction is running + if (!isNil "ace_interact_menu_fnc_createAction") then { + [] call FUNC(addACEAction); + }; + + // CBA inventory action + [ + "#All","RIFLE", + LSTR(Action_Inspect), + [],"",{ true }, + { [] call FUNC(inspectWeapon); } + ] call CBA_fnc_addItemContextMenuOption; +}] call CBA_fnc_waitUntilAndExecute; diff --git a/source/dzn_EJAM/PreInit.sqf b/source/dzn_EJAM/PreInit.sqf new file mode 100644 index 0000000..eb6f501 --- /dev/null +++ b/source/dzn_EJAM/PreInit.sqf @@ -0,0 +1,6 @@ +#include "macro.hpp" + +#include "XEH_PREP.hpp" + +call compile preprocessFileLineNumbers format ["%1\Enums.sqf", PATH]; +call compile preprocessFileLineNumbers format ["%1\Settings.sqf", PATH]; diff --git a/source/dzn_EJAM/PreStart.sqf b/source/dzn_EJAM/PreStart.sqf new file mode 100644 index 0000000..a2db9f2 --- /dev/null +++ b/source/dzn_EJAM/PreStart.sqf @@ -0,0 +1,3 @@ +#include "macro.hpp" + +#include "XEH_PREP.hpp" diff --git a/source/dzn_EJAM/Settings.sqf b/source/dzn_EJAM/Settings.sqf index 58ba4d9..2770085 100644 --- a/source/dzn_EJAM/Settings.sqf +++ b/source/dzn_EJAM/Settings.sqf @@ -1,19 +1,20 @@ #include "macro.hpp" +#include "Enums.hpp" // Addon Settings private _add = { - params ["_var","_type","_val",["_exp", "No Expression"],["_subcat", ""],["_isGlobal", false]]; - + params ["_var","_type","_val",["_exp", "No Expression"],["_subcat", ""],["_isGlobal", false]]; + private _arr = [ FORMAT_VAR(_var) , _type - , [LOCALIZE_FORMAT_STR(_var), LOCALIZE_FORMAT_STR_desc(_var)] + , [LOCALIZE_FORMAT_STR(_var), LOCALIZE_FORMAT_STR_DESC(_var)] , if (_subcat == "") then { TITLE } else { [TITLE, _subcat] } , _val , _isGlobal ]; - + if !(typename _exp == "STRING" && { _exp == "No Expression" }) then { _arr pushBack _exp; }; _arr call CBA_Settings_fnc_init; }; @@ -27,14 +28,14 @@ private _addLocal = { [ "Force" , "CHECKBOX" - , true + , true ] call _add; // Option to force EJAM's Jam chance over ACE [ "ForceOverallChance" , "CHECKBOX" - , true + , true ] call _add; // Overall jam chance @@ -54,35 +55,35 @@ private _addLocal = { [ "feed_failure_ChanceSettings" , "SLIDER" - , [0, 100, 60, 0] + , [0, 100, 60, 0] , { /* Reset cache */ player setVariable [SVAR(FiredLastGunData), nil]; } ] call _add; [ "feed_failure_2_ChanceSettings" , "SLIDER" - , [0, 100, 20, 0] + , [0, 100, 20, 0] , { /* Reset cache */ player setVariable [SVAR(FiredLastGunData), nil]; } ] call _add; [ "dud_ChanceSettings" , "SLIDER" - , [0, 100, 60, 0] + , [0, 100, 60, 0] , { /* Reset cache */ player setVariable [SVAR(FiredLastGunData), nil]; } ] call _add; [ "fail_to_extract_ChanceSettings" , "SLIDER" - , [0, 100, 20, 0] + , [0, 100, 20, 0] , { /* Reset cache */ player setVariable [SVAR(FiredLastGunData), nil]; } ] call _add; [ "fail_to_eject_ChanceSettings" , "SLIDER" - , [0, 100, 20, 0] + , [0, 100, 20, 0] , { /* Reset cache */ player setVariable [SVAR(FiredLastGunData), nil]; } ] call _add; @@ -110,17 +111,32 @@ private _addLocal = { "MappingSettings" , "EDITBOX" , str(GVAR(Mapping)) select [1, count str(GVAR(Mapping)) -2] - , { + , { GVAR(Mapping) = call compile ("[" + _this + "]"); - call GVAR(fnc_processMappingData); + call FUNC(processMappingData); // Reset cache player setVariable [SVAR(FiredLastGunData), nil]; } ] call _add; +// Pull bolt on reload via Reload key or inventory +[ + "PullBoltOnReload" + , "CHECKBOX" + , true +] call _addLocal; + +// Allow full Inspect menu +[ + "AllowFullInspectMenu" + , "CHECKBOX" + , true +] call _add; + + // Keybinding -#define ALLOW_OVERRIDE !([] call GVAR(fnc_isInVehicleCrew)) +#define ALLOW_OVERRIDE !([] call FUNC(isInVehicleCrew)) private _addKey = { params["_var","_str","_downCode",["_defaultKey", nil],["_upCode", { false }]]; @@ -139,8 +155,8 @@ private _addKey = { // Inspect weapon key [ "InspectKey" - , "Action_Inspect" - , { call GVAR(fnc_inspectWeapon); ALLOW_OVERRIDE } + , "Action_Inspect_Menu" + , { [] call FUNC(inspectWeapon); ALLOW_OVERRIDE } , [19, [false,true,false]] , { true } ] call _addKey; @@ -148,45 +164,45 @@ private _addKey = { [ "QuickInspectKey" , "Action_QuickInspect" - , { "inspect" call GVAR(fnc_doHotkeyAction); ALLOW_OVERRIDE } + , { ACTION_INSPECT call FUNC(doHotkeyAction); ALLOW_OVERRIDE } ] call _addKey; // Pull bolt key [ "PullBoltKey" , "Action_PullBolt" - , { "pull_bolt" call GVAR(fnc_doHotkeyAction); ALLOW_OVERRIDE } + , { ACTION_PULL_BOLT call FUNC(doHotkeyAction); ALLOW_OVERRIDE } ] call _addKey; // Open bolt key [ "OpenBoltKey" , "Action_OpenBolt" - , { "open_bolt" call GVAR(fnc_doHotkeyAction); ALLOW_OVERRIDE } + , { ACTION_OPEN_BOLT call FUNC(doHotkeyAction); ALLOW_OVERRIDE } ] call _addKey; // Toggle magazine key [ "MagazineKey" , "Action_MagazineToggle" - , { - (call GVAR(fnc_getWeaponState)) params ["","","","_mag"]; - private _action = if (_mag == "mag_attached") then { "detach_mag" } else { "attach_mag" }; - _action call GVAR(fnc_doHotkeyAction); + , { + (call FUNC(getWeaponState)) params ["","","","_mag"]; + private _action = [ACTION_ATTACH_MAG, ACTION_DETACH_MAG] select (_mag == STATE_MAG_ATTACHED); + _action call FUNC(doHotkeyAction); ALLOW_OVERRIDE } ] call _addKey; -// Clear chamber key +// Clear chamber key [ "ClearChamnerKey" , "Action_ClearChamber" - , { "clear_chamber" call GVAR(fnc_doHotkeyAction); true } + , { ACTION_CLEAR_CHAMBER call FUNC(doHotkeyAction); true } ] call _addKey; // Remove case key [ "RemoveCaseKey" , "Action_RemoveCase" - , { "remove_case" call GVAR(fnc_doHotkeyAction); true } -] call _addKey; \ No newline at end of file + , { ACTION_REMOVE_CASE call FUNC(doHotkeyAction); true } +] call _addKey; diff --git a/source/dzn_EJAM/XEH_PREP.hpp b/source/dzn_EJAM/XEH_PREP.hpp new file mode 100644 index 0000000..1f5bace --- /dev/null +++ b/source/dzn_EJAM/XEH_PREP.hpp @@ -0,0 +1,41 @@ +#include "macro.hpp" + +PREP(main,fnc_initPlayer); +PREP(main,fnc_firedEH); +PREP(main,fnc_reloadedEH); + +PREP(main,fnc_getMappingData); +PREP(main,fnc_processMappingData); +PREP(main,fnc_getEnumText); +PREP(main,fnc_getClassFamily); +PREP(main,fnc_isInVehicleCrew); + +PREP(main,fnc_checkJammed); +PREP(main,fnc_getJamCause); + +PREP(main,fnc_setJammed); +PREP(main,fnc_setUnjammed); +PREP(main,fnc_processWeaponFixed); +PREP(main,fnc_wasteRound); + +PREP(main,fnc_setWeaponState); +PREP(main,fnc_getWeaponState); +PREP(main,fnc_calculateStateOnBoltOpen); +PREP(main,fnc_calculateStateOnBoltPull); +PREP(main,fnc_isMagAttached); +PREP(main,fnc_hasMagazine); + +PREP(interact,fnc_addACEAction); +PREP(interact,fnc_inspectWeapon); +PREP(interact,fnc_doAction); +PREP(interact,fnc_doHotkeyAction); +PREP(interact,fnc_playActionSound); +PREP(interact,fnc_operateBolt); +PREP(interact,fnc_manageMagazine); + +PREP(ui,fnc_uiShowUnjamMenu); +PREP(ui,fnc_uiShowBriefState); +PREP(ui,fnc_uiShowProgressBar); +PREP(ui,fnc_uiShowConfig); + +GVAR(Configure) = { [] spawn FUNC(uiShowConfig); }; diff --git a/source/dzn_EJAM/config.cpp b/source/dzn_EJAM/config.cpp index 4d2de91..c6d7e25 100644 --- a/source/dzn_EJAM/config.cpp +++ b/source/dzn_EJAM/config.cpp @@ -4,10 +4,10 @@ class CfgPatches { units[] = {"dzn_EJAM_RequireModule"}; weapons[] = {}; - requiredVersion = 0.1; + requiredVersion = 2.02; requiredAddons[] = {"CBA_MAIN"}; author = "10Dozen"; - version = "2.7.1"; + version = "2.7.2"; }; }; @@ -15,7 +15,14 @@ class Extended_PreInit_EventHandlers { class dzn_EJAM { - init = call compile preprocessFileLineNumbers "\dzn_EJAM\Init.sqf"; + init = call compile preprocessFileLineNumbers "\dzn_EJAM\PreInit.sqf"; + }; +}; +class Extended_PostInit_EventHandlers +{ + class dzn_EJAM + { + init = call compile preprocessFileLineNumbers "\dzn_EJAM\PostInit.sqf"; }; }; diff --git a/source/dzn_EJAM/functions/fnc_doHotkeyAction.sqf b/source/dzn_EJAM/functions/fnc_doHotkeyAction.sqf deleted file mode 100644 index aaa5506..0000000 --- a/source/dzn_EJAM/functions/fnc_doHotkeyAction.sqf +++ /dev/null @@ -1,42 +0,0 @@ -/* ---------------------------------------------------------------------------- -Function: dzn_EJAM_fnc_doHotkeyAction - -Description: - Process hotkey action init - -Parameters: - _actionName - action to perform - -Returns: - nothing - -Examples: - (begin example) - "pull_bolt" call dzn_EJAM_fnc_doHotkeyAction; - (end) - -Author: - 10Dozen ----------------------------------------------------------------------------- */ - -#include "..\macro.hpp" - -if !(isNil SVAR(ActionInProgress)) exitWith {}; -if ([] call GVAR(fnc_isInVehicleCrew)) exitWith {}; - -if !("inspect" call GVAR(fnc_checkJammed)) exitWith { - "OK" call GVAR(fnc_uiShowBriefState); -}; - -(call GVAR(fnc_getWeaponState)) params ["_bolt","_chamber","_case","_mag"]; -private _actionID = _this; - -if ( - (_actionID == "clear_chamber" && (_mag == "mag_attached" || _bolt in ["bolt_closed","bolt_not_closed"])) - || - (_actionID == "remove_case" && _bolt in ["bolt_closed","bolt_not_closed"]) -) exitWith { - "no_access" call GVAR(fnc_uiShowBriefState); -}; - -[_actionID, false] call GVAR(fnc_doAction); \ No newline at end of file diff --git a/source/dzn_EJAM/functions/fnc_pullBolt.sqf b/source/dzn_EJAM/functions/fnc_pullBolt.sqf deleted file mode 100644 index 76a32de..0000000 --- a/source/dzn_EJAM/functions/fnc_pullBolt.sqf +++ /dev/null @@ -1,64 +0,0 @@ -/* ---------------------------------------------------------------------------- -Function: dzn_EJAM_fnc_pullBolt - -Description: - Process bolt pulling action called from Weapon Malfunctions menu - -Parameters: - nothing - -Returns: - nothing - -Examples: - (begin example) - call dzn_EJAM_fnc_pullBolt; - (end) - -Author: - 10Dozen ----------------------------------------------------------------------------- */ - -#include "..\macro.hpp" - -#define REMOVE_ROUND if ((player getVariable SVAR(RemovedMagazine) select 1) > 0) then { player setVariable [SVAR(LooseRound), true]; } - -(call GVAR(fnc_getWeaponState)) params ["_bolt","_chamber","_case","_mag"]; - -private _hasAmmo = player ammo (currentWeapon player) > 0; - -if (_case == "case_not_ejected") then { - if (_mag == "mag_attached" && _hasAmmo) then { - ["bolt_not_closed","chamber_stucked",nil,nil] call GVAR(fnc_setWeaponState); - } else { - ["bolt_not_closed",nil,nil,nil] call GVAR(fnc_setWeaponState); - }; -} else { - if (_chamber == "chamber_stucked") then { - ["bolt_not_closed",nil,nil,nil] call GVAR(fnc_setWeaponState); - } else { - if (_chamber == "chamber_empty") then { - if (_mag == "mag_attached" && _hasAmmo) then { - ["bolt_closed","chamber_ready",nil,nil] call GVAR(fnc_setWeaponState); - } else { - ["bolt_closed",nil,nil,nil] call GVAR(fnc_setWeaponState); - }; - } else { - if (_chamber in ["chamber_not_extracted","chamber_ready"]) then { - if (_mag == "mag_attached" && _hasAmmo) then { - if (_bolt == "bolt_opened") then { - ["bolt_not_closed","chamber_stucked",nil,nil] call GVAR(fnc_setWeaponState); - } else { - if (_chamber == "chamber_ready") then { REMOVE_ROUND; }; - ["bolt_closed","chamber_ready",nil,nil] call GVAR(fnc_setWeaponState); - }; - } else { - if (_chamber == "chamber_ready") then { REMOVE_ROUND; }; - ["bolt_closed","chamber_empty",nil,nil] call GVAR(fnc_setWeaponState); - }; - }; - }; - }; -}; - -call GVAR(fnc_processWeaponFixed); \ No newline at end of file diff --git a/source/dzn_EJAM/functions/fnc_uiShowUnjamMenu.sqf b/source/dzn_EJAM/functions/fnc_uiShowUnjamMenu.sqf deleted file mode 100644 index 3817078..0000000 --- a/source/dzn_EJAM/functions/fnc_uiShowUnjamMenu.sqf +++ /dev/null @@ -1,144 +0,0 @@ -/* ---------------------------------------------------------------------------- -Function: dzn_EJAM_fnc_uiShowUnjamMenu - -Description: - Draw Unjam UI menu. - -Parameters: - nothing - -Returns: - nothing - -Examples: - (begin example) - [] spawn dzn_EJAM_fnc_uiShowUnjamMenu; - (end) - -Author: - 10Dozen ----------------------------------------------------------------------------- */ - -#include "..\macro.hpp" - -closeDialog 2; -hintSilent ""; -sleep 0.001; - -// ** -// Get weapon state -[ - nil, nil, nil - , if (call GVAR(fnc_isMagAttached)) then { "mag_attached" } else { "mag_detached" } -] call GVAR(fnc_setWeaponState); - -(call GVAR(fnc_getWeaponState)) params ["_bolt","_chamber","_case","_mag"]; - -// ** -// Prepare data -private _parseAndFormatLeft = { - parseText format ["%1", _this] -}; -private _parseAndFormatCenter = { - parseText format ["%1", _this] -}; - -private _titleText = (LOCALIZE_FORMAT_STR("Menu_Title")) call _parseAndFormatLeft; -private _closeBtnText = LOCALIZE_FORMAT_STR("Menu_Close"); - -private _gunText = (getText (configFile >> "CfgWeapons" >> primaryWeapon player >> "displayName")) call _parseAndFormatCenter; -private _img = parseText format [ - "" - , getText (configFile >> "CfgWeapons" >> primaryWeapon player >> "picture") -]; -private _boltText = [_bolt, "state"] call GVAR(fnc_getEnumText) call _parseAndFormatCenter; -private _chamberText = ([_chamber, "state"] call GVAR(fnc_getEnumText)) call _parseAndFormatCenter; -private _caseText = ([_case, "state"] call GVAR(fnc_getEnumText)) call _parseAndFormatCenter; -private _magText = ([_mag, "state"] call GVAR(fnc_getEnumText)) call _parseAndFormatCenter; - -private _pullBoltActionText = ["pull_bolt", "action"] call GVAR(fnc_getEnumText) call _parseAndFormatLeft; -private _clearChamberActionText = ["clear_chamber", "action"] call GVAR(fnc_getEnumText) call _parseAndFormatLeft; -private _openBoltActionText = ["open_bolt", "action"] call GVAR(fnc_getEnumText) call _parseAndFormatLeft; -private _clearCaseActionText = ["remove_case", "action"] call GVAR(fnc_getEnumText) call _parseAndFormatLeft; -private _magActionText = [ - if (_mag == "mag_attached") then { "detach_mag" } else { "attach_mag" } - , "action" -] call GVAR(fnc_getEnumText) call _parseAndFormatLeft; - - -// ** -// Show menu -createDialog "dzn_EJAM_Menu_Group"; - -private _display = (findDisplay 134802); -#define GET_CTRL(X) (_display displayCtrl X) - -// --- Title and Image -GET_CTRL(6002) ctrlSetStructuredText _titleText; -GET_CTRL(6003) ctrlSetText _closeBtnText; - -GET_CTRL(6010) ctrlSetStructuredText _img; -GET_CTRL(6011) ctrlSetStructuredText _gunText; - -// --- State labels -GET_CTRL(6012) ctrlSetStructuredText _boltText; -GET_CTRL(6013) ctrlSetStructuredText _chamberText; -GET_CTRL(6014) ctrlSetStructuredText _magText; -GET_CTRL(6015) ctrlSetStructuredText _caseText; - -// --- Buttons -GET_CTRL(6020) ctrlSetStructuredText _pullBoltActionText; -GET_CTRL(6021) ctrlSetStructuredText _clearChamberActionText; -GET_CTRL(6022) ctrlSetStructuredText _magActionText; -GET_CTRL(6023) ctrlSetStructuredText _openBoltActionText; -GET_CTRL(6024) ctrlSetStructuredText _clearCaseActionText; - -// --- Set button states & onclick -private _generateActionCode = { - compile format ["closeDialog 2; ""%1"" spawn %2", _this, SVAR(fnc_doAction)] -}; -private _isActive = false; - -// --- --- Close -GET_CTRL(6003) ctrlAddEventHandler ["ButtonClick", { closeDialog 2; }]; - -// --- --- Bolt pull -GET_CTRL(6020) ctrlAddEventHandler ["ButtonClick", "pull_bolt" call _generateActionCode]; -GET_CTRL(6020) ctrlSetFont "PuristaLight"; - -// --- --- Bolt open -if (_bolt != "bolt_opened") then { - _isActive = true; - GET_CTRL(6023) ctrlAddEventHandler ["ButtonClick", "open_bolt" call _generateActionCode]; -} else { - _isActive = false; -}; - -GET_CTRL(6023) ctrlEnable _isActive; - -// --- --- Chamber -if (_bolt == "bolt_opened" && _mag == "mag_detached" && _chamber == "chamber_stucked" && _case == "case_ejected") then { - _isActive = true; - GET_CTRL(6021) ctrlAddEventHandler ["ButtonClick", "clear_chamber" call _generateActionCode]; -} else { - _isActive = false; -}; - -GET_CTRL(6021) ctrlEnable _isActive; - -// --- --- Case -if (_bolt == "bolt_opened" && _case == "case_not_ejected") then { - _isActive = true; - GET_CTRL(6024) ctrlAddEventHandler ["ButtonClick", "remove_case" call _generateActionCode]; -} else { - _isActive = false; -}; - -GET_CTRL(6024) ctrlEnable _isActive; - -// --- --- Magazine detach -if (_mag == "mag_attached") then { - GET_CTRL(6022) ctrlAddEventHandler ["ButtonClick", "detach_mag" call _generateActionCode]; -} else { - GET_CTRL(6022) ctrlAddEventHandler ["ButtonClick", "attach_mag" call _generateActionCode]; -}; \ No newline at end of file diff --git a/source/dzn_EJAM/functions/interact/fnc_addACEAction.sqf b/source/dzn_EJAM/functions/interact/fnc_addACEAction.sqf new file mode 100644 index 0000000..81a1766 --- /dev/null +++ b/source/dzn_EJAM/functions/interact/fnc_addACEAction.sqf @@ -0,0 +1,61 @@ +/* ---------------------------------------------------------------------------- +Function: dzn_EJAM_fnc_addACEAction + +Description: + Adds ACE Equipment action for Inspect menu. + +Parameters: + none + +Returns: + nothing + +Examples: + (begin example) + [] call dzn_EJAM_fnc_addACEAction; + (end) + +Author: + 10Dozen +---------------------------------------------------------------------------- */ + +#include "..\script_macro.hpp" + +GVAR(ACE_InspectActionClass) = [ + SVAR(ACE_Action_Inspect) + , LOCALIZE_FORMAT_STR("Action_Inspect") + , getText (configFile >> "CfgWeapons" >> primaryWeapon player >> "picture") + , { [] call FUNC(inspectWeapon) } + , { private _pw = primaryWeapon player; _pw isNotEqualTo "" && currentWeapon player == _pw } +] call ace_interact_menu_fnc_createAction; + +[ + typeof player, 1 + , ["ACE_SelfActions", "ACE_Equipment"] + , GVAR(ACE_InspectActionClass) +] call ace_interact_menu_fnc_addActionToClass; + +// Loop to handle gun icon change & unjam chance +GVAR(CurrentPrimaryWeapon) = primaryWeapon player; +GVAR(ACE_Weapon_EH) = ["weapon", { + params ["", "_newWeapon", ""]; + private _pw = primaryWeapon player; + + // Update ACE Action's icon & cache weapon family + // if new weapon is primary and different from previous one + if ( + _newWeapon isNotEqualTo "" + && _newWeapon isEqualTo _pw + && { _newWeapon isNotEqualTo GVAR(CurrentPrimaryWeapon) } + ) then { + GVAR(CurrentPrimaryWeapon) = _pw; + GVAR(ACE_InspectActionClass) set [2, getText(configFile >> "CfgWeapons" >> _pw >> "picture")]; + + // Cache weapon family + _pw spawn FUNC(getClassFamily); + }; + + if (GVAR(Force) && !isNil SVAR(ACEUnjamFailChance)) then { + ace_overheating_unJamFailChance = [GVAR(ACEUnjamFailChance), 1] select (_newWeapon isEqualTo _pw); + }; +}, true] call CBA_fnc_addPlayerEventHandler; diff --git a/source/dzn_EJAM/functions/fnc_doAction.sqf b/source/dzn_EJAM/functions/interact/fnc_doAction.sqf similarity index 52% rename from source/dzn_EJAM/functions/fnc_doAction.sqf rename to source/dzn_EJAM/functions/interact/fnc_doAction.sqf index 6c8fe62..3eec663 100644 --- a/source/dzn_EJAM/functions/fnc_doAction.sqf +++ b/source/dzn_EJAM/functions/interact/fnc_doAction.sqf @@ -12,82 +12,86 @@ Returns: Examples: (begin example) - "pull_bolt" call dzn_EJAM_fnc_doAction; + ACTION_PULL_BOLT call dzn_EJAM_fnc_doAction; (end) Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" params ["_actionID", ["_isMenuAction", true]]; GVAR(ActionInProgress) = true; // Update magazine state -[nil, nil, nil, if (call GVAR(fnc_isMagAttached)) then { "mag_attached" } else { "mag_detached" }] call GVAR(fnc_setWeaponState); +// [nil, nil, nil, if (call FUNC(isMagAttached)) then { STATE_MAG_ATTACHED } else { STATE_MAG_DETACHED }] call FUNC(setWeaponState); -#define REMOVE_ROUND if ((player getVariable SVAR(RemovedMagazine) select 1) > 0) then { player setVariable [SVAR(LooseRound), true]; } -#define SHOW_MENU if (_args) then { call GVAR(fnc_inspectWeapon) } else { "state" call GVAR(fnc_uiShowBriefState) } +#define SHOW_MENU if (_args) then { [] call FUNC(inspectWeapon) } else { "state" call FUNC(uiShowBriefState) } #define FINISH_ACTION GVAR(ActionInProgress) = nil #define PLAY_ANIMATION if (stance player != "PRONE" && vehicle player == player) then { player playActionNow "DismountOptic"; } -private _title = [_actionID, "process"] call GVAR(fnc_getEnumText); +private _title = [_actionID, "process"] call FUNC(getEnumText); private _args = _isMenuAction; -private _time = [_actionID, "time"] call GVAR(fnc_getEnumText);; +private _time = [_actionID, "time"] call FUNC(getEnumText); private _code = {}; +private _onAbort = {}; private _needExecute = true; private _needSound = true; switch (_actionID) do { - case "pull_bolt": { + case ACTION_PULL_BOLT: { _code = { - call GVAR(fnc_pullBolt); + ["pull"] call FUNC(operateBolt); SHOW_MENU; FINISH_ACTION; }; }; - case "open_bolt": { + case ACTION_OPEN_BOLT: { _code = { - ["bolt_opened",nil,nil,nil] call GVAR(fnc_setWeaponState); + ["open"] call FUNC(operateBolt); SHOW_MENU; FINISH_ACTION; }; }; - case "clear_chamber": { + case ACTION_CLEAR_CHAMBER: { PLAY_ANIMATION; _code = { - REMOVE_ROUND; - [nil,"chamber_empty",nil,nil] call GVAR(fnc_setWeaponState); + [nil,STATE_CHAMBER_EMPTY,nil,nil] call FUNC(setWeaponState); SHOW_MENU; FINISH_ACTION; }; }; - case "remove_case": { + case ACTION_REMOVE_CASE: { PLAY_ANIMATION; _code = { - [nil,nil,"case_ejected",nil] call GVAR(fnc_setWeaponState); + [nil,nil,STATE_CASE_EJECTED,nil] call FUNC(setWeaponState); SHOW_MENU; FINISH_ACTION; }; }; - case "detach_mag": { + case ACTION_DETACH_MAG: { if ((primaryWeaponMagazine player) isEqualTo []) exitWith { FINISH_ACTION; _needExecute = false; }; - + _code = { - true call GVAR(fnc_manageMagazine); - [nil, nil, nil, if (call GVAR(fnc_isMagAttached)) then { "mag_attached" } else { "mag_detached" }] call GVAR(fnc_setWeaponState); + true call FUNC(manageMagazine); + [ + nil, + nil, + nil, + [STATE_MAG_DETACHED, STATE_MAG_ATTACHED] select (call FUNC(isMagAttached)) + ] call FUNC(setWeaponState); SHOW_MENU; FINISH_ACTION; }; }; - case "attach_mag": { - if !(call GVAR(fnc_hasMagazine)) exitWith { + case ACTION_ATTACH_MAG: { + if !(call FUNC(hasMagazine)) exitWith { FINISH_ACTION; private _msg = [LOCALIZE_FORMAT_STR("Hint_NoMag"),1.5]; if (isNil "ace_common_fnc_displayTextStructured") then { @@ -100,15 +104,27 @@ switch (_actionID) do { }; _code = { - false call GVAR(fnc_manageMagazine); - [nil, nil, nil, if (call GVAR(fnc_isMagAttached)) then { "mag_attached" } else { "mag_detached" }] call GVAR(fnc_setWeaponState); + GVAR(MagLoading) = true; + false call FUNC(manageMagazine); + [ + nil, + nil, + nil, + [STATE_MAG_DETACHED, STATE_MAG_ATTACHED] select (call FUNC(isMagAttached)) + ] call FUNC(setWeaponState); SHOW_MENU; FINISH_ACTION; + + [{ GVAR(MagLoading) = nil; }] call CBA_fnc_execNextFrame; + }; + _onAbort = { + GVAR(MagLoading) = nil; }; }; - case "inspect": { + case ACTION_INSPECT: { + player playActionNow "Gear"; _code = { - "state" call GVAR(fnc_uiShowBriefState); + "state" call FUNC(uiShowBriefState); FINISH_ACTION; }; _needSound = false; @@ -117,16 +133,17 @@ switch (_actionID) do { if !(_needExecute) exitWith {}; + if (isNil "ace_common_fnc_progressBar") then { // No ACE: use custom progress bar - [_time, _title, _code, _args] call GVAR(fnc_uiShowProgressBar); + [_time, _title, _code, _onAbort, _args] call FUNC(uiShowProgressBar); } else { // ACE detected: use ace progress bar - [_time, _args, _code, {}, _title, {true}, ["isNotInside", "isNotSwimming", "isNotSitting"]] call ace_common_fnc_progressBar; + [_time, _args, _code, _onAbort, _title, {true}, ["isNotInside", "isNotSwimming", "isNotSitting"]] call ace_common_fnc_progressBar; }; if (_needSound) then { - _actionID call GVAR(fnc_playActionSound); -}; \ No newline at end of file + _actionID call FUNC(playActionSound); +}; diff --git a/source/dzn_EJAM/functions/interact/fnc_doHotkeyAction.sqf b/source/dzn_EJAM/functions/interact/fnc_doHotkeyAction.sqf new file mode 100644 index 0000000..7d35b6b --- /dev/null +++ b/source/dzn_EJAM/functions/interact/fnc_doHotkeyAction.sqf @@ -0,0 +1,43 @@ +/* ---------------------------------------------------------------------------- +Function: dzn_EJAM_fnc_doHotkeyAction + +Description: + Process hotkey action init + +Parameters: + _actionName - action to perform + +Returns: + nothing + +Examples: + (begin example) + ACTION_PULL_BOLT call dzn_EJAM_fnc_doHotkeyAction; + (end) + +Author: + 10Dozen +---------------------------------------------------------------------------- */ + +#include "..\script_macro.hpp" + +if !(isNil SVAR(ActionInProgress)) exitWith {}; +if ([] call FUNC(isInVehicleCrew)) exitWith {}; + +if !("inspect" call FUNC(checkJammed)) exitWith { + "OK" call FUNC(uiShowBriefState); +}; + +(call FUNC(getWeaponState)) params ["_bolt","_chamber","_case","_mag"]; +private _actionID = _this; + +// --- Prevent actions inside gun if no access (bolt closed/blocked by magazine) +if ( + (_actionID == ACTION_CLEAR_CHAMBER && (CHECK_MAG_ATTACHED(_mag) || not CHECK_BOLT_OPENED(_bolt))) + || + (_actionID == ACTION_REMOVE_CASE && not CHECK_BOLT_OPENED(_bolt)) +) exitWith { + "no_access" call FUNC(uiShowBriefState); +}; + +[_actionID, false] call FUNC(doAction); diff --git a/source/dzn_EJAM/functions/fnc_inspectWeapon.sqf b/source/dzn_EJAM/functions/interact/fnc_inspectWeapon.sqf similarity index 51% rename from source/dzn_EJAM/functions/fnc_inspectWeapon.sqf rename to source/dzn_EJAM/functions/interact/fnc_inspectWeapon.sqf index 6dbe879..3b43bc3 100644 --- a/source/dzn_EJAM/functions/fnc_inspectWeapon.sqf +++ b/source/dzn_EJAM/functions/interact/fnc_inspectWeapon.sqf @@ -19,14 +19,17 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" - -if ("inspect" call GVAR(fnc_checkJammed)) then { - [] spawn GVAR(fnc_uiShowUnjamMenu); -} else { - hint parseText format [ - "%1
" - , LOCALIZE_FORMAT_STR("Hint_WeaponOK") - , getText (configFile >> "CfgWeapons" >> primaryWeapon player >> "picture") - ]; -}; \ No newline at end of file +#include "..\script_macro.hpp" + +// --- Show OK hint if not jammed +if !("inspect" call FUNC(checkJammed)) exitWith { + "OK" call FUNC(uiShowBriefState); +}; + +// --- Show Full Inspect menu if option selected in settings +if (GVAR(AllowFullInspectMenu)) exitWith { + [] spawn FUNC(uiShowUnjamMenu); +}; + +// --- Show Quick Inspect menu otherwise +[ACTION_INSPECT, false] call FUNC(doAction); diff --git a/source/dzn_EJAM/functions/fnc_manageMagazine.sqf b/source/dzn_EJAM/functions/interact/fnc_manageMagazine.sqf similarity index 58% rename from source/dzn_EJAM/functions/fnc_manageMagazine.sqf rename to source/dzn_EJAM/functions/interact/fnc_manageMagazine.sqf index 767c4e8..b606389 100644 --- a/source/dzn_EJAM/functions/fnc_manageMagazine.sqf +++ b/source/dzn_EJAM/functions/interact/fnc_manageMagazine.sqf @@ -4,7 +4,7 @@ Function: dzn_EJAM_fnc_manageMagazine Description: Process magazine detach/attach action called from Weapon Malfunction menu. If appropriate setting is turned on - detached magazine will be dropped in front of player, - + Parameters: _needRemove - Should magazine be detached (true) or attached (false) from weapon @@ -20,7 +20,7 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" private _needRemove = _this; private _gun = primaryWeapon player; @@ -28,33 +28,54 @@ private _msg = []; if (_needRemove) then { private _allMags = magazinesAmmo player; - private _gunMagClass = (primaryWeaponMagazine player) select 0; + private _gunMagClass = (primaryWeaponMagazine player) # 0; private _gunMagAmmo = player ammo _gun; + // --- Save magazine type as preffered for selection on attach action + player setVariable [SVAR(DetachedMagazine), _gunMagClass]; + + // --- Remove magazine from weapon & add to inventory player removePrimaryWeaponItem _gunMagClass; player addMagazine [_gunMagClass, _gunMagAmmo]; + // If no room for magazine - drop it if ((magazinesAmmo player) isEqualTo _allMags) then { - private _holder = createVehicle ["WeaponHolderSimulated",player modelToWorld [0,0.75,0], [],0,"CAN_COLLIDE"]; + private _holder = createVehicle ["WeaponHolderSimulated",player modelToWorld [0,0.75,0],[],0,"CAN_COLLIDE"]; _holder addMagazineAmmoCargo [_gunMagClass, 1, _gunMagAmmo]; - "drop_mag" call GVAR(fnc_playActionSound); + "drop_mag" call FUNC(playActionSound); _msg = [LOCALIZE_FORMAT_STR("Hint_MagDropped"), 1.5]; }; } else { - private _weaponMags = (getArray (configFile >> "CfgWeapons" >> _gun >> "magazines")) apply { toLower(_x) }; private _mag = []; - { - if (toLower(_x select 0) in _weaponMags) exitWith { _mag = _x; }; - } forEach (magazinesAmmo player); + private _weaponMags = ([_gun] call CBA_fnc_compatibleMagazines) apply { toLower(_x) }; + + (player getVariable [SVAR(DetachedMagazine), ""]) params ["_preferredMagType"]; + + private _availableMags = (magazinesAmmo player) select { toLower(_x # 0) in _weaponMags }; + + if (_preferredMagType isNotEqualTo "") then { + // --- Get only mags of preffered type + private _filteredMags = _availableMags select { (_x # 0) isEqualTo _preferredMagType }; + if (_filteredMags isEqualTo []) exitWith {}; + + _mag = _filteredMags # 0; + }; + + if (_mag isEqualTo []) then { + // --- Pick any compatible magazine, if no prefered found + _mag = _availableMags # 0; + }; if (_mag isEqualTo []) then { - _msg = [LOCALIZE_FORMAT_STR("Hint_NoMag"),1.5]; + _msg = [LOCALIZE_FORMAT_STR("Hint_NoMag"),1.5]; } else { player addPrimaryWeaponItem (_mag select 0); player setAmmo [primaryWeapon player, (_mag select 1)]; player removeMagazine (_mag select 0); + player setVariable [SVAR(DetachedMagazine), nil]; + _msg = [LOCALIZE_FORMAT_STR("Hint_MagAttached"),1.5] }; }; @@ -65,4 +86,4 @@ if (isNil "ace_common_fnc_displayTextStructured") then { hint parseText (_msg select 0); } else { _msg call ace_common_fnc_displayTextStructured; -}; \ No newline at end of file +}; diff --git a/source/dzn_EJAM/functions/interact/fnc_operateBolt.sqf b/source/dzn_EJAM/functions/interact/fnc_operateBolt.sqf new file mode 100644 index 0000000..c5d8c77 --- /dev/null +++ b/source/dzn_EJAM/functions/interact/fnc_operateBolt.sqf @@ -0,0 +1,52 @@ +/* ---------------------------------------------------------------------------- +Function: dzn_EJAM_fnc_operateBolt + +Description: + Process bolt operations (pull or open) action called from Weapon Malfunctions + menu or hotkey. + +Parameters: + _mode - operation name: "pull", "open". Optional, default: "pull" + +Returns: + nothing + +Examples: + (begin example) + ["pull"] call dzn_EJAM_fnc_operateBolt; // Pulls the bolt and + //set new state for weapon + (end) + +Author: + 10Dozen +---------------------------------------------------------------------------- */ + +#include "..\script_macro.hpp" + +params [["_mode", "pull"], ["_params", []]]; + +private _newState = nil; +private _checkToBeFixed = false; + +switch toUpper _mode do { + case "PULL": { + _newState = [] call FUNC(calculateStateOnBoltPull); + _checkToBeFixed = true; + }; + case "OPEN": { + _newState = [] call FUNC(calculateStateOnBoltOpen); + }; +}; + +// Set new weapon state +_newState params ["_boltNewState","_chamberNewState","_roundWasted"]; +[_boltNewState,_chamberNewState,nil,nil] call FUNC(setWeaponState); + +if (_roundWasted) then { + [] call FUNC(wasteRound); +}; + +if !_checkToBeFixed exitWith {}; + +// Check for exit Jammed state +call FUNC(processWeaponFixed); diff --git a/source/dzn_EJAM/functions/fnc_playActionSound.sqf b/source/dzn_EJAM/functions/interact/fnc_playActionSound.sqf similarity index 89% rename from source/dzn_EJAM/functions/fnc_playActionSound.sqf rename to source/dzn_EJAM/functions/interact/fnc_playActionSound.sqf index 698e850..b0a90c7 100644 --- a/source/dzn_EJAM/functions/fnc_playActionSound.sqf +++ b/source/dzn_EJAM/functions/interact/fnc_playActionSound.sqf @@ -12,7 +12,7 @@ Returns: Examples: (begin example) - "pull_bolt" call dzn_EJAM_fnc_playActionSound; + ACTION_PULL_BOLT call dzn_EJAM_fnc_playActionSound; (end) Author: diff --git a/source/dzn_EJAM/functions/main/fnc_calculateStateOnBoltOpen.sqf b/source/dzn_EJAM/functions/main/fnc_calculateStateOnBoltOpen.sqf new file mode 100644 index 0000000..5581b54 --- /dev/null +++ b/source/dzn_EJAM/functions/main/fnc_calculateStateOnBoltOpen.sqf @@ -0,0 +1,39 @@ +/* ---------------------------------------------------------------------------- +Function: dzn_EJAM_fnc_calculateStateOnBoltOpen + +Description: + Calculates weapon state after opening the bolt. + +Parameters: + nothing + +Returns: + _boltState - new bolt state (string) + _chamberState - new chamber state (string) + _roundWasted - flags that round was removed from the weapon + +Examples: + (begin example) + [] call dzn_EJAM_fnc_calculateStateOnBoltOpen; + (end) + +Author: + 10Dozen +---------------------------------------------------------------------------- */ + + +#include "..\script_macro.hpp" + +(call FUNC(getWeaponState)) params ["_bolt","_chamber","_case","_mag"]; + +if (CHECK_BOLT_OPENED(_bolt)) exitWith { + // Something gone wrong and bolt already opened... + [nil, nil] +}; + +// Case D2 & D5: Extract round if bolt closed & round chambered (e.g. dud) +if (CHECK_BOLT_CLOSED(_bolt) && CHECK_CHAMBER_READY(_chamber)) exitWith { + [STATE_BOLT_OPENED, STATE_CHAMBER_EMPTY, true] +}; + +[STATE_BOLT_OPENED, _chamber, false] diff --git a/source/dzn_EJAM/functions/main/fnc_calculateStateOnBoltPull.sqf b/source/dzn_EJAM/functions/main/fnc_calculateStateOnBoltPull.sqf new file mode 100644 index 0000000..708ee23 --- /dev/null +++ b/source/dzn_EJAM/functions/main/fnc_calculateStateOnBoltPull.sqf @@ -0,0 +1,93 @@ +/* ---------------------------------------------------------------------------- +Function: dzn_EJAM_fnc_calculateStateOnBoltPull + +Description: + Calculates weapon state after pulling the bolt. + +Parameters: + nothing + +Returns: + _boltState - new bolt state (string) + _chamberState - new chamber state (string) + _roundWasted - was round lost after pulling the bold (bool) + +Examples: + (begin example) + [] call dzn_EJAM_fnc_calculateStateOnBoltPull; + (end) + +Author: + 10Dozen +---------------------------------------------------------------------------- */ + +#include "..\script_macro.hpp" + +(call FUNC(getWeaponState)) params ["_bolt","_chamber","_case","_mag"]; + +private _hasMagWithAmmo = _mag isEqualTo STATE_MAG_ATTACHED && player ammo (currentWeapon player) > 0; +private _newState = []; + +if (_case == STATE_CASE_NOT_EJECTED) exitWith { + // Initial state: Bolt is not closed + if (_hasMagWithAmmo) exitWith { + // New round picked, but failed to chamber + [STATE_BOLT_NOT_CLOSED, STATE_CHAMBER_STUCK, true] + }; + + // No change + [STATE_BOLT_NOT_CLOSED, nil, false] +}; + +if (_chamber == STATE_CHAMBER_EMPTY) exitWith { + // Initial state: Bolt is closed + if (_hasMagWithAmmo) exitWith { + // Loads new shootable round + [STATE_BOLT_CLOSED, STATE_CHAMBER_READY, false] + }; + + // No change + [STATE_BOLT_CLOSED, nil, false] +}; + +if (_chamber == STATE_CHAMBER_READY) exitWith { + // Initial state: Bolt is closed + if (_hasMagWithAmmo) exitWith { + if (_bolt == STATE_BOLT_CLOSED) exitWith { + // Extract loaded round, load new one + [STATE_BOLT_CLOSED, STATE_CHAMBER_READY, true] + }; + + // Shouldn't be reachable (open bolt + chambered live round) + // but if happened - double feed occured + [STATE_BOLT_NOT_CLOSED, STATE_CHAMBER_STUCK, true] + }; + + // Extract normal round + [STATE_BOLT_CLOSED, STATE_CHAMBER_EMPTY, true] +}; + +if (_chamber == STATE_CHAMBER_STUCK) exitWith { + // Initial state: Bolt is not closed + if (_hasMagWithAmmo) exitWith { + // Sort of Double feed, but no round lost to prevent emptying mag =) + [STATE_BOLT_NOT_CLOSED, STATE_CHAMBER_STUCK, false] + }; + + // No changes + [STATE_BOLT_NOT_CLOSED, nil, false] +}; + +if (_chamber == STATE_CHAMBER_NOT_EXTRACTABLE) exitWith { + // Initial state: Bolt is not closed + if (_hasMagWithAmmo) exitWith { + // Sort of double feed + [STATE_BOLT_NOT_CLOSED, STATE_CHAMBER_STUCK, true] + }; + + // No changes + [STATE_BOLT_NOT_CLOSED, nil, false] +}; + +// Default - no change +[nil, nil, false] diff --git a/source/dzn_EJAM/functions/fnc_checkJammed.sqf b/source/dzn_EJAM/functions/main/fnc_checkJammed.sqf similarity index 90% rename from source/dzn_EJAM/functions/fnc_checkJammed.sqf rename to source/dzn_EJAM/functions/main/fnc_checkJammed.sqf index 53a7d31..bfc4316 100644 --- a/source/dzn_EJAM/functions/fnc_checkJammed.sqf +++ b/source/dzn_EJAM/functions/main/fnc_checkJammed.sqf @@ -19,10 +19,10 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" private _aceJammed = !(missionNamespace getVariable ["ace_overheating_enabled", false]) || (primaryWeapon player) in (player getVariable ["ace_overheating_jammedWeapons", []]); -private _causeSet = (call GVAR(fnc_getJamCause)) != ""; +private _causeSet = ([] call FUNC(getJamCause)) isNotEqualTo ""; private _result = false; @@ -35,4 +35,4 @@ switch toLower(_this) do { }; }; -(_result) \ No newline at end of file +(_result) diff --git a/source/dzn_EJAM/functions/fnc_firedEH.sqf b/source/dzn_EJAM/functions/main/fnc_firedEH.sqf similarity index 70% rename from source/dzn_EJAM/functions/fnc_firedEH.sqf rename to source/dzn_EJAM/functions/main/fnc_firedEH.sqf index 5b0dedb..d022dce 100644 --- a/source/dzn_EJAM/functions/fnc_firedEH.sqf +++ b/source/dzn_EJAM/functions/main/fnc_firedEH.sqf @@ -19,12 +19,12 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" params ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_gunner"]; private _gun = primaryWeapon player; -if ( _weapon != _gun || {_muzzle != _gun} || "inspect" call GVAR(fnc_checkJammed) ) exitWith { +if ( _weapon != _gun || {_muzzle != _gun} || "inspect" call FUNC(checkJammed) ) exitWith { // Exit if fired not a main muzzle (e.g. UGL) OR weapon already jammed }; @@ -33,35 +33,35 @@ private _lastFiredGunData = player getVariable [SVAR(FiredLastGunData), []]; private _jamChance = 0; if (_lastFiredGunData isEqualTo [] || { _gun != _lastFiredGunData select 0 }) then { // No gun data - get from mapping - _jamChance = [_gun, "jam"] call GVAR(fnc_getMappingData); + _jamChance = [_gun, "jam"] call FUNC(getMappingData); player setVariable [SVAR(FiredLastGunData), [_gun, _jamChance]]; } else { // Gun data cached _jamChance = _lastFiredGunData select 1; }; +if (_jamChance isEqualTo 0) exitWith { + // No jam may happen if there is 0 chance in config/settings +}; + // Check is subsonic to enlarge jam chance _magazine = toLower(_magazine); if (GVAR(SubsonicMagazines) findIf { _magazine isEqualTo _x } > -1) then { _jamChance = _jamChance + GVAR(SubsonicJamEffect); }; -// Get random value +// Get random value private _random = random 100; -// Check random vs jam chance to modify +// Check random vs jam chance to modify if (_random <= _jamChance) then { - call GVAR(fnc_setJammed); - // Stop firing - _gun spawn { - private _gun = _this; - private _frame = diag_frameno; - private _ammo = player ammo _gun; - if (_ammo > 0) then { - player setAmmo [_gun, 0]; - waitUntil {_frame < diag_frameno}; - player setAmmo [_gun, _ammo]; - }; - }; + private _ammo = player ammo _gun; + player setAmmo [_gun, 0]; + [{ + params ["_gun","_ammo"]; + player setAmmo [_gun, _ammo]; + + [true] call FUNC(setJammed); + }, [_gun, _ammo]] call CBA_fnc_execNextFrame; }; diff --git a/source/dzn_EJAM/functions/fnc_getClassFamily.sqf b/source/dzn_EJAM/functions/main/fnc_getClassFamily.sqf similarity index 89% rename from source/dzn_EJAM/functions/fnc_getClassFamily.sqf rename to source/dzn_EJAM/functions/main/fnc_getClassFamily.sqf index 1c16742..2cbb343 100644 --- a/source/dzn_EJAM/functions/fnc_getClassFamily.sqf +++ b/source/dzn_EJAM/functions/main/fnc_getClassFamily.sqf @@ -2,7 +2,7 @@ Function: dzn_EJAM_fnc_getClassFamily Description: - Search and return all guns of the same family + Search and return all guns of the same family (e.g. base weapon and all weapons models w. grip) Parameters: @@ -20,16 +20,16 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" private _class = _this; private _parent = [_class] call BIS_fnc_baseWeapon; private _result = []; if (!isNil { GVAR(ClassFamiliesCache) getVariable _parent }) then { - // Return cached data + // Return cached data _result = GVAR(ClassFamiliesCache) getVariable _parent; - + } else { // Get data private _fnc_gfc = { @@ -56,8 +56,8 @@ if (!isNil { GVAR(ClassFamiliesCache) getVariable _parent }) then { if ( [_classItem,"type","n"] call _fnc_gfc == 1 && { - [_classItem,"picture","t"] call _fnc_gfc != "" - && [_classItem,"model","t"] call _fnc_gfc != "" + [_classItem,"picture","t"] call _fnc_gfc != "" + && [_classItem,"model","t"] call _fnc_gfc != "" && [_classItem,"scope","n"] call _fnc_gfc > 0 } ) then { @@ -73,4 +73,4 @@ if (!isNil { GVAR(ClassFamiliesCache) getVariable _parent }) then { GVAR(ClassFamiliesCache) setVariable [_parent, _result]; }; -(_result) \ No newline at end of file +(_result) diff --git a/source/dzn_EJAM/functions/fnc_getEnumText.sqf b/source/dzn_EJAM/functions/main/fnc_getEnumText.sqf similarity index 83% rename from source/dzn_EJAM/functions/fnc_getEnumText.sqf rename to source/dzn_EJAM/functions/main/fnc_getEnumText.sqf index cc77079..dc99218 100644 --- a/source/dzn_EJAM/functions/fnc_getEnumText.sqf +++ b/source/dzn_EJAM/functions/main/fnc_getEnumText.sqf @@ -3,7 +3,7 @@ Function: dzn_EJAM_fnc_getEnumText Description: Resolve enum value to localized text - + Parameters: _enumValue - Value of enum _enumType - Type of the enum to search: "state", "action", "process", "time" @@ -13,15 +13,15 @@ Returns: Examples: (begin example) - _boltStateText = ["bolt_not_closed", "state"] call dzn_EJAM_fnc_getEnumText; - _pullProcess = ["pull_bolt", "process"] call dzn_EJAM_fnc_getEnumText; + _boltStateText = [STATE_BOLT_NOT_CLOSED, "state"] call dzn_EJAM_fnc_getEnumText; + _pullProcess = [ACTION_PULL_BOLT, "process"] call dzn_EJAM_fnc_getEnumText; (end) Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" params ["_text", "_source"]; @@ -44,4 +44,4 @@ switch (_source) do { }; }; -(_result) \ No newline at end of file +(_result) diff --git a/source/dzn_EJAM/functions/fnc_getJamCause.sqf b/source/dzn_EJAM/functions/main/fnc_getJamCause.sqf similarity index 93% rename from source/dzn_EJAM/functions/fnc_getJamCause.sqf rename to source/dzn_EJAM/functions/main/fnc_getJamCause.sqf index f8e9680..cb3a875 100644 --- a/source/dzn_EJAM/functions/fnc_getJamCause.sqf +++ b/source/dzn_EJAM/functions/main/fnc_getJamCause.sqf @@ -19,11 +19,11 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" private _gun = [primaryWeapon player] call BIS_fnc_baseWeapon; private _cause = ((player getVariable [SVAR(Cause), []]) select { _gun == _x # 0 }); if (_cause isEqualTo []) exitWith { "" }; -(_cause # 0 # 1) \ No newline at end of file +(_cause # 0 # 1) diff --git a/source/dzn_EJAM/functions/fnc_getMappingData.sqf b/source/dzn_EJAM/functions/main/fnc_getMappingData.sqf similarity index 97% rename from source/dzn_EJAM/functions/fnc_getMappingData.sqf rename to source/dzn_EJAM/functions/main/fnc_getMappingData.sqf index cceecf6..518874c 100644 --- a/source/dzn_EJAM/functions/fnc_getMappingData.sqf +++ b/source/dzn_EJAM/functions/main/fnc_getMappingData.sqf @@ -22,7 +22,7 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" params ["_gun", "_type", ["_isForConfig", false]]; @@ -63,4 +63,4 @@ switch toLower(_type) do { }; }; -(_result) \ No newline at end of file +(_result) diff --git a/source/dzn_EJAM/functions/fnc_getWeaponState.sqf b/source/dzn_EJAM/functions/main/fnc_getWeaponState.sqf similarity index 79% rename from source/dzn_EJAM/functions/fnc_getWeaponState.sqf rename to source/dzn_EJAM/functions/main/fnc_getWeaponState.sqf index dc653ec..4624367 100644 --- a/source/dzn_EJAM/functions/fnc_getWeaponState.sqf +++ b/source/dzn_EJAM/functions/main/fnc_getWeaponState.sqf @@ -12,14 +12,14 @@ Returns: Examples: (begin example) - _weaponState = call dzn_EJAM_fnc_getWeaponState; // ["bolt_not_closed","chamber_stucked","case_ejected","mag_attached"] + _weaponState = call dzn_EJAM_fnc_getWeaponState; // [STATE_BOLT_NOT_CLOSED,STATE_CHAMBER_STUCK,STATE_CASE_EJECTED,STATE_MAG_ATTACHED] (end) Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" private _gun = [primaryWeapon player] call BIS_fnc_baseWeapon; private _state = ((player getVariable [SVAR(WeaponState), []]) select { _gun == _x # 0 }); @@ -29,4 +29,4 @@ if (_state isEqualTo []) exitWith { [] }; _state = [] + (_state # 0); _state deleteAt 0; -(_state) \ No newline at end of file +(_state) diff --git a/source/dzn_EJAM/functions/fnc_hasMagazine.sqf b/source/dzn_EJAM/functions/main/fnc_hasMagazine.sqf similarity index 61% rename from source/dzn_EJAM/functions/fnc_hasMagazine.sqf rename to source/dzn_EJAM/functions/main/fnc_hasMagazine.sqf index 1b24c0e..bae0ac6 100644 --- a/source/dzn_EJAM/functions/fnc_hasMagazine.sqf +++ b/source/dzn_EJAM/functions/main/fnc_hasMagazine.sqf @@ -19,12 +19,9 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -private _weaponMags = (getArray (configFile >> "CfgWeapons" >> primaryWeapon player >> "magazines")) apply { toLower(_x) }; -private _mag = []; -{ - if (toLower(_x select 0) in _weaponMags) exitWith { _mag = _x; }; -} forEach (magazinesAmmo player); +private _weaponMags = ([primaryWeapon player] call CBA_fnc_compatibleMagazines) apply { toLower(_x) }; -private _result = !(_mag isEqualTo []); +// --- Loop through player's magazines and find any compatible +private _hasAnyMagazine = (magazinesAmmo player) findIf { toLower(_x # 0) in _weaponMags } > -1; -(_result) \ No newline at end of file +(_hasAnyMagazine) diff --git a/source/dzn_EJAM/functions/fnc_initPlayer.sqf b/source/dzn_EJAM/functions/main/fnc_initPlayer.sqf similarity index 73% rename from source/dzn_EJAM/functions/fnc_initPlayer.sqf rename to source/dzn_EJAM/functions/main/fnc_initPlayer.sqf index bd33ac1..c864eb9 100644 --- a/source/dzn_EJAM/functions/fnc_initPlayer.sqf +++ b/source/dzn_EJAM/functions/main/fnc_initPlayer.sqf @@ -19,11 +19,10 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" player setVariable [SVAR(Cause), []]; -player setVariable [SVAR(RemovedMagazine), nil]; -player setVariable [SVAR(LooseRound), nil]; +player setVariable [SVAR(DetachedMagazine), nil]; player setVariable [SVAR(WeaponState), nil]; if (!isNil SVAR(PreventFireID)) then { @@ -31,11 +30,6 @@ if (!isNil SVAR(PreventFireID)) then { GVAR(PreventFireID) = nil; }; -// Run EJAM's FiredEH if ACE Overheating disabled OR EJAM Jam chance forced -if (!(missionNamespace getVariable ["ace_overheating_enabled",false]) || GVAR(ForceOverallChance)) then { - GVAR(FiredEH) = player addEventHandler ["Fired", { call GVAR(fnc_firedEH) }]; -}; - if (!isNil "ace_overheating_unJamFailChance") then { private _jammedList = player getVariable ["ace_overheating_jammedWeapons", []]; if (_jammedList isEqualTo []) exitWith {}; diff --git a/source/dzn_EJAM/functions/fnc_isInVehicleCrew.sqf b/source/dzn_EJAM/functions/main/fnc_isInVehicleCrew.sqf similarity index 96% rename from source/dzn_EJAM/functions/fnc_isInVehicleCrew.sqf rename to source/dzn_EJAM/functions/main/fnc_isInVehicleCrew.sqf index 6786e3f..53ff444 100644 --- a/source/dzn_EJAM/functions/fnc_isInVehicleCrew.sqf +++ b/source/dzn_EJAM/functions/main/fnc_isInVehicleCrew.sqf @@ -19,7 +19,7 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" // Exit with FALSE if player not in vehicle if (vehicle player == player) exitWith { false }; diff --git a/source/dzn_EJAM/functions/fnc_isMagAttached.sqf b/source/dzn_EJAM/functions/main/fnc_isMagAttached.sqf similarity index 78% rename from source/dzn_EJAM/functions/fnc_isMagAttached.sqf rename to source/dzn_EJAM/functions/main/fnc_isMagAttached.sqf index 18eda9e..a2fbac2 100644 --- a/source/dzn_EJAM/functions/fnc_isMagAttached.sqf +++ b/source/dzn_EJAM/functions/main/fnc_isMagAttached.sqf @@ -2,7 +2,7 @@ Function: dzn_EJAM_fnc_isMagAttached Description: - Process selected action from Weapon Malfunction menu + Returns True if magazine attache to current weapon Parameters: nothing @@ -12,7 +12,7 @@ Returns: Examples: (begin example) - call dzn_EJAM_fnc_isMagAttached; + _isMagAttached = [] call dzn_EJAM_fnc_isMagAttached; (end) Author: @@ -21,4 +21,4 @@ Author: private _result = (weaponState player select 3) != ""; -(_result) \ No newline at end of file +(_result) diff --git a/source/dzn_EJAM/functions/fnc_processMappingData.sqf b/source/dzn_EJAM/functions/main/fnc_processMappingData.sqf similarity index 91% rename from source/dzn_EJAM/functions/fnc_processMappingData.sqf rename to source/dzn_EJAM/functions/main/fnc_processMappingData.sqf index 95cf54d..ec5d926 100644 --- a/source/dzn_EJAM/functions/fnc_processMappingData.sqf +++ b/source/dzn_EJAM/functions/main/fnc_processMappingData.sqf @@ -2,7 +2,7 @@ Function: dzn_EJAM_fnc_processMappingData Description: - Update ACE Overheating cache data and set up EJAM customized config + Update ACE Overheating cache data and set up EJAM customized config according to dzn_EJAM Jam chance Mapping Parameters: @@ -20,7 +20,7 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" // Reset EJAM's config private _configVars = allVariables GVAR(ConfigData); @@ -31,7 +31,7 @@ private _configVars = allVariables GVAR(ConfigData); { _x params ["_gun","_jamChance"]; - _gun = [_gun] call BIS_fnc_baseWeapon; + _gun = [_gun] call BIS_fnc_baseWeapon; if (isNil {ace_overheating_cacheWeaponData getVariable _gun}) then { [_gun] call ace_overheating_fnc_getWeaponData; @@ -45,5 +45,5 @@ private _configVars = allVariables GVAR(ConfigData); // Set EJAM customized data for weapon GVAR(ConfigData) setVariable [_gun, _x select [1,6]]; - -} forEach GVAR(Mapping); \ No newline at end of file + +} forEach GVAR(Mapping); diff --git a/source/dzn_EJAM/functions/fnc_processWeaponFixed.sqf b/source/dzn_EJAM/functions/main/fnc_processWeaponFixed.sqf similarity index 70% rename from source/dzn_EJAM/functions/fnc_processWeaponFixed.sqf rename to source/dzn_EJAM/functions/main/fnc_processWeaponFixed.sqf index 6b28823..bb0cdbc 100644 --- a/source/dzn_EJAM/functions/fnc_processWeaponFixed.sqf +++ b/source/dzn_EJAM/functions/main/fnc_processWeaponFixed.sqf @@ -19,17 +19,17 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" if (isNil { player getVariable SVAR(WeaponState) }) exitWith {}; -(call GVAR(fnc_getWeaponState)) params ["_bolt","_chamber","_case","_mag"]; +(call FUNC(getWeaponState)) params ["_bolt","_chamber","_case","_mag"]; if ( - _bolt != "bolt_not_closed" - && _chamber in ["chamber_ready","chamber_empty"] - && _case == "case_ejected" - && _mag == "mag_attached" + _bolt != STATE_BOLT_NOT_CLOSED + && _chamber in [STATE_CHAMBER_READY,STATE_CHAMBER_EMPTY] + && _case == STATE_CASE_EJECTED + && _mag == STATE_MAG_ATTACHED ) then { [] spawn { if (isNil "ace_common_fnc_displayTextStructured") then { @@ -43,5 +43,5 @@ if ( }; // Unjamming - [] call GVAR(fnc_setUnjammed); -}; \ No newline at end of file + [] call FUNC(setUnjammed); +}; diff --git a/source/dzn_EJAM/functions/main/fnc_reloadedEH.sqf b/source/dzn_EJAM/functions/main/fnc_reloadedEH.sqf new file mode 100644 index 0000000..62d9a0a --- /dev/null +++ b/source/dzn_EJAM/functions/main/fnc_reloadedEH.sqf @@ -0,0 +1,39 @@ +/* ---------------------------------------------------------------------------- +Function: dzn_EJAM_fnc_reloadedEH + +Description: + -- + +Parameters: + _reloadedEH - Eventhandler data of "Reloaded" EH + +Returns: + nothing + +Examples: + (begin example) + _reloadedEH call dzn_EJAM_fnc_reloadedEH; + (end) + +Author: + 10Dozen +---------------------------------------------------------------------------- */ + +#include "..\script_macro.hpp" + +// params ["_unit", "_weapon", "_muzzle", "_newMagazine", "_oldMagazine"]; + +if !("inspect" call FUNC(checkJammed)) exitWith {}; + +// Set proper Magazine state +[ + nil, + nil, + nil, + [STATE_MAG_DETACHED, STATE_MAG_ATTACHED] select ([] call FUNC(isMagAttached)) +] call FUNC(setWeaponState); + +// Pull bolt if reload is not from Inspect menu +if (GVAR(PullBoltOnReload) && isNil SVAR(MagLoading)) then { + ["pull"] call FUNC(operateBolt); +}; diff --git a/source/dzn_EJAM/functions/fnc_setJammed.sqf b/source/dzn_EJAM/functions/main/fnc_setJammed.sqf similarity index 65% rename from source/dzn_EJAM/functions/fnc_setJammed.sqf rename to source/dzn_EJAM/functions/main/fnc_setJammed.sqf index 5afb6ea..aea5da8 100644 --- a/source/dzn_EJAM/functions/fnc_setJammed.sqf +++ b/source/dzn_EJAM/functions/main/fnc_setJammed.sqf @@ -5,30 +5,49 @@ Description: Selects and applies Jam cause of current primary weapon Parameters: - nothing + _isSelfEvent -- flags that function called as a result of EJAM's EH (Bool). Returns: nothing Examples: (begin example) - call dzn_EJAM_fnc_setJammed + [true] call dzn_EJAM_fnc_setJammed (end) Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" + +params ["_isSelfEvent"]; + +if (!isNil SVAR(ExtraEventInvoked)) exitWith { + GVAR(ExtraEventInvoked) = nil; +}; + private _gun = [primaryWeapon player] call BIS_fnc_baseWeapon; -private _weights = [_gun, "malfunction"] call GVAR(fnc_getMappingData); +private _weights = [_gun, "malfunction"] call FUNC(getMappingData); private _cause = GVAR(Causes) selectRandomWeighted _weights; _cause params ["_causeID","_weaponState"]; // Set weapon state -_weaponState call GVAR(fnc_setWeaponState); +_weaponState call FUNC(setWeaponState); + +// Remove round from magazine in case it was picked, but failed to be used +if (_causeID == CAUSE_CHAMBER_FAILURE) then { + + if (_isSelfEvent) then { + [] call FUNC(wasteRound); + } else { + [{ + [] call FUNC(wasteRound); + }] call CBA_fnc_execNextFrame; + }; +}; // List weapon as jammed private _jamCauses = player getVariable [SVAR(Cause), []]; @@ -46,7 +65,7 @@ if ((_jamCauses select { _gun == _x # 0 }) isEqualTo []) then { // Set gun jamming if !(missionNamespace getVariable ["ace_overheating_enabled",false]) then { - // No ACE_Overheating + // No ACE_Overheating if (isNil SVAR(PreventFireID)) then { // Adding prevent fire handler @@ -57,8 +76,8 @@ if !(missionNamespace getVariable ["ace_overheating_enabled",false]) then { }, "", 0, false, true, "DefaultAction" , format [ "_muzzle = str(currentMuzzle player) splitString '""' joinString ''; - (_muzzle == primaryWeapon player) - && [player, primaryWeapon player] call CBA_fnc_canUseWeapon + (_muzzle == primaryWeapon player) + && [player, primaryWeapon player] call CBA_fnc_canUseWeapon && ""inspect"" call %1" , SVAR(fnc_checkJammed) ] @@ -67,12 +86,15 @@ if !(missionNamespace getVariable ["ace_overheating_enabled",false]) then { } else { // ACE_Overheating - [player, primaryWeapon player] call ace_overheating_fnc_jamWeapon; + if (_isSelfEvent) then { + GVAR(ExtraEventInvoked) = true; + [player, primaryWeapon player] call ace_overheating_fnc_jamWeapon; + }; [] spawn { // Async jam whole weapon family (w. and w/o grips) private _aceJammed = player getVariable ["ace_overheating_jammedWeapons", []]; - private _family = (primaryWeapon player) call GVAR(fnc_getClassFamily); + private _family = (primaryWeapon player) call FUNC(getClassFamily); { _aceJammed pushBackUnique _x; } forEach _family; }; -}; \ No newline at end of file +}; diff --git a/source/dzn_EJAM/functions/fnc_setUnjammed.sqf b/source/dzn_EJAM/functions/main/fnc_setUnjammed.sqf similarity index 88% rename from source/dzn_EJAM/functions/fnc_setUnjammed.sqf rename to source/dzn_EJAM/functions/main/fnc_setUnjammed.sqf index f4c09eb..ef43967 100644 --- a/source/dzn_EJAM/functions/fnc_setUnjammed.sqf +++ b/source/dzn_EJAM/functions/main/fnc_setUnjammed.sqf @@ -19,7 +19,7 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" private _gun = [primaryWeapon player] call BIS_fnc_baseWeapon; @@ -35,9 +35,6 @@ player setVariable [ SVAR(Cause) , _causes - (_causes select { _gun == _x select 0 }) ]; -player setVariable [SVAR(RemovedMagazine), nil]; -player setVariable [SVAR(LooseRound), nil]; - if !(missionNamespace getVariable ["ace_overheating_enabled",false]) then { // No ACE Overheating @@ -50,11 +47,11 @@ if !(missionNamespace getVariable ["ace_overheating_enabled",false]) then { // ACE Overheating enabled private _oldFailChance = ace_overheating_unJamFailChance; - private _family = _gun call GVAR(fnc_getClassFamily); + private _family = _gun call FUNC(getClassFamily); { ace_overheating_unJamFailChance = 0; [player, _x, true] call ace_overheating_fnc_clearJam; } forEach _family; ace_overheating_unJamFailChance = _oldFailChance; -}; \ No newline at end of file +}; diff --git a/source/dzn_EJAM/functions/fnc_setWeaponState.sqf b/source/dzn_EJAM/functions/main/fnc_setWeaponState.sqf similarity index 91% rename from source/dzn_EJAM/functions/fnc_setWeaponState.sqf rename to source/dzn_EJAM/functions/main/fnc_setWeaponState.sqf index a660f33..25a8a71 100644 --- a/source/dzn_EJAM/functions/fnc_setWeaponState.sqf +++ b/source/dzn_EJAM/functions/main/fnc_setWeaponState.sqf @@ -13,10 +13,10 @@ Returns: Examples: (begin example) [ - "bolt_closed" - ,"chamber_empty" - ,"case_ejected" - ,"mag_attached" + STATE_BOLT_CLOSED + ,STATE_CHAMBER_EMPTY + ,STATE_CASE_EJECTED + ,STATE_MAG_ATTACHED ] call dzn_EJAM_fnc_setWeaponState; (end) @@ -24,7 +24,7 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" private _gun = [primaryWeapon player] call BIS_fnc_baseWeapon; private _weaponStates = player getVariable [SVAR(WeaponState), []]; diff --git a/source/dzn_EJAM/functions/main/fnc_wasteRound.sqf b/source/dzn_EJAM/functions/main/fnc_wasteRound.sqf new file mode 100644 index 0000000..50d1065 --- /dev/null +++ b/source/dzn_EJAM/functions/main/fnc_wasteRound.sqf @@ -0,0 +1,30 @@ +/* ---------------------------------------------------------------------------- +Function: dzn_EJAM_fnc_wasteRound + +Description: + Removes wasted round from currently loaded magazine of main muzzle. + +Parameters: + _numberOfRounds - number of rounds to remove from mag (Number). Default: 1. + +Returns: + nothing + +Examples: + (begin example) + [2] call dzn_EJAM_fnc_wasteRound; // Removes 2 rounds + (end) + +Author: + 10Dozen +---------------------------------------------------------------------------- */ +#include "..\script_macro.hpp" + +params [["_numberOfRounds", 1]]; + +private _gun = primaryWeapon player; +private _ammo = (player ammo _gun) - _numberOfRounds; + +if (_ammo < 0) then { _ammo = 0 }; + +player setAmmo [_gun, _ammo]; diff --git a/source/dzn_EJAM/functions/script_macro.hpp b/source/dzn_EJAM/functions/script_macro.hpp new file mode 100644 index 0000000..ff8ca9a --- /dev/null +++ b/source/dzn_EJAM/functions/script_macro.hpp @@ -0,0 +1,2 @@ +#include "..\macro.hpp" +#include "..\Enums.hpp" diff --git a/source/dzn_EJAM/functions/fnc_uiShowBriefState.sqf b/source/dzn_EJAM/functions/ui/fnc_uiShowBriefState.sqf similarity index 57% rename from source/dzn_EJAM/functions/fnc_uiShowBriefState.sqf rename to source/dzn_EJAM/functions/ui/fnc_uiShowBriefState.sqf index fe6830b..1170c89 100644 --- a/source/dzn_EJAM/functions/fnc_uiShowBriefState.sqf +++ b/source/dzn_EJAM/functions/ui/fnc_uiShowBriefState.sqf @@ -19,7 +19,7 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" switch toLower(_this) do { case "ok": { @@ -37,17 +37,36 @@ switch toLower(_this) do { ]; }; case "state": { - (call GVAR(fnc_getWeaponState)) params [ + (call FUNC(getWeaponState)) params [ ["_bolt", GVAR(Defaults) # 0] - , "" - , "" + , ["_chamber", GVAR(Defaults) # 1] + , ["_case", GVAR(Defaults) # 2] ,["_mag", GVAR(Defaults) # 3] ]; + /* + [STATE_BOLT_NOT_CLOSED,STATE_CHAMBER_STUCK,STATE_CASE_EJECTED,STATE_MAG_ATTACHED] + */ + + private _boltText = [_bolt, "state"] call FUNC(getEnumText); + private _chamberText = ""; + private _caseText = ""; + if (_bolt != STATE_BOLT_CLOSED) then { + // Show info of chamber/case + _chamberText = [_chamber, "state"] call FUNC(getEnumText); + _caseText = [_case, "state"] call FUNC(getEnumText); + }; + private _magText = [_mag, "state"] call FUNC(getEnumText); + + private _hintText = ""; + { + if (_x != "") then { + _hintText = format ["%1%2
", _hintText, _x]; + }; + } forEach [_boltText, _chamberText, _caseText, _magText]; hint parseText format [ - "%1
%2
" - , [_bolt, "state"] call GVAR(fnc_getEnumText) - , [_mag, "state"] call GVAR(fnc_getEnumText) + "%1" + , _hintText , getText (configFile >> "CfgWeapons" >> primaryWeapon player >> "picture") ]; }; diff --git a/source/dzn_EJAM/functions/fnc_uiShowConfig.sqf b/source/dzn_EJAM/functions/ui/fnc_uiShowConfig.sqf similarity index 96% rename from source/dzn_EJAM/functions/fnc_uiShowConfig.sqf rename to source/dzn_EJAM/functions/ui/fnc_uiShowConfig.sqf index e418330..6f84d22 100644 --- a/source/dzn_EJAM/functions/fnc_uiShowConfig.sqf +++ b/source/dzn_EJAM/functions/ui/fnc_uiShowConfig.sqf @@ -3,7 +3,7 @@ Function: dzn_EJAM_fnc_uiShowConfig Description: Draw EJAM Weapon Configurator UI menu. - + Parameters: nothing @@ -19,7 +19,7 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" closeDialog 2; sleep 0.001; @@ -27,7 +27,7 @@ sleep 0.001; // Prerparation GVAR(SearchRun) = false; -// Define UI functions +// Define UI functions fnc_EJAM_gfc = { params ["_class", "_par","_type",["_config","CfgWeapons"]]; private _result = switch toUpper(_type) do { @@ -55,7 +55,7 @@ fnc_EJAM_filterWeapons = { private _resultList = []; private _allGunClasses = configFile >> "CfgWeapons"; for "_i" from 0 to ((count _allGunClasses) - 1) do { - + private _class = configName (_allGunClasses select _i); if (_class != "access") then { @@ -65,8 +65,8 @@ fnc_EJAM_filterWeapons = { if ( [_class,"type","n"] call fnc_EJAM_gfc == 1 && { - [_class,"picture","t"] call fnc_EJAM_gfc != "" - && [_class,"model","t"] call fnc_EJAM_gfc != "" + [_class,"picture","t"] call fnc_EJAM_gfc != "" + && [_class,"model","t"] call fnc_EJAM_gfc != "" && [_class,"scope","n"] call fnc_EJAM_gfc == 2 } ) then { @@ -75,7 +75,7 @@ fnc_EJAM_filterWeapons = { if !(_baseClass in _resultList) then { private _name = [_baseClass,"displayName","t"] call fnc_EJAM_gfc; - + { // Filter by string and source if ( [_x, _name, false] call BIS_fnc_inString ) then { @@ -98,7 +98,7 @@ fnc_EJAM_collectSliderData = { private _gun = call fnc_EJAM_uiGetSelected; private _display = (findDisplay 134802); private _data = [_gun]; - + // Jam chance w. 0.00 accuracy & other sliders w. 0.0 accuracy { private _accuracy = if (_forEachIndex == 0) then { 100 } else { 10 }; @@ -127,7 +127,7 @@ fnc_EJAM_uiOnFilterKeyDown = { [] spawn { uiSleep 0.5; GVAR(SearchRun) = false; - }; + }; }; fnc_EJAM_uiUpatdeListbox = { @@ -161,7 +161,7 @@ fnc_EJAM_uiOnGunSelected = { params ["_control", "_selectedIndex"]; private _class = call fnc_EJAM_uiGetSelected; - + _class call fnc_EJAM_uiUpdateWeaponData; [_class, true] call fnc_EJAM_uiUpdateSliders; true call fnc_EJAM_uiUpdateButtons; @@ -170,7 +170,7 @@ fnc_EJAM_uiOnGunSelected = { fnc_EJAM_uiUpdateWeaponData = { private _class = _this; private _display = (findDisplay 134802); - + private _gunName = parseText format [ "%1 %2" , [_class,"displayName","t"] call fnc_EJAM_gfc @@ -203,12 +203,12 @@ fnc_EJAM_uiUpdateSliders = { private _malfunctionWeights = 0; if (_sliderData isEqualTo []) then { - _jamChance = [_class, "jam", true] call GVAR(fnc_getMappingData); - _malfunctionWeights = [_class, "malfunction", true] call GVAR(fnc_getMappingData); + _jamChance = [_class, "jam", true] call FUNC(getMappingData); + _malfunctionWeights = [_class, "malfunction", true] call FUNC(getMappingData); } else { _jamChance = _sliderData # 0; _malfunctionWeights = _sliderData select [1,5]; - }; + }; (_data # 0) set [1, _jamChance]; (_data # 1) set [1, _malfunctionWeights # 0]; @@ -216,7 +216,7 @@ fnc_EJAM_uiUpdateSliders = { (_data # 3) set [1, _malfunctionWeights # 2]; (_data # 4) set [1, _malfunctionWeights # 3]; (_data # 5) set [1, _malfunctionWeights # 4]; - + { _x params ["_ctrlId","_val"]; @@ -251,7 +251,7 @@ fnc_EJAM_uiOnSliderChanged = { fnc_EJAM_uiUpdateButtons = { private _display = (findDisplay 134802); private _data = [6050, 6051, 6052, 6053]; - + { ((findDisplay 134802) displayCtrl _x) ctrlEnable _this; } forEach _data; @@ -260,7 +260,7 @@ fnc_EJAM_uiUpdateButtons = { fnc_EJAM_uiOnSaveClick = { private _newMappingData = call fnc_EJAM_collectSliderData; private _isReset = (_newMappingData select [1,6]) isEqualTo [0,0,0,0,0,0]; - + private _mapping = GVAR(Mapping) select { _newMappingData select 0 == _x select 0 }; if (_mapping isEqualTo []) then { if !(_isReset) then { @@ -353,8 +353,8 @@ fnc_EJAM_uiOnResetClick = { call fnc_EJAM_uiOnSaveClick; }; -// Draw -// --- Dialog +// Draw +// --- Dialog createDialog "dzn_EJAM_Config_Group"; private _display = (findDisplay 134802); #define GET_CTRL(X) (_display displayCtrl X) @@ -365,20 +365,20 @@ GET_CTRL(6003) ctrlSetStructuredText parseText LOCALIZE_FORMAT_STR("Config_Close GET_CTRL(6010) ctrlSetStructuredText parseText LOCALIZE_FORMAT_STR("Config_SectionLabel"); GET_CTRL(6010) ctrlSetStructuredText parseText LOCALIZE_FORMAT_STR("Config_SectionLabel"); -// --- Filter +// --- Filter GET_CTRL(6012) ctrlSetText LOCALIZE_FORMAT_STR("Config_FilterLabel"); GET_CTRL(6012) ctrlSetTooltip LOCALIZE_FORMAT_STR("Config_FilterTooltip"); GET_CTRL(6012) ctrlSetEventHandler ["KeyDown", "_this call fnc_EJAM_uiOnFilterKeyDown;"]; GET_CTRL(6011) ctrlSetEventHandler ["LBSelChanged", "_this call fnc_EJAM_uiOnGunSelected"]; GET_CTRL(6011) ctrlSetEventHandler ["LBDblClick", "_this call fnc_EJAM_uiOnLBDblClick"]; -// --- Weapon data +// --- Weapon data GET_CTRL(6021) ctrlSetStructuredText parseText format [ "%1" , LOCALIZE_FORMAT_STR("Config_PlaceholderLabel") ]; -// --- Sliders +// --- Sliders { GET_CTRL(_x) sliderSetRange [0,100]; GET_CTRL(_x) sliderSetSpeed (if (_forEachIndex == 0) then { [0.01,10] } else { [0.1,25] }); @@ -389,7 +389,7 @@ GET_CTRL(6021) ctrlSetStructuredText parseText format [ ]; } forEach [6040, 6041, 6042, 6043, 6044, 6045]; -// --- Buttons +// --- Buttons false call fnc_EJAM_uiUpdateButtons; GET_CTRL(6050) ctrlSetEventHandler ["ButtonClick", "_this call fnc_EJAM_uiOnSaveClick"]; GET_CTRL(6050) ctrlSetStructuredText parseText LOCALIZE_FORMAT_STR("Config_SaveBtn"); @@ -404,4 +404,3 @@ GET_CTRL(6052) ctrlSetTooltip LOCALIZE_FORMAT_STR("Config_PasteTooltip"); GET_CTRL(6053) ctrlSetEventHandler ["ButtonClick", "_this call fnc_EJAM_uiOnResetClick"]; GET_CTRL(6053) ctrlSetStructuredText parseText LOCALIZE_FORMAT_STR("Config_ResetBtn"); GET_CTRL(6053) ctrlSetTooltip LOCALIZE_FORMAT_STR("Config_ResetTooltip"); - diff --git a/source/dzn_EJAM/functions/fnc_uiShowProgressBar.sqf b/source/dzn_EJAM/functions/ui/fnc_uiShowProgressBar.sqf similarity index 86% rename from source/dzn_EJAM/functions/fnc_uiShowProgressBar.sqf rename to source/dzn_EJAM/functions/ui/fnc_uiShowProgressBar.sqf index 36da41a..2968cf8 100644 --- a/source/dzn_EJAM/functions/fnc_uiShowProgressBar.sqf +++ b/source/dzn_EJAM/functions/ui/fnc_uiShowProgressBar.sqf @@ -8,6 +8,7 @@ Parameters: _drawTime - Time to draw progress bar _title - Title text on progress bar _code - Code to execute on finish + _onAbortCode - Code to execute if aborted _args - Arguments to use in code Returns: @@ -22,15 +23,15 @@ Author: 10Dozen ---------------------------------------------------------------------------- */ -#include "..\macro.hpp" +#include "..\script_macro.hpp" -params ["_drawTime","_title","_code",["_args", []]]; +params ["_drawTime","_title","_code","_onAbortCode",["_args", []]]; -// Prepare data +// Prepare data private _strCode = ((str(_code) splitString "") select [1, count str(_code) - 2]) joinString ""; _code = compile format ["private _args = _this; %1", _strCode]; -// Draw +// Draw private _dialog = createDialog "dzn_EJAM_ProgressBar_Group"; private _display = (findDisplay 134804); #define GET_CTRL(X) (_display displayCtrl X) @@ -45,18 +46,19 @@ private _h = ctrlPosition GET_CTRL(6502) select 3; [ { - (_this select 0) params ["_drawTime","_startTime","_wMax","_posX","_posY","_h","_onFinish","_onFinishArgs"]; + (_this select 0) params ["_drawTime","_startTime","_wMax","_posX","_posY","_h","_onFinish","_onAbortCode", "_args"]; private _timeSpent = CBA_missionTime - _startTime; if (_timeSpent >= _drawTime) then { closeDialog 2; (_this select 1) call CBA_fnc_removePerFrameHandler; - _onFinishArgs spawn _onFinish; + _args call _onFinish; } else { if (isNull (findDisplay 134804) || !alive player) exitWith { closeDialog 2; (_this select 1) call CBA_fnc_removePerFrameHandler; + _args call _onAbortCode; hint "Canceled"; }; @@ -65,5 +67,5 @@ private _h = ctrlPosition GET_CTRL(6502) select 3; }; } , 0 - , [_drawTime, CBA_missionTime, _wMax, _posX, _posY, _h, _code, _args] + , [_drawTime, CBA_missionTime, _wMax, _posX, _posY, _h, _code, _onAbortCode, _args] ] call CBA_fnc_addPerFrameHandler; diff --git a/source/dzn_EJAM/functions/ui/fnc_uiShowUnjamMenu.sqf b/source/dzn_EJAM/functions/ui/fnc_uiShowUnjamMenu.sqf new file mode 100644 index 0000000..4747783 --- /dev/null +++ b/source/dzn_EJAM/functions/ui/fnc_uiShowUnjamMenu.sqf @@ -0,0 +1,157 @@ +/* ---------------------------------------------------------------------------- +Function: dzn_EJAM_fnc_uiShowUnjamMenu + +Description: + Draw Unjam UI menu. + +Parameters: + nothing + +Returns: + nothing + +Examples: + (begin example) + [] spawn dzn_EJAM_fnc_uiShowUnjamMenu; + (end) + +Author: + 10Dozen +---------------------------------------------------------------------------- */ + +#include "..\script_macro.hpp" +#define __EXEC_NEXT_FRAME_START__ [{ +#define __EXEC_NEXT_FRAME_END__ }] call CBA_fnc_execNextFrame; + + +closeDialog 2; +hintSilent ""; + + +__EXEC_NEXT_FRAME_START__ +// uiSleep 0.001; + +// ** +// Get weapon state +[ + nil, nil, nil + , [STATE_MAG_DETACHED, STATE_MAG_ATTACHED] select (call FUNC(isMagAttached)) +] call FUNC(setWeaponState); + +(call FUNC(getWeaponState)) params ["_bolt","_chamber","_case","_mag"]; + +// ** +// Prepare data +private _parseAndFormatLeft = { + parseText format ["%1", _this] +}; +private _parseAndFormatCenter = { + parseText format ["%1", _this] +}; + +private _titleText = LSTR(Menu_Title) call _parseAndFormatLeft; +private _closeBtnText = LSTR(Menu_Close); + +private _gunText = (getText (configFile >> "CfgWeapons" >> primaryWeapon player >> "displayName")) call _parseAndFormatCenter; +private _img = parseText format [ + "" + , getText (configFile >> "CfgWeapons" >> primaryWeapon player >> "picture") +]; +private _boltText = [_bolt, "state"] call FUNC(getEnumText) call _parseAndFormatCenter; +private _chamberText = ([_chamber, "state"] call FUNC(getEnumText)) call _parseAndFormatCenter; +private _caseText = ([_case, "state"] call FUNC(getEnumText)) call _parseAndFormatCenter; +private _magText = ([_mag, "state"] call FUNC(getEnumText)) call _parseAndFormatCenter; + +private _pullBoltActionText = [ACTION_PULL_BOLT, "action"] call FUNC(getEnumText) call _parseAndFormatLeft; +private _clearChamberActionText = [ACTION_CLEAR_CHAMBER, "action"] call FUNC(getEnumText) call _parseAndFormatLeft; +private _openBoltActionText = [ACTION_OPEN_BOLT, "action"] call FUNC(getEnumText) call _parseAndFormatLeft; +private _clearCaseActionText = [ACTION_REMOVE_CASE, "action"] call FUNC(getEnumText) call _parseAndFormatLeft; +private _magActionText = [ + [ACTION_ATTACH_MAG, ACTION_DETACH_MAG] select (_mag == STATE_MAG_ATTACHED) + , "action" +] call FUNC(getEnumText) call _parseAndFormatLeft; + + +// ** +// Show menu +createDialog "dzn_EJAM_Menu_Group"; + +private _display = (findDisplay 134802); +#define GET_CTRL(X) (_display displayCtrl X) + +// --- Title and Image +GET_CTRL(6002) ctrlSetStructuredText _titleText; +GET_CTRL(6003) ctrlSetText _closeBtnText; + +GET_CTRL(6010) ctrlSetStructuredText _img; +GET_CTRL(6011) ctrlSetStructuredText _gunText; + +// --- State labels +GET_CTRL(6012) ctrlSetStructuredText _boltText; +GET_CTRL(6013) ctrlSetStructuredText _chamberText; +GET_CTRL(6014) ctrlSetStructuredText _magText; +GET_CTRL(6015) ctrlSetStructuredText _caseText; + +// --- Buttons +GET_CTRL(6020) ctrlSetStructuredText _pullBoltActionText; +GET_CTRL(6021) ctrlSetStructuredText _clearChamberActionText; +GET_CTRL(6022) ctrlSetStructuredText _magActionText; +GET_CTRL(6023) ctrlSetStructuredText _openBoltActionText; +GET_CTRL(6024) ctrlSetStructuredText _clearCaseActionText; + +// --- Set button states & onclick +private _generateActionCode = { + compile format ["closeDialog 2; ""%1"" spawn %2", _this, QFUNC(doAction)] +}; +private _isActive = false; + +// --- --- Close +GET_CTRL(6003) ctrlAddEventHandler ["ButtonClick", { closeDialog 2; }]; + +// --- --- Bolt pull +GET_CTRL(6020) ctrlAddEventHandler ["ButtonClick", ACTION_PULL_BOLT call _generateActionCode]; +GET_CTRL(6020) ctrlSetFont "PuristaLight"; + +// --- --- Bolt open +if (_bolt != STATE_BOLT_OPENED) then { + _isActive = true; + GET_CTRL(6023) ctrlAddEventHandler ["ButtonClick", ACTION_OPEN_BOLT call _generateActionCode]; +} else { + _isActive = false; +}; + +GET_CTRL(6023) ctrlEnable _isActive; + +// --- --- Chamber +if ( + _bolt == STATE_BOLT_OPENED + && _chamber in [STATE_CHAMBER_STUCK, STATE_CHAMBER_NOT_EXTRACTABLE] + && _case == STATE_CASE_EJECTED + && _mag == STATE_MAG_DETACHED +) then { + _isActive = true; + GET_CTRL(6021) ctrlAddEventHandler ["ButtonClick", ACTION_CLEAR_CHAMBER call _generateActionCode]; +} else { + _isActive = false; +}; + +GET_CTRL(6021) ctrlEnable _isActive; + +// --- --- Case +if (_bolt == STATE_BOLT_OPENED && _case == STATE_CASE_NOT_EJECTED) then { + _isActive = true; + GET_CTRL(6024) ctrlAddEventHandler ["ButtonClick", ACTION_REMOVE_CASE call _generateActionCode]; +} else { + _isActive = false; +}; + +GET_CTRL(6024) ctrlEnable _isActive; + +// --- --- Magazine detach +if (_mag == STATE_MAG_ATTACHED) then { + GET_CTRL(6022) ctrlAddEventHandler ["ButtonClick", ACTION_DETACH_MAG call _generateActionCode]; +} else { + GET_CTRL(6022) ctrlAddEventHandler ["ButtonClick", ACTION_ATTACH_MAG call _generateActionCode]; +}; + +__EXEC_NEXT_FRAME_END__ diff --git a/source/dzn_EJAM/macro.hpp b/source/dzn_EJAM/macro.hpp index 49e8aec..8d6b820 100644 --- a/source/dzn_EJAM/macro.hpp +++ b/source/dzn_EJAM/macro.hpp @@ -2,27 +2,60 @@ #define gADDON EJAM #define gADDON_NAME dzn_##gADDON -#define gADDON_PATH \##gADDON_NAME -#define gFNC_PATH gADDON_PATH##\functions\## +#ifdef _SCRIPT_MACRO + #undef gADDON_PATH + #define gADDON_PATH gADDON_NAME +#else + #undef gADDON_PATH + #define gADDON_PATH \##gADDON_NAME +#endif + +#define gFNCS_PATH gADDON_PATH##\functions\## #define QUOTE(s) #s #define ADDON QUOTE(gADDON) #define ADDON_NAME QUOTE(gADDON_NAME) #define PATH QUOTE(gADDON_PATH) -#define FNC_PATH QUOTE(gFNC_PATH) +#define FNCS_PATH QUOTE(gFNCS_PATH) +#define PATH_TO_FUNCTION(SUBPATH, NAME) gFNCS_PATH##SUBPATH##\##NAME.sqf + #define GVAR(X) gADDON_NAME##_##X #define SVAR(X) QUOTE(GVAR(X)) #define FORMAT_VAR(X) format ["%1_%2", ADDON_NAME, X] +#define FUNC(X) gADDON_NAME##_fnc_##X +#define QFUNC(X) QUOTE(FUNC(X)) + +// Localization #define gSTR_NAME(X) STR_##gADDON##_##X #define STR_NAME(X) QUOTE(gSTR_NAME(X)) +#define LSTR(X) localize STR_NAME(X) #define LOCALIZE_FORMAT_STR(X) localize format ["STR_%1_%2", ADDON, X] -#define LOCALIZE_FORMAT_STR_desc(X) localize format ["STR_%1_%2_desc", ADDON, X] +#define LOCALIZE_FORMAT_STR_DESC(X) localize format ["STR_%1_%2_desc", ADDON, X] + + +#define COMPILE_FUNCTION(SUBPATH,NAME) GVAR(NAME) = compile preprocessFileLineNumbers QUOTE(PATH_TO_FUNCTION(SUBPATH,NAME)) +/* +COMPILE_FUNCTION(main,fnc_initPlayer) -> + dzn_EJAM_fnc_initPlayer = compile preprocessFileLineNumbers "dzn_EJAM\functions\main\fnc_initPlayer.sqf" +*/ + +#define COMPILE_FUNCTION_CACHED(SUBPATH,NAME) [QUOTE(PATH_TO_FUNCTION(SUBPATH,NAME)), SVAR(NAME)] call CBA_fnc_compileFunction +/* COMPILE_FUNCTION_CACHED(main,fnc_initPlayer) -> + ["dzn_EJAM\functions\main\fnc_initPlayer.sqf", "dzn_EJAM_fnc_initPlayer"] call CBA_fnc_compileFunction +*/ + +#ifdef _SCRIPT_MACRO + #undef PREP + #define PREP(SUBPATH,NAME) COMPILE_FUNCTION(SUBPATH,NAME) +#else + #undef PREP + #define PREP(SUBPATH,NAME) [QUOTE(PATH_TO_FUNCTION(SUBPATH,NAME)), SVAR(NAME)] call CBA_fnc_compileFunction +#endif -#define COMPILE_FUNCTION(X) GVAR(X) = compile preprocessFileLineNumbers format ["%1%2.sqf", FNC_PATH, #X] #define gSND_PATH gADDON_PATH##\sounds\## #define gSND(X) gSND_PATH##X diff --git a/source/dzn_EJAM/sounds/CfgSounds.hpp b/source/dzn_EJAM/sounds/CfgSounds.hpp index 8b6a27d..ac75ab2 100644 --- a/source/dzn_EJAM/sounds/CfgSounds.hpp +++ b/source/dzn_EJAM/sounds/CfgSounds.hpp @@ -1,5 +1,7 @@ +// Was 1,1 + #define SOUND_CLASS(X,Y) class X { \ - sound[] = {Y, 1, 1}; \ + sound[] = {Y, db+5, 1}; \ name = ""; \ titles[] = {0, ""}; \ } @@ -16,4 +18,4 @@ class CfgSounds SOUND_CLASS(clear_chamber, SND(Fixing.ogg)); SOUND_CLASS(remove_case, SND(Fixing.ogg)); SOUND_CLASS(drop_mag, SND(MagDrop.ogg)); -}; \ No newline at end of file +}; diff --git a/source/dzn_EJAM/stringtable.xml b/source/dzn_EJAM/stringtable.xml index 33a7714..caad87c 100644 --- a/source/dzn_EJAM/stringtable.xml +++ b/source/dzn_EJAM/stringtable.xml @@ -7,8 +7,10 @@ KICKASS (Chinese, Chinese simplified) EckoMoire (Portuguese) Ralf (German) + Abogado (Spanish) --> - + + @@ -19,6 +21,7 @@ 武器只能使用EJAM排障 Entstörung nur über EJAM Destravar apenas pelo EJAM + Desencasquillar usando sólo EJAM Force EJAM unjam logic over ACE @@ -27,6 +30,7 @@ 強制使用EJAM排障覆蓋ACE Erzwinge EJAM Logik über ACE-Jam-Logik Forçar configurações do EJAM sobre o ACE + Forzar uso de EJAM sobre ACE @@ -36,6 +40,7 @@ 重新定義武器卡彈概率 Allgemeine Chance auf Ladehemmungen überschreiben Sobrepor a chance de trava + Forzar probabilidad de encasquillado Force EJAM Overall jam chance over ACE jamming logic. @@ -44,6 +49,7 @@ 强行讓EJAM覆蓋ACE卡彈機制 Erwinge EJAM Allgemeine Chance auf Ladehemmungen über ACE-Jam-Logik Forçar a chance geral de trava do EJAM sobre a lógica do ACE + Forzar la probabilidad de EJAM sobre la de ACE @@ -53,6 +59,7 @@ 整體卡彈概率 Allgemeine Chance auf Ladehemmungen Chance geral de trava + Probabilidad de encasquillado general Default jam chance for all primary weapons. From 0 to 100. Custom weapon setting will be used if set. @@ -61,6 +68,7 @@ 所有主武器的默認卡彈概率.從0到100.自定義武器設定後生效 Standardmäßige Chance auf Ladehemmungen für alle Primärwaffen. Von 0 bis 100. Die benutzerdefinierte Waffeneinstellung wird verwendet, wenn sie eingestellt ist. Chance padrão para todas as armas primárias. De 0 a 100. Configurações personalizadas serão utilizadas se definidas. + Probabilidad de encasquillado para las armas principales. De 0 a 100. Se usarán las configuraciones personalizadas si están definidas. @@ -70,6 +78,7 @@ 導氣系統故障概率 (Chance auf) Zufuhrausfall (Chance) Falha de Alimentação + (Probabilidad de) fallo de alimentación Chance for specific malfunction to happen if weapon got jammed. @@ -78,6 +87,7 @@ 武器卡彈後發生特定故障的概率 Möglichkeit einer spezifischen Fehlfunktion, wenn die Waffe blockiert wurde Chance de ocorrer esse defeito específico se a arma travar. + Probabilidad de ocurrir este fallo específico de encasquillado (Chance of) Chamber failure @@ -86,6 +96,7 @@ 供彈失敗概率 (Chance auf) Kammerausfall (Chance) Falha na Câmara + (Probabilidad de) fallo en la recámara Chance for specific malfunction to happen if weapon got jammed @@ -94,6 +105,7 @@ 武器卡彈後發生特定故障的概率 Möglichkeit einer spezifischen Fehlfunktion, wenn die Waffe blockiert wurde Chance de ocorrer esse defeito específico se a arma travar. + Probabilidad de ocurrir este fallo específico de encasquillado (Chance of) Dud @@ -102,6 +114,7 @@ 啞彈概率 (Chance auf) Blindgänger (Chance) Projétil Falho + (Probabilidad de) cartucho defectuoso Chance for specific malfunction to happen if weapon got jammed @@ -110,6 +123,7 @@ 武器卡彈後發生特定故障的概率 Möglichkeit einer spezifischen Fehlfunktion, wenn die Waffe blockiert wurde Chance de ocorrer esse defeito específico se a arma travar. + Probabilidad de ocurrir este fallo específico de encasquillado (Chance of) Extraction failure @@ -118,6 +132,7 @@ 抽殼失敗概率 (Chance des) Extraktionsversagens (Chance) Falha de Extração do estojo do cartucho + (Probabilidad de) fallo de extracción de casquillo Chance for specific malfunction to happen if weapon got jammed @@ -126,6 +141,7 @@ 武器卡彈後發生特定故障的概率 Möglichkeit einer spezifischen Fehlfunktion, wenn die Waffe blockiert wurde Chance de ocorrer esse defeito específico se a arma travar. + Probabilidad de ocurrir este fallo específico de encasquillado (Chance of) Ejection failure @@ -134,6 +150,7 @@ 拋殼失敗概率 (Chance auf) Auswurfversagen (Chance) Falha de Ejeção + (Probabilidad de) eyección Chance for specific malfunction to happen if weapon got jammed @@ -142,6 +159,7 @@ 武器卡彈後發生特定故障的概率 Möglichkeit einer spezifischen Fehlfunktion, wenn die Waffe blockiert wurde Chance de ocorrer esse defeito específico se a arma travar. + Probabilidad de ocurrir este fallo específico de encasquillado @@ -182,6 +204,7 @@ 亞音速彈卡彈概率 Strafe für Unterschall-Munition Penalidade de munições subsônicas + Penalización por munición subsónica Jam chance penalty on using subsonic ammo. Value will be added to weapon's jam chance. @@ -190,14 +213,17 @@ 額外新增使用亞音速彈藥時的卡彈概率 Strafe für die Verwendung von Unterschall-Munition. Der Wert wird der Blockierungschance der Waffe hinzugefügt. Penalidade na chance de travar a arma ao utilizar munição subsônica. Valor será adicionado à chance de trava. + Probabilidad de encasquillado usando munición subsónica. Este valor se suma a la probabilidad normal de encasquillado Subsonic magazines Дозвуковые боеприпасы + Cargadores subsónicos Magazine classes of subsonic ammunition that cause penalty. List only magazines for weapons that are NOT subsonic by design (e.g. AS Val mags shouldn't be listed, but subsonic AKM magazines should) Классы магазинов с дозвуковыми патронами которые способствуют повышению шанса на клин. Вносите только магазины для оружия которое не расчитано на дозвуковые патроны по умолчанию (т.е. магазины АС Вал не нужно записывать, а вот дозвуковые магазины к АКМ - должны) + Classnames de cargadores subsónicos con penalización. Definir únicamente cargadores que NO son subsónicos por diseño (ej. cargadores de la AS Val no deben ser listados, pero los cargadores de munición subsónica de AKM sí) @@ -207,6 +233,7 @@ 武器設定 Waffen-Einstellungen Configuraçõe de Arma + Configuración del arma Custom settings for specific weapon. In format [@WeaponClass, @JamChance, @MalfunctionChance#1...5]. Use EJAM Configurator by [ call dzn_EJAM_Configure ] @@ -215,8 +242,29 @@ 特定武器的自定義設定. 格式為 [@WeaponClass, @JamChance, @MalfunctionChance#1...5]. 使用EJAM配寘程式為 [ call dzn_EJAM_Configure ] Benutzerdefinierte Einstellungen für bestimmte Waffen. Im Format @WeaponClass, @JamChance, @MalfunctionChance#1...5]. Verwenden Sie den EJAM-Konfigurator durch [ call dzn_EJAM_Configure ]. Configurações personalizadas para arma específica. No formato [@WeaponClass, @JamChance, @MalfunctionChance#1...5]. Use o configurador EJAM com [ call dzn_EJAM_Configure ] + Opciones para armas específicas. Con el formato [@WeaponClass, @JamChance, @MalfunctionChance#1...5]. Usar el configurador de EJAM con [ call dzn_EJAM_Configure ] + + + + Pull bolt on reload + Дергать затвор при перезарядке + + + Automatically pull bolt when weapon reloaded by reload key or inventory. + Автоматически передергивать затвор при перезардке через кнопку перезарядке или инвентарь. + + Allow Inspect Menu + Разрешить Меню проверки оружия + + + Allows Inspect weapon menu dialog with actions. If not allowed - unjamming will be possible only via hotkeys! + Разрешить использование Меню проверки оружия для выполнения действий. Если не разрешено, то исправлять проблемы придеться только через горячие главиши! + + + + WEAPON MALFUNCTION @@ -225,6 +273,7 @@ 武器故障 WAFFEN-FEHLFUNKTION ARMA DEFEITUOSA + FALLO DEL ARMA @@ -234,6 +283,7 @@ 關閉 SCHLIEßEN FECHAR + CERRAR @@ -244,6 +294,7 @@ 槍機閉合 Verschluss geschlossen Ferrolho fechado + Cerrojo cerrado Bolt <t color="#f79400">not closed</t> @@ -252,6 +303,7 @@ 槍機 <t color="#f79400">未閉合</t> Verschluss <t color="#f79400">nicht geschlossen</t> Ferrolho <t color="#f79400">solto</t> + Cerrojo <t color="#f79400">no cerrado</t> Bolt <t color="#00b9f7">opened</t> @@ -260,6 +312,7 @@ 槍機 <t color="#00b9f7">已打開</t> Verschluss <t color="#00b9f7">geöffnet</t> Ferrolho <t color="#00b9f7">aberto</t> + Cerrojo <t color="#f79400">abierto</t> Chamber empty @@ -268,6 +321,7 @@ 槍膛內已清空 Kammer leer Câmara vazia + Recámara vacía Chamber <t color="#00b9f7">loaded</t> @@ -276,6 +330,7 @@ 槍膛內 <t color="#00b9f7">已供彈</t> Kammer <t color="#00b9f7">geladen</t> Câmara <t color="#00b9f7">carregada</t> + Recámara <t color="#00b9f7">cargada</t> Round <t color="#f79400">stuck</t> @@ -284,6 +339,7 @@ 子彈 <t color="#f79400">卡住</t> Patrone <t color="#f79400">blockiert</t> Cartucho <t color="#f79400">preso</t> + Cartucho <t color="#f79400">atascado</t> Round <t color="#f79400">not extracted</t> @@ -292,6 +348,7 @@ 子彈 <t color="#f79400">未入膛</t> Patrone <t color="#f79400">nicht entnommen</t> Cartucho <t color="#f79400">não extraído</t> + Cartucho <t color="#f79400">no extraído</t> Case <t color="#f79400">not ejected</t> @@ -300,6 +357,7 @@ 彈殼 <t color="#f79400">未拋出</t> Hülse <t color="#f79400">nicht ausgeworfen</t> Estojo <t color="#f79400">não ejetado</t> + Casquillo <t color="#f79400">no eyectado</t> Case ejected @@ -308,6 +366,7 @@ 彈殼已抛出 Hülse ausgeworfen Estojo ejetado + Cartucho eyectado Magazine attached @@ -316,27 +375,32 @@ 已插入彈匣 Magazin eingelegt Carregador inserido + Cargador insertado Magazine <t color="#00b9f7">detached</t> - Магазин <t color="#00b9f7">отсоединен<</t>/Russian> + Магазин <t color="#00b9f7">отсоединен</t> 弹匣 <t color="#00b9f7">卸下</t> 彈匣 <t color="#00b9f7">卸下</t> Magazin <t color="#00b9f7">entfernt</t> Carregador <t color="#00b9f7">removido</t> + Cargador <t color="#00b9f7">extraído</t> + + - + Inspect weapon menu Проверить оружие (меню) 武器检查菜单 武器檢查選單 Waffe untersuchen Menü Inspecionar Arma (menu) + Inspeccionar arma (menú) Inspect weapon (no menu) @@ -345,6 +409,7 @@ 武器檢查 (无菜单) Waffe untersuchen (Kein Menü) Inspecionar Arma (sem menu) + Inspeccionar arma (sin menú) Attach/Detach magazine @@ -353,6 +418,7 @@ 裝入/卸下 彈匣 Magazin einlegen/auswerfen Inserir/Remover carregador + Insertar/Extraer cargador @@ -362,6 +428,7 @@ 拉動槍機 Verschluss ziehen Puxar ferrolho + Accionar cerrojo Open bolt @@ -370,6 +437,7 @@ 打開槍機 Verschluss öffnen Abrir ferrolho + Abrir cerrojo Clear chamber @@ -378,6 +446,7 @@ 清理膛室 Kammer leeren Limpar câmara + Limpiar recámara Remove case @@ -386,6 +455,7 @@ 清理卡住的彈殼 Hülse entfernen Remover estojo + Extraer casquillo Detach magazine @@ -394,6 +464,7 @@ 卸下彈匣 Magazin auswerfen Remover carregador + Quitar cargador Attach magazine @@ -402,6 +473,7 @@ 裝入彈匣 Magazin einlegen Inserir carregador + Insertar cargador Inspect weapon @@ -410,8 +482,11 @@ 檢查武器 Waffe untersuchen Inspercionar Arma + Inspeccionar arma + + @@ -422,6 +497,7 @@ 正在拉動槍機 Ziehen des Verschlusses Puxando o ferrolho + Accionando cerrojo Opening the bolt @@ -430,6 +506,7 @@ 正在打開槍機 Öffnen des Verschlusses Abrindo o ferrolho + Abriendo cerrojo Clearing the chamber @@ -438,6 +515,7 @@ 正在清理膛室 Kammer leeren Limpando a câmara + Limpiando recámara Removing the case @@ -446,6 +524,7 @@ 正在清理卡住的彈殼 Entfernen der Hülse Removendo o estojo + Extrayendo casquillo Detaching magazine @@ -454,6 +533,7 @@ 正在卸下彈匣 Werfe Magazin aus Removendo o carregador + Quitando cargador Attaching magazine @@ -462,6 +542,7 @@ 正在裝入彈匣 Lege Magazin ein Inserindo o carregador + Insertando cargador Inspecting @@ -470,8 +551,11 @@ 正在檢查武器 Untersuche Waffe Inspecionando + Inspeccionando + + @@ -482,6 +566,7 @@ 彈匣脫落 Magazin fallen gelassen Carregador removido + Cargador quitado Magazine attached @@ -490,6 +575,7 @@ 彈匣已裝入 Magazin eingelegt Carregador inserido + Cargador insertado Weapon is functioning normally @@ -497,7 +583,8 @@ 武器已可以正常使用 武器已可以正常使用 Waffe funktioniert normal - Não foi possível efetuar essa ação! + Arma funcionando corretamente + Arma funcionando correctamente Not possible to perform action! @@ -505,7 +592,8 @@ 不能执行该命令! 不能執行該命令! Keine Aktion möglich! - Sem carregador para inserir! + Não foi possível efetuar essa ação! + ¡No es posible realizar la acción! No magazine to load! @@ -513,10 +601,12 @@ 武器无弹匣! 武器無彈匣! Kein Magazin zum Laden! - dzn EJAM Configurador de Arma + Sem carregador para inserir! + ¡No hay cargadores para insertar! + - + dzn EJAM Weapon Configurator @@ -525,6 +615,7 @@ dzn EJAM自定義武器設定 dzn EJAM Waffen-Konfigurator dzn EJAM Configurador de Arma + dzn EJAM Configurar arma Weapon @@ -533,6 +624,7 @@ 武器 Waffe Arma + Arma No weapon selected @@ -541,6 +633,7 @@ 沒有選擇武器 Keine Waffe ausgewählt Nenhuma arma selecionada + Ningun arma seleccionada Filter... @@ -549,6 +642,7 @@ 蒐索欄 Filtern... Filtro... + Filtro... @@ -559,6 +653,7 @@ 保存 Speichern Salvar + Guardar Copy @@ -567,6 +662,7 @@ 複製 Kopieren Copiar + Copiar Paste @@ -575,6 +671,7 @@ 粘貼 Einfügen Colar + Pegar Reset @@ -583,6 +680,7 @@ 重置 Zurücksetzen Resetar + Resetear Close @@ -591,6 +689,7 @@ 關閉 Schließen Fechar + Cerrar @@ -601,6 +700,7 @@ 輸入武器名稱後. 按左Shift+回車或小鍵盤回車即可執行蒐索. 蒐索多個武器時可以用 "|" 將幾個關鍵字隔開 Eingabe/Numpad Eingabe zum Anwenden des Filters. Verwenden Sie "|" für mehrere Filterwerte. Enter/NumpadEnter para aplicar filtro. Use "|" para múltiplos filtros + Entrar/NumpadEntrar para aplicar filtro. Usar "|" para múltiples filtros Unsets weapon settings @@ -609,6 +709,7 @@ 取消武器設定 Löscht die Waffeneinstellungen Desfaz configurações de arma + Deshacer configuración de arma Double clicking list element will also apply copied settings! @@ -617,6 +718,7 @@ 按兩下清單內容也能應用複製的設定文字! Beim Doppelklick auf ein Listenelement werden auch die kopierten Einstellungen übernommen! Clicar duas vezes no elemento da lista também aplica configurações copiadas! + ¡Doble click en el elemento de la lista aplica los cambios copiados! @@ -627,6 +729,7 @@ 無數據可應用! Keine Daten zu übergeben! Nenhuma configuração para aplicar! + ¡Sin datos para aplicar! @@ -636,6 +739,7 @@ 設定已應用! Übergeben! Aplicado! + ¡Aplicado! Config copied! @@ -644,6 +748,7 @@ 設定已複製! Konfiguration kopiert! Configuração copiada! + ¡Configuración copiada! Config saved! @@ -652,8 +757,8 @@ 設定已保存! Konfiguration gespeichert! Configuração salva! + ¡Configuración guardada! - - \ No newline at end of file + diff --git a/source/mod.cpp b/source/mod.cpp index a9e1027..1565c5d 100644 --- a/source/mod.cpp +++ b/source/mod.cpp @@ -4,7 +4,7 @@ action = ""; tooltip = "dzn EJAM"; overview = ""; author = "10Dozen"; -description = "dzn EJAM - Version 2.7.1"; +description = "dzn EJAM - Version 2.7.2"; logo = "mod.paa"; logoOver = "mod.paa"; overviewPicture = "mod.paa"; \ No newline at end of file diff --git a/source/resources/addon/macro.hpp b/source/resources/addon/macro.hpp deleted file mode 100644 index 49e8aec..0000000 --- a/source/resources/addon/macro.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#define TITLE "dzn Extended Jamming" -#define gADDON EJAM -#define gADDON_NAME dzn_##gADDON - -#define gADDON_PATH \##gADDON_NAME -#define gFNC_PATH gADDON_PATH##\functions\## - -#define QUOTE(s) #s - -#define ADDON QUOTE(gADDON) -#define ADDON_NAME QUOTE(gADDON_NAME) -#define PATH QUOTE(gADDON_PATH) -#define FNC_PATH QUOTE(gFNC_PATH) - -#define GVAR(X) gADDON_NAME##_##X -#define SVAR(X) QUOTE(GVAR(X)) -#define FORMAT_VAR(X) format ["%1_%2", ADDON_NAME, X] - -#define gSTR_NAME(X) STR_##gADDON##_##X -#define STR_NAME(X) QUOTE(gSTR_NAME(X)) - -#define LOCALIZE_FORMAT_STR(X) localize format ["STR_%1_%2", ADDON, X] -#define LOCALIZE_FORMAT_STR_desc(X) localize format ["STR_%1_%2_desc", ADDON, X] - -#define COMPILE_FUNCTION(X) GVAR(X) = compile preprocessFileLineNumbers format ["%1%2.sqf", FNC_PATH, #X] - -#define gSND_PATH gADDON_PATH##\sounds\## -#define gSND(X) gSND_PATH##X -#define SND(X) QUOTE(gSND(X)) diff --git a/source/resources/script/macro.hpp b/source/resources/script/macro.hpp deleted file mode 100644 index 12542bd..0000000 --- a/source/resources/script/macro.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#define TITLE "dzn Extended Jamming" -#define gADDON EJAM -#define gADDON_NAME dzn_##gADDON - -#define gADDON_PATH gADDON_NAME -#define gFNC_PATH gADDON_PATH##\functions\## - -#define QUOTE(s) #s - -#define ADDON QUOTE(gADDON) -#define ADDON_NAME QUOTE(gADDON_NAME) -#define PATH QUOTE(gADDON_PATH) -#define FNC_PATH QUOTE(gFNC_PATH) - -#define GVAR(X) gADDON_NAME##_##X -#define SVAR(X) QUOTE(GVAR(X)) -#define FORMAT_VAR(X) format ["%1_%2", ADDON_NAME, X] - -#define gSTR_NAME(X) STR_##gADDON##_##X -#define STR_NAME(X) QUOTE(gSTR_NAME(X)) - -#define LOCALIZE_FORMAT_STR(X) localize format ["STR_%1_%2", ADDON, X] -#define LOCALIZE_FORMAT_STR_desc(X) localize format ["STR_%1_%2_desc", ADDON, X] - -#define COMPILE_FUNCTION(X) GVAR(X) = compile preprocessFileLineNumbers format ["%1%2.sqf", FNC_PATH, #X] - -#define gSND_PATH gADDON_PATH##\sounds\## -#define gSND(X) gSND_PATH##X -#define SND(X) QUOTE(gSND(X))