From 4367c5d2d79b499bae2afa1f4596e9b004db5f1c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 28 Mar 2024 20:09:14 +0100 Subject: [PATCH] Re-activate villager day jobs again --- mods/rp_mobs_mobs/mobs/villager.lua | 106 +++++++++++----------------- 1 file changed, 40 insertions(+), 66 deletions(-) diff --git a/mods/rp_mobs_mobs/mobs/villager.lua b/mods/rp_mobs_mobs/mobs/villager.lua index 19e9f4be..cbad5d82 100644 --- a/mods/rp_mobs_mobs/mobs/villager.lua +++ b/mods/rp_mobs_mobs/mobs/villager.lua @@ -229,7 +229,7 @@ local find_reachable_node = function(startpos, nodenames, searchdistance, under_ local timeout = PATHFINDER_TIMEOUT local path = rp_pathfinder.find_path(startpos, searchpos, searchdistance, options, timeout) if path then - return npos, path + return searchpos, path end end table.remove(nodes, r) @@ -605,59 +605,32 @@ local movement_decider = function(task_queue, mob) rp_mobs.add_task_to_task_queue(task_queue, task_find_new_home_bed) local day_phase = get_day_phase() + local target + local task_label + local mobpos = mob.object:get_pos() if day_phase == "night" then -- Go to home bed at night if mob._custom_state.home_bed then - local mobpos = mob.object:get_pos() - local target = find_free_horizontal_neighbor(mob._custom_state.home_bed) - - if target then - -- First find the path asynchronously ... - local mt_find_bed_path = create_microtask_find_path_async(mobpos, target) - mt_find_bed_path.start_animation = "idle" - - -- ... then follow it - local mt_generate_microtasks = rp_mobs.create_microtask({ - label = "generate", - singlestep = true, - on_step = function(self, mob) - local mts = path_to_microtasks(mob._temp_custom_state.follow_path) - for m=1, #mts do - local parent_task = self.task - local microtask = mts[m] - rp_mobs.add_microtask_to_task(mob, microtask, parent_task) - end - end, - }) - - local task_walk_to_bed = rp_mobs.create_task({label="walk to bed"}) - rp_mobs.add_microtask_to_task(mob, mt_find_bed_path, task_walk_to_bed) - rp_mobs.add_microtask_to_task(mob, mt_generate_microtasks, task_walk_to_bed) - - rp_mobs.add_task_to_task_queue(task_queue, task_walk_to_bed) - end + target = find_free_horizontal_neighbor(mob._custom_state.home_bed) + task_label = "walk to bed" end elseif day_phase == "day" then - local r = math.random(1, 2) + -- Go to worksite or recreation site at day + local r = 1 local profession = mob._custom_state.profession local targetnodes local under_air = true if r == 1 then -- profession + task_label = "walk to workplace" if profession == "farmer" then - local a = math.random(1, 2) - if a == 1 then - targetnodes = { "group:farming_plant" } - under_air = true - else - targetnodes = { "rp_default:papyrus" } - under_air = false - end + targetnodes = { "group:farming_plant" } + under_air = true elseif profession == "blacksmith" then targetnodes = { "group:furnace" } under_air = false elseif profession == "tavernkeeper" then - targetnodes = { "group:bucket", "rp_decor:barrel" } + targetnodes = { "rp_decor:barrel" } under_air = false elseif profession == "butcher" then targetnodes = { "group:tree", "rp_jewels:bench" } @@ -668,6 +641,7 @@ local movement_decider = function(task_queue, mob) end else -- recreational + task_label = "walk to recreation site" local a = math.random(1, 4) if a == 1 then targetnodes = { "group:bonfire" } @@ -679,35 +653,35 @@ local movement_decider = function(task_queue, mob) end if targetnodes then - -- Go to workplace/recreational node at day - local mobpos = mob.object:get_pos() - local targetpos, goals = find_reachable_node(mobpos, targetnodes, WORK_DISTANCE, under_air) - if targetpos and goals and #goals > 0 then - local task_walk_to_target = rp_mobs.create_task({label="walk to recreation/workplace"}) - for g=1, #goals do - local goal = goals[g] - -- Open door - if goal.goal_type == "door" then - local mt_open_door = create_microtask_open_door(goal.pos) - mt_open_door.start_animation = "idle" - rp_mobs.add_microtask_to_task(mob, mt_open_door, task_walk_to_target) - -- Traverse path - elseif goal.goal_type == "path" then - local path = goal.path - local target = path[#path] - local start = path[1] - local mt_walk_to_target = rp_mobs.microtasks.pathfind_and_walk_to(start, target, WALK_SPEED, JUMP_STRENGTH, true, WORK_DISTANCE, MAX_JUMP, MAX_DROP) - mt_walk_to_target.start_animation = "walk" - rp_mobs.add_microtask_to_task(mob, mt_walk_to_target, task_walk_to_target) - else - minetest.log("error", "[rp_mobs_mobs] Villager walk algorithm: Invalid goal_type '"..tostring(goal.goal_type).."'!") - return - end - end - rp_mobs.add_task_to_task_queue(task_queue, task_walk_to_target) - end + target = find_reachable_node(mobpos, targetnodes, WORK_DISTANCE, under_air) end end + + if target then + -- First find the path asynchronously ... + local mt_find_path = create_microtask_find_path_async(mobpos, target) + mt_find_path.start_animation = "idle" + + -- ... then follow it + local mt_generate_microtasks = rp_mobs.create_microtask({ + label = "generate microtasks from path", + singlestep = true, + on_step = function(self, mob) + local mts = path_to_microtasks(mob._temp_custom_state.follow_path) + for m=1, #mts do + local parent_task = self.task + local microtask = mts[m] + rp_mobs.add_microtask_to_task(mob, microtask, parent_task) + end + end, + }) + + local task_walk = rp_mobs.create_task({label=task_label or "walk to somewhere"}) + rp_mobs.add_microtask_to_task(mob, mt_find_path, task_walk) + rp_mobs.add_microtask_to_task(mob, mt_generate_microtasks, task_walk) + + rp_mobs.add_task_to_task_queue(task_queue, task_walk) + end end local heal_decider = function(task_queue, mob)