mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-13 19:52:38 +03:00
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.
This commit is contained in:
@@ -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;
|
||||
}];
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user