From 4ed936c1d1a5f6a2e9cf41c8fe08feadd41b9540 Mon Sep 17 00:00:00 2001 From: worldwidesorrow Date: Tue, 21 Jan 2020 12:06:06 -0600 Subject: [PATCH] Update player_switchWeapon.sqf Fix this file so that hotkey 3 works to switch to "onBack" primary weapon when DZE_TwoPrimaries == 2. Add optimizations and rework function dz_fn_switchWeapon_swapSecure. Remove mutex. It was not doing anything. --- SQF/dayz_code/actions/player_switchWeapon.sqf | 307 ++++++------------ 1 file changed, 96 insertions(+), 211 deletions(-) diff --git a/SQF/dayz_code/actions/player_switchWeapon.sqf b/SQF/dayz_code/actions/player_switchWeapon.sqf index bca3b9e49..e88e65cd5 100644 --- a/SQF/dayz_code/actions/player_switchWeapon.sqf +++ b/SQF/dayz_code/actions/player_switchWeapon.sqf @@ -1,20 +1,13 @@ -#include "\z\addons\dayz_code\util\mutex.hpp" #include "\z\addons\dayz_code\util\player.hpp" -#define BANDAID - -#define TIMEOUT 2 - #define IS_PRIMARY(wpn) (getNumber (configFile >> "CfgWeapons" >> wpn >> "type") == 1) #define MELEE(wpn) getNumber (configFile >> "CfgWeapons" >> wpn >> "melee") #define IS_MELEE(wpn) (MELEE(wpn) == 1) //0 if not found, 1 if in primary slot, 2 if on back -#define FIND_RIFLE() (0 call dz_fn_switchWeapon_find) -#define FIND_MELEE() (1 call dz_fn_switchWeapon_find) +#define FIND_RIFLE (0 call dz_fn_switchWeapon_find) +#define FIND_MELEE (1 call dz_fn_switchWeapon_find) -dz_switchWeapon_mutex = Mutex_New(); -dz_switchWeapon_time = 0; dz_switchWeapon_pistolTime = 0; //0: switch rifle/melee instantly and update gear @@ -22,181 +15,117 @@ dz_switchWeapon_pistolTime = 0; //2: switch to rifle //3: switch to pistol //4: switch to melee -dz_fn_switchWeapon = -{ - if (vehicle player != player) exitWith {}; +dz_fn_switchWeapon = { + if Player_IsInVehicle exitWith {}; if Player_IsOnLadder() exitWith {}; if (dayz_autoRun) then {call dayz_autoRunOff;}; - if (dayz_isSwimming) exitWith {}; - private ["_current","_primary","_secondary","_swapWeapons"]; + private ["_current","_secondary","_option"]; + _option = _this; _current = currentWeapon player; - switch _this do - { - //Instantly switch primary and carry, also update gear - case 0: - { - if (IS_PRIMARY(_current)) then - { true call dz_fn_switchWeapon_swap; } - else - { false call dz_fn_switchWeapon_swap; }; - - /*call _swapWeapons; - if (IS_PRIMARY(_current)) then - { player selectWeapon primaryWeapon player; };*/ - + call { + if (_option == 0) exitWith { // Instantly switch primary and carry, also update gear + if (IS_PRIMARY(_current)) then {true call dz_fn_switchWeapon_swap;} else {false call dz_fn_switchWeapon_swap;}; [[(findDisplay 106)],"onLBSelChanged"] execVM "\z\addons\dayz_code\system\handleGear.sqf"; }; - //Switch primary and carry - case 1: - { - if (dayz_quickSwitch) then - { + if (_option == 1) exitWith { //Switch primary and carry + if (dayz_quickSwitch) then { true call dz_fn_switchWeapon_swap; - #ifdef BANDAID - call dayz_meleeMagazineCheck; - #endif - } - else - { call dz_fn_switchWeapon_swapSecure; }; + } else { + call dz_fn_switchWeapon_swapSecure; + }; }; - //Switch to rifle - case 2: - { - //No current weapon - if (_current == "") exitWith - { - switch FIND_RIFLE() do - { - //In primary - case 1: - { + if (_option == 2) exitWith { // Switch to rifle + if (_current == "") exitWith { // No current weapon + switch FIND_RIFLE do { + case 1: { //In primary player selectWeapon primaryWeapon player; }; - - //On back - case 2: - { + case 2: { //On back true call dz_fn_switchWeapon_swap; }; }; }; - - //Current weapon is primary - if (IS_PRIMARY(_current)) exitWith - { - //if current is melee and on back is rifle - if (IS_MELEE(_current) && { !IS_MELEE(dayz_onBack) }) then - { - if (dayz_quickSwitch) then - { true call dz_fn_switchWeapon_swap; } - else - { call dz_fn_switchWeapon_swapSecure; }; + if (IS_PRIMARY(_current)) exitWith { // Current weapon is primary + if (IS_MELEE(_current) && {!IS_MELEE(dayz_onBack)}) then { // if current is melee and on back is rifle + if (dayz_quickSwitch) then { + true call dz_fn_switchWeapon_swap; + } else { + call dz_fn_switchWeapon_swapSecure; + }; }; }; - - //Current is pistol - switch FIND_RIFLE() do - { - //In primary - case 1: - { - if (Player_GetStance() == Player_GetStance_PRONE) then - { player playMoveNow "AmovPpneMstpSrasWrflDnon"; }; + // Default: Current is pistol + switch FIND_RIFLE do { + case 1: { //In primary + if (Player_GetStance() == Player_GetStance_PRONE) then { + player playMoveNow "AmovPpneMstpSrasWrflDnon"; + }; player selectWeapon primaryWeapon player; }; - - //On back - case 2: - { + case 2: { //On back if (diag_tickTime - dz_switchWeapon_pistolTime < 1) exitWith {}; - if (Player_GetStance() == Player_GetStance_PRONE) then - { player playMoveNow "AmovPpneMstpSrasWrflDnon"; }; + if (Player_GetStance() == Player_GetStance_PRONE) then { + player playMoveNow "AmovPpneMstpSrasWrflDnon"; + }; true call dz_fn_switchWeapon_swap; }; }; }; - //Switch to pistol - case 3: - { - //If current weapon is primary - if (IS_PRIMARY(_current)) then - { + if (_option == 3) exitWith { //Switch to pistol + if (IS_PRIMARY(_current)) then { //If current weapon is primary _secondary = Player_GetSidearm(); - if (!isNil "_secondary") then - { + if (!isNil "_secondary") then { player selectWeapon _secondary; dz_switchWeapon_pistolTime = diag_tickTime; }; }; }; - - //Switch to melee - case 4: - { - //No current weapon - if (_current == "") exitWith - { - switch FIND_MELEE() do - { - //In primary - case 1: - { + if (_option == 4) exitWith { //Switch to melee or onBack + if (_current == "") exitWith { //No current weapon + switch FIND_MELEE do { + case 1: { //In primary player selectWeapon primaryWeapon player; }; - - //On back - case 2: - { + case 2: { //On back true call dz_fn_switchWeapon_swap; - #ifdef BANDAID - call dayz_meleeMagazineCheck; - #endif }; }; }; - - //Current weapon is primary - if (IS_PRIMARY(_current)) exitWith - { - //if current is rifle and on back is melee OR two rifles are allowed - if ((!IS_MELEE(_current) && { IS_MELEE(dayz_onBack) }) or (DZE_TwoPrimaries > 1)) then - { - if (dayz_quickSwitch) then - { + if (IS_PRIMARY(_current)) exitWith { //Current weapon is primary + if ((!IS_MELEE(_current) && { IS_MELEE(dayz_onBack) }) or (DZE_TwoPrimaries > 1)) then { //if current is rifle and on back is melee OR two rifles are allowed + if (dayz_quickSwitch) then { true call dz_fn_switchWeapon_swap; - #ifdef BANDAID - call dayz_meleeMagazineCheck; - #endif - } - else - { call dz_fn_switchWeapon_swapSecure; }; + } else { + call dz_fn_switchWeapon_swapSecure; + }; }; }; - - //Current is pistol - //Find melee weapon - switch FIND_MELEE() do - { - //In primary - case 1: - { - player selectWeapon primaryWeapon player; - if (Player_GetStance() == Player_GetStance_PRONE) then - { player playMoveNow "AmovPpneMstpSrasWrflDnon"; }; + // Default: Current is pistol + if (DZE_TwoPrimaries > 1 && {!IS_MELEE(dayz_onBack)}) exitWith { // Allow switching to on back rifle if DZE_TwoPrimaries = 2. + if (dayz_quickSwitch) then { + true call dz_fn_switchWeapon_swap; + } else { + call dz_fn_switchWeapon_swapSecure; + }; }; - - //On back - case 2: - { + switch FIND_MELEE do { // Find melee weapon + case 1: { // In primary + player selectWeapon primaryWeapon player; + if (Player_GetStance() == Player_GetStance_PRONE) then { + player playMoveNow "AmovPpneMstpSrasWrflDnon"; + }; + }; + case 2: { // On back if (diag_tickTime - dz_switchWeapon_pistolTime < 1) exitWith {}; - if (Player_GetStance() == Player_GetStance_PRONE) then - { player playMoveNow "AmovPpneMstpSrasWrflDnon"; }; + if (Player_GetStance() == Player_GetStance_PRONE) then { + player playMoveNow "AmovPpneMstpSrasWrflDnon"; + }; true call dz_fn_switchWeapon_swap; }; }; @@ -204,90 +133,46 @@ dz_fn_switchWeapon = }; }; -//See FIND_RIFLE() and FIND_MELEE() -dz_fn_switchWeapon_find = -{ +//See FIND_RIFLE and FIND_MELEE +dz_fn_switchWeapon_find = { + private "_primary"; _primary = primaryWeapon player; - - if (_primary != "" && { _this == MELEE(_primary) }) - exitWith { 1 }; - - if (dayz_onBack != "" && { _this == MELEE(dayz_onBack) }) - exitWith { 2 }; - - 0 + if (_primary != "" && { _this == MELEE(_primary) }) exitWith { 1 }; + if (dayz_onBack != "" && { _this == MELEE(dayz_onBack) }) exitWith { 2 }; + 0 // Default }; //Swaps rifle / melee instantly without animation -dz_fn_switchWeapon_swap = -{ - if (dayz_onBack == "") then - { +dz_fn_switchWeapon_swap = { + if (dayz_onBack == "") then { //Must be in a single statement to ensure atomicity in the scheduled environment. - dayz_onBack = - [ - primaryWeapon player, - player removeWeapon primaryWeapon player - ] select 0; - } - else - { - dayz_onBack = - [ - primaryWeapon player, - player removeWeapon primaryWeapon player, - player addWeapon dayz_onBack - ] select 0; + dayz_onBack = [primaryWeapon player,player removeWeapon primaryWeapon player] select 0; + } else { + dayz_onBack = [primaryWeapon player,player removeWeapon primaryWeapon player,player addWeapon dayz_onBack] select 0; }; - if (_this) then - { player selectWeapon primaryWeapon player; }; + if (_this) then { + player selectWeapon primaryWeapon player; + if (IS_MELEE(primaryWeapon player)) then { + call dayz_meleeMagazineCheck; + }; + }; }; //Swaps rifle / melee forcing an animation -dz_fn_switchWeapon_swapSecure = -{ - if (!Mutex_TryLock_Fast(dz_switchWeapon_mutex)) exitWith {}; - +dz_fn_switchWeapon_swapSecure = { + private ["_anim","_array","_str"]; //animation states are in the form "AmovPerc...", "AmovPknl...", "AmovPpne..." - dz_switchWeapon_anim = format - [ - "AmovP%1MstpSrasWrflDnon_AmovP%1MstpSrasWpstDnon", - //Switch on player stance - switch Player_GetStance() do - { - case Player_GetStance_STAND: { "erc" }; - case Player_GetStance_KNEEL: { "knl" }; - case Player_GetStance_PRONE: { "pne" }; - } - ]; + _array = toArray (animationState player); + _str = toString [_array select 5,_array select 6,_array select 7]; + _anim = format["AmovP%1MstpSrasWrflDnon_AmovP%1MstpSrasWpstDnon",_str]; + player playMoveNow _anim; //Add AnimDone event handler to wait until current weapon is put away - dz_switchWeapon_handler = player addEventHandler ["AnimDone", dz_fn_switchWeapon_animDone]; - player playMoveNow dz_switchWeapon_anim; - dz_switchWeapon_time = diag_tickTime; -}; - -dz_fn_switchWeapon_animDone = -{ - //Wait at most TIMEOUT seconds - if (diag_tickTime - dz_switchWeapon_time > TIMEOUT) exitWith - { + dz_switchWeapon_handler = player addEventHandler ["AnimDone", { + + true call dz_fn_switchWeapon_swap; player removeEventHandler ["AnimDone", dz_switchWeapon_handler]; - Mutex_Unlock(dz_switchWeapon_mutex); - }; - - //Check if finished animation is the correct one - if ((_this select 1) != dz_switchWeapon_anim) exitWith {}; - - true call dz_fn_switchWeapon_swap; - - //Remove eventhandler - player removeEventHandler ["AnimDone", dz_switchWeapon_handler]; - Mutex_Unlock(dz_switchWeapon_mutex); - - #ifdef BANDAID - if (IS_MELEE(primaryWeapon player)) then - { call dayz_meleeMagazineCheck; }; - #endif + dz_switchWeapon_handler = nil; + }]; };