Working on the kamehameha
This commit is contained in:
parent
82c1878b49
commit
e976d4e192
122
kamehameha.lua
122
kamehameha.lua
@ -1,101 +1,72 @@
|
|||||||
--Kamehameha!
|
--Kamehameha!
|
||||||
kame_velocity = 30,
|
kame_velocity = 30
|
||||||
|
exp_radius = 4
|
||||||
|
|
||||||
|
local function round(n)
|
||||||
|
return n % 1 >= 0.5 and math.ceil(n) or math.floor(n)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
minetest.register_entity("nssm:kamehameha", {
|
minetest.register_entity("nssm:kamehameha", {
|
||||||
textures = {"kamehameha.png"},
|
textures = {"kamehameha.png"},
|
||||||
on_step = function (self, pos, node, dtime)
|
on_step = function (self, pos, node, dtime)
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
local objs = minetest.env:get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2)
|
|
||||||
for k, obj in pairs(objs) do
|
--while going around it damages entities
|
||||||
if obj:is_player() then
|
local objects = minetest.env:get_objects_inside_radius(pos, 2)
|
||||||
return
|
for _,obj in ipairs(objects) do
|
||||||
else
|
if (obj:is_player()) then
|
||||||
|
elseif (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then
|
||||||
obj:set_hp(obj:get_hp()-20)
|
obj:set_hp(obj:get_hp()-20)
|
||||||
--[[
|
if (obj:get_hp() <= 0) then
|
||||||
if obj:get_entity_name() ~= "nssm:kamehameha" then
|
if (not obj:is_player()) and obj:get_entity_name() ~= "nssm:kamehameha" then
|
||||||
if obj:get_hp()<=0 then
|
|
||||||
obj:remove()
|
obj:remove()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
]]--
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local n = minetest.env:get_node(pos).name
|
local n = minetest.env:get_node(pos).name
|
||||||
|
|
||||||
if n ~= "kamehameha:kame_entity" and n ~="default:stone" and n ~="default:desert_stone" then
|
if n ~="default:stone" and n ~="default:desert_stone" then
|
||||||
if minetest.registered_nodes[n].groups.flammable --[[or math.random(1, 100) <= 1]] then
|
if minetest.registered_nodes[n].groups.flammable --[[or math.random(1, 100) <= 1]] then
|
||||||
minetest.env:set_node(pos, {name="fire:basic_flame"})
|
minetest.env:set_node(pos, {name="fire:basic_flame"})
|
||||||
else
|
else
|
||||||
minetest.env:set_node(pos, {name="air"})
|
minetest.env:set_node(pos, {name="air"})
|
||||||
|
|
||||||
local v = self.object:getvelocity()
|
local vec = self.object:getvelocity()
|
||||||
local c=1
|
local c=3
|
||||||
local c2=0
|
|
||||||
|
|
||||||
--[[
|
--calculate how many blocks around the kamehameha need to be removed
|
||||||
for dx = -c*(math.abs(v.x))-c2 , c*(math.abs(v.x))+c2 do
|
local i = round(math.abs(math.abs(vec.x)-kame_velocity)*0.01*c)
|
||||||
for dy= -c*(math.abs(v.y))-c2, c*(math.abs(v.y))+c2 do
|
local j = round(math.abs(math.abs(vec.y)-kame_velocity)*0.01*c)
|
||||||
for dz = -c*(math.abs(v.z))-c2 , c*(math.abs(v.z))+c2 do
|
local k = round(math.abs(math.abs(vec.z)-kame_velocity)*0.01*c)
|
||||||
|
|
||||||
|
for dx = -i,i do
|
||||||
|
for dy= -j,j do
|
||||||
|
for dz = -k,k do
|
||||||
local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
|
local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
|
||||||
minetest.env:remove_node(p)
|
minetest.env:remove_node(p)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
]]--
|
|
||||||
|
|
||||||
--[[
|
|
||||||
for dx=-1,1 do
|
|
||||||
for dy=-1,1 do
|
|
||||||
for dz=-1,1 do
|
|
||||||
local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
|
|
||||||
minetest.env:set_node(p, {name="air"})
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
]]--
|
|
||||||
|
|
||||||
end
|
|
||||||
elseif n == "default:stone" or n =="default:desert_stone" then
|
|
||||||
self.hit_node(self, pos, node)
|
|
||||||
self.object:remove()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
--[[
|
|
||||||
for dx=-1,1 do
|
|
||||||
for dy=-1,1 do
|
|
||||||
for dz=-1,1 do
|
|
||||||
local p = {x=pos.x+dx, y=pos.y, z=pos.z+dz}
|
|
||||||
local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
|
|
||||||
local n = minetest.env:get_node(p).name
|
|
||||||
if n ~= "kamehameha:kame_entity" and n ~="default:stone" and n ~="default:desert_stone" then
|
|
||||||
if minetest.registered_nodes[n].groups.flammable then --or math.random(1, 100) <= 1 then
|
|
||||||
minetest.env:set_node(t, {name="fire:basic_flame"})
|
|
||||||
else
|
else
|
||||||
minetest.env:set_node(t, {name="air"})
|
|
||||||
end
|
|
||||||
elseif n == "default:stone" or n =="default:desert_stone" then
|
|
||||||
self.hit_node(self, pos, node)
|
self.hit_node(self, pos, node)
|
||||||
self.object:remove()
|
self.object:remove()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
]]--
|
|
||||||
end,
|
end,
|
||||||
|
|
||||||
hit_node = function(self, pos, node)
|
hit_node = function(self, pos, node)
|
||||||
--[[
|
--This is the particle spawner, if it slows down your pc then comment this section
|
||||||
--This is the particle spawner, but it will slow your pc. If you have a powerful pc you can uncomment this section
|
|
||||||
minetest.add_particlespawner(
|
minetest.add_particlespawner(
|
||||||
1, --amount
|
100, --amount
|
||||||
0.1, --time
|
0.1, --time
|
||||||
{x=pos.x-3, y=pos.y-3, z=pos.z-3}, --minpos
|
{x=pos.x-3, y=pos.y-3, z=pos.z-3}, --minpos
|
||||||
{x=pos.x+3, y=pos.y+3, z=pos.z+3}, --maxpos
|
{x=pos.x+3, y=pos.y+3, z=pos.z+3}, --maxpos
|
||||||
{x=-0, y=-0, z=-0}, --minvel
|
{x=-0, y=-0, z=-0}, --minvel
|
||||||
{x=0, y=0, z=0}, --maxvel
|
{x=5, y=5, z=5}, --maxvel
|
||||||
{x=-0.5,y=5,z=-0.5}, --minacc
|
{x=-0.5,y=5,z=-0.5}, --minacc
|
||||||
{x=0.5,y=5,z=0.5}, --maxacc
|
{x=0.5,y=5,z=0.5}, --maxacc
|
||||||
0.1, --minexptime
|
0.1, --minexptime
|
||||||
@ -105,21 +76,37 @@ minetest.register_entity("nssm:kamehameha", {
|
|||||||
false, --collisiondetection
|
false, --collisiondetection
|
||||||
"tnt_smoke.png" --texture
|
"tnt_smoke.png" --texture
|
||||||
)
|
)
|
||||||
]]--
|
|
||||||
local objects = minetest.env:get_objects_inside_radius(pos, 4)
|
--Damages entities around (not the player)
|
||||||
|
local objects = minetest.env:get_objects_inside_radius(pos, exp_radius)
|
||||||
for _,obj in ipairs(objects) do
|
for _,obj in ipairs(objects) do
|
||||||
if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then
|
if (obj:is_player()) then
|
||||||
|
elseif (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then
|
||||||
local obj_p = obj:getpos()
|
local 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 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
|
local dist = (vec.x^2+vec.y^2+vec.z^2)^0.5
|
||||||
local damage = (80*0.5^dist)*2
|
local damage = 21-dist*5
|
||||||
obj:punch(obj, 1.0, {
|
obj:set_hp(obj:get_hp()-damage)
|
||||||
full_punch_interval=1.0,
|
if (obj:get_hp() <= 0) then
|
||||||
damage_groups={fleshy=damage},
|
if (not obj:is_player()) and obj:get_entity_name() ~= "nssm:kamehameha" then
|
||||||
}, vec)
|
obj:remove()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
minetest.sound_play("boom", {max_hear_distance = 100})
|
minetest.sound_play("boom", {max_hear_distance = 100})
|
||||||
|
|
||||||
|
for dx=-1,1 do
|
||||||
|
for dy=-1,1 do
|
||||||
|
for dz=-1,1 do
|
||||||
|
local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
|
||||||
|
minetest.env:remove_node(p)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
for dx=-4,4 do
|
for dx=-4,4 do
|
||||||
for dy=-4,4 do
|
for dy=-4,4 do
|
||||||
for dz=-4,4 do
|
for dz=-4,4 do
|
||||||
@ -134,6 +121,7 @@ minetest.register_entity("nssm:kamehameha", {
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
]]--
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user