From e446603ea2126daa5c6b7101fffba17789aa3508 Mon Sep 17 00:00:00 2001 From: icomrade Date: Tue, 26 Jul 2016 20:51:10 -0400 Subject: [PATCH] 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 --- SQF/dayz_code/compile/fn_damageHandler.sqf | 1 + SQF/dayz_code/compile/player_death.sqf | 1 + .../compile/player_humanityMorph.sqf | 5 +- .../compile/player_projectileNear.sqf | 2 + .../compile/player_weaponFiredNear.sqf | 2 + SQF/dayz_code/system/player_monitor.fsm | 47 ++++++++++--------- SQF/dayz_code/system/player_spawn_2.sqf | 1 + .../system/scheduler/sched_playerActions.sqf | 7 ++- .../compile/server_onPlayerDisconnect.sqf | 5 +- 9 files changed, 45 insertions(+), 26 deletions(-) diff --git a/SQF/dayz_code/compile/fn_damageHandler.sqf b/SQF/dayz_code/compile/fn_damageHandler.sqf index a64b4fd79..9148f6a52 100644 --- a/SQF/dayz_code/compile/fn_damageHandler.sqf +++ b/SQF/dayz_code/compile/fn_damageHandler.sqf @@ -225,6 +225,7 @@ if (_hit in USEC_MinorWounds) then { if (_unit == player) then { //Set player in combat _unit setVariable["startcombattimer", 1]; + _unit setVariable["inCombat", 1, true]; }; //Shake the cam, frighten them! diff --git a/SQF/dayz_code/compile/player_death.sqf b/SQF/dayz_code/compile/player_death.sqf index 0a586f2c9..cad35bdb8 100644 --- a/SQF/dayz_code/compile/player_death.sqf +++ b/SQF/dayz_code/compile/player_death.sqf @@ -65,6 +65,7 @@ player setVariable ["USEC_isCardiac",false,true]; player setVariable ["medForceUpdate",true,true]; player setVariable ["bloodTaken", false, true]; player setVariable ["startcombattimer", 0]; //remove combat timer on death +player setVariable ["inCombat", 0, true]; r_player_unconscious = false; r_player_cardiac = false; _model = typeOf player; diff --git a/SQF/dayz_code/compile/player_humanityMorph.sqf b/SQF/dayz_code/compile/player_humanityMorph.sqf index ba4057dc8..039d10dfa 100644 --- a/SQF/dayz_code/compile/player_humanityMorph.sqf +++ b/SQF/dayz_code/compile/player_humanityMorph.sqf @@ -1,4 +1,4 @@ -private ["_charID","_newmodel","_old","_updates","_humanity","_medical","_worldspace","_zombieKills","_headShots","_humanKills","_combattimeout","_banditKills","_fractures","_wpnType","_ismelee"]; +private ["_charID","_newmodel","_old","_updates","_humanity","_medical","_worldspace","_zombieKills","_headShots","_humanKills","_combattimeout","_inCombat","_banditKills","_fractures","_wpnType","_ismelee"]; //_playerUID = _this select 0; _charID = _this select 1; _model = _this select 2; @@ -24,7 +24,7 @@ _humanKills = player getVariable ["humanKills",0]; _banditKills = player getVariable ["banditKills",0]; _achievements = player getVariable ["Achievements",[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]; _combattimeout = player getVariable["combattimeout",0]; - +_inCombat = player getVariable["inCombat",0]; _ConfirmedHumanKills = player getVariable ["ConfirmedHumanKills",0]; _ConfirmedBanditKills = player getVariable ["ConfirmedBanditKills",0]; _friendlies = player getVariable ["friendlies",[]]; @@ -83,6 +83,7 @@ player setVariable ["characterID",_charID,true]; player setVariable ["worldspace",_worldspace]; player setVariable ["Achievements",_achievements]; player setVariable ["combattimeout",_combattimeout,false]; +player setVariable ["inCombat", _inCombat, true]; player setVariable ["ConfirmedHumanKills",_ConfirmedHumanKills,true]; player setVariable ["ConfirmedBanditKills",_ConfirmedBanditKills,true]; diff --git a/SQF/dayz_code/compile/player_projectileNear.sqf b/SQF/dayz_code/compile/player_projectileNear.sqf index 5bfe9cc5d..b945cd977 100644 --- a/SQF/dayz_code/compile/player_projectileNear.sqf +++ b/SQF/dayz_code/compile/player_projectileNear.sqf @@ -34,6 +34,7 @@ while {(alive _projectile) && !(isNull _projectile) && (_callCount < 85)} do { _isInCombat = _nearVehicle getVariable["startcombattimer",0]; if ((alive _nearVehicle) and _isInCombat == 0) then { _nearVehicle setVariable["startcombattimer", 1]; + _nearVehicle setVariable["inCombat", 1, true]; diag_log("Now in Combat (Player): " + name _unit); }; }; @@ -43,6 +44,7 @@ while {(alive _projectile) && !(isNull _projectile) && (_callCount < 85)} do { _isInCombat = _x getVariable["startcombattimer",0]; if (isPlayer _x and _isInCombat == 0 and alive _x) then { _x setVariable["startcombattimer", 1]; + _x setVariable["inCombat", 1, true]; diag_log("Now in Combat (Crew): " + name _x); }; } forEach (crew _nearVehicle); diff --git a/SQF/dayz_code/compile/player_weaponFiredNear.sqf b/SQF/dayz_code/compile/player_weaponFiredNear.sqf index a9490c0d2..1c9dc4f86 100644 --- a/SQF/dayz_code/compile/player_weaponFiredNear.sqf +++ b/SQF/dayz_code/compile/player_weaponFiredNear.sqf @@ -22,8 +22,10 @@ private ["_handled"]; // Both the firer and those nearby (<=8m) go into "combat" to prevent ALT-F4 //diag_log ("DEBUG: AMMO TYPE: " +str(_ammo)); _firer setVariable["startcombattimer", 1]; + _firer setVariable["inCombat", 1, true]; if (_distance <= 8) then { _unit setVariable["startcombattimer", 1]; + _unit setVariable["inCombat", 1, true]; }; if (_inVehicle) exitWith {}; diff --git a/SQF/dayz_code/system/player_monitor.fsm b/SQF/dayz_code/system/player_monitor.fsm index c62d39fc4..0430a5877 100644 --- a/SQF/dayz_code/system/player_monitor.fsm +++ b/SQF/dayz_code/system/player_monitor.fsm @@ -32,7 +32,7 @@ item27[] = {"ERROR__Bad_Versi",2,250,325.000000,850.000000,425.000000,900.000000 item28[] = {"Display_Ready",4,218,-175.000000,1200.000000,-75.000000,1250.000000,0.000000,"Display" \n "Ready"}; item29[] = {"Preload_Display",2,250,-75.000000,1250.000000,25.000000,1300.000000,0.000000,"Preload" \n "Display"}; item30[] = {"Preload_Done",4,218,-175.000000,1300.000000,-75.000000,1350.000000,0.000000,"Preload" \n "Done"}; -item31[] = {"Initialize",2,250,-75.000000,1350.000000,25.000000,1400.000000,0.000000,"Initialize"}; +item31[] = {"Initialize",2,4346,-75.000000,1350.000000,25.000000,1400.000000,0.000000,"Initialize"}; item32[] = {"Finish",1,250,-75.000000,1625.000000,25.000000,1675.000000,0.000000,"Finish"}; item33[] = {"no_Time_Date",4,218,125.000000,950.000000,225.000000,1000.000000,0.000000,"no Time/Date"}; item34[] = {"sleep",4,218,525.000000,150.000000,625.000000,200.000000,0.000000,"sleep"}; @@ -108,7 +108,7 @@ item103[] = {"",7,210,-279.000000,371.000000,-271.000000,379.000000,0.000000,""} item104[] = {"retry_Login",4,218,-250.000000,350.000000,-150.000000,400.000000,0.000000,"retry Login"}; item105[] = {"",7,210,-379.000031,471.000000,-371.000000,479.000000,0.000000,""}; item106[] = {"Finish_1",2,250,-75.000000,1500.000000,25.000000,1550.000000,0.000000,"Finish"}; -item107[] = {"dayz_preloadFini",4,4314,50.000000,1550.000000,150.000000,1600.000000,0.000000,"dayz_preloadFinished"}; +item107[] = {"dayz_preloadFini",4,218,50.000000,1550.000000,150.000000,1600.000000,0.000000,"dayz_preloadFinished"}; item108[] = {"New_INFECTED_Character",4,218,-271.606934,571.673645,-171.606934,621.673645,5.000000,"New" \n "INFECTED Character" \n "258"}; item109[] = {"Player_Zombie__S",2,250,-611.348511,641.870300,-521.348145,691.870300,0.000000,"Player Zombie" \n " Selection"}; item110[] = {"",7,210,-955.744385,664.969482,-947.744385,672.969482,0.000000,""}; @@ -243,8 +243,8 @@ link127[] = {107,32}; link128[] = {108,109}; link129[] = {109,110}; link130[] = {110,64}; -globals[] = {0.000000,0,0,0,0,640,480,3,262,6316128,1,-633.732300,669.877075,2180.669678,358.546051,890,1244,1}; -window[] = {2,-1,-1,-1,-1,786,260,1280,260,3,908}; +globals[] = {0.000000,0,0,0,0,640,480,3,262,6316128,1,-420.384094,456.528290,1882.460693,656.753967,890,1244,1}; +window[] = {2,-1,-1,-32000,-32000,1270,1052,2072,744,3,908}; *//*%FSM*/ class FSM { @@ -732,7 +732,7 @@ class FSM "_worldspace = PVCDZ_plr_Login2 select 0;" \n "_state = PVCDZ_plr_Login2 select 1;" \n "" \n - "player setVariable [""Achievements"",[],false];" \n + "player setVariable [""Achievements"",[],false];" \n "" \n "_setDir = _worldspace select 0;" \n "_setPos = _worldspace select 1;" \n @@ -864,6 +864,7 @@ class FSM "r_player_cardiac = player getVariable[""USEC_isCardiac"",false];" \n "r_player_lowblood = player getVariable[""USEC_lowBlood"",false];" \n "r_player_blood = player getVariable[""USEC_BloodQty"",r_player_bloodTotal];" \n + "r_player_timeout = player getVariable[""unconsciousTime"",0];" \n "" \n "//Hunger/Thirst" \n "_messing = player getVariable[""messing"",[0,0,0]];" \n @@ -1136,13 +1137,12 @@ class FSM "//Medical" \n "dayz_medicalH = [] execVM ""\z\addons\dayz_code\medical\init_medical.sqf""; //Medical Monitor Script (client only)" \n "[player] call fnc_usec_damageHandle;" \n + "" \n "if (r_player_unconscious) then {" \n - " r_player_timeout = player getVariable[""unconsciousTime"",0];" \n " player playActionNow ""Die"";" \n + " [player,r_player_timeout] call fnc_usec_damageUnconscious;" \n "};" \n "" \n - "" \n - "" \n "//Add core tools" \n "player addWeapon ""Loot"";" \n "if ((currentWeapon player == """")) then { player action [""SWITCHWEAPON"", player,player,1]; };" \n @@ -1170,8 +1170,7 @@ class FSM "" \n "{ _x call fnc_veh_ResetEH; } forEach vehicles;" \n "player allowDamage true;" \n - "player enableSimulation true;" \n - ""/*%FSM*/; + "player enableSimulation true;"/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { @@ -1195,9 +1194,9 @@ class FSM name = "Finish"; itemno = 32; init = /*%FSM*/"diag_log 'player_forceSave called from fsm';" \n - "//call player_forceSave;" \n - "" \n - "publicVariableServer ""PVDZ_plr_LoginRecord"";"/*%FSM*/; + "//call player_forceSave;" \n + "" \n + "publicVariableServer ""PVDZ_plr_LoginRecord"";"/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { @@ -1934,22 +1933,28 @@ class FSM name = "Finish_1"; itemno = 106; init = /*%FSM*/"if (_debug == 1) then {diag_log [diag_tickTime,'Finish'];};" \n - "" \n - "PVDZ_plr_LoginRecord = [_playerUID,_charID,0,toArray (name vehicle player)];" \n - "" \n + "" \n + "PVDZ_plr_LoginRecord = [_playerUID,_charID,0,toArray (name vehicle player)];" \n + "" \n + "if (r_player_unconscious) then {" \n + " r_player_timeout = player getVariable[""unconsciousTime"",0];" \n + " player playActionNow ""Die"";" \n + " [player,r_player_timeout] call fnc_usec_damageUnconscious;" \n + "};" \n + "" \n "progressLoadingScreen 1;" \n - "" \n + "" \n "diag_log ['Sent to server: PVDZ_plr_LoginRecord', PVDZ_plr_LoginRecord]; " \n "" \n - "_world = toUpper(worldName); //toUpper(getText (configFile >> ""CfgWorlds"" >> (worldName) >> ""description""));" \n + "_world = toUpper(worldName); //toUpper(getText (configFile >> ""CfgWorlds"" >> (worldName) >> ""description""));" \n "_nearestCity = nearestLocations [getPos player, [""NameCityCapital"",""NameCity"",""NameVillage"",""NameLocal""],1000];" \n "" \n - "Dayz_logonTown = ""Wilderness"";" \n + "Dayz_logonTown = ""Wilderness"";" \n "if (count _nearestCity > 0) then {Dayz_logonTown = text (_nearestCity select 0)};" \n "" \n - "[_world,Dayz_logonTown,format[localize ""str_player_06"",dayz_Survived]] spawn {uiSleep 5; _this spawn BIS_fnc_infoText;};" \n + "[_world,Dayz_logonTown,format[localize ""str_player_06"",dayz_Survived]] spawn {uiSleep 5; _this spawn BIS_fnc_infoText;};" \n "" \n - "dayz_myPosition = getPosATL player;" \n + "dayz_myPosition = getPosATL player;" \n "Dayz_loginCompleted = true;" \n "" \n "//Other Counters" \n diff --git a/SQF/dayz_code/system/player_spawn_2.sqf b/SQF/dayz_code/system/player_spawn_2.sqf index 475bc3413..26cbca185 100644 --- a/SQF/dayz_code/system/player_spawn_2.sqf +++ b/SQF/dayz_code/system/player_spawn_2.sqf @@ -361,6 +361,7 @@ while {1 == 1} do { _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 diff --git a/SQF/dayz_code/system/scheduler/sched_playerActions.sqf b/SQF/dayz_code/system/scheduler/sched_playerActions.sqf index 9f0109dbd..25721e7cb 100644 --- a/SQF/dayz_code/system/scheduler/sched_playerActions.sqf +++ b/SQF/dayz_code/system/scheduler/sched_playerActions.sqf @@ -5,6 +5,11 @@ sched_playerActions = { call fnc_usec_selfActions; call fnc_usec_damageActions; call fnc_usec_upgradeActions; - + + //combat check + if ((player getVariable ["combattimeout",0] < diag_tickTime) && {player getVariable ["inCombat", 0] > 0}) then { + player setVariable ["inCombat", 0, true]; + }; + objNull }; diff --git a/SQF/dayz_server/compile/server_onPlayerDisconnect.sqf b/SQF/dayz_server/compile/server_onPlayerDisconnect.sqf index 2269a2c52..56222dc19 100644 --- a/SQF/dayz_server/compile/server_onPlayerDisconnect.sqf +++ b/SQF/dayz_server/compile/server_onPlayerDisconnect.sqf @@ -25,6 +25,7 @@ _characterID = _playerObj getVariable["characterID", "?"]; _lastDamage = _playerObj getVariable["noatlf4",0]; _Sepsis = _playerObj getVariable["USEC_Sepsis",false]; _lastDamage = round(diag_ticktime - _lastDamage); +_inCombat = _playerObj getVariable ["inCombat", 0]; //Readded Logout debug info. diag_log format["INFO - Player: %3(UID:%1/CID:%2) as (%4), logged off at %5%6", @@ -64,12 +65,12 @@ if (_characterID != "?") exitwith { }; //Punish combat log - if ((_lastDamage > 5 && {_lastDamage < 30}) && {alive _playerObj && (_playerObj distance (getMarkerpos "respawn_west") >= 2000)}) then { + if ((_inCombat > 0) && {alive _playerObj && (_playerObj distance (getMarkerpos "respawn_west") >= 2000)}) then { _playerObj setVariable ["NORRN_unconscious",true,true]; // Set status to unconscious _playerObj setVariable ["unconsciousTime",150,true]; // Set knock out timer to 150 seconds //_playerObj setVariable ["USEC_injured",true]; // Set status to bleeding //_playerObj setVariable ["USEC_BloodQty",3000]; // Set blood to 3000 - diag_log format["PLAYER COMBAT LOGGED: %1(%4) (with %2s combat time remaining) at location %3",_playerName,_lastDamage,_playerPos,_playerUID]; + diag_log format["PLAYER COMBAT LOGGED: %1(%3) at location %2",_playerName,_playerPos,_playerUID]; _message = format["PLAYER COMBAT LOGGED: %1",_playerName]; [nil, nil, rTitleText, _message, "PLAIN"] call RE; // Message whole server };