diff --git a/maidroid/api.lua b/maidroid/api.lua index 426ac85..4eb550b 100644 --- a/maidroid/api.lua +++ b/maidroid/api.lua @@ -145,9 +145,10 @@ function maidroid.maidroid.set_wield_item_stack(self, stack) end -- maidroid.maidroid.add_item_to_main add item to main slot. +-- and returns leftover. function maidroid.maidroid.add_item_to_main(self, stack) local inv = self:get_inventory() - inv:add_item("main", stack) + return inv:add_item("main", stack) end -- maidroid.maidroid.move_main_to_wield moves itemstack from main to wield. diff --git a/maidroid_core/cores/farming.lua b/maidroid_core/cores/farming.lua index 19eb30d..4cfdc25 100644 --- a/maidroid_core/cores/farming.lua +++ b/maidroid_core/cores/farming.lua @@ -92,13 +92,20 @@ do -- register farming core end end + local function to_walk_randomly(self) + self.state = state.WALK_RANDOMLY + self.time_counters[1] = 0 + self.time_counters[2] = 0 + self:change_direction_randomly() + end + local function to_walk_to_plant(self, path, destination) self.state = state.WALK_TO_PLANT self.path = path self.destination = destination self.time_counters[1] = 0 -- find path interval self.time_counters[2] = 0 - self.pre_position = self.object:getpos() + self:change_direction(self.path[1]) end local function to_walk_to_mow(self, path, destination) @@ -107,7 +114,25 @@ do -- register farming core self.destination = destination self.time_counters[1] = 0 -- find path interval self.time_counters[2] = 0 - self.pre_position = self.object:getpos() + self:change_direction(self.path[1]) + end + + local function to_plant(self) + if self:move_main_to_wield(function(itemname) return (minetest.get_item_group(itemname, "seed") > 0 end)) then + self.state = state.PLANT + self.time_counters[1] = 0 + self.object:set_velocity{x = 0, y = 0, z = 0} + return + else + to_walk_randomly(self) + return + end + end + + local function to_mow(self) + self.state = state.MOW + self.time_counters[1] = 0 + self.object:set_velocity{x = 0, y = 0, z = 0} end local function walk_to_plant_and_mow_common(self, dtime) @@ -128,8 +153,21 @@ do -- register farming core end -- follow path - if vector.distance(path[1], self.object:getpos()) < 0.01 then - table.remove(path, 1) -- next step, follow next path. + if vector.distance(self.path[1], self.object:getpos()) < 0.01 then + table.remove(self.path, 1) + + if #self.path == 0 then -- end of path + if self.state == state.WALK_TO_PLANT then + to_plant(self) + return + elseif self.state == state.WALK_TO_MOW then + to_mow(self) + return + end + else -- else next step, follow next path. + self:change_direction(self.path[1]) + end + else -- if maidroid is stopped by obstacles, the maidroid must jump. local velocity = self.object:getvelocity() @@ -142,6 +180,65 @@ do -- register farming core end end + local function plant(self, dtime) + if self.time_counters[1] >= 5 then + if is_plantable_place(self.destination) then + local stack = self:get_wield_item_stack() + stack:take_item(1) + self:set_wield_item_stack(stack) + return + end + to_walk_randomly() + return + else + self.time_counters[1] = self.time_counters[1] + 1 + end + end + + local function mow(self, dtime) + if self.time_counters[1] >= 5 then + if is_mowable_place(self.destination) then + local destnode = minetest.get_node(self.destination) + minetest.remove_node(self.destination) + local stacks = minetest.get_node_drops(destnode.name) + + for _, stack in ipairs(stacks) do + local leftover = self:add_item_to_main(stack) + minetest.add_item(self.destination, leftover) + end + end + to_walk_randomly() + return + else + self.time_counters[1] = self.time_counters[1] + 1 + end + end + + local function plant_and_mow_common(self, dtime) + if self.time_counters[1] >= 5 then + if (self.state == state.PLANT and not is_plantable_place(self.destination) + or (self.state == state.MOW and not is_mowable_place(self.destination)) then + + + local inv = self:get_inventory() + local stacks = inv:get_list("main") + + for idx, stack in ipairs(stacks) do + local item_name = stack:get_name() + if minetest.get_item_group(item_name, "seed") > 0 then + minetest.add_node(self.destination, {name = item_name, param2 = 1}) + stack:take_item(1) + inv:set_stack("main", idx, stack) + break + end + end + end + to_walk(self) + else + self.time_count = self.time_count + 1 + end + end + local function on_step(self, dtime) if self.state == state.WALK_RANDOMLY then walk_randomly(self, dtime)