forked from mtcontrib/maidroid
		
	Update farming core
This commit is contained in:
		| @@ -42,139 +42,170 @@ local function is_mowable_place(pos) | ||||
| 	return false | ||||
| end | ||||
|  | ||||
| do -- register farming core | ||||
|  | ||||
| 	local walk_randomly, walk_to_plant_and_mow_common, plant, mow | ||||
| 	local to_walk_randomly, to_walk_to_plant, to_walk_to_mow, to_plant, to_mow | ||||
| local walk_randomly, walk_to_plant_and_mow_common, plant, mow | ||||
| local to_walk_randomly, to_walk_to_plant, to_walk_to_mow, to_plant, to_mow | ||||
|  | ||||
| 	local function on_start(self) | ||||
| 		self.object:setacceleration{x = 0, y = -10, z = 0} | ||||
| 		self.object:setvelocity{x = 0, y = 0, z = 0} | ||||
| 		self.state = state.WALK_RANDOMLY | ||||
| 		self.time_counters = {} | ||||
| 		self.path = nil | ||||
| 		to_walk_randomly(self) | ||||
| 	end | ||||
| local function on_start(self) | ||||
| 	self.object:setacceleration{x = 0, y = -10, z = 0} | ||||
| 	self.object:setvelocity{x = 0, y = 0, z = 0} | ||||
| 	self.state = state.WALK_RANDOMLY | ||||
| 	self.time_counters = {} | ||||
| 	self.path = nil | ||||
| 	to_walk_randomly(self) | ||||
| end | ||||
|  | ||||
| 	local function on_stop(self) | ||||
| 		self.object:setvelocity{x = 0, y = 0, z = 0} | ||||
| 		self.state = nil | ||||
| 		self.time_counters = nil | ||||
| 		self.path = nil | ||||
| 		self:set_animation(maidroid.animation_frames.STAND) | ||||
| 	end | ||||
| local function on_stop(self) | ||||
| 	self.object:setvelocity{x = 0, y = 0, z = 0} | ||||
| 	self.state = nil | ||||
| 	self.time_counters = nil | ||||
| 	self.path = nil | ||||
| 	self:set_animation(maidroid.animation_frames.STAND) | ||||
| end | ||||
|  | ||||
| 	local function is_near(self, pos, distance) | ||||
| 		local p = self.object:getpos() | ||||
| 		-- p.y = p.y + 0.5 | ||||
| 		return vector.distance(p, pos) < distance | ||||
| 	end | ||||
| local function is_near(self, pos, distance) | ||||
| 	local p = self.object:getpos() | ||||
| 	-- p.y = p.y + 0.5 | ||||
| 	return vector.distance(p, pos) < distance | ||||
| end | ||||
|  | ||||
| 	local searching_range = {x = 5, y = 2, z = 5} | ||||
| local searching_range = {x = 5, y = 2, z = 5} | ||||
|  | ||||
| 	walk_randomly = function(self, dtime) | ||||
| 		if self.time_counters[1] >= FIND_PATH_TIME_INTERVAL then | ||||
| 			self.time_counters[1] = 0 | ||||
| 			self.time_counters[2] = self.time_counters[2] + 1 | ||||
| walk_randomly = function(self, dtime) | ||||
| 	if self.time_counters[1] >= FIND_PATH_TIME_INTERVAL then | ||||
| 		self.time_counters[1] = 0 | ||||
| 		self.time_counters[2] = self.time_counters[2] + 1 | ||||
|  | ||||
| 			local wield_stack = self:get_wield_item_stack() | ||||
| 			if minetest.get_item_group(wield_stack:get_name(), "seed") > 0 | ||||
| 			or self:has_item_in_main(function(itemname)	return (minetest.get_item_group(itemname, "seed") > 0) end) then | ||||
| 				local destination = _aux.search_surrounding(self.object:getpos(), is_plantable_place, searching_range) | ||||
| 				if destination ~= nil then | ||||
| 					local path = minetest.find_path(self.object:getpos(), destination, 10, 1, 1, "A*") | ||||
|  | ||||
| 					if path ~= nil then -- to walk to plant state. | ||||
| 						to_walk_to_plant(self, path, destination) | ||||
| 						return | ||||
| 					end | ||||
| 				end | ||||
| 			end | ||||
| 			-- if couldn't find path to plant, try to mow. | ||||
| 			local destination = _aux.search_surrounding(self.object:getpos(), is_mowable_place, searching_range) | ||||
| 		local wield_stack = self:get_wield_item_stack() | ||||
| 		if minetest.get_item_group(wield_stack:get_name(), "seed") > 0 | ||||
| 		or self:has_item_in_main(function(itemname)	return (minetest.get_item_group(itemname, "seed") > 0) end) then | ||||
| 			local destination = _aux.search_surrounding(self.object:getpos(), is_plantable_place, searching_range) | ||||
| 			if destination ~= nil then | ||||
| 				local path = minetest.find_path(self.object:getpos(), destination, 10, 1, 1, "A*") | ||||
| 				if path ~= nil then -- to walk to mow state. | ||||
| 					to_walk_to_mow(self, path, destination) | ||||
|  | ||||
| 				if path ~= nil then -- to walk to plant state. | ||||
| 					to_walk_to_plant(self, path, destination) | ||||
| 					return | ||||
| 				end | ||||
| 			end | ||||
| 			-- else do nothing. | ||||
| 			return | ||||
|  | ||||
| 		elseif self.time_counters[2] >= CHANGE_DIRECTION_TIME_INTERVAL then | ||||
| 			self.time_counters[1] = self.time_counters[1] + 1 | ||||
| 			self.time_counters[2] = 0 | ||||
| 			self:change_direction_randomly() | ||||
| 			return | ||||
| 		else | ||||
| 			self.time_counters[1] = self.time_counters[1] + 1 | ||||
| 			self.time_counters[2] = self.time_counters[2] + 1 | ||||
|  | ||||
| 			local velocity = self.object:getvelocity() | ||||
| 			if velocity.y == 0 then | ||||
| 				local front_node = self:get_front_node() | ||||
| 				if front_node.name ~= "air" and minetest.registered_nodes[front_node.name].walkable | ||||
| 				and not (minetest.get_item_group(front_node.name, "fence") > 0) then | ||||
| 					self.object:setvelocity{x = velocity.x, y = 6, z = velocity.z} | ||||
| 				end | ||||
| 			end | ||||
| 			return | ||||
| 		end | ||||
| 	end | ||||
| 		-- if couldn't find path to plant, try to mow. | ||||
| 		local destination = _aux.search_surrounding(self.object:getpos(), is_mowable_place, searching_range) | ||||
| 		if destination ~= nil then | ||||
| 			local path = minetest.find_path(self.object:getpos(), destination, 10, 1, 1, "A*") | ||||
| 			if path ~= nil then -- to walk to mow state. | ||||
| 				to_walk_to_mow(self, path, destination) | ||||
| 				return | ||||
| 			end | ||||
| 		end | ||||
| 		-- else do nothing. | ||||
| 		return | ||||
|  | ||||
| 	to_walk_randomly = function(self) | ||||
| 		self.state = state.WALK_RANDOMLY | ||||
| 		self.time_counters[1] = 0 | ||||
| 	elseif self.time_counters[2] >= CHANGE_DIRECTION_TIME_INTERVAL then | ||||
| 		self.time_counters[1] = self.time_counters[1] + 1 | ||||
| 		self.time_counters[2] = 0 | ||||
| 		self:change_direction_randomly() | ||||
| 		self:set_animation(maidroid.animation_frames.WALK) | ||||
| 	end | ||||
| 		return | ||||
| 	else | ||||
| 		self.time_counters[1] = self.time_counters[1] + 1 | ||||
| 		self.time_counters[2] = self.time_counters[2] + 1 | ||||
|  | ||||
| 	to_walk_to_plant = function(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:change_direction(self.path[1]) | ||||
| 		self:set_animation(maidroid.animation_frames.WALK) | ||||
| 	end | ||||
|  | ||||
| 	to_walk_to_mow = function(self, path, destination) | ||||
| 		self.state = state.WALK_TO_MOW | ||||
| 		self.path = path | ||||
| 		self.destination = destination | ||||
| 		self.time_counters[1] = 0 -- find path interval | ||||
| 		self.time_counters[2] = 0 | ||||
| 		self:change_direction(self.path[1]) | ||||
| 		self:set_animation(maidroid.animation_frames.WALK) | ||||
| 	end | ||||
|  | ||||
| 	to_plant = function(self) | ||||
| 		local wield_stack = self:get_wield_item_stack() | ||||
| 		if minetest.get_item_group(wield_stack:get_name(), "seed") > 0 | ||||
| 		or 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:setvelocity{x = 0, y = 0, z = 0} | ||||
| 			self:set_animation(maidroid.animation_frames.MINE) | ||||
| 			return | ||||
| 		else | ||||
| 			to_walk_randomly(self) | ||||
| 			return | ||||
| 		local velocity = self.object:getvelocity() | ||||
| 		if velocity.y == 0 then | ||||
| 			local front_node = self:get_front_node() | ||||
| 			if front_node.name ~= "air" and minetest.registered_nodes[front_node.name].walkable | ||||
| 			and not (minetest.get_item_group(front_node.name, "fence") > 0) then | ||||
| 				self.object:setvelocity{x = velocity.x, y = 6, z = velocity.z} | ||||
| 			end | ||||
| 		end | ||||
| 		return | ||||
| 	end | ||||
| end | ||||
|  | ||||
| 	to_mow = function(self) | ||||
| 		self.state = state.MOW | ||||
| to_walk_randomly = function(self) | ||||
| 	self.state = state.WALK_RANDOMLY | ||||
| 	self.time_counters[1] = 0 | ||||
| 	self.time_counters[2] = 0 | ||||
| 	self:change_direction_randomly() | ||||
| 	self:set_animation(maidroid.animation_frames.WALK) | ||||
| end | ||||
|  | ||||
| to_walk_to_plant = function(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:change_direction(self.path[1]) | ||||
| 	self:set_animation(maidroid.animation_frames.WALK) | ||||
| end | ||||
|  | ||||
| to_walk_to_mow = function(self, path, destination) | ||||
| 	self.state = state.WALK_TO_MOW | ||||
| 	self.path = path | ||||
| 	self.destination = destination | ||||
| 	self.time_counters[1] = 0 -- find path interval | ||||
| 	self.time_counters[2] = 0 | ||||
| 	self:change_direction(self.path[1]) | ||||
| 	self:set_animation(maidroid.animation_frames.WALK) | ||||
| end | ||||
|  | ||||
| to_plant = function(self) | ||||
| 	local wield_stack = self:get_wield_item_stack() | ||||
| 	if minetest.get_item_group(wield_stack:get_name(), "seed") > 0 | ||||
| 	or 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:setvelocity{x = 0, y = 0, z = 0} | ||||
| 		self:set_animation(maidroid.animation_frames.MINE) | ||||
| 		return | ||||
| 	else | ||||
| 		to_walk_randomly(self) | ||||
| 		return | ||||
| 	end | ||||
| end | ||||
|  | ||||
| to_mow = function(self) | ||||
| 	self.state = state.MOW | ||||
| 	self.time_counters[1] = 0 | ||||
| 	self.object:setvelocity{x = 0, y = 0, z = 0} | ||||
| 	self:set_animation(maidroid.animation_frames.MINE) | ||||
| end | ||||
|  | ||||
| walk_to_plant_and_mow_common = function(self, dtime) | ||||
| 	if is_near(self, self.destination, 1.5) then | ||||
| 		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 | ||||
| 	end | ||||
|  | ||||
| 	walk_to_plant_and_mow_common = function(self, dtime) | ||||
| 		if is_near(self, self.destination, 1.5) then | ||||
| 	if self.time_counters[2] >= MAX_WALK_TIME then -- time over. | ||||
| 		to_walk_randomly(self) | ||||
| 		return | ||||
| 	end | ||||
|  | ||||
| 	self.time_counters[1] = self.time_counters[1] + 1 | ||||
| 	self.time_counters[2] = self.time_counters[2] + 1 | ||||
|  | ||||
| 	if self.time_counters[1] >= FIND_PATH_TIME_INTERVAL then | ||||
| 		self.time_counters[1] = 0 | ||||
| 		local path = minetest.find_path(self.object:getpos(), self.destination, 10, 1, 1, "A*") | ||||
| 		if path == nil then | ||||
| 			to_walk_randomly(self) | ||||
| 			return | ||||
| 		end | ||||
| 		self.path = path | ||||
| 	end | ||||
|  | ||||
| 	-- follow path | ||||
| 	if is_near(self, self.path[1], 0.5) 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 | ||||
| @@ -182,112 +213,78 @@ do -- register farming core | ||||
| 				to_mow(self) | ||||
| 				return | ||||
| 			end | ||||
| 		else -- else next step, follow next path. | ||||
| 			self:change_direction(self.path[1]) | ||||
| 		end | ||||
|  | ||||
| 		if self.time_counters[2] >= MAX_WALK_TIME then -- time over. | ||||
| 			to_walk_randomly(self) | ||||
| 			return | ||||
| 	else | ||||
| 		-- self:change_direction(self.path[1]) | ||||
| 		-- if maidroid is stopped by obstacles, the maidroid must jump. | ||||
| 		-- self:change_direction(self.path[1]) | ||||
| 		local velocity = self.object:getvelocity() | ||||
| 		if velocity.y == 0 then | ||||
| 			local front_node = self:get_front_node() | ||||
| 			if front_node.name ~= "air" and minetest.registered_nodes[front_node.name].walkable | ||||
| 			and not (minetest.get_item_group(front_node.name, "fence") > 0) then | ||||
| 				self.object:setvelocity{x = velocity.x, y = 6, z = velocity.z} | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| plant = function(self, dtime) | ||||
| 	if self.time_counters[1] >= 15 then | ||||
| 		if is_plantable_place(self.destination) then | ||||
| 			local stack = self:get_wield_item_stack() | ||||
| 			local itemname = stack:get_name() | ||||
| 			minetest.add_node(self.destination, {name = itemname, param2 = 1}) | ||||
| 			stack:take_item(1) | ||||
| 			self:set_wield_item_stack(stack) | ||||
| 		end | ||||
| 		to_walk_randomly(self) | ||||
| 		return | ||||
| 	else | ||||
| 		self.time_counters[1] = self.time_counters[1] + 1 | ||||
| 		self.time_counters[2] = self.time_counters[2] + 1 | ||||
|  | ||||
| 		if self.time_counters[1] >= FIND_PATH_TIME_INTERVAL then | ||||
| 			self.time_counters[1] = 0 | ||||
| 			local path = minetest.find_path(self.object:getpos(), self.destination, 10, 1, 1, "A*") | ||||
| 			if path == nil then | ||||
| 				to_walk_randomly(self) | ||||
| 				return | ||||
| 			end | ||||
| 			self.path = path | ||||
| 		end | ||||
|  | ||||
| 		-- follow path | ||||
| 		if is_near(self, self.path[1], 0.5) 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 | ||||
| 			-- self:change_direction(self.path[1]) | ||||
| 			-- if maidroid is stopped by obstacles, the maidroid must jump. | ||||
| 			-- self:change_direction(self.path[1]) | ||||
| 			local velocity = self.object:getvelocity() | ||||
| 			if velocity.y == 0 then | ||||
| 				local front_node = self:get_front_node() | ||||
| 				if front_node.name ~= "air" and minetest.registered_nodes[front_node.name].walkable | ||||
| 				and not (minetest.get_item_group(front_node.name, "fence") > 0) then | ||||
| 					self.object:setvelocity{x = velocity.x, y = 6, z = velocity.z} | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| 	plant = function(self, dtime) | ||||
| 		if self.time_counters[1] >= 15 then | ||||
| 			if is_plantable_place(self.destination) then | ||||
| 				local stack = self:get_wield_item_stack() | ||||
| 				local itemname = stack:get_name() | ||||
| 				minetest.add_node(self.destination, {name = itemname, param2 = 1}) | ||||
| 				stack:take_item(1) | ||||
| 				self:set_wield_item_stack(stack) | ||||
| mow = function(self, dtime) | ||||
| 	if self.time_counters[1] >= 15 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 | ||||
| 			to_walk_randomly(self) | ||||
| 			return | ||||
| 		else | ||||
| 			self.time_counters[1] = self.time_counters[1] + 1 | ||||
| 		end | ||||
| 		to_walk_randomly(self) | ||||
| 		return | ||||
| 	else | ||||
| 		self.time_counters[1] = self.time_counters[1] + 1 | ||||
| 	end | ||||
| end | ||||
|  | ||||
| 	mow = function(self, dtime) | ||||
| 		if self.time_counters[1] >= 15 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(self) | ||||
| 			return | ||||
| 		else | ||||
| 			self.time_counters[1] = self.time_counters[1] + 1 | ||||
| 		end | ||||
| local function on_step(self, dtime) | ||||
| 	if self.state == state.WALK_RANDOMLY then | ||||
| 		walk_randomly(self, dtime) | ||||
| 	elseif self.state == state.WALK_TO_PLANT or self.state == state.WALK_TO_MOW then | ||||
| 		walk_to_plant_and_mow_common(self, dtime) | ||||
| 	elseif self.state == state.PLANT then | ||||
| 		plant(self, dtime) | ||||
| 	elseif self.state == state.MOW then | ||||
| 		mow(self, dtime) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| 	local function on_step(self, dtime) | ||||
| 		if self.state == state.WALK_RANDOMLY then | ||||
| 			walk_randomly(self, dtime) | ||||
| 		elseif self.state == state.WALK_TO_PLANT or self.state == state.WALK_TO_MOW then | ||||
| 			walk_to_plant_and_mow_common(self, dtime) | ||||
| 		elseif self.state == state.PLANT then | ||||
| 			plant(self, dtime) | ||||
| 		elseif self.state == state.MOW then | ||||
| 			mow(self, dtime) | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	maidroid.register_core("maidroid_core:farming", { | ||||
| 		description      = "maidroid core : farming", | ||||
| 		inventory_image  = "maidroid_core_farming.png", | ||||
| 		on_start         = on_start, | ||||
| 		on_stop          = on_stop, | ||||
| 		on_resume        = on_start, | ||||
| 		on_pause         = on_stop, | ||||
| 		on_step          = on_step, | ||||
| 	}) | ||||
|  | ||||
| end -- register farming core | ||||
| maidroid.register_core("maidroid_core:farming", { | ||||
| 	description      = "maidroid core : farming", | ||||
| 	inventory_image  = "maidroid_core_farming.png", | ||||
| 	on_start         = on_start, | ||||
| 	on_stop          = on_stop, | ||||
| 	on_resume        = on_start, | ||||
| 	on_pause         = on_stop, | ||||
| 	on_step          = on_step, | ||||
| }) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user