2013-08-16 17:05:56 +01:00

136 lines
4.5 KiB
Lua

--[[
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.
]]
local destroy = function(pos)
if math.random(1,5) <= 4 then
minetest.env:add_entity({x=pos.x+math.random(0,10)/10-0.5, y=pos.y, z=pos.z+math.random(0,10)/10-0.5}, "firearmslib:explosion_smoke")
end
local nodename = minetest.env:get_node(pos).name
if nodename ~= "air" then
minetest.env:remove_node(pos)
nodeupdate(pos)
if (firearmslib.EXPLOSION_SMOKE) then
local obj = minetest.env:add_entity(pos, "firearmslib:explosion_debris")
if obj == nil then
return
end
obj:get_luaentity().collect = true
obj:setacceleration({x=0, y=-10, z=0})
obj:setvelocity({x=math.random(0,6)-3, y=10, z=math.random(0,6)-3})
end
end
end
firearmslib.explosion = function ( pos, bulletdef )
minetest.env:remove_node(pos);
local objects = minetest.env:get_objects_inside_radius(pos, bulletdef.explosion_range or 7);
for _,obj in ipairs(objects) do
if (obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item")) then
local dist = kutils.distance3d(pos, obj:getpos());
local damage = bulletdef.explosion_damage * (dist / bulletdef.explosion_range);
obj:set_hp(obj.entity:get_hp() - damage);
if (obj:get_hp() <= 0) then
if (not obj:is_player()) then
obj:remove();
end
for i,f in ipairs(firearmslib.on_killentity_cbs) do
f(obj, player);
end
end
--[[
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 dist = (vec.x^2+vec.y^2+vec.z^2)^0.5
local damage = (80*0.5^dist)*2
obj:punch(obj, 1.0, {
full_punch_interval=1.0,
groupcaps={
fleshy={times={[1]=1/damage, [2]=1/damage, [3]=1/damage}},
snappy={times={[1]=1/damage, [2]=1/damage, [3]=1/damage}},
}
}, nil)
]]
end
end
for dx=-2,2 do
for dz=-2,2 do
for dy=2,-2,-1 do
pos.x = pos.x+dx
pos.y = pos.y+dy
pos.z = pos.z+dz
local node = minetest.env:get_node(pos)
if node.name == "fire:basic_flame" or string.find(node.name, "default:water_") or string.find(node.name, "default:lava_") or node.name == "tnt:boom" then
else
if math.abs(dx)<2 and math.abs(dy)<2 and math.abs(dz)<2 then
destroy(pos)
else
if math.random(1,5) <= 4 then
destroy(pos)
end
end
end
pos.x = pos.x-dx
pos.y = pos.y-dy
pos.z = pos.z-dz
end
end
end
end
minetest.register_entity("firearmslib:explosion_smoke", {
physical = true,
visual = "sprite",
textures = {"firearms_explosion_smoke.png"},
collisionbox = {0,0,0,0,0,0},
timer = 0,
time = 5,
on_activate = function(self, staticdata)
self.object:setacceleration({x=math.random(0,10)/10-0.5, y=5, z=math.random(0,10)/10-0.5})
self.time = math.random(1, 10)/10
end,
on_step = function(self, dtime)
self.timer = self.timer+dtime
if self.timer > self.time then
self.object:remove()
end
end,
})
if minetest.setting_get("log_mods") then
minetest.log("action", "tnt loaded")
end
minetest.register_entity("firearmslib:explosion_debris", {
physical = true;
timer = 0;
textures = { "smoke_puff.png" };
collisionbox = { 0, 0, 0, 0, 0, 0 };
on_step = function ( self, dtime )
self.timer = self.timer + dtime;
if (self.timer >= 1) then
self.object:remove();
return;
end
end;
});