diff --git a/SQF/dayz_code/actions/trade_items.sqf b/SQF/dayz_code/actions/trade_items.sqf index 9d263231b..02a044123 100644 --- a/SQF/dayz_code/actions/trade_items.sqf +++ b/SQF/dayz_code/actions/trade_items.sqf @@ -1,11 +1,9 @@ -private ["_part_out","_part_in","_qty_out","_qty_in","_qty","_buy_o_sell","_textPartIn","_textPartOut","_bos","_needed","_started","_finished","_animState","_isMedic","_total_parts_out","_abort","_removed","_tradeCounter","_next_highest_bar","_third_highest_bar","_next_highest_conv","_third_highest_conv","_third_parts_out_raw","_third_parts_out","_remainder","_next_parts_out_raw","_next_parts_out","_activatingPlayer","_traderID","_total_trades"]; +private ["_part_out","_part_in","_qty_out","_qty_in","_qty","_buy_o_sell","_textPartIn","_textPartOut","_bos","_needed","_started","_finished","_animState","_isMedic","_total_parts_out","_abort","_removed","_activatingPlayer","_traderID","_done"]; // [part_out,part_in, qty_out, qty_in,]; if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_103") , "PLAIN DOWN"] }; DZE_ActionInProgress = true; -_total_parts_out = 0; - _activatingPlayer = player; _part_out = (_this select 3) select 0; @@ -18,39 +16,20 @@ _textPartOut = (_this select 3) select 6; _traderID = (_this select 3) select 7; _removed = 0; -_tradeCounter = 0; _bos = 0; if(_buy_o_sell == "sell") then { _bos = 1; }; -// Get total parts in -_qty = {_x == _part_in} count magazines player; - -// Find number of possible trades -_total_trades = floor(_qty / _qty_in); - _abort = false; -if(_total_trades < 1) exitWith { - _needed = _qty_in - _qty; - cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; - DZE_ActionInProgress = false; -}; - // perform number of total trades -for "_x" from 1 to _total_trades do { +r_autoTrade = true; +while {r_autoTrade} do { _removed = 0; - _tradeCounter = _tradeCounter + 1; - // cutText ["Starting trade, stand still to complete.", "PLAIN DOWN"]; - if(_total_trades == 1) then { - cutText [format[(localize "str_epoch_player_105"),_tradeCounter,_total_trades] , "PLAIN DOWN"]; - } else { - cutText [format[(localize "str_epoch_player_187"),_tradeCounter,_total_trades] , "PLAIN DOWN"]; - }; [1,1] call dayz_HungerThirst; player playActionNow "Medic"; @@ -92,59 +71,69 @@ for "_x" from 1 to _total_trades do { }; if (_finished) then { - - _qty = {_x == _part_in} count magazines player; - if (_qty >= _qty_in) then { - - _part_inClass = configFile >> "CfgMagazines" >> _part_in; - - _removed = _removed + ([player,_part_inClass,_qty_in] call BIS_fnc_invRemove); - if (_removed == _qty_in) then { + + _canAfford = false; + if(_bos == 1) then { - // Continue with trade. - if (isNil "_part_in") then { _part_in = "Unknown Item" }; - if (isNil "inTraderCity") then { inTraderCity = "Unknown Trader City" }; - if(_bos == 1) then { - // Selling - PVDZE_obj_Trade = [_activatingPlayer,_traderID,_bos,_part_in,inTraderCity,_part_out,_qty_out]; - } else { - // Buying - PVDZE_obj_Trade = [_activatingPlayer,_traderID,_bos,_part_out,inTraderCity,_part_in,_qty_in]; + //sell + _qty = {_x == _part_in} count magazines player; + if (_qty >= _qty_in) then { + _part_inClass = configFile >> "CfgMagazines" >> _part_in; + _removed = _removed + ([player,_part_inClass,_qty_in] call BIS_fnc_invRemove); + if (_removed == _qty_in) then { + _canAfford = [[[_part_out,_qty_out]],1] call epoch_returnChange; }; - publicVariableServer "PVDZE_obj_Trade"; - - waitUntil {!isNil "dayzTradeResult"}; - - if(dayzTradeResult == "PASS") then { - - // total of all parts - _total_parts_out = _total_parts_out + _qty_out; - - cutText [format[(localize "str_epoch_player_186"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; - - } else { - cutText [format[(localize "str_epoch_player_183"),_textPartOut] , "PLAIN DOWN"]; - _abort = true; - - // Return items taken - for "_x" from 1 to _removed do { - player addMagazine _part_in; - }; - - }; - - dayzTradeResult = nil; - - } else { - - // Return items from botched trade. - for "_x" from 1 to _removed do { - player addMagazine _part_in; - }; - _abort = true; }; } else { + + //buy + _trade_total = [[_part_in,_qty_in]] call epoch_itemCost; + _total_currency = call epoch_totalCurrency; + _return_change = _total_currency - _trade_total; + if (_return_change >= 0) then { + _canAfford = true; + }; + }; + + diag_log format["DEBUG TRADER DONE?: %1", _canAfford]; + + if (_canAfford) then { + + // Continue with trade. + if (isNil "_part_in") then { _part_in = "Unknown Item" }; + if (isNil "inTraderCity") then { inTraderCity = "Unknown Trader City" }; + if(_bos == 1) then { + // Selling + PVDZE_obj_Trade = [_activatingPlayer,_traderID,_bos,_part_in,inTraderCity,_part_out,_qty_out]; + } else { + // Buying + PVDZE_obj_Trade = [_activatingPlayer,_traderID,_bos,_part_out,inTraderCity,_part_in,_qty_in]; + }; + publicVariableServer "PVDZE_obj_Trade"; + + if(_bos == 0) then { + + // only wait for result when buying + waitUntil {!isNil "dayzTradeResult"}; + + if(dayzTradeResult == "PASS") then { + + _done = [[[_part_in,_qty_in]],0] call epoch_returnChange; + if (_done) then { + for "_x" from 1 to _qty_out do { + player addMagazine _part_out; + }; + }; + cutText [format[(localize "str_epoch_player_186"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; + }; + } else { + cutText [format[(localize "str_epoch_player_186"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; + }; + dayzTradeResult = nil; + + } else { + _qty = {_x == _part_in} count magazines player; _needed = _qty_in - _qty; cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; }; @@ -152,116 +141,7 @@ for "_x" from 1 to _total_trades do { sleep 1; - if(_abort) exitWith {}; -}; - -// pay out -if(_total_parts_out >= 1) then { - - //diag_log format["DEBUG TRADE #: %1", _total_parts_out]; - - if(_bos == 1) then { - //convert currency trades into next bar - // 10 ItemCopperBar > ItemCopperBar10oz - // 3 ItemCopperBar10oz > ItemSilverBar - // 10 ItemSilverBar > ItemSilverBar10oz - // 3 ItemSilverBar10oz > ItemGoldBar - // 10 ItemGoldBar > ItemGoldBar10oz - - _next_highest_bar = "NA"; - _third_highest_bar = "NA"; - _next_highest_conv = 10000; - _third_highest_conv = 10000; - - switch(true)do{ - case (_part_out == "ItemSilverBar"): { - _next_highest_bar = "ItemSilverBar10oz"; - _third_highest_bar = "ItemGoldBar"; - _next_highest_conv = 10; - _third_highest_conv = 3; - }; - case (_part_out == "ItemSilverBar10oz"): { - _next_highest_bar = "ItemGoldBar"; - _third_highest_bar = "ItemGoldBar10oz"; - _next_highest_conv = 3; - _third_highest_conv = 10; - }; - case (_part_out == "ItemGoldBar"): { - _next_highest_bar = "ItemGoldBar10oz"; - _third_highest_bar = "NA"; - _next_highest_conv = 10; - _third_highest_conv = 10000; - }; - }; - - //diag_log format["DEBUG TRADE part: %1 next: %2", _part_out,_next_highest_bar]; - - if(_total_parts_out >= _next_highest_conv) then { - _next_parts_out_raw = _total_parts_out / _next_highest_conv; - - // whole parts - _next_parts_out = floor(_next_parts_out_raw); - - //diag_log format["DEBUG TRADE next whole parts: %1 part: %2", _next_parts_out,_next_highest_bar]; - - // find any whole remains - _remainder = floor((_next_parts_out_raw - _next_parts_out) * _next_highest_conv); - - //diag_log format["DEBUG TRADE remainder parts: %1 part: %2", _remainder,_part_out]; - - for "_x" from 1 to _remainder do { - player addMagazine _part_out; - }; - - // Find if needs further conversion - if (_next_parts_out >= _third_highest_conv) then { - - _third_parts_out_raw = _next_parts_out / _third_highest_conv; - - // whole parts - _third_parts_out = floor(_third_parts_out_raw); - - //diag_log format["DEBUG TRADE third whole parts: %1 part: %2", _third_parts_out,_third_highest_bar]; - - for "_x" from 1 to _third_parts_out do { - player addMagazine _third_highest_bar; - }; - - // find any whole remains - _remainder = floor((_third_parts_out_raw - _third_parts_out) * _third_highest_conv); - - //diag_log format["DEBUG TRADE remainder parts: %1 part: %2", _remainder,_next_highest_bar]; - - for "_x" from 1 to _remainder do { - player addMagazine _next_highest_bar; - }; - - } else { - - //diag_log format["DEBUG TRADE next parts: %1 part: %2", _next_parts_out,_next_highest_bar]; - - for "_x" from 1 to _next_parts_out do { - player addMagazine _next_highest_bar; - }; - }; - - } else { - - //diag_log "DEBUG TRADE SELLING NORMALLY"; - - for "_x" from 1 to _total_parts_out do { - player addMagazine _part_out; - }; - }; - - } else { - - //diag_log "DEBUG TRADE BUYING"; - - for "_x" from 1 to _total_parts_out do { - player addMagazine _part_out; - }; - }; + if(_abort || !_canAfford) exitWith {r_autoTrade = false}; }; DZE_ActionInProgress = false; diff --git a/SQF/dayz_code/compile/epoch_returnChange.sqf b/SQF/dayz_code/compile/epoch_returnChange.sqf index 112d30630..9185ca7d5 100644 --- a/SQF/dayz_code/compile/epoch_returnChange.sqf +++ b/SQF/dayz_code/compile/epoch_returnChange.sqf @@ -15,6 +15,7 @@ diag_log format["DEBUG TRADER INPUT TOTAL: %1", _trade_total]; _total_currency_dry = call epoch_totalCurrency; +_return_change_dry = 0; if (_buyOrSell == 0) then { //buy _return_change_dry = _total_currency_dry - _trade_total; @@ -22,6 +23,9 @@ if (_buyOrSell == 0) then { //sell _return_change_dry = _total_currency_dry + _trade_total; }; + +diag_log format["DEBUG TRADER DRY: %1", _return_change_dry]; + if (_return_change_dry >= 0) then { _canAfford = true; }; diff --git a/SQF/dayz_code/init/compiles.sqf b/SQF/dayz_code/init/compiles.sqf index d1867b09d..a7e5726d7 100644 --- a/SQF/dayz_code/init/compiles.sqf +++ b/SQF/dayz_code/init/compiles.sqf @@ -142,7 +142,42 @@ if (!isDedicated) then { _b }; + + epoch_totalCurrency = { + // total currency + _total_currency = 0; + { + _part = (configFile >> "CfgMagazines" >> _x); + _worth = (_part >> "worth"); + if isNumber (_worth) then { + _total_currency = _total_currency + getNumber(_worth); + }; + } forEach (magazines player); + _total_currency + }; + + epoch_itemCost = { + _trade_total = 0; + { + _part_in_configClass = configFile >> "CfgMagazines" >> (_x select 0); + if (isClass (_part_in_configClass)) then { + _part_inWorth = (_part_in_configClass >> "worth"); + if isNumber (_part_inWorth) then { + _trade_total = _trade_total + (getNumber(_part_inWorth) * (_x select 1)); + }; + }; + } forEach _this; + + diag_log format["DEBUG TRADER ITEMCOST: %1", _this]; + _trade_total + }; + + epoch_returnChange = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\epoch_returnChange.sqf"; + // usage [["partinclassname",4]] call epoch_returnChange; + + + // RunTime = 0; TotalRuns = 0; @@ -251,7 +286,7 @@ if (!isDedicated) then { }; player_tagFriendlyMsg = { - if(player == _this) then { + if(player == (_this select 0)) then { cutText[(localize "str_epoch_player_2"),"PLAIN DOWN"]; }; }; diff --git a/Server Files/@DayZ_Epoch_Server/addons/dayz_server.pbo b/Server Files/@DayZ_Epoch_Server/addons/dayz_server.pbo index 3a8d26e4e..555e84a21 100644 Binary files a/Server Files/@DayZ_Epoch_Server/addons/dayz_server.pbo and b/Server Files/@DayZ_Epoch_Server/addons/dayz_server.pbo differ