From e4c9e904429e1623f729b886ba0615a28dbd76f7 Mon Sep 17 00:00:00 2001 From: Florian Kinder Date: Sun, 9 Feb 2014 03:41:37 +0100 Subject: [PATCH] Added Config Crafting inputstrict --- .../Configs/CfgMagazines/DZE/Items.hpp | 1 + SQF/dayz_code/actions/player_craftItem.sqf | 92 ++++++++++--------- 2 files changed, 48 insertions(+), 45 deletions(-) diff --git a/SQF/dayz_code/Configs/CfgMagazines/DZE/Items.hpp b/SQF/dayz_code/Configs/CfgMagazines/DZE/Items.hpp index 1c8fde7ae..df5027851 100644 --- a/SQF/dayz_code/Configs/CfgMagazines/DZE/Items.hpp +++ b/SQF/dayz_code/Configs/CfgMagazines/DZE/Items.hpp @@ -16,6 +16,7 @@ class ItemMixOil : CA_Magazine { requiretools[] = {}; output[] = {{"ItemJerryMixed",1}}; input[] = {{"ItemMixOil",1},{"ItemJerrycan",1}}; + inputstrict = true; }; }; }; diff --git a/SQF/dayz_code/actions/player_craftItem.sqf b/SQF/dayz_code/actions/player_craftItem.sqf index 6a189400d..6c14fe0a3 100644 --- a/SQF/dayz_code/actions/player_craftItem.sqf +++ b/SQF/dayz_code/actions/player_craftItem.sqf @@ -14,12 +14,13 @@ class ItemActions requiretools[] = {"ItemToolbox","ItemKnife"}; // (cfgweapons only) output[] = {{"ItemTent",1}}; // (CfgMagazines, qty) input[] = {{"ItemCanvas",2},{"ItemPole",2}}; // (CfgMagazines, qty) + inputstrict = true; // (CfgMagazines input without inheritsFrom) Optional inputweapons[] = {"ItemToolbox"}; // consume toolbox (cfgweapons only) outputweapons[] = {"ItemToolbox"}; // return toolbox (cfgweapons only) }; -}; +}; */ -private ["_tradeComplete","_onLadder","_canDo","_selectedRecipeOutput","_proceed","_itemIn","_countIn","_missing","_missingQty","_qty","_itemOut","_countOut","_started","_finished","_animState","_isMedic","_removed","_tobe_removed_total","_textCreate","_textMissing","_selectedRecipeInput","_num_removed","_removed_total","_temp_removed_array","_abort","_reason","_isNear","_missingTools","_hastoolweapon","_selectedRecipeTools","_distance","_crafting","_needNear","_item","_baseClass","_num_removed_weapons","_outputWeapons","_inputWeapons","_randomOutput","_craft_doLoop","_selectedWeapon","_selectedMag","_sfx"]; +private ["_tradeComplete","_onLadder","_canDo","_selectedRecipeOutput","_proceed","_itemIn","_countIn","_missing","_missingQty","_qty","_itemOut","_countOut","_started","_finished","_animState","_isMedic","_removed","_tobe_removed_total","_textCreate","_textMissing","_selectedRecipeInput","_selectedRecipeInputStrict","_num_removed","_removed_total","_temp_removed_array","_abort","_reason","_isNear","_missingTools","_hastoolweapon","_selectedRecipeTools","_distance","_crafting","_needNear","_item","_baseClass","_num_removed_weapons","_outputWeapons","_inputWeapons","_randomOutput","_craft_doLoop","_selectedWeapon","_selectedMag","_sfx"]; if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_63") , "PLAIN DOWN"]; }; DZE_ActionInProgress = true; @@ -44,14 +45,14 @@ _canDo = (!r_drag_sqf and !r_player_unconscious and !_onLadder); _needNear = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "neednearby"); if("fire" in _needNear) then { _isNear = {inflamed _x} count (getPosATL player nearObjects _distance); - if(_isNear == 0) then { + if(_isNear == 0) then { _abort = true; _reason = "fire"; }; }; if("workshop" in _needNear) then { _isNear = count (nearestObjects [player, ["Wooden_shed_DZ","WoodShack_DZ","WorkBench_DZ"], _distance]); - if(_isNear == 0) then { + if(_isNear == 0) then { _abort = true; _reason = "workshop"; }; @@ -64,10 +65,11 @@ if(_abort) exitWith { // diag_log format["Checking for fire: %1", _isFireNear]; if (_canDo) then { - + _selectedRecipeTools = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "requiretools"); - _selectedRecipeOutput = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "output"); - _selectedRecipeInput = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "input"); + _selectedRecipeOutput = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "output"); + _selectedRecipeInput = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "input"); + _selectedRecipeInputStrict = if ((isNumber (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "inputstrict")) && (getNumber (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "inputstrict"))) then {true} else {false}; _outputWeapons = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "outputweapons"); _inputWeapons = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "inputweapons"); @@ -80,24 +82,24 @@ if (_canDo) then { if(isNumber (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "randomOutput")) then { _randomOutput = getNumber(configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "randomOutput"); }; - + _craft_doLoop = true; _tradeComplete = 0; while {_craft_doLoop} do { _temp_removed_array = []; - + _missing = ""; _missingTools = false; { _hastoolweapon = _x in weapons player; if(!_hastoolweapon) exitWith { _craft_doLoop = false; _missingTools = true; _missing = _x; }; } forEach _selectedRecipeTools; - + if(!_missingTools) then { - - + + // Dry run to see if all parts are available. _proceed = true; if (count _selectedRecipeInput > 0) then { @@ -105,30 +107,30 @@ if (_canDo) then { _itemIn = _x select 0; _countIn = _x select 1; - _qty = { (_x == _itemIn) || (configName(inheritsFrom(configFile >> "cfgMagazines" >> _x)) == _itemIn) } count magazines player; - + _qty = { (_x == _itemIn) || (!_selectedRecipeInputStrict && configName(inheritsFrom(configFile >> "cfgMagazines" >> _x)) == _itemIn) } count magazines player; + if(_qty < _countIn) exitWith { _missing = _itemIn; _missingQty = (_countIn - _qty); _proceed = false; }; - + } forEach _selectedRecipeInput; }; - + // If all parts proceed if (_proceed) then { - + cutText [(localize "str_epoch_player_62"), "PLAIN DOWN"]; - + [1,1] call dayz_HungerThirst; player playActionNow "Medic"; - + [player,_sfx,0,false] call dayz_zombieSpeak; [player,50,true,(getPosATL player)] spawn player_alertZombies; - + r_interrupt = false; _animState = animationState player; r_doLoop = true; _started = false; _finished = false; - + while {r_doLoop} do { _animState = animationState player; _isMedic = ["medic",_animState] call fnc_inString; @@ -145,9 +147,9 @@ if (_canDo) then { sleep 0.1; }; r_doLoop = false; - + if (_finished) then { - + _removed_total = 0; // count total of removed items _tobe_removed_total = 0; // count total of all to be removed items // Take items @@ -157,10 +159,10 @@ if (_canDo) then { _countIn = _x select 1; // diag_log format["Recipe Finish: %1 %2", _itemIn,_countIn]; _tobe_removed_total = _tobe_removed_total + _countIn; - - { + + { _configParent = configName(inheritsFrom(configFile >> "cfgMagazines" >> _x)); - if( (_removed < _countIn) && ((_x == _itemIn) || _configParent == _itemIn)) then { + if( (_removed < _countIn) && ((_x == _itemIn) || (!_selectedRecipeInputStrict && _configParent == _itemIn))) then { _num_removed = ([player,_x] call BIS_fnc_invRemove); _removed = _removed + _num_removed; _removed_total = _removed_total + _num_removed; @@ -172,20 +174,20 @@ if (_canDo) then { _temp_removed_array set [count _temp_removed_array,_x]; }; }; - + } forEach magazines player; - + } forEach _selectedRecipeInput; - + //diag_log format["removed: %1 of: %2", _removed, _tobe_removed_total]; - + // Only proceed if all parts were removed successfully if(_removed_total == _tobe_removed_total) then { _num_removed_weapons = 0; { _num_removed_weapons = _num_removed_weapons + ([player,_x] call BIS_fnc_invRemove); } forEach _inputWeapons; - if (_num_removed_weapons == (count _inputWeapons)) then { + if (_num_removed_weapons == (count _inputWeapons)) then { if(_randomOutput == 1) then { _selectedWeapon = _outputWeapons call BIS_fnc_selectRandom; _outputWeapons = [_selectedWeapon]; @@ -195,19 +197,19 @@ if (_canDo) then { _craft_doLoop = false; }; { - player addWeapon _x; + player addWeapon _x; } forEach _outputWeapons; - { - + { + _itemOut = _x select 0; _countOut = _x select 1; - + if (_itemOut == "ItemWaterbottleUnfilled") then { - + if (_waterLevel > 0) then { _itemOut = format["ItemWaterbottle%1oz",_waterLevel]; }; - + }; diag_log format["Checking for water level: %1", _waterLevel]; @@ -219,22 +221,22 @@ if (_canDo) then { _tradeComplete = _tradeComplete+1; _textCreate = getText(configFile >> "CfgMagazines" >> _itemOut >> "displayName"); - + // Add crafted item cutText [format[(localize "str_epoch_player_150"),_textCreate,_countOut], "PLAIN DOWN"]; - // sleep here + // sleep here sleep 1; - + } forEach _selectedRecipeOutput; }; - + } else { - // Refund parts since we failed + // Refund parts since we failed {player addMagazine _x;} forEach _temp_removed_array; - + cutText [format[(localize "str_epoch_player_151"),_removed_total,_tobe_removed_total], "PLAIN DOWN"]; }; - + } else { r_interrupt = false; if (vehicle player == player) then { @@ -244,7 +246,7 @@ if (_canDo) then { cutText [(localize "str_epoch_player_64"), "PLAIN DOWN"]; _craft_doLoop = false; }; - + } else { _textMissing = getText(configFile >> "CfgMagazines" >> _missing >> "displayName"); cutText [format[(localize "str_epoch_player_152"),_missingQty, _textMissing,_tradeComplete], "PLAIN DOWN"];