diff --git a/nssm_materials.lua b/nssm_materials.lua index dd58677..1fc225a 100644 --- a/nssm_materials.lua +++ b/nssm_materials.lua @@ -432,7 +432,23 @@ minetest.register_node("nssm:rope", { drops = "nssm:rope", tile_images = { "rope.png" }, groups = {snappy=1}, - }) +}) + +minetest.register_node("nssm:invisible_light", { + description = "Invisible light source", + tiles = {"transparent.png"}, + paramtype = "light", + drawtype = "airlike", + walkable = false, + sunlight_propagates = true, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + groups = {unbreakable=1}, + drop = "", + light_source = 15, +}) minetest.register_tool("nssm:stoneater_pick", { description = "Stoneater Pickaxe", diff --git a/nssm_weapons.lua b/nssm_weapons.lua index af05f35..384b359 100644 --- a/nssm_weapons.lua +++ b/nssm_weapons.lua @@ -318,7 +318,8 @@ local function nssm_register_weapon(name, def) end, move = def.move, life_time = 0, - timer = 0 + timer = 0, + custom_timer = 0, }) minetest.register_tool("nssm:"..name.."_hand", { @@ -514,3 +515,111 @@ nssm_register_weapon("particles_ball", { material = "group:wood", description = "Particles ball", }) + + +nssm_register_weapon("light_ball", { + velocity = 25, + move = 0, + + on_step = function(self, dtime, last_pos) + local pos = self.object:getpos() + local vel = 1 + + + --Disappear after a certain time + if self.life_time == 0 then + self.life_time = os.time() + end + if os.time() - self.life_time > 60 then + self.object:remove() + return + end + + if self.custom_timer == 0 then + self.custom_timer = os.time() + end + + if last_pos == nil or (last_pos ~= nil and last_pos ~= pos) then + minetest.set_node(pos, {name="nssm:invisible_light"}) + last_pos = pos + end + + --Look for an entity to follow + local objects = minetest.env:get_objects_inside_radius(pos, 20) + local min_dist = 100 + local obj_min = nil + local obj_p = nil + local vec_min = nil + for _,obj in ipairs(objects) do + if (obj:is_player()) then + elseif (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item" and obj:get_luaentity().name ~= self.object:get_luaentity().name) then + obj_p = obj:getpos() + local vec = {x=obj_p.x-pos.x, y=obj_p.y-pos.y, z=obj_p.z-pos.z} + local dist = (vec.x^2+vec.y^2+vec.z^2)^0.5 + if (dist