From ae78fde0675241b91fed7acd6fc46d9c701b99d4 Mon Sep 17 00:00:00 2001 From: icomrade Date: Wed, 3 Aug 2016 18:01:22 -0400 Subject: [PATCH] Add coin support to dayz_Server and login New variables: DZE_groupManagement = false; //Enable or disable group management. Enabled by default DZE_MoneyStorageClasses = []; // If using a Single currency system (Z_SingleCurrency = true;), this is an array of object classes players can store coins in if Z_SingleCurrency = true; the hive is now set up to handle coin updates on players, characters, and objects. if DZE_groupManagement = true; the hive is now set up to save groups group and coin variables are set in player_monitor.fsm, for vehicles/objects it's set in the server_monitor.sqf file for objects in the DZE_MoneyStorageClasses array Also, this commit includes a change to the way the hive spawns in vehicles. vehicles are now created at [0,0,0] and moved using setPosATL to their saved position. Thanks for the tip @ndavalos @eraser1 --- SQF/dayz_code/configVariables.sqf | 6 +- SQF/dayz_code/system/player_monitor.fsm | 32 ++++++++--- .../compile/server_playerLogin.sqf | 23 +++++--- SQF/dayz_server/compile/server_playerSync.sqf | 28 ++++++++-- .../compile/server_updateObject.sqf | 55 +++++++++++++++---- SQF/dayz_server/system/server_monitor.sqf | 12 ++-- 6 files changed, 117 insertions(+), 39 deletions(-) diff --git a/SQF/dayz_code/configVariables.sqf b/SQF/dayz_code/configVariables.sqf index 6ad4bb659..a849ab2a4 100644 --- a/SQF/dayz_code/configVariables.sqf +++ b/SQF/dayz_code/configVariables.sqf @@ -46,6 +46,7 @@ timezoneswitch = 0; // Changes murderMenu times with this offset in hours. DZE_SafeZonePosArray = []; //Prevent players in safeZones from being killed if their vehicle is destroyed. Format is [[[3D POS], RADIUS],[[3D POS], RADIUS]]; Ex. DZE_SafeZonePosArray = [[[6325.6772,7807.7412,0],150],[[4063.4226,11664.19,0],150]]; DZE_GemOccurance = [["ItemTopaz",10], ["ItemObsidian",8], ["ItemSapphire",6], ["ItemAmethyst",4], ["ItemEmerald",3], ["ItemCitrine",2], ["ItemRuby",1]]; //Sets how rare each gem is in the order shown when mining (whole numbers only) DZE_GodModeBaseExclude = []; //Array of object class names excluded from the god mode bases feature +DZE_groupManagement = false; //Enable or disable group management. Enabled by default // Advanced Trading DZE_advancedTrading = true; //Use advanced trading system. WARNING: set to false if you use database traders, you should use config-traders anyway! @@ -54,10 +55,11 @@ DZE_GemWorthArray = [["ItemTopaz",15000], ["ItemObsidian",20000], ["ItemSapphire DZE_SaleRequiresKey = false; //Require the player has the key for a vehicle in order to sell it. The key can be in the player's toolbelt or backpack, or the vehicle's inventory. False by default Z_AT_FolderLocation = '\z\addons\dayz_code\actions\AdvancedTrading'; Z_VehicleDistance = 40; // Distance that a vehicle needs to be to see it's content or to sell it. -Z_SingleCurrency = false; // Does your server use a single currency system. Z_AllowTakingMoneyFromBackpack = true; // When buying items with DEFAULT CURRENCY to any inventory. Do you allow the trader to take money from your backpack. Z_AllowTakingMoneyFromVehicle = true; // When buying items with DEFAULT CURRENCY to any inventory. Do you allow the trader to take money from your vehicle. -Z_MoneyVariable = "cashMoney"; // If using a Single currency system, change this to whatever currency you are using. +Z_SingleCurrency = false; // Does your server use a single currency system? +Z_MoneyVariable = "cashMoney"; // If using a Single currency system (Z_SingleCurrency = true;), change this to whatever currency you are using. +DZE_MoneyStorageClasses = []; // If using a Single currency system (Z_SingleCurrency = true;), this is an array of object classes players can store coins in // Plot Management and Plot for Life DZE_permanentPlot = true; // Plot ownership saves after death. Enables Plot for Life by @RimBlock and Plot Management by @DevZupa. diff --git a/SQF/dayz_code/system/player_monitor.fsm b/SQF/dayz_code/system/player_monitor.fsm index 9598f5a36..196eb1e10 100644 --- a/SQF/dayz_code/system/player_monitor.fsm +++ b/SQF/dayz_code/system/player_monitor.fsm @@ -14,7 +14,7 @@ item9[] = {"no_PlayerID",4,218,125.000000,150.000000,225.000000,200.000000,2.000 item10[] = {"ERROR__No_Player",2,250,325.000000,150.000000,425.000000,200.000000,0.000000,"ERROR:" \n "No PlayerID"}; item11[] = {"Request",2,250,-75.000000,350.000000,25.000000,400.000000,0.000000,"Request"}; item12[] = {"Response",4,218,-175.000000,400.000000,-75.000000,450.000000,0.000000,"Response"}; -item13[] = {"Parse_Login",2,250,-66.532227,557.409241,33.467773,607.409241,0.000000,"Parse Login"}; +item13[] = {"Parse_Login",2,4346,-66.532227,557.409241,33.467773,607.409241,0.000000,"Parse Login"}; item14[] = {"Hive_Bad",4,218,125.000000,550.000000,225.000000,600.000000,10.000000,"Hive" \n "Bad"}; item15[] = {"ERROR__Wrong_HIVE",2,250,325.000000,550.000000,425.000000,600.000000,0.000000,"ERROR:" \n "Wrong HIVE" \n "Version"}; item16[] = {"Character_Setup",4,218,-175.000000,600.000000,-75.000000,650.000000,0.000000,"Character" \n "Setup"}; @@ -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,4346,-75.000000,1350.000000,25.000000,1400.000000,0.000000,"Initialize"}; +item31[] = {"Initialize",2,250,-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"}; @@ -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,-420.384094,456.528290,1882.460693,656.753967,890,1244,1}; -window[] = {2,-1,-1,-32000,-32000,1270,1052,2072,744,3,908}; +globals[] = {0.000000,0,0,0,0,640,480,3,262,6316128,1,-888.855957,924.990540,1855.234863,-680.074097,890,1244,1}; +window[] = {2,-1,-1,-1,-1,708,182,1202,182,3,908}; *//*%FSM*/ class FSM { @@ -486,11 +486,19 @@ class FSM "_isHiveOk = false;" \n "_newPlayer = false;" \n "_isInfected = false;" \n + "_mygroup = [];" \n + "_characterCoins = 0;" \n + "_globalCoins = 0;" \n + "_CoinsSpecial = 0;" \n "" \n "if (count _msg > 7) then {" \n " _isHiveOk = _msg select 7;" \n " _newPlayer = _msg select 8;" \n " _isInfected = _msg select 9;" \n + " _mygroup = _msg select 10;" \n + " _characterCoins = _msg select 11;" \n + " _globalCoins = _msg select 12;" \n + " _CoinsSpecial = _msg select 13;" \n " diag_log (""PLAYER RESULT: "" + str(_isHiveOk));" \n "};" \n "" \n @@ -1158,6 +1166,17 @@ class FSM "r_player_bloodtype = player getVariable [""blood_type"", false];" \n "r_player_rh = player getVariable [""rh_factor"", false];" \n "" \n + "if (Z_SingleCurrency) then {" \n + " player setVariable [Z_MoneyVariable, _characterCoins, true];" \n + " player setVariable [""GlobalMoney"", _globalCoins, true];" \n + " player setVariable [""MoneySpecial"", _CoinsSpecial, true];" \n + "};" \n + "" \n + "if (DZE_groupManagement) then {" \n + " player setVariable [""savedGroup"", _mygroup, true];" \n + " player setVariable [""purgeGroup"", 0, true];" \n + "};" \n + "" \n "dayz_musicH = [] spawn player_music;" \n "dayz_slowCheck = [] spawn player_spawn_2;" \n "Dayz_logonTime = daytime;" \n @@ -1936,11 +1955,6 @@ class FSM "" \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 diff --git a/SQF/dayz_server/compile/server_playerLogin.sqf b/SQF/dayz_server/compile/server_playerLogin.sqf index eb4ebddee..e4e79b938 100644 --- a/SQF/dayz_server/compile/server_playerLogin.sqf +++ b/SQF/dayz_server/compile/server_playerLogin.sqf @@ -1,4 +1,4 @@ -private ["_doLoop","_hiveVer","_isHiveOk","_playerID","_playerObj","_primary","_key","_charID","_playerName","_backpack","_isNew","_inventory","_survival","_model","_config","_mags","_wpns","_bcpk","_newPlayer","_isInfected"]; +private ["_playerID","_forEachIndex","_endMission","_0","_1","_timeleft","_doLoop","_key","_primary","_model","_inventory","_backpack","_survival","_CharacterCoins","_group","_playerCoins","_BankCoins","_hiveVer","_mags","_wpns","_bcpk","_config","_isInfected","_remaining","_playerObj","_playerName","_newPlayer","_isNew","_charID","_isHiveOk"]; #include "\z\addons\dayz_server\compile\server_toggle_debug.hpp" @@ -17,6 +17,10 @@ _backpack = []; _survival = [0,0,0]; _model = ""; _isInfected = 0; +_CharacterCoins = 0; +_group = []; +_playerCoins = 0; +_BankCoins = 0; if (_playerID == "") then { _playerID = [_playerObj] call FNC_GetPlayerUID; @@ -78,10 +82,9 @@ if ((_primary select 0) == "ERROR") exitWith { //Process request _newPlayer = _primary select 1; -_isNew = count _primary < 7; //_result select 1; +_isNew = count _primary < 10; //_result select 1; _charID = _primary select 2; //diag_log ("LOGIN RESULT: " + str(_primary)); - /* PROCESS */ _hiveVer = 0; @@ -90,14 +93,20 @@ if (!_isNew) then { _inventory = _primary select 4; _backpack = _primary select 5; _survival = _primary select 6; - _group = _primary select 7; + _CharacterCoins = _primary select 7; _model = _primary select 8; - _hiveVer = _primary select 9; + _group = _primary select 9; + _playerCoins = _primary select 10; + _BankCoins = _primary select 11; + _hiveVer = _primary select 12; if !(_model in AllPlayers) then {_model = "Survivor2_DZ";}; } else { _isInfected = if (DZE_PlayerZed) then {_primary select 3} else {0}; _model = _primary select 4; - _hiveVer = _primary select 5; + _group = _primary select 5; + _playerCoins = _primary select 6; + _BankCoins = _primary select 7; + _hiveVer = _primary select 8; if (isNil "_model") then { _model = "Survivor2_DZ"; } else { @@ -122,7 +131,7 @@ if (!_isNew) then { _isHiveOk = if (_hiveVer >= dayz_hiveVersionNo) then {true} else {false}; //EDITED -PVCDZ_plr_Login = [_charID,_inventory,_backpack,_survival,_isNew,dayz_versionNo,_model,_isHiveOk,_newPlayer,_isInfected]; +PVCDZ_plr_Login = [_charID,_inventory,_backpack,_survival,_isNew,dayz_versionNo,_model,_isHiveOk,_newPlayer,_isInfected,_group,_CharacterCoins,_playerCoins,_BankCoins]; (owner _playerObj) publicVariableClient "PVCDZ_plr_Login"; //Make player wait until ghost timer is up. diff --git a/SQF/dayz_server/compile/server_playerSync.sqf b/SQF/dayz_server/compile/server_playerSync.sqf index 0b89f43f5..ee9816788 100644 --- a/SQF/dayz_server/compile/server_playerSync.sqf +++ b/SQF/dayz_server/compile/server_playerSync.sqf @@ -1,4 +1,4 @@ -private ["_characterID","_temp","_currentWpn","_magazines","_force","_isNewPos","_humanity","_isNewGear","_currentModel","_modelChk","_playerPos","_playerGear","_playerBackp","_backpack","_killsB","_killsH","_medical","_isNewMed","_character","_timeSince","_charPos","_isInVehicle","_distanceFoot","_lastPos","_kills","_headShots","_timeGross","_timeLeft","_onLadder","_isTerminal","_currentAnim","_muzzles","_array","_key","_lastTime","_config","_currentState","_name"]; +private ["_debug","_distance","_distanceFoot","_playerPos","_lastPos","_playerGear","_medical","_currentModel","_currentAnim","_currentWpn","_muzzles","_array","_coins","_key","_globalCoins","_bankCoins","_group","_playerBackp","_backpack","_kills","_killsB","_killsH","_headShots","_humanity","_lastTime","_timeGross","_timeSince","_timeLeft","_config","_onLadder","_isTerminal","_modelChk","_temp","_currentState","_character","_magazines","_characterID","_force","_charPos","_isInVehicle","_name","_Achievements","_isNewMed","_isNewPos","_isNewGear"]; //[player,array] _character = _this select 0; @@ -88,7 +88,7 @@ if (_characterID != "0") then { }; //Process update - if (_characterID != "0") then { + //if (_characterID != "0") then { //Record stats while we're here /* Check previous stats against what client had when they logged in @@ -164,13 +164,31 @@ if (_characterID != "0") then { if (!isNull _character) then { if (alive _character) then { //Wait for HIVE to be free and send request - _key = format["CHILD:201:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:",_characterID,_playerPos,_playerGear,_playerBackp,_medical,false,false,_kills,_headShots,_distanceFoot,_timeSince,_currentState,_killsH,_killsB,_currentModel,_humanity]; + if (Z_SingleCurrency) then { + _coins = _character getVariable [Z_MoneyVariable, -1]; //should getting coins fail set the variable to an invalid value to prevent overwritting the in the DB + _key = format["CHILD:201:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:",_characterID,_playerPos,_playerGear,_playerBackp,_medical,false,false,_kills,_headShots,_distanceFoot,_timeSince,_currentState,_killsH,_killsB,_currentModel,_humanity,_coins]; + } else { + _key = format["CHILD:201:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:",_characterID,_playerPos,_playerGear,_playerBackp,_medical,false,false,_kills,_headShots,_distanceFoot,_timeSince,_currentState,_killsH,_killsB,_currentModel,_humanity]; + }; //diag_log ("HIVE: WRITE: "+ str(_key) + " / " + _characterID); //diag_log format["HIVE: SYNC: [%1,%2,%3,%4]",_characterID,_playerPos,_playerGear,_playerBackp]; _key call server_hiveWrite; }; }; - + + if (Z_SingleCurrency) then { //update global coins + _globalCoins = _character getVariable ["GlobalMoney", -1]; + _bankCoins = _character getVariable ["MoneySpecial", -1]; + _key = format["CHILD:205:%1:%2:%3:%4:",(getPlayerUID _character),dayZ_instance,_globalCoins,_bankCoins]; + _key call server_hiveWrite; + }; + + if (DZE_groupManagement) then { //update player group + _group = _character getVariable ["savedGroup", []]; + _key = format["CHILD:204:%1:%2:%3:",(getPlayerUID _character),dayZ_instance, _group]; + _key call server_hiveWrite; + }; + // If player is in a vehicle, keep its position updated if (vehicle _character != _character) then { [vehicle _character, "position"] call server_updateObject; @@ -183,5 +201,5 @@ if (_characterID != "0") then { if (_timeSince > 0) then { _character setVariable ["lastTime",(diag_ticktime - _timeLeft)]; }; - }; + //}; }; \ No newline at end of file diff --git a/SQF/dayz_server/compile/server_updateObject.sqf b/SQF/dayz_server/compile/server_updateObject.sqf index c4a0ece57..376f480b1 100644 --- a/SQF/dayz_server/compile/server_updateObject.sqf +++ b/SQF/dayz_server/compile/server_updateObject.sqf @@ -1,8 +1,8 @@ // [_object,_type] spawn server_updateObject; #include "\z\addons\dayz_server\compile\server_toggle_debug.hpp" if (isNil "sm_done") exitWith {}; +private ["_objectID","_objectUID","_object_position","_isNotOk","_object","_type","_recorddmg","_forced","_lastUpdate","_needUpdate","_object_inventory","_object_damage","_objWallDamage","_object_killed","_object_maintenance","_object_variables"]; -private ["_object","_type","_objectID","_objectUID","_lastUpdate","_needUpdate","_object_position","_object_inventory","_object_damage","_isNotOk"]; _object = _this select 0; _type = _this select 1; _recorddmg = false; @@ -11,10 +11,10 @@ _forced = if (count _this > 2) then {_this select 2} else {false}; _objectID = "0"; _objectUID = "0"; -if !((isNil "_object") or {isNull _object}) then { - _objectID = _object getVariable ["ObjectID","0"]; - _objectUID = _object getVariable ["ObjectUID","0"]; -}; +if ((isNil "_object") || {isNull _object}) exitWith {diag_log "server_updateObject.sqf _object null or nil, could not update object"}; +_objectID = _object getVariable ["ObjectID","0"]; +_objectUID = _object getVariable ["ObjectUID","0"]; + if ((typeName _objectID == "SCALAR") || (typeName _objectUID == "SCALAR")) then { #ifdef OBJECT_DEBUG @@ -65,7 +65,7 @@ _object_position = { }; _object_inventory = { - private ["_inventory","_previous","_key"]; + private ["_inventory","_key","_isNormal","_coins"]; if (_object isKindOf "TrapItems") then { _inventory = [["armed",_object getVariable ["armed",false]]]; } else { @@ -90,9 +90,19 @@ _object_inventory = { //if (str _inventory != _previous) then { _object setVariable["lastInventory",_inventory]; if (_objectID == "0") then { - _key = format["CHILD:309:%1:",_objectUID] + str _inventory + ":"; + if (Z_SingleCurrency) then { + _coins = _object getVariable [Z_MoneyVariable, -1]; //set to invalid value if getVariable fails to prevent overwriting of coins in DB + _key = format["CHILD:309:%1:%2:%3:",_objectUID,_inventory,_coins]; + } else { + _key = format["CHILD:309:%1:%2:",_objectUID,_inventory]; + }; } else { - _key = format["CHILD:303:%1:",_objectID] + str _inventory + ":"; + if (Z_SingleCurrency) then { + _coins = _object getVariable [Z_MoneyVariable, -1]; + _key = format["CHILD:303:%1:%2:%3:",_objectID,_inventory,_coins]; + } else { + _key = format["CHILD:303:%1:%2:",_objectID,_inventory]; + }; }; #ifdef OBJECT_DEBUG @@ -188,12 +198,23 @@ _object_maintenance = { _variables set [count _variables, ["padlockCombination", _accessArray]]; if (_objectID == "0") then { - _key = format["CHILD:309:%1:%2:",_objectUID,_ownerArray]; + if (Z_SingleCurrency) then { + _coins = _object getVariable [Z_MoneyVariable, -1]; + _key = format["CHILD:309:%1:%2:%3:",_objectUID,_ownerArray,_coins]; + } else { + _key = format["CHILD:309:%1:%2:",_objectUID,_ownerArray]; + }; _key = format["CHILD:306:%1:%2:%3:",_objectUID,[],0]; //Wont work just now. } else { - _key = format["CHILD:303:%1:%2:",_objectID,_ownerArray]; + if (Z_SingleCurrency) then { + _coins = _object getVariable [Z_MoneyVariable, -1]; + _key = format["CHILD:303:%1:%2:%3:",_objectID,_ownerArray,_coins]; + } else { + _key = format["CHILD:303:%1:%2:",_objectID,_ownerArray]; + }; _key = format["CHILD:306:%1:%2:%3:",_objectID,[],0]; }; + // #ifdef OBJECT_DEBUG diag_log ("HIVE: WRITE: Maintenance, "+ str(_key)); // #endif @@ -214,9 +235,19 @@ _object_variables = { _variables set [count _variables, ["BuildLock", _lockedArray]]; if (_objectID == "0") then { - _key = format["CHILD:309:%1:%2:",_objectUID,_variables]; + if (Z_SingleCurrency) then { + _coins = _object getVariable [Z_MoneyVariable, -1]; + _key = format["CHILD:309:%1:%2:%3:",_objectUID,_variables,_coins]; + } else { + _key = format["CHILD:309:%1:%2:",_objectUID,_variables]; + }; } else { - _key = format["CHILD:303:%1:%2:",_objectID,_variables]; + if (Z_SingleCurrency) then { + _coins = _object getVariable [Z_MoneyVariable, -1]; + _key = format["CHILD:303:%1:%2:%3:",_objectID,_variables,_coins]; + } else { + _key = format["CHILD:303:%1:%2:",_objectID,_variables]; + }; }; _key call server_hiveWrite; }; diff --git a/SQF/dayz_server/system/server_monitor.sqf b/SQF/dayz_server/system/server_monitor.sqf index 0da937e2e..75ea6a6d8 100644 --- a/SQF/dayz_server/system/server_monitor.sqf +++ b/SQF/dayz_server/system/server_monitor.sqf @@ -67,7 +67,8 @@ if (_status == "ObjectStreamStart") then { _hitPoints = if ((typeName (_x select 6)) == "ARRAY") then { _x select 6 } else { [] }; _fuel = if ((typeName (_x select 7)) == "SCALAR") then { _x select 7 } else { 0 }; _damage = if ((typeName (_x select 8)) == "SCALAR") then { _x select 8 } else { 0.9 }; - + _storageMoney = if ((typeName (_x select 9)) == "SCALAR") then { _x select 9 } else { 0 }; + //set object to be in maintenance mode _maintenanceMode = false; _maintenanceModeVars = []; @@ -168,13 +169,16 @@ if (_status == "ObjectStreamStart") then { }; //Create it - _object = createVehicle [_type, _pos, [], 0, if (_type in DayZ_nonCollide) then {"NONE"} else {"CAN_COLLIDE"}]; - + _object = createVehicle [_type, [0,0,0], [], 0, if (_type in DayZ_nonCollide) then {"NONE"} else {"CAN_COLLIDE"}]; + _object setPosATL _pos; + // prevent immediate hive write when vehicle parts are set up _object setVariable ["lastUpdate",diag_ticktime]; _object setVariable ["ObjectID", _idKey, true]; _object setVariable ["OwnerPUID", _ownerPUID, true]; - + if ((typeOf (_object)) in DZE_MoneyStorageClasses) then { + _object setVariable [Z_MoneyVariable, _storageMoney, true]; + }; if (DZE_permanentPlot && (typeOf _object == "Plastic_Pole_EP1_DZ")) then { _object setVariable ["plotfriends", _inventory, true]; };