Files
DayZ-Epoch/SQF/dayz_code/system/player_spawn_2.sqf
icomrade e446603ea2 Fix combat logging
In the initialize section of the fsm r_player_unconscious and
r_player_timeout return their default values (false and 0). Also, the
Vanilla server-side combat check doesn't appear to work, or it doesn't
work with the antihack disabled (I haven't tested with it enabled).

New variable inCombat is set more quickly than the combatTimeout
variable
2016-07-26 20:51:10 -04:00

455 lines
14 KiB
Plaintext

private ["_hunger","_thirst","_timeOut","_result","_randomSpot","_distance","_mylastPos","_lastTemp","_rnd","_messTimer","_PlayerNearby","_ZedsNearby","_saveTime"];
disableSerialization;
_timeOut = 0;
_messTimer = 0;
_lastTemp = dayz_temperatur;
_debug = getMarkerpos "respawn_west";
_isPZombie = player isKindOf "PZombie_VB";
_radTimer = 0;
_timer = diag_tickTime;
_timer1 = diag_tickTime;
_spawnCheck = diag_tickTime;
_timer2 = diag_Ticktime;
_timer5 = diag_Ticktime;
_timer10 = diag_Ticktime;
_timer30 = diag_Ticktime;
_timer150 = diag_ticktime;
_forceHumanity = false;
_runonce = false;
_timerMonitor = diag_ticktime;
player setVariable ["temperature",dayz_temperatur,true];
player setVariable["friendlies",DZE_Friends,true];
[player,0] call player_humanityChange;
//player addMagazine "Hatchet_swing";
//player addWeapon "MeleeHatchet";
while {1 == 1} do {
_start = diag_tickTime;
//Initialize
_refObj = vehicle player;
_size = (sizeOf typeOf _refObj) * 0.6;
_vel = velocity player;
_speed = round((_vel distance [0,0,0]) * 3.5);
_saveTime = (playersNumber west * 2) + 10;
//reset rating always
if (((rating player) > 0) or ((rating player) < 0)) then {
player setUnitRank "PRIVATE";
};
dayz_myLoad = (((count dayz_myBackpackMags) * 0.2) + (count dayz_myBackpackWpns)) + (((count dayz_myMagazines) * 0.1) + (count dayz_myWeapons * 0.5));
//reset position
_randomSpot = true;
_tempPos = getPosATL player;
_distance = _debug distance _tempPos;
if (_distance < 2000) then {
_randomSpot = false;
};
_distance = [0,0,0] distance _tempPos;
if (_distance < 500) then {
_randomSpot = false;
};
if (!isNil "_mylastPos") then {
_distance = _mylastPos distance _tempPos;
if (_distance > 400) then {
_randomSpot = false;
};
};
if (_randomSpot) then {
_mylastPos = _tempPos;
};
if (!isNil "_mylastPos") then {
dayz_mylastPos = _mylastPos;
};
dayz_areaAffect = _size;
if (_speed > 0.1) then {
_timeOut = _timeOut + 1;
};
if (_timeOut > 150) then {
_humanity = player getVariable ["humanity",0];
if (_humanity < 1 or _forceHumanity) then {
if (vehicle player != player) then {
[player, round(_timeOut / 10)] call player_humanityChange;
_forceHumanity = false;
} else {
_humanity = _humanity + round(_timeOut / 10);
player setVariable["humanity",_humanity,true];
_forceHumanity = true;
};
};
_timeOut = 0;
};
/*
if ((Dayz_loginCompleted) && (diag_tickTime < 25)) then {
[player,0] call player_humanityChange;
diag_log ("Running");
_timer10 = diag_Ticktime;
};
*/
//reset OpenTarget variable if the timer has run out.
if (OpenTarget_Time > 0 && {diag_tickTime - OpenTarget_Time >= dayz_OpenTarget_TimerTicks}) then
{
player setVariable ["OpenTarget",false,true];
};
if ((diag_tickTime - _timer150) > 60) then {
//Digest Food.
if (r_player_foodstack > 0) then { r_player_foodstack = r_player_foodstack - 1; };
_timer150 = diag_ticktime;
};
if ((diag_tickTime - _timer) > 300) then {
_timer = diag_tickTime;
};
//Every 30 seconds force the client to update the server of all medical Values
if ((diag_tickTime - _timer30) > 30) then {
[] spawn {
_medical = player call player_sumMedical;
PVDZ_playerMedicalSync = [player,_medical];
publicVariableServer "PVDZ_playerMedicalSync";
};
_timer30 = diag_tickTime;
};
//Record Check
_lastUpdate = diag_ticktime - dayZ_lastPlayerUpdate;
if (_lastUpdate > 8) then {
//POSITION?
_distance = dayz_myPosition distance player;
if (_distance > 10) then {
//Player has moved
dayz_myPosition = getPosATL player;
// Check for radiation
DZE_InRadiationZone = false;
_outsideMap = ((dayz_myPosition select 0) < dayz_minpos || (dayz_myPosition select 1) < dayz_minpos || (dayz_myPosition select 0) > dayz_maxpos || (dayz_myPosition select 1) > dayz_maxpos);
if ((_outsideMap || DZE_Quarantine) && {!r_player_dead} && {!isNull (findDisplay 46)} && {player distance (getMarkerPos "respawn_west") > 15}) then {
DZE_InRadiationZone = true;
};
player setVariable["posForceUpdate",true,true];
dayz_unsaved = true;
dayZ_lastPlayerUpdate = diag_ticktime;
};
};
_hunger = (abs((((r_player_bloodTotal - r_player_blood) / r_player_bloodTotal) * 5) + _speed + dayz_myLoad) * 3);
if (diag_ticktime - dayz_panicCooldown < 120) then {
_hunger = _hunger * 2;
};
dayz_hunger = dayz_hunger + (_hunger / 70); //60 Updated to 80
dayz_hunger = (dayz_hunger min SleepFood) max 0;
if (dayz_hunger >= SleepFood) then {
if (r_player_blood < 10) then {
_id = [player,"starve"] spawn player_death;
};
};
//Thirst
_thirst = 2;
if (_refObj == player) then {
_thirst = (_speed + 4) * 3;
};
dayz_thirst = dayz_thirst + (_thirst / 60) * (dayz_temperatur / dayz_temperaturnormal); //TeeChange Temperatur effects added Max Effects: -25% and + 16.6% waterloss
dayz_thirst = (dayz_thirst min SleepWater) max 0;
if (dayz_thirst >= SleepWater) then {
if (r_player_blood < 10) then {
_id = [player,"dehyd"] spawn player_death;
};
};
//diag_log format ["playerSpawn2 %1/%2",dayz_hunger,dayz_thirst];
//Calories
if (dayz_nutrition > 0) then {
_Nutrition = dayz_nutrition;
_hunger = (abs((((r_player_bloodTotal - r_player_blood) / r_player_bloodTotal) * 5) + _speed + dayz_myLoad) * 3);
_thirst = 2; if (_refObj == player) then {_thirst = (_speed + 4) * 3;};
_NutritionLoss = _Nutrition - (((_thirst / 1000) + (_hunger / 1000)) * (dayz_temperatur / dayz_temperaturnormal));
r_player_Nutrition = _NutritionLoss;
} else {
r_player_Nutrition = 0;
};
dayz_nutrition = r_player_Nutrition;
//Temperatur
2 call player_temp_calculation; //2 = sleep time of this loop //TeeChange
if ((_lastTemp - dayz_temperatur) > 0.75 or (_lastTemp - dayz_temperatur) < -0.75 ) then {
player setVariable ["temperature",dayz_temperatur,false];
PVDZ_serverStoreVar = [player,"temperature",dayz_temperatur];
publicVariableServer "PVDZ_serverStoreVar";
_lastTemp = dayz_temperatur;
};
dayz_temperatur = (dayz_temperatur min dayz_temperaturmax) max dayz_temperaturmin;
//can get nearby infection
if (!r_player_infected && !_isPZombie) then {
// Infectionriskstart
if (dayz_temperatur < ((80 / 100) * (dayz_temperaturnormal - dayz_temperaturmin) + dayz_temperaturmin)) then { //TeeChange
{
if (_x getVariable["USEC_infected",false]) then {
_rnd = (random 1) * (((dayz_temperaturnormal - dayz_temperatur) * (100 /(dayz_temperaturnormal - dayz_temperaturmin)))/ 50); //TeeChange
if (_rnd < 0.1) then {
_rnd = random 1;
if (_rnd > 0.7) then {
r_player_infected = true;
//player setVariable["USEC_infected",true];
};
};
};
} count (_mylastPos nearEntities ["CAManBase",12]);
if (dayz_temperatur < ((50 / 100) * (dayz_temperaturnormal - dayz_temperaturmin) + dayz_temperaturmin)) then { //TeeChange
_rnd = (random 1) * (((dayz_temperaturnormal - dayz_temperatur) * (100 /(dayz_temperaturnormal - dayz_temperaturmin)))/ 25); //TeeChange
if (_rnd < 0.05) then {
_rnd = random 1;
if (_rnd > 0.95) then {
r_player_infected = true;
//player setVariable["USEC_infected",true];
};
};
};
};
};
//If has infection reduce blood cough and add shake
if (r_player_infected) then {
if !(player getVariable["USEC_infected",false]) then {
player setVariable["USEC_infected",true,true];
};
if (r_player_blood < 3) then {
_id = [player,"sick"] spawn player_death;
};
};
// Radiation zones rapid blood loss
if (DZE_InRadiationZone) then {
_radsound = "radzone1";
_bloodloss = 10;
if (_radTimer > 5 && _radTimer < 10) then {
_radsound = "radzone2";
_bloodloss = 20;
};
if (_radTimer > 10) then {
_radsound = "radzone3";
_bloodloss = 30;
};
if (_radTimer > 15) then {
_radsound = "radzone4";
_bloodloss = 50;
};
_result = r_player_blood - _bloodloss;
if (_result < 0) then {
_id = [player,"rad"] spawn player_death;
} else {
r_player_blood = _result;
};
addCamShake [2, 1, 25];
[player,_radsound,0,true] call dayz_zombieSpeak;
_radTimer = _radTimer + 1;
} else {
_radTimer = 0;
};
// Regen some blood if player is well fed and resting
// Attention: regen _result must not trigger the "up" arrow of the blood icon
if (r_player_blood < 12000 and dayz_hunger < SleepFood
and dayz_thirst < SleepWater and !r_player_injured
and !r_player_infected and !(r_player_Sepsis select 0)
and !r_player_unconscious) then {
_result = (1-(dayz_hunger + dayz_thirst)/(SleepWater + SleepFood));
switch (1==1) do {
case (_result < 0.25) : {}; // not well fed
case ((toArray(animationState player) select 5) == 112) : { // prone
_result = _result * (1 + 10 * (12000 - r_player_blood) / 12000);
};
case (speed player < 1) : { // still
_result = _result * (1 + 4 * sqrt((12000 - r_player_blood) / 12000));
};
default { // moving
};
};
r_player_bloodregen = r_player_bloodregen + _result;
};
if (r_player_blood > 12000) then {
r_player_blood = 12000;
};
//Record low bloow
_lowBlood = player getVariable ["USEC_lowBlood", false];
if ((r_player_blood < r_player_bloodTotal) and !_lowBlood) then {
player setVariable["USEC_lowBlood",true,true];
};
//Broadcast Hunger/Thirst
_messTimer = _messTimer + 1;
if (_messTimer > 60) then {
_messTimer = 0;
player setVariable ["messing",[dayz_hunger,dayz_thirst,dayz_nutrition],false];
PVDZ_serverStoreVar = [player,"messing",[dayz_hunger,dayz_thirst,dayz_nutrition]];
publicVariableServer "PVDZ_serverStoreVar";
};
//Save Checker
if (dayz_unsaved or ((diag_ticktime - dayz_lastSave) > 300)) then {
if ((diag_ticktime - dayz_lastSave) > _saveTime) then {
PVDZ_plr_Save = [player,nil,false,dayz_playerAchievements];
publicVariableServer "PVDZ_plr_Save";
PVDZ_serverStoreVar = [player,"Achievements",dayz_playerAchievements];
publicVariableServer "PVDZ_serverStoreVar";
player setVariable ["Achievements",dayz_playerAchievements,false];
if (isServer) then {
PVDZ_plr_Save call server_playerSync;
};
dayz_unsaved = false;
dayz_lastSave = diag_ticktime;
};
};
// sort out pickup actions
_isOK = (pickupInit and !canPickup) or (!pickupInit and canPickup);
if (_isOK) then {
if (pickupInit and !canPickup) then {
canPickup = true;
pickupInit = false;
};
} else {
// reset
canPickup = false;
pickupInit = true;
};
_PlayerNearby = false;
_ZedsNearby = false;
if ({isPlayer _x} count (player nearEntities ["AllVehicles", 5]) > 1) then {
_PlayerNearby = true;
};
if (count (player nearEntities ["zZombie_Base", 10]) > 0) then {
_ZedsNearby = true;
};
_startcombattimer = player getVariable["startcombattimer", 0];
if (_startcombattimer == 1) then { //if (_startcombattimer == 1 || _PlayerNearby) then { // do not use _PlayerNearby it makes building impossible, tthis is handled in player_onPause.sqf just fine
player setVariable["combattimeout", diag_tickTime + 30, false];
player setVariable["inCombat", 1, true];
player setVariable["startcombattimer", 0, false];
}; /* else {
if (_ZedsNearby && !_isPZombie) then { //this makes building a nightmare, this is handled in player_onPause.sqf just fine
player setVariable["combattimeout", diag_tickTime + 10, false];
player setVariable["startcombattimer", 0, false];
};
}; */
//setGroupIconsVisible [false,false];
//clearGroupIcons group player;
uiSleep 2;
_myPos = player getVariable["lastPos",[]];
if (count _myPos > 0) then {
player setVariable["lastPos",_mylastPos, true];
player setVariable["lastPos",[]];
};
//Melee Weapons ammo fix
if(isNil {login_ammochecked}) then {
login_ammochecked = true;
_wpnType = primaryWeapon player;
_ismelee = (getNumber (configFile >> "CfgWeapons" >> _wpnType >> "melee") == 1);
if (_ismelee) then {
call dayz_meleeMagazineCheck;
};
};
if ((diag_tickTime - _timer1) > 10) then {
_position = getPosATL player;
//Other Counters
dayz_currentGlobalAnimals = count entities "CAAnimalBase";
dayz_currentGlobalZombies = count entities "zZombie_Base";
_zeds = _position nearEntities ["zZombie_Base",200];
dayz_spawnZombies = 0;
dayz_CurrentNearByZombies = 0;
//Current amounts
{
if (alive _x) then {
if (local _x) then {
dayz_spawnZombies = dayz_spawnZombies + 1;
};
dayz_CurrentNearByZombies = dayz_CurrentNearByZombies + 1;
};
} count _zeds;
//dayz_spawnZombies = {alive _x AND local _x} count (_position nearEntities ["zZombie_Base",400]);
//dayz_CurrentNearByZombies = {alive _x} count (_position nearEntities ["zZombie_Base",400]);
dayz_currentWeaponHolders = count (_position nearObjects ["ReammoBox",200]);
//Remove empty cardborad box's << this needs to be changed moved (action menu or close button)
{
//get contents
_weapons = getWeaponCargo _x;
_magazines = getMagazineCargo _x;
_backpacks = getBackpackCargo _x;
if ((count (_weapons select 0) < 1) and (count (_magazines select 0) < 1) and (count (_backpacks select 0) < 1)) then {
//remove vehicle, Need to ask server to remove.
diag_log format["Deleting empty nearby box: %1",_x];
PVDZ_obj_Delete = [_x,player];
publicVariableServer "PVDZ_obj_Delete";
};
} count (_position nearObjects ["CardboardBox",10]);
_timer1 = diag_tickTime;
};
//Two primary guns pickup exploit fix
if ((DZE_TwoPrimaries < 2) && (primaryWeapon player != "") && (!(primaryWeapon player in MeleeWeapons)) && (dayz_onBack != "") && (!(dayz_onBack in MeleeWeapons)) && (isNull (findDisplay 106)) &&
(animationState player != "amovpknlmstpslowwrfldnon_amovpknlmstpsraswrfldnon" OR animationState player != "amovpercmstpslowwrfldnon_amovpercmstpsraswrfldnon" OR animationState player != "amovpercmstpslowwrfldnon_amovpercmstpsraswrfldnon")) then {
localize "str_player_ammo_2primary" call dayz_rollingMessages;
player playActionNow "stop";
player action ["dropWeapon", player, primaryWeapon player];
//sleep 3;
//["gear"] call player_switchWeapon;
//sleep 1;
};
//Crowbar ammo fix
//"MeleeCrowbar" call dayz_meleeMagazineCheck;
_stop = diag_tickTime;
/*
if ((diag_tickTime - _timerMonitor) > 60) then {
diag_log format ["Loop Monitor - Spawn2: %1, DA: %2, UA: %3, SA: %4",(_stop - _start),(diag_tickTime - (player getVariable "damageActions")),(diag_tickTime - (player getVariable "upgradeActions")),(diag_tickTime - (player getVariable "selfActions"))];
_timerMonitor = diag_ticktime;
};
*/
};