92 lines
2.5 KiB
Lua
92 lines
2.5 KiB
Lua
nuke.entity = {}
|
|
|
|
function nuke.entity:on_activate(staticdata)
|
|
local o = self.object
|
|
o:setvelocity({x=0, y=3, z=0})
|
|
o:setacceleration({x=0, y=-5, z=0})
|
|
o:settexturemod("^[brighten")
|
|
if nuke.config:get_bool("fancy") then
|
|
local pos = o:getpos()
|
|
local min_pos = vector.new(pos)
|
|
min_pos.x = min_pos.x - 0.2
|
|
min_pos.y = min_pos.y + 0.5
|
|
min_pos.z = min_pos.z - 0.2
|
|
local max_pos = vector.new(pos)
|
|
max_pos.x = max_pos.x + 0.2
|
|
max_pos.y = max_pos.y + 0.5
|
|
max_pos.z = max_pos.z + 0.2
|
|
-- add_particlespawner silently fails in entity callbacks, so
|
|
-- use minetest.after to call it later.
|
|
minetest.after(0, function()
|
|
if self.smoke_spawner == false then
|
|
self.smoke_spawner = minetest.add_particlespawner({
|
|
amount = 512,
|
|
time = 10,
|
|
minpos = min_pos,
|
|
maxpos = max_pos,
|
|
minvel = {x=-1, y=1, z=-1},
|
|
maxvel = {x=1, y=4, z=1},
|
|
minacc = vector.new(),
|
|
maxacc = vector.new(),
|
|
minexptime = 0.2,
|
|
maxexptime = 0.4,
|
|
minsize = 2,
|
|
maxsize = 3,
|
|
collisiondetection = false,
|
|
texture = "nuke_smoke_dark.png",
|
|
})
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
function nuke.entity:on_step(dtime)
|
|
local o = self.object
|
|
self.timer = self.timer + dtime
|
|
self.blinktimer = self.blinktimer + (dtime * self.timer)
|
|
if self.blinktimer > 1 then
|
|
self.blinktimer = self.blinktimer - 1
|
|
o:settexturemod(self.blinkstatus and "" or "^[brighten")
|
|
self.blinkstatus = not self.blinkstatus
|
|
end
|
|
|
|
if self.timer < 10 then
|
|
return
|
|
end
|
|
-- Explode
|
|
local pos = vector.round(o:getpos())
|
|
local node = minetest.get_node(pos)
|
|
|
|
-- Cause entity physics even if we are put out.
|
|
-- This isn't very realistic but it allows for cannons.
|
|
o:remove()
|
|
minetest.sound_play("nuke_explode",
|
|
{pos = pos, gain = 1.0, max_hear_distance = 16})
|
|
nuke:entity_physics(pos, self.radius)
|
|
if minetest.get_item_group(node.name, "puts_out_fire") <= 0 then
|
|
nuke:explode(pos, self.radius)
|
|
end
|
|
if nuke.config:get_bool("fancy") then
|
|
nuke:effects(pos, self.radius)
|
|
end
|
|
end
|
|
|
|
function nuke.entity:on_punch(hitter)
|
|
self.object:remove()
|
|
hitter:get_inventory():add_item("main", self.name)
|
|
if self.smoke_spawner then
|
|
minetest.delete_particlespawner(self.smoke_spawner)
|
|
end
|
|
-- For add_particlespawner hack to detect if we've been removed
|
|
self.smoke_spawner = nil
|
|
end
|
|
|
|
function nuke.entity:get_staticdata()
|
|
if self.smoke_spawner then
|
|
minetest.delete_particlespawner(self.smoke_spawner)
|
|
end
|
|
-- For add_particlespawner hack to detect if we've been removed
|
|
self.smoke_spawner = nil
|
|
end
|
|
|