Testing a light ball
This commit is contained in:
parent
d0b0717246
commit
74be5f13a1
@ -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",
|
||||
|
111
nssm_weapons.lua
111
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<min_dist) then
|
||||
min_dist = dist
|
||||
obj_min = obj
|
||||
vec_min = vec
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--Found an entity to follow:
|
||||
if obj_min ~= nil then
|
||||
local new_vel = {x=0, y=0, z=0}
|
||||
|
||||
local dir = 0
|
||||
local max_diff = 0
|
||||
|
||||
if (max_diff<math.abs(vec_min.x)) then
|
||||
dir = 1
|
||||
max_diff = math.abs(vec_min.x)
|
||||
end
|
||||
if (max_diff<math.abs(vec_min.y)) then
|
||||
dir = 2
|
||||
max_diff = math.abs(vec_min.y)
|
||||
end
|
||||
if (max_diff<math.abs(vec_min.z)) then
|
||||
dir = 3
|
||||
max_diff = math.abs(vec_min.z)
|
||||
end
|
||||
|
||||
vec_min.x = (vec_min.x/max_diff)*vel
|
||||
vec_min.y = (vec_min.y/max_diff)*vel
|
||||
vec_min.z = (vec_min.z/max_diff)*vel
|
||||
obj_p = obj_min:getpos()
|
||||
|
||||
self.object:setvelocity(vec_min)
|
||||
--[[if min_dist < 1 then
|
||||
|
||||
local node = nssm:node_ok(pos).name
|
||||
self.hit_node(self, pos, node)
|
||||
self.object:remove()
|
||||
return
|
||||
else
|
||||
self.object:setvelocity(vec_min)
|
||||
end
|
||||
]]
|
||||
end
|
||||
local n = minetest.env:get_node(pos).name
|
||||
|
||||
--[[if n ~= "air" and n ~= "default:water_source" and n ~= "default:water_flowing" then
|
||||
local node = nssm:node_ok(pos).name
|
||||
self.hit_node(self, pos, node)
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
]]
|
||||
end,
|
||||
|
||||
hit_node = function(self, pos, node)
|
||||
--nssm:explosion(pos, 4, 0)
|
||||
end,
|
||||
|
||||
on_drop = function(itemstack, user, pointed_thing)
|
||||
local pos = user:getpos()
|
||||
--activate_balls(pos)
|
||||
end,
|
||||
material = "group:sand",
|
||||
description = "Light Ball",
|
||||
})
|
||||
|
Loading…
x
Reference in New Issue
Block a user