Files
DayZ-Epoch/SQF/dayz_code/compile/player_switchModel.sqf
A Man 876e264e33 Fix change clothes and login over sea level
This also aims for the fix that the player still gets damaged while in debug. It looks like that allowDamage gets lifted when it should not. fn_exitSwim set too early the damage true which can be a problem. Ive decided to remove the handled damage from fn_exitSwim and set allowDamage always false before we enter this function.
This needs intensive testing to be sure it works without any new problems.

Thx to ndavalos and iben.
2022-04-16 17:20:28 +02:00

208 lines
7.3 KiB
Plaintext

private ["_weapons","_isArray","_backpackWpn","_backpackMag","_currentWpn","_isWeapon","_isMagazine","_countr","_class","_position","_dir","_currentAnim","_playerUID","_countMags","_magazines","_primweapon","_secweapon","_newBackpackType","_muzzles","_oldUnit","_group","_newUnit","_oldGroup","_idc","_display","_switchUnit","_leader","_currentCamera"];
_isArray = typeName _this == "ARRAY";
_class = if (_isArray) then {_this select 0} else {_this};
if (gear_done) then {disableUserInput true;disableUserInput true;};
disableSerialization;
_position = [player] call FNC_GetPos;
_dir = getDir player;
_currentAnim = animationState player;
_currentCamera = cameraView;
_playerUID = getPlayerUID player;
//BackUp Weapons and Mags
_weapons = weapons player;
_countMags = call player_countMagazinesWBackpack; //magazines player;
if (typeName _countMags != "ARRAY") exitWith {localize "str_actions_switchmodel_fail" call dayz_rollingMessages;};
_magazines = _countMags select 0;
if ((_playerUID == dayz_playerUID) && (count _magazines == 0) && (count (magazines player) > 0)) exitWith {
localize "str_actions_switchmodel_fail" call dayz_rollingMessages;
if (gear_done) then {
(findDisplay 106) closeDisplay 0; closeDialog 0;
disableUserInput false;disableUserInput false;disableUserInput false;disableUserInput false;
};
};
_primweapon = primaryWeapon player;
_secweapon = secondaryWeapon player;
if (!(_primweapon in _weapons) && _primweapon != "") then {
_weapons set [count _weapons, _primweapon];
};
if (!(_secweapon in _weapons) && _secweapon != "") then {
_weapons set [count _weapons, _secweapon];
};
//BackUp Backpack
dayz_myBackpack = unitBackpack player;
_newBackpackType = typeOf dayz_myBackpack;
if (_newBackpackType != "") then {
_backpackWpn = getWeaponCargo unitBackpack player;
_backpackMag = _countMags select 1;
};
_currentWpn = currentWeapon player;
_muzzles = getArray(configFile >> "cfgWeapons" >> _currentWpn >> "muzzles");
if (count _muzzles > 1) then {_currentWpn = currentMuzzle player;};
//Secure Player for Transformation
//player setPosATL dayz_spawnPos;
//Prevent client crash
_display = findDisplay 106;
_display closeDisplay 0;
//BackUp Player Object
_oldUnit = player;
_oldGroup = group player;
_leader = (player == leader _oldGroup);
/***********************************/
//DONT USE player AFTER THIS POINT
/***********************************/
//Create New Character
//[player] joinSilent grpNull;
_group = createGroup west;
_newUnit = _group createUnit [_class,respawn_west_original,[],0,"NONE"];
_newUnit allowDamage false;
if (_isArray) then {
mydamage_eh1 = _newUnit addEventHandler ["handleDamage", {0}];
_newUnit setVariable ["characterID",(_this select 1),true];
_newUnit setVariable ["humanity",(_this select 2),true];
_newUnit setVariable ["zombieKills",(_this select 3),true];
_newUnit setVariable ["headShots",(_this select 4),true];
_newUnit setVariable ["humanKills",(_this select 5),true];
_newUnit setVariable ["banditKills",(_this select 6),true];
};
_newUnit setDir _dir;
{_newUnit removeMagazine _x;} count magazines _newUnit;
removeAllWeapons _newUnit;
removeAllItems _newUnit;
removebackpack _newUnit;
//Equip New Character
{
if (typeName _x == "ARRAY") then {if (count _x > 0) then {_newUnit addMagazine [_x select 0,_x select 1]; }; } else { _newUnit addMagazine _x; };
} count _magazines;
{_newUnit addWeapon _x;} count _weapons;
//Check and Compare it
if (str(_weapons) != str(weapons _newUnit)) then {
//Get Differecnce
{_weapons = _weapons - [_x];} count (weapons _newUnit);
//Add the Missing
{_newUnit addWeapon _x;} count _weapons;
};
if (_primweapon != (primaryWeapon _newUnit)) then {
_newUnit addWeapon _primweapon;
};
if (_secweapon != (secondaryWeapon _newUnit) && _secweapon != "") then {
_newUnit addWeapon _secweapon;
};
_switchUnit = {
//Make New Unit Playable (1 of these 3 commands causes crashes with gear dialog open)
addSwitchableUnit _newUnit;
setPlayable _newUnit;
selectPlayer _newUnit;
//Switch the units
_rndx = floor(random 100);
_rndy = floor(random 100);
_oldUnit setPosATL [(respawn_west_original select 0) + _rndx, (respawn_west_original select 1) + _rndy, 0];
if (surfaceIsWater _position) then {
_newUnit setPosASL _position;
} else {
_newUnit setPosATL _position;
};
if (surfaceIsWater respawn_west_original) then {_newUnit call fn_exitSwim;};
removeAllWeapons _oldUnit;
{_oldUnit removeMagazine _x;} count magazines _oldUnit;
if !(isNull _oldUnit) then {deleteVehicle _oldUnit;};
if (!isNil "dayz_groupInit" && count (units _oldGroup) > 0) then {
[_newUnit] joinSilent _oldGroup;
if (count (units _group) == 0) then {deleteGroup _group;};
if (_leader) then {
//Request new leader promote player back to leader (group is local to leader)
PVDZ_Server_UpdateGroup = [-1,player];
publicVariableServer "PVDZ_Server_UpdateGroup";
};
};
if (count (units _oldGroup) == 0) then {deleteGroup _oldGroup;};
if (_currentWpn != "") then {_newUnit selectWeapon _currentWpn;};
};
//Add and Fill BackPack
if (!isNil "_newBackpackType" && {_newBackpackType != ""}) then {
_newUnit addBackpack _newBackpackType;
//_oldBackpack = dayz_myBackpack;
dayz_myBackpack = unitBackpack _newUnit;
call _switchUnit;
if (gear_done) then {sleep 0.001;};
["1"] call gearDialog_create;
if (gear_done) then {sleep 0.001;};
_countr = 0;
{
_isArray = typeName _x == "ARRAY";
if (_isArray) then {
_isWeapon = isClass (configFile >> "CfgWeapons" >> (_x select 0));
_isMagazine = isClass (configFile >> "CfgMagazines" >> (_x select 0));
} else {
_isWeapon = isClass (configFile >> "CfgWeapons" >> _x);
_isMagazine = isClass (configFile >> "CfgMagazines" >> _x);
};
if (!_isWeapon || (_isWeapon && _isMagazine)) then {
_countr = _countr + 1;
if (_isArray) then {
if (_x select 1 > 0) then { //Javelin rockets in BP returns ["Javelin", 0],"Javelin". Dupe on relog -> # real Javs + 1 per skin change
dayz_myBackpack addMagazineCargoGlobal [_x select 0, 1];
_idc = 4999 + _countr;
_idc setIDCAmmoCount (_x select 1);
};
} else {
dayz_myBackpack addMagazineCargoGlobal [_x, 1];
};
};
} count _backpackMag;
(findDisplay 106) closeDisplay 0;
[_backpackWpn,[],[],dayz_myBackpack] call fn_addCargo;
} else {
call _switchUnit;
};
if (gear_done) then {disableUserInput false;disableUserInput false;disableUserInput false;disableUserInput false;};
//Debug Message
/*
diag_log "Swichtable Unit Created. Equipment:";
diag_log format["Weapons: %1",weapons _newUnit];
diag_log format["Magazines: %1",magazines _newUnit];
diag_log format["Backpack weapons: %1",getWeaponCargo unitBackpack _newUnit];
diag_log format["Backpack magazines: %1",getMagazineCargo unitBackpack _newUnit];
*/
player switchCamera _currentCamera;
if (_currentWpn != "") then {_newUnit selectWeapon _currentWpn;};
[objNull, player, rSwitchMove, _currentAnim] call RE;
//dayz_originalPlayer attachTo [_newUnit];
player disableConversation true;
player setVariable ["BIS_noCoreConversations",true];
// _playerUID=getPlayerUID player;
// _playerObjName = format["player%1",_playerUID];
// call compile format["%1 = player;",_playerObjName];
// publicVariable _playerObjName;
call dayz_meleeMagazineCheck;
{player reveal _x} count (nearestObjects [_position,["AllVehicles","WeaponHolder","Land_A_tent","BuiltItems","ModularItems","DZE_Base_Object"],75]);