TARGET_NAME = "repair" PATTERN = "return" local trace_assert = igi_helper.trace_assert local trace_dbg = igi_helper.trace_dbg local TASK_STATUSES = igi_subtask.TASK_STATUSES local WorldState = igi_world_state.WorldState function is_failed(se_obj, section_name) if not se_obj then return true end return se_obj:section_name() ~= section_name end -- Patch fetch task so that it takes condition of items into account (must be greater than threshold) -- TODO: Allow adjustment of threshold per task, rather than globally function ready_to_finish(se_obj) local item = igi_helper.level_object(se_obj.id) -- Reject in case the game object cannot be found (server object is still intact) if not item then return false end local threshold = 90 local in_good_condition = true -- Reject if overall weapon condition is less than threshold if item.condition and item:condition() < (threshold/100) then in_good_condition = false end -- Reject if one or more parts have a condition less than threshold local parts = se_load_var(item:id(), item:name(), "parts") if parts then for k,v in pairs(parts) do if string.find(k, "prt_w_") and v < threshold then in_good_condition = false end end end local is_with_actor = se_obj.parent_id == 0 return in_good_condition and is_with_actor end function get_status(entity) local se_obj = WorldState.objects[entity.id] if is_failed(se_obj, entity.section_name) then return TASK_STATUSES.FAILED end return ready_to_finish(se_obj) and TASK_STATUSES.READY_TO_FINISH or TASK_STATUSES.RUNNING end function test(entity) local assert_test = igi_tests.assert_test entity._test_stage = (entity._test_stage or 0) + 1 local function repair_item(item) if not item then return end -- Set overall item condition to low item:set_condition(100) -- Set condition of individual weapon parts to low local sec = SYS_GetParam(0, item:section(),"parent_section") or item:section() local parts = itms_manager.ini_parts:r_string_ex("con_parts_list", sec) local parts_data = {} for i,part in pairs(str_explode(parts, ",")) do parts_data[part] = 100 end se_save_var( item:id(), item:name(), "parts", parts_data ) end -- Go to Item if entity._test_stage == 1 then local se_obj = igi_entities.get_binded_object(entity) assert_test(se_obj, "Entity does not exist") igi_tests.travel_to_se_obj(se_obj) -- Break Item elseif entity._test_stage == 2 then local se_obj = igi_entities.get_binded_object(entity) local obj = igi_helper.level_object(se_obj.id) assert_test(obj, "Entity is not online when player travels to it") igi_actions.actions.break_item(se_obj) assert_test(entity.status == "RUNNING", "Task is still completeable after reducing item condition") -- Get Item elseif entity._test_stage == 3 then local se_obj = igi_entities.get_binded_object(entity) local obj = igi_helper.level_object(se_obj.id) db.actor:transfer_item(obj, db.actor) -- Repair Item elseif entity._test_stage == 4 then local se_obj = igi_entities.get_binded_object(entity) local obj = igi_helper.level_object(se_obj.id) repair_item(obj) elseif entity._test_stage == 5 then assert_test(entity.status == "READY_TO_FINISH", "Quest did not complete") return true end end igi_tests.register_subtask_test("test_target_repair", { entities = { { entity_type = "item", target = "repair", section_name = "wpn_ak", to_create = true, where = "[location_1_1.id]", }, { entity_type = "location", where = "0,0", search_for = "smart", } } })