diff --git a/SQF/dayz_code/actions/trade_any_bicycle.sqf b/SQF/dayz_code/actions/trade_any_bicycle.sqf index 8fc8a0916..0f41a5645 100644 --- a/SQF/dayz_code/actions/trade_any_bicycle.sqf +++ b/SQF/dayz_code/actions/trade_any_bicycle.sqf @@ -1,4 +1,4 @@ -private ["_veh","_location","_part_out","_part_in","_qty_out","_qty_in","_qty","_buy_o_sell","_obj","_objectID","_objectUID","_bos","_started","_finished","_animState","_isMedic","_dir","_helipad","_removed","_damage","_tireDmg","_tires","_okToSell","_hitpoints","_needed","_activatingPlayer","_textPartIn","_textPartOut","_traderID","_playerNear"]; +private ["_veh","_location","_isOk","_part_out","_part_in","_qty_out","_qty_in","_qty","_buy_o_sell","_obj","_objectID","_objectUID","_bos","_started","_finished","_animState","_isMedic","_dir","_helipad","_keyColor","_keyNumber","_keySelected","_isKeyOK","_config","_damage","_tireDmg","_tires","_okToSell","_hitpoints","_needed","_activatingPlayer","_textPartIn","_textPartOut","_traderID","_canAfford","_trade_total","_total_currency","_return_change","_done"]; if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_103") , "PLAIN DOWN"]; }; DZE_ActionInProgress = true; @@ -21,79 +21,96 @@ _textPartOut = (_this select 3) select 6; _traderID = (_this select 3) select 7; _bos = 0; -if(_buy_o_sell == "buy") then { - _qty = {_x == _part_in} count magazines player; -} else { - _obj = nearestObjects [(getPosATL player), [_part_in], dayz_sellDistance_vehicle]; - _qty = count _obj; +if(_buy_o_sell == "sell") then { _bos = 1; }; -if (_qty >= _qty_in) then { - - cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"]; +cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"]; - [1,1] call dayz_HungerThirst; - // force animation - player playActionNow "Medic"; +[1,1] call dayz_HungerThirst; +// force animation +player playActionNow "Medic"; - r_interrupt = false; +r_interrupt = false; +_animState = animationState player; +r_doLoop = true; +_started = false; +_finished = false; + +while {r_doLoop} do { _animState = animationState player; - r_doLoop = true; - _started = false; - _finished = false; - - while {r_doLoop} do { - _animState = animationState player; - _isMedic = ["medic",_animState] call fnc_inString; - if (_isMedic) then { - _started = true; - }; - if (_started and !_isMedic) then { - r_doLoop = false; - _finished = true; - }; - if (r_interrupt) then { - r_doLoop = false; - }; - sleep 0.1; + _isMedic = ["medic",_animState] call fnc_inString; + if (_isMedic) then { + _started = true; }; - r_doLoop = false; + if (_started and !_isMedic) then { + r_doLoop = false; + _finished = true; + }; + if (r_interrupt) then { + r_doLoop = false; + }; + sleep 0.1; +}; +r_doLoop = false; - if (!_finished) exitWith { - r_interrupt = false; - if (vehicle player == player) then { - [objNull, player, rSwitchMove,""] call RE; - player playActionNow "stop"; +if (!_finished) exitWith { + r_interrupt = false; + if (vehicle player == player) then { + [objNull, player, rSwitchMove,""] call RE; + player playActionNow "stop"; + }; + cutText [(localize "str_epoch_player_106") , "PLAIN DOWN"]; + DZE_ActionInProgress = false; +}; + +if (_finished) then { + + _canAfford = false; + if(_bos == 1) then { + + _distance = dayz_sellDistance_vehicle; + if (_part_in isKindOf "Air") then { + _distance = dayz_sellDistance_air; + }; + if (_part_in isKindOf "Ship") then { + _distance = dayz_sellDistance_boat; + }; + _count = {(typeOf _x) == _part_in} count (nearestObjects [(getPosATL player), [_part_in], _distance]); + if (_count >= _qty_in) then { + _canAfford = true; + }; + diag_log format["DEBUG vehicle sell count: %1", _count]; + + } 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; }; - cutText [(localize "str_epoch_player_106") , "PLAIN DOWN"]; }; - if (_finished) then { - // Double check for items - if(_buy_o_sell == "buy") then { - _qty = {_x == _part_in} count magazines player; + if (_canAfford) then { + + //["PVDZE_obj_Trade",[_activatingPlayer,_traderID,_bos]] call callRpcProcedure; + // if (isNil "_obj") then { _obj = "Unknown Vehicle" }; + 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 { - _obj = nearestObjects [(getPosATL player), [_part_in], dayz_sellDistance_vehicle]; - _qty = count _obj; + // Buying + PVDZE_obj_Trade = [_activatingPlayer,_traderID,_bos,_part_out,inTraderCity,_part_in,_qty_in]; }; - - if (_qty >= _qty_in) then { - - //["PVDZE_obj_Trade",[_activatingPlayer,_traderID,_bos]] call callRpcProcedure; - if (isNil "_obj") then { _obj = "Unknown Vehicle" }; - 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"; + publicVariableServer "PVDZE_obj_Trade"; - //diag_log format["DEBUG Starting to wait for answer: %1", PVDZE_obj_Trade]; + //diag_log format["DEBUG Starting to wait for answer: %1", PVDZE_obj_Trade]; + + if(_buy_o_sell == "buy") then { waitUntil {!isNil "dayzTradeResult"}; @@ -101,107 +118,121 @@ if (_qty >= _qty_in) then { if(dayzTradeResult == "PASS") then { - if(_buy_o_sell == "buy") then { + _done = [[[_part_in,_qty_in]],0] call epoch_returnChange; + if (_done) then { - _removed = ([player,_part_in,_qty_in] call BIS_fnc_invRemove); - if(_removed == _qty_in) then { - _dir = round(random 360); + // spawn vehicle + _dir = round(random 360); - _helipad = nearestObjects [player, ["HeliHCivil","HeliHempty"], 100]; - if(count _helipad > 0) then { - _location = (getPosATL (_helipad select 0)); - } else { - _location = [(position player),0,20,1,0,2000,0] call BIS_fnc_findSafePos; - }; - - //place vehicle spawn marker (local) - _veh = createVehicle ["Sign_arrow_down_large_EP1", _location, [], 0, "CAN_COLLIDE"]; - - _location = (getPosATL _veh); - - //["PVDZE_veh_Publish",[_veh,[_dir,_location],_part_out,false,_keySelected]] call callRpcProcedure; - PVDZE_veh_Publish2 = [_veh,[_dir,_location],_part_out,true,dayz_characterID,_activatingPlayer]; - publicVariableServer "PVDZE_veh_Publish2"; - - player reveal _veh; - - cutText [format[(localize "str_epoch_player_180"),_qty_in,_textPartIn,_textPartOut], "PLAIN DOWN"]; - }; - - } else { - - _obj = _obj select 0; - - //check to make sure vehicle has no more than 75% average tire damage - _hitpoints = _obj call vehicle_getHitpoints; - _okToSell = true; - - // count parts - _tires = 0; - - // total damage - _tireDmg = 0; - - _damage = 0; - { - if(["Wheel",_x,false] call fnc_inString) then { - _damage = [_obj,_x] call object_getHit; - _tireDmg = _tireDmg + _damage; - _tires = _tires + 1; - }; - } forEach _hitpoints; - - // find average tire damage - if(_tireDmg > 0 and _tires > 0) then { - if((_tireDmg / _tires) > 0.75) then { - _okToSell = false; - }; - }; - if(local _obj) then { - - if(_okToSell) then { - - if(!isNull _obj and alive _obj) then { - - for "_x" from 1 to _qty_out do { - player addMagazine _part_out; - }; - - _objectID = _obj getVariable ["ObjectID","0"]; - _objectUID = _obj getVariable ["ObjectUID","0"]; - - PVDZE_obj_Delete = [_objectID,_objectUID,_activatingPlayer]; - publicVariableServer "PVDZE_obj_Delete"; - - deleteVehicle _obj; - - cutText [format[(localize "str_epoch_player_181"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; - }; - } else { - cutText [format[(localize "str_epoch_player_182"),_textPartIn] , "PLAIN DOWN"]; - }; + _helipad = nearestObjects [player, ["HeliHCivil","HeliHempty"], 100]; + if(count _helipad > 0) then { + _location = (getPosATL (_helipad select 0)); } else { - cutText [(localize "str_epoch_player_245"), "PLAIN DOWN"]; + _location = [(position player),0,20,1,0,2000,0] call BIS_fnc_findSafePos; }; + + //place vehicle spawn marker (local) + _veh = createVehicle ["Sign_arrow_down_large_EP1", _location, [], 0, "CAN_COLLIDE"]; + + _location = (getPosATL _veh); + + //["PVDZE_veh_Publish",[_veh,[_dir,_location],_part_out,false,_keySelected]] call callRpcProcedure; + PVDZE_veh_Publish2 = [_veh,[_dir,_location],_part_out,true,dayz_characterID,_activatingPlayer]; + publicVariableServer "PVDZE_veh_Publish2"; + + cutText [format[(localize "STR_EPOCH_PLAYER_180"),_qty_in,_textPartIn,_textPartOut], "PLAIN DOWN"]; }; - - {player removeAction _x} forEach s_player_parts;s_player_parts = []; - s_player_parts_crtl = -1; } else { cutText [format[(localize "str_epoch_player_183"),_textPartOut] , "PLAIN DOWN"]; }; - dayzTradeResult = nil; + } else { + + //sell + _distance = dayz_sellDistance_vehicle; + if (_part_in isKindOf "Air") then { + _distance = dayz_sellDistance_air; + }; + if (_part_in isKindOf "Ship") then { + _distance = dayz_sellDistance_boat; + }; + + _objects = nearestObjects [(getPosATL player), [_part_in], _distance]; + + diag_log format["DEBUG vehicle sell objects: %1", _objects]; + + _qty = ({(typeOf _x) == _part_in} count _objects); + + if (_qty >= _qty_in) then { + + _obj = (_objects select 0); + + //check to make sure vehicle has no more than 75% average tire damage + _hitpoints = _obj call vehicle_getHitpoints; + _okToSell = true; + + // count parts + _tires = 0; + + // total damage + _tireDmg = 0; + + _damage = 0; + { + if(["Wheel",_x,false] call fnc_inString) then { + _damage = [_obj,_x] call object_getHit; + _tireDmg = _tireDmg + _damage; + _tires = _tires + 1; + }; + } forEach _hitpoints; + + // find average tire damage + if(_tireDmg > 0 and _tires > 0) then { + if((_tireDmg / _tires) > 0.75) then { + _okToSell = false; + }; + }; + + _objectID = _obj getVariable ["ObjectID","0"]; + _objectUID = _obj getVariable ["ObjectUID","0"]; + + _notSetup = (_objectID == "0" && _objectUID == "0"); + + if(local _obj and !isNull _obj and alive _obj and !_notSetup) then { + + if(_okToSell) then { + + + + //if(_objectID != "0" && _objectUID != "0") then { + + PVDZE_obj_Delete = [_objectID,_objectUID,_activatingPlayer]; + publicVariableServer "PVDZE_obj_Delete"; + + deleteVehicle _obj; + + // payout + _canAfford = [[[_part_out,_qty_out]],1] call epoch_returnChange; + + cutText [format[(localize "str_epoch_player_181"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; + + + } else { + cutText [format[(localize "str_epoch_player_182"),_textPartIn] , "PLAIN DOWN"]; + }; + } else { + cutText [(localize "str_epoch_player_245"), "PLAIN DOWN"]; + }; + }; }; - }; - -} else { - _needed = _qty_in - _qty; - if(_buy_o_sell == "buy") then { - cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; + dayzTradeResult = nil; } else { - cutText [format[(localize "str_epoch_player_185"),_textPartIn] , "PLAIN DOWN"]; - }; + _needed = _qty_in - _qty; + if(_buy_o_sell == "buy") then { + cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; + } else { + cutText [format[(localize "str_epoch_player_185"),_textPartIn] , "PLAIN DOWN"]; + }; + }; }; - -DZE_ActionInProgress = false; +DZE_ActionInProgress = false; \ No newline at end of file diff --git a/SQF/dayz_code/actions/trade_any_boat.sqf b/SQF/dayz_code/actions/trade_any_boat.sqf index ccc7570f5..dc99f7456 100644 --- a/SQF/dayz_code/actions/trade_any_boat.sqf +++ b/SQF/dayz_code/actions/trade_any_boat.sqf @@ -1,4 +1,4 @@ -private ["_veh","_location","_isOk","_part_out","_part_in","_qty_out","_qty_in","_qty","_buy_o_sell","_obj","_objectID","_objectUID","_bos","_started","_finished","_animState","_isMedic","_dir","_helipad","_removed","_keyColor","_keyNumber","_keySelected","_isKeyOK","_config","_okToSell","_needed","_activatingPlayer","_textPartIn","_textPartOut","_traderID","_playerNear"]; +private ["_veh","_location","_isOk","_part_out","_part_in","_qty_out","_qty_in","_qty","_buy_o_sell","_obj","_objectID","_objectUID","_bos","_started","_finished","_animState","_isMedic","_dir","_helipad","_keyColor","_keyNumber","_keySelected","_isKeyOK","_config","_damage","_tireDmg","_tires","_okToSell","_hitpoints","_needed","_activatingPlayer","_textPartIn","_textPartOut","_traderID","_canAfford","_trade_total","_total_currency","_return_change","_done"]; if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_103") , "PLAIN DOWN"]; }; DZE_ActionInProgress = true; @@ -21,80 +21,96 @@ _textPartOut = (_this select 3) select 6; _traderID = (_this select 3) select 7; _bos = 0; -if(_buy_o_sell == "buy") then { - _qty = {_x == _part_in} count magazines player; -} else { - _obj = nearestObjects [(getPosATL player), [_part_in], dayz_sellDistance_boat]; - _qty = count _obj; +if(_buy_o_sell == "sell") then { _bos = 1; }; - -if (_qty >= _qty_in) then { - - cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"]; +cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"]; - [1,1] call dayz_HungerThirst; - // force animation - player playActionNow "Medic"; +[1,1] call dayz_HungerThirst; +// force animation +player playActionNow "Medic"; - r_interrupt = false; +r_interrupt = false; +_animState = animationState player; +r_doLoop = true; +_started = false; +_finished = false; + +while {r_doLoop} do { _animState = animationState player; - r_doLoop = true; - _started = false; - _finished = false; - - while {r_doLoop} do { - _animState = animationState player; - _isMedic = ["medic",_animState] call fnc_inString; - if (_isMedic) then { - _started = true; - }; - if (_started and !_isMedic) then { - r_doLoop = false; - _finished = true; - }; - if (r_interrupt) then { - r_doLoop = false; - }; - sleep 0.1; + _isMedic = ["medic",_animState] call fnc_inString; + if (_isMedic) then { + _started = true; }; - r_doLoop = false; + if (_started and !_isMedic) then { + r_doLoop = false; + _finished = true; + }; + if (r_interrupt) then { + r_doLoop = false; + }; + sleep 0.1; +}; +r_doLoop = false; - if (!_finished) exitWith { - r_interrupt = false; - if (vehicle player == player) then { - [objNull, player, rSwitchMove,""] call RE; - player playActionNow "stop"; +if (!_finished) exitWith { + r_interrupt = false; + if (vehicle player == player) then { + [objNull, player, rSwitchMove,""] call RE; + player playActionNow "stop"; + }; + cutText [(localize "str_epoch_player_106") , "PLAIN DOWN"]; + DZE_ActionInProgress = false; +}; + +if (_finished) then { + + _canAfford = false; + if(_bos == 1) then { + + _distance = dayz_sellDistance_vehicle; + if (_part_in isKindOf "Air") then { + _distance = dayz_sellDistance_air; + }; + if (_part_in isKindOf "Ship") then { + _distance = dayz_sellDistance_boat; + }; + _count = {(typeOf _x) == _part_in} count (nearestObjects [(getPosATL player), [_part_in], _distance]); + if (_count >= _qty_in) then { + _canAfford = true; + }; + diag_log format["DEBUG vehicle sell count: %1", _count]; + + } 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; }; - cutText [(localize "str_epoch_player_106") , "PLAIN DOWN"]; }; - if (_finished) then { - // Double check for items - if(_buy_o_sell == "buy") then { - _qty = {_x == _part_in} count magazines player; + if (_canAfford) then { + + //["PVDZE_obj_Trade",[_activatingPlayer,_traderID,_bos]] call callRpcProcedure; + // if (isNil "_obj") then { _obj = "Unknown Vehicle" }; + 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 { - _obj = nearestObjects [(getPosATL player), [_part_in], dayz_sellDistance_boat]; - _qty = count _obj; + // Buying + PVDZE_obj_Trade = [_activatingPlayer,_traderID,_bos,_part_out,inTraderCity,_part_in,_qty_in]; }; - - if (_qty >= _qty_in) then { - - //["PVDZE_obj_Trade",[_activatingPlayer,_traderID,_bos]] call callRpcProcedure; - if (isNil "_obj") then { _obj = "Unknown Vehicle" }; - 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"; + publicVariableServer "PVDZE_obj_Trade"; - //diag_log format["DEBUG Starting to wait for answer: %1", PVDZE_obj_Trade]; + //diag_log format["DEBUG Starting to wait for answer: %1", PVDZE_obj_Trade]; + + if(_buy_o_sell == "buy") then { waitUntil {!isNil "dayzTradeResult"}; @@ -102,99 +118,106 @@ if (_qty >= _qty_in) then { if(dayzTradeResult == "PASS") then { - if(_buy_o_sell == "buy") then { + // First select key color + _keyColor = ["Green","Red","Blue","Yellow","Black"] call BIS_fnc_selectRandom; - // First select key color - _keyColor = ["Green","Red","Blue","Yellow","Black"] call BIS_fnc_selectRandom; + // then select number from 1 - 2500 + _keyNumber = (floor(random 2500)) + 1; - // then select number from 1 - 2500 - _keyNumber = (floor(random 2500)) + 1; + // Combine to key (eg.ItemKeyYellow2494) classname + _keySelected = format[("ItemKey%1%2"),_keyColor,_keyNumber]; - // Combine to key (eg.ItemKeyYellow2494) classname - _keySelected = format[("ItemKey%1%2"),_keyColor,_keyNumber]; - - _isKeyOK = isClass(configFile >> "CfgWeapons" >> _keySelected); + _isKeyOK = isClass(configFile >> "CfgWeapons" >> _keySelected); - _config = _keySelected; - _isOk = [player,_config] call BIS_fnc_invAdd; - waitUntil {!isNil "_isOk"}; - if (_isOk and _isKeyOK) then { + _config = _keySelected; + _isOk = [player,_config] call BIS_fnc_invAdd; - _removed = ([player,_part_in,_qty_in] call BIS_fnc_invRemove); - if(_removed == _qty_in) then { - _dir = round(random 360); + waitUntil {!isNil "_isOk"}; - _helipad = nearestObjects [player, ["HeliHCivil","HeliHempty"], 100]; - if(count _helipad > 0) then { - _location = (getPosATL (_helipad select 0)); - } else { - _location = [(position player),0,20,1,2,2000,0] call BIS_fnc_findSafePos; - }; - - //place vehicle spawn marker (local) - _veh = createVehicle ["Sign_arrow_down_large_EP1", _location, [], 0, "CAN_COLLIDE"]; + if (_isOk and _isKeyOK) then { - _location = (getPosATL _veh); - - //["PVDZE_veh_Publish",[_veh,[_dir,_location],_part_out,false,_keySelected]] call callRpcProcedure; - PVDZE_veh_Publish2 = [_veh,[_dir,_location],_part_out,false,_keySelected,_activatingPlayer]; - publicVariableServer "PVDZE_veh_Publish2"; + _done = [[[_part_in,_qty_in]],0] call epoch_returnChange; + if (_done) then { - player reveal _veh; + // spawn vehicle + _dir = round(random 360); - cutText [format[(localize "STR_EPOCH_ACTIONS_11"),_qty_in,_textPartIn,_textPartOut], "PLAIN DOWN"]; + _helipad = nearestObjects [player, ["HeliHCivil","HeliHempty"], 100]; + if(count _helipad > 0) then { + _location = (getPosATL (_helipad select 0)); } else { - player removeMagazine _keySelected; + _location = [(position player),0,20,1,2,2000,0] call BIS_fnc_findSafePos; }; - } else { - cutText [(localize "str_epoch_player_107"), "PLAIN DOWN"]; + + //place vehicle spawn marker (local) + _veh = createVehicle ["Sign_arrow_down_large_EP1", _location, [], 0, "CAN_COLLIDE"]; + + _location = (getPosATL _veh); + + //["PVDZE_veh_Publish",[_veh,[_dir,_location],_part_out,false,_keySelected]] call callRpcProcedure; + PVDZE_veh_Publish2 = [_veh,[_dir,_location],_part_out,false,_keySelected,_activatingPlayer]; + publicVariableServer "PVDZE_veh_Publish2"; + + cutText [format[(localize "STR_EPOCH_ACTIONS_11"),_qty_in,_textPartIn,_textPartOut], "PLAIN DOWN"]; }; } else { - - _obj = _obj select 0; - - _okToSell = true; - if(!local _obj) then { - _okToSell = false; - }; - - if(_okToSell and !isNull _obj and alive _obj) then { - - for "_x" from 1 to _qty_out do { - player addMagazine _part_out; - }; - - _objectID = _obj getVariable ["ObjectID","0"]; - _objectUID = _obj getVariable ["ObjectUID","0"]; - - PVDZE_obj_Delete = [_objectID,_objectUID,_activatingPlayer]; - publicVariableServer "PVDZE_obj_Delete"; - - deleteVehicle _obj; - - cutText [format[(localize "str_epoch_player_181"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; - } else { - cutText [(localize "str_epoch_player_245"), "PLAIN DOWN"]; - }; + cutText [(localize "str_epoch_player_107"), "PLAIN DOWN"]; }; - - {player removeAction _x} forEach s_player_parts;s_player_parts = []; - s_player_parts_crtl = -1; } else { cutText [format[(localize "str_epoch_player_183"),_textPartOut] , "PLAIN DOWN"]; }; - dayzTradeResult = nil; - }; - }; + } else { + + //sell + _distance = dayz_sellDistance_vehicle; + if (_part_in isKindOf "Air") then { + _distance = dayz_sellDistance_air; + }; + if (_part_in isKindOf "Ship") then { + _distance = dayz_sellDistance_boat; + }; + + _objects = nearestObjects [(getPosATL player), [_part_in], _distance]; -} else { - _needed = _qty_in - _qty; - if(_buy_o_sell == "buy") then { - cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; + diag_log format["DEBUG vehicle sell objects: %1", _objects]; + + _qty = ({(typeOf _x) == _part_in} count _objects); + + if (_qty >= _qty_in) then { + + _obj = (_objects select 0); + + _objectID = _obj getVariable ["ObjectID","0"]; + _objectUID = _obj getVariable ["ObjectUID","0"]; + + _notSetup = (_objectID == "0" && _objectUID == "0"); + + if(local _obj and !isNull _obj and alive _obj and !_notSetup) then { + + PVDZE_obj_Delete = [_objectID,_objectUID,_activatingPlayer]; + publicVariableServer "PVDZE_obj_Delete"; + + deleteVehicle _obj; + + // payout + _canAfford = [[[_part_out,_qty_out]],1] call epoch_returnChange; + + cutText [format[(localize "str_epoch_player_181"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; + + } else { + cutText [(localize "str_epoch_player_245"), "PLAIN DOWN"]; + }; + }; + }; + dayzTradeResult = nil; } else { - cutText [format[(localize "str_epoch_player_185"),_textPartIn] , "PLAIN DOWN"]; + _needed = _qty_in - _qty; + if(_buy_o_sell == "buy") then { + cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; + } else { + cutText [format[(localize "str_epoch_player_185"),_textPartIn] , "PLAIN DOWN"]; + }; }; }; - -DZE_ActionInProgress = false; +DZE_ActionInProgress = false; \ No newline at end of file diff --git a/SQF/dayz_code/actions/trade_any_vehicle.sqf b/SQF/dayz_code/actions/trade_any_vehicle.sqf index 9842c51e2..c352767a7 100644 --- a/SQF/dayz_code/actions/trade_any_vehicle.sqf +++ b/SQF/dayz_code/actions/trade_any_vehicle.sqf @@ -1,4 +1,4 @@ -private ["_veh","_location","_isOk","_part_out","_part_in","_qty_out","_qty_in","_qty","_buy_o_sell","_obj","_objectID","_objectUID","_bos","_started","_finished","_animState","_isMedic","_dir","_helipad","_removed","_keyColor","_keyNumber","_keySelected","_isKeyOK","_config","_damage","_tireDmg","_tires","_okToSell","_hitpoints","_needed","_activatingPlayer","_textPartIn","_textPartOut","_traderID","_playerNear"]; +private ["_veh","_location","_isOk","_part_out","_part_in","_qty_out","_qty_in","_qty","_buy_o_sell","_obj","_objectID","_objectUID","_bos","_started","_finished","_animState","_isMedic","_dir","_helipad","_keyColor","_keyNumber","_keySelected","_isKeyOK","_config","_damage","_tireDmg","_tires","_okToSell","_hitpoints","_needed","_activatingPlayer","_textPartIn","_textPartOut","_traderID","_canAfford","_trade_total","_total_currency","_return_change","_done"]; if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_103") , "PLAIN DOWN"]; }; DZE_ActionInProgress = true; @@ -21,88 +21,96 @@ _textPartOut = (_this select 3) select 6; _traderID = (_this select 3) select 7; _bos = 0; -if(_buy_o_sell == "buy") then { - _qty = {_x == _part_in} count magazines player; -} else { - - if (_part_in isKindOf "Air") then { - _obj = nearestObjects [(getPosATL player), [_part_in], dayz_sellDistance_air]; - } else { - _obj = nearestObjects [(getPosATL player), [_part_in], dayz_sellDistance_vehicle]; - }; - _qty = count _obj; +if(_buy_o_sell == "sell") then { _bos = 1; }; -if (_qty >= _qty_in) then { - - cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"]; +cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"]; - [1,1] call dayz_HungerThirst; - // force animation - player playActionNow "Medic"; +[1,1] call dayz_HungerThirst; +// force animation +player playActionNow "Medic"; - r_interrupt = false; +r_interrupt = false; +_animState = animationState player; +r_doLoop = true; +_started = false; +_finished = false; + +while {r_doLoop} do { _animState = animationState player; - r_doLoop = true; - _started = false; - _finished = false; - - while {r_doLoop} do { - _animState = animationState player; - _isMedic = ["medic",_animState] call fnc_inString; - if (_isMedic) then { - _started = true; - }; - if (_started and !_isMedic) then { - r_doLoop = false; - _finished = true; - }; - if (r_interrupt) then { - r_doLoop = false; - }; - sleep 0.1; + _isMedic = ["medic",_animState] call fnc_inString; + if (_isMedic) then { + _started = true; }; - r_doLoop = false; + if (_started and !_isMedic) then { + r_doLoop = false; + _finished = true; + }; + if (r_interrupt) then { + r_doLoop = false; + }; + sleep 0.1; +}; +r_doLoop = false; - if (!_finished) exitWith { - r_interrupt = false; - if (vehicle player == player) then { - [objNull, player, rSwitchMove,""] call RE; - player playActionNow "stop"; +if (!_finished) exitWith { + r_interrupt = false; + if (vehicle player == player) then { + [objNull, player, rSwitchMove,""] call RE; + player playActionNow "stop"; + }; + cutText [(localize "str_epoch_player_106") , "PLAIN DOWN"]; + DZE_ActionInProgress = false; +}; + +if (_finished) then { + + _canAfford = false; + if(_bos == 1) then { + + _distance = dayz_sellDistance_vehicle; + if (_part_in isKindOf "Air") then { + _distance = dayz_sellDistance_air; + }; + if (_part_in isKindOf "Ship") then { + _distance = dayz_sellDistance_boat; + }; + _count = {(typeOf _x) == _part_in} count (nearestObjects [(getPosATL player), [_part_in], _distance]); + if (_count >= _qty_in) then { + _canAfford = true; + }; + diag_log format["DEBUG vehicle sell count: %1", _count]; + + } 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; }; - cutText [(localize "str_epoch_player_106") , "PLAIN DOWN"]; }; - if (_finished) then { - // Double check for items - if(_buy_o_sell == "buy") then { - _qty = {_x == _part_in} count magazines player; + if (_canAfford) then { + + //["PVDZE_obj_Trade",[_activatingPlayer,_traderID,_bos]] call callRpcProcedure; + // if (isNil "_obj") then { _obj = "Unknown Vehicle" }; + 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 { - if (_part_in isKindOf "AIR") then { - _obj = nearestObjects [(getPosATL player), [_part_in], dayz_sellDistance_air]; - } else { - _obj = nearestObjects [(getPosATL player), [_part_in], dayz_sellDistance_vehicle]; - }; - _qty = count _obj; + // Buying + PVDZE_obj_Trade = [_activatingPlayer,_traderID,_bos,_part_out,inTraderCity,_part_in,_qty_in]; }; - - if (_qty >= _qty_in) then { - - //["PVDZE_obj_Trade",[_activatingPlayer,_traderID,_bos]] call callRpcProcedure; - if (isNil "_obj") then { _obj = "Unknown Vehicle" }; - 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"; + publicVariableServer "PVDZE_obj_Trade"; - //diag_log format["DEBUG Starting to wait for answer: %1", PVDZE_obj_Trade]; + //diag_log format["DEBUG Starting to wait for answer: %1", PVDZE_obj_Trade]; + + if(_buy_o_sell == "buy") then { waitUntil {!isNil "dayzTradeResult"}; @@ -110,125 +118,142 @@ if (_qty >= _qty_in) then { if(dayzTradeResult == "PASS") then { - if(_buy_o_sell == "buy") then { + // First select key color + _keyColor = ["Green","Red","Blue","Yellow","Black"] call BIS_fnc_selectRandom; - // First select key color - _keyColor = ["Green","Red","Blue","Yellow","Black"] call BIS_fnc_selectRandom; + // then select number from 1 - 2500 + _keyNumber = (floor(random 2500)) + 1; - // then select number from 1 - 2500 - _keyNumber = (floor(random 2500)) + 1; + // Combine to key (eg.ItemKeyYellow2494) classname + _keySelected = format[("ItemKey%1%2"),_keyColor,_keyNumber]; - // Combine to key (eg.ItemKeyYellow2494) classname - _keySelected = format[("ItemKey%1%2"),_keyColor,_keyNumber]; - - _isKeyOK = isClass(configFile >> "CfgWeapons" >> _keySelected); + _isKeyOK = isClass(configFile >> "CfgWeapons" >> _keySelected); - _config = _keySelected; - _isOk = [player,_config] call BIS_fnc_invAdd; - waitUntil {!isNil "_isOk"}; - if (_isOk and _isKeyOK) then { + _config = _keySelected; + _isOk = [player,_config] call BIS_fnc_invAdd; - _removed = ([player,_part_in,_qty_in] call BIS_fnc_invRemove); - if(_removed == _qty_in) then { - _dir = round(random 360); + waitUntil {!isNil "_isOk"}; - _helipad = nearestObjects [player, ["HeliHCivil","HeliHempty"], 100]; - if(count _helipad > 0) then { - _location = (getPosATL (_helipad select 0)); - } else { - _location = [(position player),0,20,1,0,2000,0] call BIS_fnc_findSafePos; - }; - - //place vehicle spawn marker (local) - _veh = createVehicle ["Sign_arrow_down_large_EP1", _location, [], 0, "CAN_COLLIDE"]; + if (_isOk and _isKeyOK) then { - _location = (getPosATL _veh); + _done = [[[_part_in,_qty_in]],0] call epoch_returnChange; + if (_done) then { - //["PVDZE_veh_Publish",[_veh,[_dir,_location],_part_out,false,_keySelected]] call callRpcProcedure; - PVDZE_veh_Publish2 = [_veh,[_dir,_location],_part_out,false,_keySelected,_activatingPlayer]; - publicVariableServer "PVDZE_veh_Publish2"; - - cutText [format[(localize "STR_EPOCH_ACTIONS_11"),_qty_in,_textPartIn,_textPartOut], "PLAIN DOWN"]; + // spawn vehicle + _dir = round(random 360); + + _helipad = nearestObjects [player, ["HeliHCivil","HeliHempty"], 100]; + if(count _helipad > 0) then { + _location = (getPosATL (_helipad select 0)); } else { - player removeMagazine _keySelected; + _location = [(position player),0,20,1,0,2000,0] call BIS_fnc_findSafePos; }; - } else { - cutText [(localize "str_epoch_player_107"), "PLAIN DOWN"]; + + //place vehicle spawn marker (local) + _veh = createVehicle ["Sign_arrow_down_large_EP1", _location, [], 0, "CAN_COLLIDE"]; + + _location = (getPosATL _veh); + + //["PVDZE_veh_Publish",[_veh,[_dir,_location],_part_out,false,_keySelected]] call callRpcProcedure; + PVDZE_veh_Publish2 = [_veh,[_dir,_location],_part_out,false,_keySelected,_activatingPlayer]; + publicVariableServer "PVDZE_veh_Publish2"; + + cutText [format[(localize "STR_EPOCH_ACTIONS_11"),_qty_in,_textPartIn,_textPartOut], "PLAIN DOWN"]; }; } else { - - _obj = _obj select 0; - - //check to make sure vehicle has no more than 75% average tire damage - _hitpoints = _obj call vehicle_getHitpoints; - _okToSell = true; - - // count parts - _tires = 0; - - // total damage - _tireDmg = 0; - - _damage = 0; - { - if(["Wheel",_x,false] call fnc_inString) then { - _damage = [_obj,_x] call object_getHit; - _tireDmg = _tireDmg + _damage; - _tires = _tires + 1; - }; - } forEach _hitpoints; - - // find average tire damage - if(_tireDmg > 0 and _tires > 0) then { - if((_tireDmg / _tires) > 0.75) then { - _okToSell = false; - }; - }; - - if(local _obj and !isNull _obj and alive _obj) then { - - if(_okToSell) then { - - for "_x" from 1 to _qty_out do { - player addMagazine _part_out; - }; - - _objectID = _obj getVariable ["ObjectID","0"]; - _objectUID = _obj getVariable ["ObjectUID","0"]; - - PVDZE_obj_Delete = [_objectID,_objectUID,_activatingPlayer]; - publicVariableServer "PVDZE_obj_Delete"; - - deleteVehicle _obj; - - cutText [format[(localize "str_epoch_player_181"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; - - } else { - cutText [format[(localize "str_epoch_player_182"),_textPartIn] , "PLAIN DOWN"]; - }; - } else { - cutText [(localize "str_epoch_player_245"), "PLAIN DOWN"]; - }; - + cutText [(localize "str_epoch_player_107"), "PLAIN DOWN"]; }; - - {player removeAction _x} forEach s_player_parts;s_player_parts = []; - s_player_parts_crtl = -1; } else { cutText [format[(localize "str_epoch_player_183"),_textPartOut] , "PLAIN DOWN"]; }; - dayzTradeResult = nil; + } else { + + //sell + _distance = dayz_sellDistance_vehicle; + if (_part_in isKindOf "Air") then { + _distance = dayz_sellDistance_air; + }; + if (_part_in isKindOf "Ship") then { + _distance = dayz_sellDistance_boat; + }; + + _objects = nearestObjects [(getPosATL player), [_part_in], _distance]; + + diag_log format["DEBUG vehicle sell objects: %1", _objects]; + + _qty = ({(typeOf _x) == _part_in} count _objects); + + if (_qty >= _qty_in) then { + + _obj = (_objects select 0); + + //check to make sure vehicle has no more than 75% average tire damage + _hitpoints = _obj call vehicle_getHitpoints; + _okToSell = true; + + // count parts + _tires = 0; + + // total damage + _tireDmg = 0; + + _damage = 0; + { + if(["Wheel",_x,false] call fnc_inString) then { + _damage = [_obj,_x] call object_getHit; + _tireDmg = _tireDmg + _damage; + _tires = _tires + 1; + }; + } forEach _hitpoints; + + // find average tire damage + if(_tireDmg > 0 and _tires > 0) then { + if((_tireDmg / _tires) > 0.75) then { + _okToSell = false; + }; + }; + + _objectID = _obj getVariable ["ObjectID","0"]; + _objectUID = _obj getVariable ["ObjectUID","0"]; + + _notSetup = (_objectID == "0" && _objectUID == "0"); + + if(local _obj and !isNull _obj and alive _obj and !_notSetup) then { + + if(_okToSell) then { + + + + //if(_objectID != "0" && _objectUID != "0") then { + + PVDZE_obj_Delete = [_objectID,_objectUID,_activatingPlayer]; + publicVariableServer "PVDZE_obj_Delete"; + + deleteVehicle _obj; + + // payout + _canAfford = [[[_part_out,_qty_out]],1] call epoch_returnChange; + + cutText [format[(localize "str_epoch_player_181"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; + + + } else { + cutText [format[(localize "str_epoch_player_182"),_textPartIn] , "PLAIN DOWN"]; + }; + } else { + cutText [(localize "str_epoch_player_245"), "PLAIN DOWN"]; + }; + }; }; - }; - -} else { - _needed = _qty_in - _qty; - if(_buy_o_sell == "buy") then { - cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; + dayzTradeResult = nil; } else { - cutText [format[(localize "str_epoch_player_185"),_textPartIn] , "PLAIN DOWN"]; - }; + _needed = _qty_in - _qty; + if(_buy_o_sell == "buy") then { + cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; + } else { + cutText [format[(localize "str_epoch_player_185"),_textPartIn] , "PLAIN DOWN"]; + }; + }; }; - -DZE_ActionInProgress = false; +DZE_ActionInProgress = false; \ No newline at end of file diff --git a/SQF/dayz_code/actions/trade_backpacks.sqf b/SQF/dayz_code/actions/trade_backpacks.sqf index 5d1252ac2..939b3f319 100644 --- a/SQF/dayz_code/actions/trade_backpacks.sqf +++ b/SQF/dayz_code/actions/trade_backpacks.sqf @@ -6,6 +6,8 @@ DZE_ActionInProgress = true; _activatingPlayer = player; +diag_log format["DEBUG BACKPACK: %1", _this]; + _part_out = (_this select 3) select 0; _part_in = (_this select 3) select 1; _qty_out = (_this select 3) select 2; @@ -14,89 +16,96 @@ _buy_o_sell = (_this select 3) select 4; _textPartIn = (_this select 3) select 5; _textPartOut = (_this select 3) select 6; _traderID = (_this select 3) select 7; -_bos = 0; -if(_buy_o_sell == "buy") then { - _qty = {_x == _part_in} count magazines player; -} else { +_bos = 0; +if(_buy_o_sell == "sell") then { _bos = 1; - _qty = 0; - _bag = unitBackpack player; - _class = typeOf _bag; - if(_class == _part_in) then { - _qty = 1; - }; }; -if (_qty >= _qty_in) then { - - cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"]; +cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"]; - [1,1] call dayz_HungerThirst; - // force animation - player playActionNow "Medic"; +// force animation +player playActionNow "Medic"; +[1,1] call dayz_HungerThirst; + +r_interrupt = false; +_animState = animationState player; +r_doLoop = true; +_started = false; +_finished = false; - r_interrupt = false; +while {r_doLoop} do { _animState = animationState player; - r_doLoop = true; - _started = false; - _finished = false; - - while {r_doLoop} do { - _animState = animationState player; - _isMedic = ["medic",_animState] call fnc_inString; - if (_isMedic) then { - _started = true; - }; - if (_started and !_isMedic) then { - r_doLoop = false; - _finished = true; - }; - if (r_interrupt) then { - r_doLoop = false; - }; - sleep 0.1; + _isMedic = ["medic",_animState] call fnc_inString; + if (_isMedic) then { + _started = true; }; - r_doLoop = false; - - if (!_finished) exitWith { - r_interrupt = false; - if (vehicle player == player) then { - [objNull, player, rSwitchMove,""] call RE; - player playActionNow "stop"; - }; - cutText [(localize "str_epoch_player_106") , "PLAIN DOWN"]; + if (_started and !_isMedic) then { + r_doLoop = false; + _finished = true; }; + if (r_interrupt) then { + r_doLoop = false; + }; + sleep 0.1; +}; +r_doLoop = false; - if (_finished) then { +if (!_finished) exitWith { + r_interrupt = false; + if (vehicle player == player) then { + [objNull, player, rSwitchMove,""] call RE; + player playActionNow "stop"; + }; + DZE_ActionInProgress = false; + cutText [(localize "str_epoch_player_106") , "PLAIN DOWN"]; +}; - // Double check we still have parts - if(_buy_o_sell == "buy") then { - _qty = {_x == _part_in} count magazines player; - } else { - _qty = 0; - _bag = unitBackpack player; - _class = typeOf _bag; - if(_class == _part_in) then { - _qty = 1; - }; +if (_finished) then { + + _canAfford = false; + if(_bos == 1) then { + + //sell + _qty = 0; + _bag = unitBackpack player; + _class = typeOf _bag; + if(_class == _part_in) then { + _qty = 1; }; - if (_qty >= _qty_in) then { - - //["PVDZE_obj_Trade",[_activatingPlayer,_traderID,_bos]] call callRpcProcedure; - if (isNil "_bag") then { _bag = "Unknown Backpack" }; - 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]; + if((typeOf (unitBackpack player)) == _part_in) then { + removeBackpack player; + _canAfford = [[[_part_out,_qty_out]],1] call epoch_returnChange; }; - publicVariableServer "PVDZE_obj_Trade"; + }; + + } 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; + }; + }; + + if (_canAfford) then { + + //["PVDZE_obj_Trade",[_activatingPlayer,_traderID,_bos]] call callRpcProcedure; + if (isNil "_bag") then { _bag = "Unknown Backpack" }; + 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"; - //diag_log format["DEBUG Starting to wait for answer: %1", PVDZE_obj_Trade]; + if(_bos == 0) then { waitUntil {!isNil "dayzTradeResult"}; @@ -104,38 +113,25 @@ if (_qty >= _qty_in) then { if(dayzTradeResult == "PASS") then { - if(_buy_o_sell == "buy") then { - - _num_removed = ([player,_part_in,_qty_in] call BIS_fnc_invRemove); - if(_num_removed == _qty_in) then { - removeBackpack player; - player addBackpack _part_out; - }; - } else { - // Sell - if((typeOf (unitBackpack player)) == _part_in) then { - removeBackpack player; - for "_x" from 1 to _qty_out do { - player addMagazine _part_out; - }; - }; + _done = [[[_part_in,_qty_in]],0] call epoch_returnChange; + if (_done) then { + removeBackpack player; + player addBackpack _part_out; + cutText [format[(localize "str_epoch_player_186"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; }; - cutText [format[(localize "str_epoch_player_186"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; - - {player removeAction _x} forEach s_player_parts;s_player_parts = []; - s_player_parts_crtl = -1; - } else { cutText [format[(localize "str_epoch_player_183"),_textPartOut] , "PLAIN DOWN"]; }; - dayzTradeResult = nil; + + } else { + cutText [format[(localize "str_epoch_player_186"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; }; + dayzTradeResult = nil; + } else { + _needed = _qty_in - _qty; + cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; }; - -} else { - _needed = _qty_in - _qty; - cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; }; -DZE_ActionInProgress = false; +DZE_ActionInProgress = false; \ No newline at end of file diff --git a/SQF/dayz_code/actions/trade_items.sqf b/SQF/dayz_code/actions/trade_items.sqf index 15908e38f..6e2dd417f 100644 --- a/SQF/dayz_code/actions/trade_items.sqf +++ b/SQF/dayz_code/actions/trade_items.sqf @@ -15,8 +15,6 @@ _textPartIn = (_this select 3) select 5; _textPartOut = (_this select 3) select 6; _traderID = (_this select 3) select 7; -_removed = 0; - _bos = 0; if(_buy_o_sell == "sell") then { _bos = 1; @@ -29,6 +27,7 @@ r_autoTrade = true; while {r_autoTrade} do { _removed = 0; + cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"]; [1,1] call dayz_HungerThirst; player playActionNow "Medic"; @@ -113,19 +112,16 @@ while {r_autoTrade} do { 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"]; }; - 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"]; diff --git a/SQF/dayz_code/actions/trade_weapons.sqf b/SQF/dayz_code/actions/trade_weapons.sqf index b165646fe..86fa282b1 100644 --- a/SQF/dayz_code/actions/trade_weapons.sqf +++ b/SQF/dayz_code/actions/trade_weapons.sqf @@ -6,6 +6,8 @@ DZE_ActionInProgress = true; _activatingPlayer = player; +diag_log format["DEBUG WEAPONS: %1", _this]; + _part_out = (_this select 3) select 0; _part_in = (_this select 3) select 1; _qty_out = (_this select 3) select 2; @@ -14,118 +16,170 @@ _buy_o_sell = (_this select 3) select 4; _textPartIn = (_this select 3) select 5; _textPartOut = (_this select 3) select 6; _traderID = (_this select 3) select 7; -_bos = 0; -if(_buy_o_sell == "buy") then { - _qty = {_x == _part_in} count magazines player; +_bos = 0; +_abort = false; +_msg = ""; +if(_buy_o_sell == "sell") then { + _bos = 1; + + _msg = "Need the weapon in your hands before you can sell it."; + _config = (configFile >> "CfgWeapons" >> _part_in); + _configName = configName(_config); + + _abort = (!(_configName in (weapons player))); + + if(_isToolBelt or _isBinocs) then { + _msg = "Need the item on your toolbelt before you can sell it."; + }; } else { - _qty = {_x == _part_in} count weapons player; - _bos = 1; + + // buying item type must NOT exist if rifle or pistol + _msg = "Drop or sell your current weapon before you can buy a new one."; + _config = (configFile >> "CfgWeapons" >> _part_out); + _configName = configName(_config); + _wepType = getNumber(_config >> "Type"); + + _isPistol = (_wepType == 2); + _isRifle = (_wepType == 1); + _isToolBelt = (_wepType == 131072); + _isBinocs = (_wepType == 4096); + + if (_isRifle) then { + _abort = ((primaryWeapon player) != ""); + }; + if (_isPistol) then { + _secondaryWeapon = ""; + { + if ((getNumber (configFile >> "CfgWeapons" >> _x >> "Type")) == 2) exitWith { + _secondaryWeapon = _x; + }; + } forEach (weapons player); + _abort = (_secondaryWeapon != ""); + }; + if(_isToolBelt or _isBinocs) then { + _abort = (_configName in (weapons player)); + _msg = "Drop or sell your current toolbelt item before you can buy a new one."; + }; }; -if (_qty >= _qty_in) then { +if (_abort) exitWith { + cutText [_msg, "PLAIN DOWN"]; + DZE_ActionInProgress = false; +}; - cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"]; +cutText [(localize "str_epoch_player_105"), "PLAIN DOWN"]; - [1,1] call dayz_HungerThirst; - // force animation - player playActionNow "Medic"; +// force animation +player playActionNow "Medic"; +[1,1] call dayz_HungerThirst; - //_dis=20; - //_sfx = "repair"; - //[player,_sfx,0,false,_dis] call dayz_zombieSpeak; - //[player,_dis,true,(getPosATL player)] spawn player_alertZombies; - - r_interrupt = false; +r_interrupt = false; +_animState = animationState player; +r_doLoop = true; +_started = false; +_finished = false; + +while {r_doLoop} do { _animState = animationState player; - r_doLoop = true; - _started = false; - _finished = false; - - while {r_doLoop} do { - _animState = animationState player; - _isMedic = ["medic",_animState] call fnc_inString; - if (_isMedic) then { - _started = true; - }; - if (_started and !_isMedic) then { - r_doLoop = false; - _finished = true; - }; - if (r_interrupt) then { - r_doLoop = false; - }; - sleep 0.1; + _isMedic = ["medic",_animState] call fnc_inString; + if (_isMedic) then { + _started = true; }; - r_doLoop = false; - - if (!_finished) exitWith { - r_interrupt = false; - if (vehicle player == player) then { - [objNull, player, rSwitchMove,""] call RE; - player playActionNow "stop"; - }; - cutText [(localize "str_epoch_player_106") , "PLAIN DOWN"]; + if (_started and !_isMedic) then { + r_doLoop = false; + _finished = true; }; + if (r_interrupt) then { + r_doLoop = false; + }; + sleep 0.1; +}; +r_doLoop = false; - if (_finished) then { +if (!_finished) exitWith { + r_interrupt = false; + if (vehicle player == player) then { + [objNull, player, rSwitchMove,""] call RE; + player playActionNow "stop"; + }; + DZE_ActionInProgress = false; + cutText [(localize "str_epoch_player_106") , "PLAIN DOWN"]; +}; - // double check for all parts - if(_buy_o_sell == "buy") then { - _qty = {_x == _part_in} count magazines player; - } else { - _qty = {_x == _part_in} count weapons player; - }; +if (_finished) then { + _canAfford = false; + if(_bos == 1) then { + + //sell + _qty = {_x == _part_in} count weapons player; if (_qty >= _qty_in) then { - - //["PVDZE_obj_Trade",[_activatingPlayer,_traderID,_bos]] call callRpcProcedure; - if (isNil "_part_out") then { _part_out = "Unknown Weapon/Magazine" }; - 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]; + _part_inClass = configFile >> "CfgWeapons" >> _part_in; + _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"; + }; + + } 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; + }; + }; + + if (_canAfford) then { + + //["PVDZE_obj_Trade",[_activatingPlayer,_traderID,_bos]] call callRpcProcedure; + if (isNil "_part_out") then { _part_out = "Unknown Weapon/Magazine" }; + 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 { + waitUntil {!isNil "dayzTradeResult"}; //diag_log format["DEBUG Complete Trade: %1", dayzTradeResult]; - + if(dayzTradeResult == "PASS") then { - - _removed = ([player,_part_in,_qty_in] call BIS_fnc_invRemove); - - if(_removed == _qty_in) then { - for "_x" from 1 to _qty_out do { - if(_buy_o_sell == "buy") then { - player addWeapon _part_out; - } else { - player addMagazine _part_out; - }; - }; + + _done = [[[_part_in,_qty_in]],0] call epoch_returnChange; + if (_done) then { + player addWeapon _part_out; cutText [format[(localize "str_epoch_player_186"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; }; - - - - {player removeAction _x} forEach s_player_parts;s_player_parts = []; - s_player_parts_crtl = -1; } else { cutText [format[(localize "str_epoch_player_183"),_textPartOut] , "PLAIN DOWN"]; }; - dayzTradeResult = nil; + } else { + // selling + cutText [format[(localize "str_epoch_player_186"),_qty_in,_textPartIn,_qty_out,_textPartOut], "PLAIN DOWN"]; }; - }; -} else { - _needed = _qty_in - _qty; - cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; + dayzTradeResult = nil; + } else { + if(_bos == 0) then { + _qty = {_x == _part_in} count magazines player; + } else { + _qty = {_x == _part_in} count weapons player; + }; + _needed = _qty_in - _qty; + cutText [format[(localize "str_epoch_player_184"),_needed,_textPartIn] , "PLAIN DOWN"]; + }; }; DZE_ActionInProgress = false; diff --git a/SQF/dayz_code/compile/player_traderMenu.sqf b/SQF/dayz_code/compile/player_traderMenu.sqf index d3f481cb0..53e327942 100644 --- a/SQF/dayz_code/compile/player_traderMenu.sqf +++ b/SQF/dayz_code/compile/player_traderMenu.sqf @@ -123,7 +123,7 @@ TraderDialogLoadItemList = { if (_name isKindOf "Ship") then { _distance = dayz_sellDistance_boat; }; - _count = {(typeOf _x) == _name} count (nearestObjects [player, [_name], _distance]); + _count = {(typeOf _x) == _name} count (nearestObjects [(getPosATL player), [_name], _distance]); }; }; };