crazy nukes
Here is a code for even more chaotic nukes..makes them work like minecraft tnt..one hit takes a while..but the rest set of them go off one after another (sort of) i don't recommend this for low spec pc's..this is code for sfan5's nuke mod (replace the init.lua)...the randomization of destruction is thanks to ikjoel
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
- Code: Select all
mrmin = -5
mrmax = 5
function activate_if_tnt(nname, np, tnt_np, tntr)
if nname == "experimental:tnt" or nname == "nuke:hardcore_iron_tnt" or nname == "nuke:hardcore_mese_tnt" then
local e = minetest.env:add_entity(np, nname)
e:setvelocity({x=(np.x - tnt_np.x)*3+(tntr / 4), y=(np.y - tnt_np.y)*3+(tntr / 3), z=(np.z - tnt_np.z)*3+(tntr / 4)})
else if nname == "nuke:iron_tnt" then
gop = "nuke:iron_tnt2"
local e = minetest.env:add_entity(np, gop)
e:setvelocity({x=(np.x - tnt_np.x)*1+(tntr / 4), y=(np.y - tnt_np.y)*1+(tntr / 3), z=(np.z - tnt_np.z)*1+(tntr / 4)})
else if nname == "nuke:mese_tnt" then
gop2 = "nuke:mese_tnt2"
local e = minetest.env:add_entity(np, gop2)
e:setvelocity({x=(np.x - tnt_np.x)*1+(tntr / 4), y=(np.y - tnt_np.y)*1+(tntr / 3), z=(np.z - tnt_np.z)*1+(tntr / 4)})
end
end
end
end
function do_tnt_physics(tnt_np,tntr)
local objs = minetest.env:get_objects_inside_radius(tnt_np, tntr)
for k, obj in pairs(objs) do
local oname = obj:get_entity_name()
local v = obj:getvelocity()
local p = obj:getpos()
if oname == "experimental:tnt" or oname == "nuke:iron_tnt" or oname == "nuke:mese_tnt" or oname == "nuke:hardcore_iron_tnt" or oname == "nuke:hardcore_mese_tnt" then
obj:setvelocity({x=(p.x - tnt_np.x) + (tntr / 2) + v.x, y=(p.y - tnt_np.y) + tntr + v.y, z=(p.z - tnt_np.z) + (tntr / 2) + v.z})
else
if v ~= nil then
obj:setvelocity({x=(p.x - tnt_np.x) + (tntr / 4) + v.x, y=(p.y - tnt_np.y) + (tntr / 2) + v.y, z=(p.z - tnt_np.z) + (tntr / 4) + v.z})
else
if obj:get_player_name() ~= nil then
obj:set_hp(obj:get_hp() - 1)
end
end
end
end
end
-- Iron TNT
minetest.register_craft({
output = 'node "nuke:iron_tnt" 4',
recipe = {
{'','node "default:wood" 1',''},
{'craft "default:steel_ingot" 1','craft "default:coal_lump" 1','craft "default:steel_ingot" 1'},
{'','node "default:wood" 1',''}
}
})
minetest.register_node("nuke:iron_tnt", {
tile_images = {"nuke_iron_tnt_top.png", "nuke_iron_tnt_bottom.png",
"nuke_iron_tnt_side.png", "nuke_iron_tnt_side.png",
"nuke_iron_tnt_side.png", "nuke_iron_tnt_side.png"},
inventory_image = minetest.inventorycube("nuke_iron_tnt_top.png",
"nuke_iron_tnt_side.png", "nuke_iron_tnt_side.png"),
dug_item = '', -- Get nothing
material = {
diggability = "not",
},
description = "Iron TNT",
})
minetest.register_on_punchnode(function(p, node)
if node.name == "nuke:iron_tnt" then
minetest.env:remove_node(p)
minetest.env:add_entity(p, "nuke:iron_tnt")
--minetest.env:add_entity(p, "nuke:iron_tnt2") <-in case you forget
nodeupdate(p)
end
end)
local IRON_TNT_RANGE = 6
local IRON_TNT = {
-- Static definition
physical = true, -- Collides with things
-- weight = 5,
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
visual = "cube",
textures = {"nuke_iron_tnt_top.png", "nuke_iron_tnt_bottom.png",
"nuke_iron_tnt_side.png", "nuke_iron_tnt_side.png",
"nuke_iron_tnt_side.png", "nuke_iron_tnt_side.png"},
-- Initial value for our timer
timer = 0,
-- Number of punches required to defuse
health = 1,
blinktimer = 0,
blinkstatus = true,
}
function IRON_TNT:on_activate(staticdata)
self.object:setvelocity({x=0, y=4, z=0})
self.object:setacceleration({x=0, y=-10, z=0})
self.object:settexturemod("^[brighten")
end
function IRON_TNT:on_step(dtime)
self.timer = self.timer + dtime
self.blinktimer = self.blinktimer + dtime
if self.timer>5 then
self.blinktimer = self.blinktimer + dtime
if self.timer>8 then
self.blinktimer = self.blinktimer + dtime
self.blinktimer = self.blinktimer + dtime
end
end
if self.blinktimer > 0.5 then
self.blinktimer = self.blinktimer - 0.5
if self.blinkstatus then
self.object:settexturemod("")
else
self.object:settexturemod("^[brighten")
end
self.blinkstatus = not self.blinkstatus
end
if self.timer > 10 then
local pos = self.object:getpos()
pos.x = math.floor(pos.x+0.5)
pos.y = math.floor(pos.y+0.5)
pos.z = math.floor(pos.z+0.5)
do_tnt_physics(pos, IRON_TNT_RANGE)
if minetest.env:get_node(pos).name == "default:water_source" or minetest.env:get_node(pos).name == "default:water_flowing" then
-- Cancel the Explosion
self.object:remove()
return
end
for x=-IRON_TNT_RANGE,IRON_TNT_RANGE do
for y=-IRON_TNT_RANGE,IRON_TNT_RANGE do
for z=-IRON_TNT_RANGE,IRON_TNT_RANGE do
if x*x+y*y+z*z <= (IRON_TNT_RANGE + math.floor(math.random(mrmin,mrmax))) * (IRON_TNT_RANGE + math.floor(math.random(mrmin,mrmax))) + (IRON_TNT_RANGE + math.floor(math.random(mrmin,mrmax))) then
local np={x=pos.x+x,y=pos.y+y,z=pos.z+z}
local n = minetest.env:get_node(np)
if n.name ~= "air" then
minetest.env:remove_node(np)
end
activate_if_tnt(n.name, np, pos, IRON_TNT_RANGE)
end
end
end
end
self.object:remove()
end
end
function IRON_TNT:on_punch(hitter)
self.health = self.health - 1
if self.health <= 0 then
self.object:remove()
hitter:get_inventory():add_item("main", "nuke:iron_tnt")
end
end
minetest.register_entity("nuke:iron_tnt", IRON_TNT)
-- Mese TNT
minetest.register_craft({
output = 'node "nuke:mese_tnt" 4',
recipe = {
{'','node "default:wood" 1',''},
{'node "default:mese" 1','craft "default:coal_lump" 1','node "default:mese" 1'},
{'','node "default:wood" 1',''}
}
})
minetest.register_node("nuke:mese_tnt", {
tile_images = {"nuke_mese_tnt_top.png", "nuke_mese_tnt_bottom.png",
"nuke_mese_tnt_side.png", "nuke_mese_tnt_side.png",
"nuke_mese_tnt_side.png", "nuke_mese_tnt_side.png"},
inventory_image = minetest.inventorycube("nuke_mese_tnt_top.png",
"nuke_mese_tnt_side.png", "nuke_mese_tnt_side.png"),
dug_item = '', -- Get nothing
material = {
diggability = "not",
},
description = "Mese TNT",
})
minetest.register_on_punchnode(function(p, node)
if node.name == "nuke:mese_tnt" then
minetest.env:remove_node(p)
minetest.env:add_entity(p, "nuke:mese_tnt")
nodeupdate(p)
end
end)
local IRON_TNT2_RANGE = 7
local IRON_TNT2 = {
-- Static definition
physical = true, -- Collides with things
-- weight = 5,
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
visual = "cube",
textures = {"nuke_iron_tnt_top.png", "nuke_iron_tnt_bottom.png",
"nuke_iron_tnt_side.png", "nuke_iron_tnt_side.png",
"nuke_iron_tnt_side.png", "nuke_iron_tnt_side.png"},
-- Initial value for our timer
timer = 9,
-- Number of punches required to defuse
health = 1,
blinktimer = 9,
blinkstatus = true,
}
function IRON_TNT2:on_activate(staticdata)
self.object:setvelocity({x=0, y=0, z=0})
self.object:setacceleration({x=0, y=-10, z=0})
self.object:settexturemod("^[brighten")
end
function IRON_TNT2:on_step(dtime)
self.timer = self.timer + dtime
self.blinktimer = self.blinktimer + dtime
if self.timer>5 then
self.blinktimer = self.blinktimer + dtime
if self.timer>8 then
self.blinktimer = self.blinktimer + dtime
self.blinktimer = self.blinktimer + dtime
end
end
if self.blinktimer > 0.5 then
self.blinktimer = self.blinktimer - 0.5
if self.blinkstatus then
self.object:settexturemod("")
else
self.object:settexturemod("^[brighten")
end
self.blinkstatus = not self.blinkstatus
end
if self.timer > 10 then
local pos = self.object:getpos()
pos.x = math.floor(pos.x+0.5)
pos.y = math.floor(pos.y+0.5)
pos.z = math.floor(pos.z+0.5)
do_tnt_physics(pos, IRON_TNT2_RANGE)
if minetest.env:get_node(pos).name == "default:water_source" or minetest.env:get_node(pos).name == "default:water_flowing" then
-- Cancel the Explosion
self.object:remove()
return
end
for x=-IRON_TNT2_RANGE,IRON_TNT2_RANGE do
for y=-IRON_TNT2_RANGE,IRON_TNT2_RANGE do
for z=-IRON_TNT2_RANGE,IRON_TNT2_RANGE do
if x*x+y*y+z*z <= (IRON_TNT2_RANGE + math.floor(math.random(mrmin,mrmax))) * (IRON_TNT2_RANGE + math.floor(math.random(mrmin,mrmax))) + (IRON_TNT2_RANGE + math.floor(math.random(mrmin,mrmax))) then
local np={x=pos.x+x,y=pos.y+y,z=pos.z+z}
local n = minetest.env:get_node(np)
if n.name ~= "air" then
minetest.env:remove_node(np)
end
activate_if_tnt(n.name, np, pos, IRON_TNT2_RANGE)
end
end
end
end
self.object:remove()
end
end
minetest.register_entity("nuke:iron_tnt2", IRON_TNT2)
local MESE_TNT_RANGE = 12
local MESE_TNT = {
-- Static definition
physical = true, -- Collides with things
-- weight = 5,
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
visual = "cube",
textures = {"nuke_mese_tnt_top.png", "nuke_mese_tnt_bottom.png",
"nuke_mese_tnt_side.png", "nuke_mese_tnt_side.png",
"nuke_mese_tnt_side.png", "nuke_mese_tnt_side.png"},
-- Initial value for our timer
timer = 0,
-- Number of punches required to defuse
health = 1,
blinktimer = 0,
blinkstatus = true,
}
function MESE_TNT:on_activate(staticdata)
self.object:setvelocity({x=0, y=4, z=0})
self.object:setacceleration({x=0, y=-10, z=0})
self.object:settexturemod("^[brighten")
end
function MESE_TNT:on_step(dtime)
self.timer = self.timer + dtime
self.blinktimer = self.blinktimer + dtime
if self.timer>5 then
self.blinktimer = self.blinktimer + dtime
if self.timer>8 then
self.blinktimer = self.blinktimer + dtime
self.blinktimer = self.blinktimer + dtime
end
end
if self.blinktimer > 0.5 then
self.blinktimer = self.blinktimer - 0.5
if self.blinkstatus then
self.object:settexturemod("")
else
self.object:settexturemod("^[brighten")
end
self.blinkstatus = not self.blinkstatus
end
if self.timer > 10 then
local pos = self.object:getpos()
pos.x = math.floor(pos.x+0.5)
pos.y = math.floor(pos.y+0.5)
pos.z = math.floor(pos.z+0.5)
do_tnt_physics(pos, MESE_TNT_RANGE)
if minetest.env:get_node(pos).name == "default:water_source" or minetest.env:get_node(pos).name == "default:water_flowing" then
-- Cancel the Explosion
self.object:remove()
return
end
for x=-MESE_TNT_RANGE,MESE_TNT_RANGE do
for y=-MESE_TNT_RANGE,MESE_TNT_RANGE do
for z=-MESE_TNT_RANGE,MESE_TNT_RANGE do
if x*x+y*y+z*z <= (MESE_TNT_RANGE + math.floor(math.random(mrmin,mrmax))) * (MESE_TNT_RANGE + math.floor(math.random(mrmin,mrmax))) + (MESE_TNT_RANGE + math.floor(math.random(mrmin,mrmax))) then
local np={x=pos.x+x,y=pos.y+y,z=pos.z+z}
local n = minetest.env:get_node(np)
if n.name ~= "air" then
minetest.env:remove_node(np)
end
activate_if_tnt(n.name, np, pos, MESE_TNT_RANGE)
end
end
end
end
self.object:remove()
end
end
function MESE_TNT:on_punch(hitter)
self.health = self.health - 1
if self.health <= 0 then
self.object:remove()
hitter:get_inventory():add_item("main", "nuke:mese_tnt")
end
end
minetest.register_entity("nuke:mese_tnt", MESE_TNT)
local MESE_TNT2_RANGE = 14
local MESE_TNT2 = {
-- Static definition
physical = true, -- Collides with things
-- weight = 5,
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
visual = "cube",
textures = {"nuke_mese_tnt_top.png", "nuke_mese_tnt_bottom.png",
"nuke_mese_tnt_side.png", "nuke_mese_tnt_side.png",
"nuke_mese_tnt_side.png", "nuke_mese_tnt_side.png"},
-- Initial value for our timer
timer = 9,
-- Number of punches required to defuse
health = 1,
blinktimer = 9,
blinkstatus = true,
}
function MESE_TNT2:on_activate(staticdata)
self.object:setvelocity({x=0, y=1, z=0})
self.object:setacceleration({x=0, y=-10, z=0})
self.object:settexturemod("^[brighten")
end
function MESE_TNT2:on_step(dtime)
self.timer = self.timer + dtime
self.blinktimer = self.blinktimer + dtime
if self.timer>5 then
self.blinktimer = self.blinktimer + dtime
if self.timer>8 then
self.blinktimer = self.blinktimer + dtime
self.blinktimer = self.blinktimer + dtime
end
end
if self.blinktimer > 0.5 then
self.blinktimer = self.blinktimer - 0.5
if self.blinkstatus then
self.object:settexturemod("")
else
self.object:settexturemod("^[brighten")
end
self.blinkstatus = not self.blinkstatus
end
if self.timer > 10 then
local pos = self.object:getpos()
pos.x = math.floor(pos.x+0.5)
pos.y = math.floor(pos.y+0.5)
pos.z = math.floor(pos.z+0.5)
do_tnt_physics(pos, MESE_TNT2_RANGE)
if minetest.env:get_node(pos).name == "default:water_source" or minetest.env:get_node(pos).name == "default:water_flowing" then
-- Cancel the Explosion
self.object:remove()
return
end
for x=-MESE_TNT2_RANGE,MESE_TNT2_RANGE do
for y=-MESE_TNT2_RANGE,MESE_TNT2_RANGE do
for z=-MESE_TNT2_RANGE,MESE_TNT2_RANGE do
if x*x+y*y+z*z <= (MESE_TNT2_RANGE + math.floor(math.random(mrmin,mrmax))) * (MESE_TNT2_RANGE + math.floor(math.random(mrmin,mrmax))) + (MESE_TNT2_RANGE + math.floor(math.random(mrmin,mrmax))) then
local np={x=pos.x+x,y=pos.y+y,z=pos.z+z}
local n = minetest.env:get_node(np)
if n.name ~= "air" then
minetest.env:remove_node(np)
end
activate_if_tnt(n.name, np, pos, MESE_TNT2_RANGE)
end
end
end
end
self.object:remove()
end
end
minetest.register_entity("nuke:mese_tnt2", MESE_TNT2)
-- Hardcore Iron TNT
minetest.register_craft({
output = 'node "nuke:hardcore_iron_tnt" 1',
recipe = {
{'','craft "default:coal_lump" 1',''},
{'craft "default:coal_lump" 1','node "nuke:iron_tnt" 1','craft "default:coal_lump" 1'},
{'','craft "default:coal_lump" 1',''}
}
})
minetest.register_node("nuke:hardcore_iron_tnt", {
tile_images = {"nuke_iron_tnt_top.png", "nuke_iron_tnt_bottom.png",
"nuke_hardcore_iron_tnt_side.png", "nuke_hardcore_iron_tnt_side.png",
"nuke_hardcore_iron_tnt_side.png", "nuke_hardcore_iron_tnt_side.png"},
inventory_image = minetest.inventorycube("nuke_iron_tnt_top.png",
"nuke_hardcore_iron_tnt_side.png", "nuke_hardcore_iron_tnt_side.png"),
dug_item = '', -- Get nothing
material = {
diggability = "not",
},
description = "Hardcore Iron TNT",
})
minetest.register_on_punchnode(function(p, node)
if node.name == "nuke:hardcore_iron_tnt" then
minetest.env:remove_node(p)
minetest.env:add_entity(p, "nuke:hardcore_iron_tnt")
nodeupdate(p)
end
end)
local HARDCORE_IRON_TNT_RANGE = 6
local HARDCORE_IRON_TNT = {
-- Static definition
physical = true, -- Collides with things
-- weight = 5,
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
visual = "cube",
textures = {"nuke_iron_tnt_top.png", "nuke_iron_tnt_bottom.png",
"nuke_hardcore_iron_tnt_side.png", "nuke_hardcore_iron_tnt_side.png",
"nuke_hardcore_iron_tnt_side.png", "nuke_hardcore_iron_tnt_side.png"},
-- Initial value for our timer
timer = 0,
-- Number of punches required to defuse
health = 1,
blinktimer = 0,
blinkstatus = true,
}
function HARDCORE_IRON_TNT:on_activate(staticdata)
self.object:setvelocity({x=0, y=4, z=0})
self.object:setacceleration({x=0, y=-10, z=0})
self.object:settexturemod("^[brighten")
end
function HARDCORE_IRON_TNT:on_step(dtime)
self.timer = self.timer + dtime
self.blinktimer = self.blinktimer + dtime
if self.timer>5 then
self.blinktimer = self.blinktimer + dtime
if self.timer>8 then
self.blinktimer = self.blinktimer + dtime
self.blinktimer = self.blinktimer + dtime
end
end
if self.blinktimer > 0.5 then
self.blinktimer = self.blinktimer - 0.5
if self.blinkstatus then
self.object:settexturemod("")
else
self.object:settexturemod("^[brighten")
end
self.blinkstatus = not self.blinkstatus
end
if self.timer > 10 then
local pos = self.object:getpos()
pos.x = math.floor(pos.x+0.5)
pos.y = math.floor(pos.y+0.5)
pos.z = math.floor(pos.z+0.5)
for x=-HARDCORE_IRON_TNT_RANGE,HARDCORE_IRON_TNT_RANGE do
for z=-HARDCORE_IRON_TNT_RANGE,HARDCORE_IRON_TNT_RANGE do
if x*x+z*z <= HARDCORE_IRON_TNT_RANGE * HARDCORE_IRON_TNT_RANGE + HARDCORE_IRON_TNT_RANGE then
local np={x=pos.x+x,y=pos.y,z=pos.z+z}
minetest.env:add_entity(np, "nuke:iron_tnt")
end
end
end
self.object:remove()
end
end
function HARDCORE_IRON_TNT:on_punch(hitter)
self.health = self.health - 1
if self.health <= 0 then
self.object:remove()
hitter:add_to_inventory("node nuke:hardcore_iron_tnt 1")
hitter:set_hp(hitter:get_hp() - 1)
end
end
minetest.register_entity("nuke:hardcore_iron_tnt", HARDCORE_IRON_TNT)
-- Hardcore Mese TNT
minetest.register_craft({
output = 'node "nuke:hardcore_mese_tnt" 1',
recipe = {
{'','craft "default:coal_lump" 1',''},
{'craft "default:coal_lump" 1','node "nuke:mese_tnt" 1','craft "default:coal_lump" 1'},
{'','craft "default:coal_lump" 1',''}
}
})
minetest.register_node("nuke:hardcore_mese_tnt", {
tile_images = {"nuke_mese_tnt_top.png", "nuke_mese_tnt_bottom.png",
"nuke_hardcore_mese_tnt_side.png", "nuke_hardcore_mese_tnt_side.png",
"nuke_hardcore_mese_tnt_side.png", "nuke_hardcore_mese_tnt_side.png"},
inventory_image = minetest.inventorycube("nuke_mese_tnt_top.png",
"nuke_hardcore_mese_tnt_side.png", "nuke_hardcore_mese_tnt_side.png"),
dug_item = '', -- Get nothing
material = {
diggability = "not",
},
description = "Hardcore Mese TNT",
})
minetest.register_on_punchnode(function(p, node)
if node.name == "nuke:hardcore_mese_tnt" then
minetest.env:remove_node(p)
minetest.env:add_entity(p, "nuke:hardcore_mese_tnt")
nodeupdate(p)
end
end)
local HARDCORE_MESE_TNT_RANGE = 6
local HARDCORE_MESE_TNT = {
-- Static definition
physical = true, -- Collides with things
-- weight = 5,
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
visual = "cube",
textures = {"nuke_mese_tnt_top.png", "nuke_mese_tnt_bottom.png",
"nuke_hardcore_mese_tnt_side.png", "nuke_hardcore_mese_tnt_side.png",
"nuke_hardcore_mese_tnt_side.png", "nuke_hardcore_mese_tnt_side.png"},
-- Initial value for our timer
timer = 0,
-- Number of punches required to defuse
health = 1,
blinktimer = 0,
blinkstatus = true,
}
function HARDCORE_MESE_TNT:on_activate(staticdata)
self.object:setvelocity({x=0, y=4, z=0})
self.object:setacceleration({x=0, y=-10, z=0})
self.object:settexturemod("^[brighten")
end
function HARDCORE_MESE_TNT:on_step(dtime)
self.timer = self.timer + dtime
self.blinktimer = self.blinktimer + dtime
if self.timer>5 then
self.blinktimer = self.blinktimer + dtime
if self.timer>8 then
self.blinktimer = self.blinktimer + dtime
self.blinktimer = self.blinktimer + dtime
end
end
if self.blinktimer > 0.5 then
self.blinktimer = self.blinktimer - 0.5
if self.blinkstatus then
self.object:settexturemod("")
else
self.object:settexturemod("^[brighten")
end
self.blinkstatus = not self.blinkstatus
end
if self.timer > 10 then
local pos = self.object:getpos()
pos.x = math.floor(pos.x+0.5)
pos.y = math.floor(pos.y+0.5)
pos.z = math.floor(pos.z+0.5)
for x=-HARDCORE_MESE_TNT_RANGE,HARDCORE_MESE_TNT_RANGE do
for z=-HARDCORE_MESE_TNT_RANGE,HARDCORE_MESE_TNT_RANGE do
if x*x+z*z <= HARDCORE_MESE_TNT_RANGE * HARDCORE_MESE_TNT_RANGE + HARDCORE_MESE_TNT_RANGE then
local np={x=pos.x+x,y=pos.y,z=pos.z+z}
minetest.env:add_entity(np, "nuke:mese_tnt")
end
end
end
self.object:remove()
end
end
function HARDCORE_MESE_TNT:on_punch(hitter)
self.health = self.health - 1
if self.health <= 0 then
self.object:remove()
hitter:add_to_inventory("node nuke:hardcore_mese_tnt 1")
hitter:set_hp(hitter:get_hp() - 1)
end
end
minetest.register_entity("nuke:hardcore_mese_tnt", HARDCORE_MESE_TNT)