Added Config Crafting inputstrict

This commit is contained in:
Florian Kinder
2014-02-09 03:41:37 +01:00
parent caafc7fbcb
commit e4c9e90442
2 changed files with 48 additions and 45 deletions

View File

@@ -16,6 +16,7 @@ class ItemMixOil : CA_Magazine {
requiretools[] = {}; requiretools[] = {};
output[] = {{"ItemJerryMixed",1}}; output[] = {{"ItemJerryMixed",1}};
input[] = {{"ItemMixOil",1},{"ItemJerrycan",1}}; input[] = {{"ItemMixOil",1},{"ItemJerrycan",1}};
inputstrict = true;
}; };
}; };
}; };

View File

@@ -14,12 +14,13 @@ class ItemActions
requiretools[] = {"ItemToolbox","ItemKnife"}; // (cfgweapons only) requiretools[] = {"ItemToolbox","ItemKnife"}; // (cfgweapons only)
output[] = {{"ItemTent",1}}; // (CfgMagazines, qty) output[] = {{"ItemTent",1}}; // (CfgMagazines, qty)
input[] = {{"ItemCanvas",2},{"ItemPole",2}}; // (CfgMagazines, qty) input[] = {{"ItemCanvas",2},{"ItemPole",2}}; // (CfgMagazines, qty)
inputstrict = true; // (CfgMagazines input without inheritsFrom) Optional
inputweapons[] = {"ItemToolbox"}; // consume toolbox (cfgweapons only) inputweapons[] = {"ItemToolbox"}; // consume toolbox (cfgweapons only)
outputweapons[] = {"ItemToolbox"}; // return 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"]; }; if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_63") , "PLAIN DOWN"]; };
DZE_ActionInProgress = true; 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"); _needNear = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "neednearby");
if("fire" in _needNear) then { if("fire" in _needNear) then {
_isNear = {inflamed _x} count (getPosATL player nearObjects _distance); _isNear = {inflamed _x} count (getPosATL player nearObjects _distance);
if(_isNear == 0) then { if(_isNear == 0) then {
_abort = true; _abort = true;
_reason = "fire"; _reason = "fire";
}; };
}; };
if("workshop" in _needNear) then { if("workshop" in _needNear) then {
_isNear = count (nearestObjects [player, ["Wooden_shed_DZ","WoodShack_DZ","WorkBench_DZ"], _distance]); _isNear = count (nearestObjects [player, ["Wooden_shed_DZ","WoodShack_DZ","WorkBench_DZ"], _distance]);
if(_isNear == 0) then { if(_isNear == 0) then {
_abort = true; _abort = true;
_reason = "workshop"; _reason = "workshop";
}; };
@@ -64,10 +65,11 @@ if(_abort) exitWith {
// diag_log format["Checking for fire: %1", _isFireNear]; // diag_log format["Checking for fire: %1", _isFireNear];
if (_canDo) then { if (_canDo) then {
_selectedRecipeTools = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "requiretools"); _selectedRecipeTools = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "requiretools");
_selectedRecipeOutput = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "output"); _selectedRecipeOutput = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "output");
_selectedRecipeInput = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "input"); _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"); _outputWeapons = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "outputweapons");
_inputWeapons = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "inputweapons"); _inputWeapons = getArray (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "inputweapons");
@@ -80,24 +82,24 @@ if (_canDo) then {
if(isNumber (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "randomOutput")) then { if(isNumber (configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "randomOutput")) then {
_randomOutput = getNumber(configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "randomOutput"); _randomOutput = getNumber(configFile >> _baseClass >> _item >> "ItemActions" >> _crafting >> "randomOutput");
}; };
_craft_doLoop = true; _craft_doLoop = true;
_tradeComplete = 0; _tradeComplete = 0;
while {_craft_doLoop} do { while {_craft_doLoop} do {
_temp_removed_array = []; _temp_removed_array = [];
_missing = ""; _missing = "";
_missingTools = false; _missingTools = false;
{ {
_hastoolweapon = _x in weapons player; _hastoolweapon = _x in weapons player;
if(!_hastoolweapon) exitWith { _craft_doLoop = false; _missingTools = true; _missing = _x; }; if(!_hastoolweapon) exitWith { _craft_doLoop = false; _missingTools = true; _missing = _x; };
} forEach _selectedRecipeTools; } forEach _selectedRecipeTools;
if(!_missingTools) then { if(!_missingTools) then {
// Dry run to see if all parts are available. // Dry run to see if all parts are available.
_proceed = true; _proceed = true;
if (count _selectedRecipeInput > 0) then { if (count _selectedRecipeInput > 0) then {
@@ -105,30 +107,30 @@ if (_canDo) then {
_itemIn = _x select 0; _itemIn = _x select 0;
_countIn = _x select 1; _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; }; if(_qty < _countIn) exitWith { _missing = _itemIn; _missingQty = (_countIn - _qty); _proceed = false; };
} forEach _selectedRecipeInput; } forEach _selectedRecipeInput;
}; };
// If all parts proceed // If all parts proceed
if (_proceed) then { if (_proceed) then {
cutText [(localize "str_epoch_player_62"), "PLAIN DOWN"]; cutText [(localize "str_epoch_player_62"), "PLAIN DOWN"];
[1,1] call dayz_HungerThirst; [1,1] call dayz_HungerThirst;
player playActionNow "Medic"; player playActionNow "Medic";
[player,_sfx,0,false] call dayz_zombieSpeak; [player,_sfx,0,false] call dayz_zombieSpeak;
[player,50,true,(getPosATL player)] spawn player_alertZombies; [player,50,true,(getPosATL player)] spawn player_alertZombies;
r_interrupt = false; r_interrupt = false;
_animState = animationState player; _animState = animationState player;
r_doLoop = true; r_doLoop = true;
_started = false; _started = false;
_finished = false; _finished = false;
while {r_doLoop} do { while {r_doLoop} do {
_animState = animationState player; _animState = animationState player;
_isMedic = ["medic",_animState] call fnc_inString; _isMedic = ["medic",_animState] call fnc_inString;
@@ -145,9 +147,9 @@ if (_canDo) then {
sleep 0.1; sleep 0.1;
}; };
r_doLoop = false; r_doLoop = false;
if (_finished) then { if (_finished) then {
_removed_total = 0; // count total of removed items _removed_total = 0; // count total of removed items
_tobe_removed_total = 0; // count total of all to be removed items _tobe_removed_total = 0; // count total of all to be removed items
// Take items // Take items
@@ -157,10 +159,10 @@ if (_canDo) then {
_countIn = _x select 1; _countIn = _x select 1;
// diag_log format["Recipe Finish: %1 %2", _itemIn,_countIn]; // diag_log format["Recipe Finish: %1 %2", _itemIn,_countIn];
_tobe_removed_total = _tobe_removed_total + _countIn; _tobe_removed_total = _tobe_removed_total + _countIn;
{ {
_configParent = configName(inheritsFrom(configFile >> "cfgMagazines" >> _x)); _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); _num_removed = ([player,_x] call BIS_fnc_invRemove);
_removed = _removed + _num_removed; _removed = _removed + _num_removed;
_removed_total = _removed_total + _num_removed; _removed_total = _removed_total + _num_removed;
@@ -172,20 +174,20 @@ if (_canDo) then {
_temp_removed_array set [count _temp_removed_array,_x]; _temp_removed_array set [count _temp_removed_array,_x];
}; };
}; };
} forEach magazines player; } forEach magazines player;
} forEach _selectedRecipeInput; } forEach _selectedRecipeInput;
//diag_log format["removed: %1 of: %2", _removed, _tobe_removed_total]; //diag_log format["removed: %1 of: %2", _removed, _tobe_removed_total];
// Only proceed if all parts were removed successfully // Only proceed if all parts were removed successfully
if(_removed_total == _tobe_removed_total) then { if(_removed_total == _tobe_removed_total) then {
_num_removed_weapons = 0; _num_removed_weapons = 0;
{ {
_num_removed_weapons = _num_removed_weapons + ([player,_x] call BIS_fnc_invRemove); _num_removed_weapons = _num_removed_weapons + ([player,_x] call BIS_fnc_invRemove);
} forEach _inputWeapons; } forEach _inputWeapons;
if (_num_removed_weapons == (count _inputWeapons)) then { if (_num_removed_weapons == (count _inputWeapons)) then {
if(_randomOutput == 1) then { if(_randomOutput == 1) then {
_selectedWeapon = _outputWeapons call BIS_fnc_selectRandom; _selectedWeapon = _outputWeapons call BIS_fnc_selectRandom;
_outputWeapons = [_selectedWeapon]; _outputWeapons = [_selectedWeapon];
@@ -195,19 +197,19 @@ if (_canDo) then {
_craft_doLoop = false; _craft_doLoop = false;
}; };
{ {
player addWeapon _x; player addWeapon _x;
} forEach _outputWeapons; } forEach _outputWeapons;
{ {
_itemOut = _x select 0; _itemOut = _x select 0;
_countOut = _x select 1; _countOut = _x select 1;
if (_itemOut == "ItemWaterbottleUnfilled") then { if (_itemOut == "ItemWaterbottleUnfilled") then {
if (_waterLevel > 0) then { if (_waterLevel > 0) then {
_itemOut = format["ItemWaterbottle%1oz",_waterLevel]; _itemOut = format["ItemWaterbottle%1oz",_waterLevel];
}; };
}; };
diag_log format["Checking for water level: %1", _waterLevel]; diag_log format["Checking for water level: %1", _waterLevel];
@@ -219,22 +221,22 @@ if (_canDo) then {
_tradeComplete = _tradeComplete+1; _tradeComplete = _tradeComplete+1;
_textCreate = getText(configFile >> "CfgMagazines" >> _itemOut >> "displayName"); _textCreate = getText(configFile >> "CfgMagazines" >> _itemOut >> "displayName");
// Add crafted item // Add crafted item
cutText [format[(localize "str_epoch_player_150"),_textCreate,_countOut], "PLAIN DOWN"]; cutText [format[(localize "str_epoch_player_150"),_textCreate,_countOut], "PLAIN DOWN"];
// sleep here // sleep here
sleep 1; sleep 1;
} forEach _selectedRecipeOutput; } forEach _selectedRecipeOutput;
}; };
} else { } else {
// Refund parts since we failed // Refund parts since we failed
{player addMagazine _x;} forEach _temp_removed_array; {player addMagazine _x;} forEach _temp_removed_array;
cutText [format[(localize "str_epoch_player_151"),_removed_total,_tobe_removed_total], "PLAIN DOWN"]; cutText [format[(localize "str_epoch_player_151"),_removed_total,_tobe_removed_total], "PLAIN DOWN"];
}; };
} else { } else {
r_interrupt = false; r_interrupt = false;
if (vehicle player == player) then { if (vehicle player == player) then {
@@ -244,7 +246,7 @@ if (_canDo) then {
cutText [(localize "str_epoch_player_64"), "PLAIN DOWN"]; cutText [(localize "str_epoch_player_64"), "PLAIN DOWN"];
_craft_doLoop = false; _craft_doLoop = false;
}; };
} else { } else {
_textMissing = getText(configFile >> "CfgMagazines" >> _missing >> "displayName"); _textMissing = getText(configFile >> "CfgMagazines" >> _missing >> "displayName");
cutText [format[(localize "str_epoch_player_152"),_missingQty, _textMissing,_tradeComplete], "PLAIN DOWN"]; cutText [format[(localize "str_epoch_player_152"),_missingQty, _textMissing,_tradeComplete], "PLAIN DOWN"];