------------------------------------------------------------ -- Copyright (c) 2016 tacigar -- https://github.com/tacigar/maidroid ------------------------------------------------------------ maidroid.modules._aux = {} local velocity = 3 -- change direction to destination and velocity vector function maidroid.modules._aux.change_dir_to(self, dest) local pos = self.object:getpos() local dir = vector.subtract(dest, pos) local vel = vector.multiply(vector.normalize(dir), velocity) self.object:setvelocity(vel) self.object:setyaw(math.atan2(vel.z, vel.x) + math.pi / 2) end -- change direction and velocity vector function maidroid.modules._aux.change_dir(self) local rnd = function() return math.random(0, 5) * 2 - 5 end local dir = {x = rnd(), y = 0, z = rnd()} local vel = vector.multiply(vector.normalize(dir), velocity) self.object:setvelocity(vel) self.object:setyaw(math.atan2(vel.z, vel.x) + math.pi / 2) end -- get direction vector by yaw function maidroid.modules._aux.get_forward(yaw) return { x = math.sin(yaw), y = 0.0, z = -math.cos(yaw) } end -- round direction vector function maidroid.modules._aux.get_round_forward(forward) local rforward = { x = 0, y = 0, z = 0} if math.abs((forward.x / (math.abs(forward.x) + math.abs(forward.z)))) > 0.5 then if forward.x > 0 then rforward.x = 1 else rforward.x = -1 end end if math.abs((forward.z / (math.abs(forward.x) + math.abs(forward.z)))) > 0.5 then if forward.z > 0 then rforward.z = 1 else rforward.z = -1 end end return rforward end function maidroid.modules._aux.get_under_pos(vec) return { x = vec.x, y = vec.y - 1, z = vec.z } end function maidroid.modules._aux.get_upper_pos(vec) return { x = vec.x, y = vec.y + 1, z = vec.z } end -- pickup droped items function maidroid.modules._aux.pickup_item(self, radius, target_pred) local pos = self.object:getpos() local pred = target_pred or (function(itemstring) return true end) local all_objects = minetest.get_objects_inside_radius(pos, radius) for _, obj in ipairs(all_objects) do if not obj:is_player() and obj:get_luaentity() then local itemstring = obj:get_luaentity().itemstring if itemstring then if pred(itemstring) then local inv = maidroid._aux.get_maidroid_inventory(self) local stack = ItemStack(itemstring) local leftover = inv:add_item("main", stack) minetest.add_item(obj:getpos(), leftover) obj:get_luaentity().itemstring = "" obj:remove() end end end end end -- search surrounding nodes function maidroid.modules._aux.search_surrounding(self, lenvec, pred) local pos = vector.round(self.object:getpos()) for xi = -lenvec.x, lenvec.x do for yi = -lenvec.y, lenvec.y do for zi = -lenvec.z, lenvec.z do local p = {x = pos.x + xi, y = pos.y + yi, z = pos.z + zi} local node = minetest.get_node(p) if pred(self, p, node) then return true, p, node end end end end return false, nil, nil end