1 --here is where tnt is defined
2 local function extreme_tnt(pos,range)
3 local pos = vector.floor(vector.add(pos,0.5))
7 for _,object in ipairs(minetest.get_objects_inside_radius(pos, range)) do
8 if object:is_player() then
10 elseif object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
20 minetest.after(delay, function(pos,range,x,y,z)
21 local min = vector.add(pos,vector.multiply(vector.new(x,y,z),range))
22 local max = vector.add(pos,vector.multiply(vector.new(x+1,y+1,z+1),range))
23 local vm = minetest.get_voxel_manip()
24 local emin, emax = vm:read_from_map(min,max)
25 local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
26 local data = vm:get_data()
27 local air = minetest.get_content_id("air")
32 --if vector.distance(pos, vector.new(x,y,z)) <= range then
33 --minetest.remove_node(vector.new(x,y,z))
34 data[area:index(x,y,z)] = air
47 minetest.sound_play("tnt_explode", {pos = pos, gain = 1.0, max_hear_distance = range*range*range})
50 function tnt(pos,range)
51 local pos = vector.floor(vector.add(pos,0.5))
53 --throw players and items
54 for _,object in ipairs(minetest.get_objects_inside_radius(pos, range)) do
55 if object:is_player() then
56 local ppos = object:getpos()
57 local power = (range - vector.distance(pos,ppos))*2
58 local distance = vector.subtract(ppos,pos)
59 local force = vector.multiply(distance,power)
60 object:add_player_velocity(force)
61 elseif object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
62 local ppos = object:getpos()
63 local power = (range - vector.distance(pos,ppos))*2
64 local distance = vector.subtract(pos,ppos)
65 local force = vector.multiply(distance,power)
66 object:setvelocity(force)
72 local min = vector.add(pos,range)
73 local max = vector.subtract(pos,range)
74 local vm = minetest.get_voxel_manip()
75 local emin, emax = vm:read_from_map(min,max)
76 local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
77 local data = vm:get_data()
79 local air = minetest.get_content_id("air")
80 local content_id = minetest.get_name_from_content_id
82 local pos2 = vector.new(0,0,0)
84 for x=-range, range do
85 for y=-range, range do
86 for z=-range, range do
87 if vector.distance(pos2, vector.new(x,y,z)) <= range then
88 local p_pos = area:index(pos.x+x,pos.y+y,pos.z+z)
89 local n = content_id(data[p_pos])
90 if n == "tnt:tnt" then
92 local obj = minetest.add_entity(vector.new(pos.x+x,pos.y+y,pos.z+z),"tnt:tnt")
93 obj:get_luaentity().range = 5
94 obj:get_luaentity().timer = math.random(1,10)*math.random()
95 --minetest.sound_play("tnt_ignite", {object=obj, gain = 1.0, max_hear_distance = range*range*range})
96 elseif n ~= "air" and n ~= "ignore" then
97 if math.random()>0.99 then
98 local item = minetest.get_node_drops(n, "main:diamondpick")[1]
99 minetest.add_item(vector.new(pos.x+x,pos.y+y,pos.z+z), item)
112 minetest.sound_play("tnt_explode", {pos = pos, gain = 1.0, max_hear_distance = range*range*range})
114 --stop client from lagging
115 local particle = range
116 if particle > 15 then
120 minetest.add_particlespawner({
121 amount = particle*particle*particle,
125 minvel = vector.new(-range,-range,-range),
126 maxvel = vector.new(range,range,range),
127 minacc = {x=0, y=0, z=0},
128 maxacc = {x=0, y=0, z=0},
133 collisiondetection = false,
135 texture = "smoke.png",
140 minetest.register_entity("tnt:tnt", {
141 initial_properties = {
144 collide_with_objects = false,
145 collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
147 visual_size = {x = 1, y = 1},
148 textures = {"tnt_top.png", "tnt_bottom.png",
149 "tnt_side.png", "tnt_side.png",
150 "tnt_side.png", "tnt_side.png"},
158 get_staticdata = function(self)
159 return minetest.serialize({
165 on_activate = function(self, staticdata, dtime_s)
166 self.object:set_armor_groups({immortal = 1})
167 self.object:set_velocity({x = math.random(-5,5), y = 5, z = math.random(-5,5)})
168 self.object:set_acceleration({x = 0, y = -9.81, z = 0})
169 if string.sub(staticdata, 1, string.len("return")) == "return" then
170 local data = minetest.deserialize(staticdata)
171 if data and type(data) == "table" then
172 self.range = data.range
173 self.timer = data.timer
177 minetest.add_particlespawner({
182 minvel = vector.new(-0.5,1,-0.5),
183 maxvel = vector.new(0.5,5,0.5),
184 minacc = {x=0, y=0, z=0},
185 maxacc = {x=0, y=0, z=0},
190 collisiondetection = false,
192 texture = "smoke.png",
193 attached = self.object,
195 minetest.sound_play("tnt_ignite", {object = self.object, gain = 1.0, max_hear_distance = self.range*self.range*self.range})
198 on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
199 local obj = minetest.add_item(self.object:getpos(), "tnt:tnt")
203 sound_played = false,
204 on_step = function(self, dtime)
205 self.timer = self.timer - dtime
206 local vel = self.object:getvelocity()
207 vel = vector.multiply(vel,-0.05)
208 self.object:add_velocity(vector.new(vel.x,0,vel.z))
210 if self.timer <= 0 then
211 local pos = self.object:getpos()
212 if not self.range then
215 if self.extreme == true then
216 extreme_tnt(pos,self.range)
226 minetest.register_node("tnt:tnt", {
227 description = "Cobblestone",
228 tiles = {"tnt_top.png", "tnt_bottom.png",
229 "tnt_side.png", "tnt_side.png",
230 "tnt_side.png", "tnt_side.png"},
231 groups = {stone = 2, hard = 1, pickaxe = 2, hand = 4, redstone_activation = 1},
232 sounds = main.stoneSound(),
233 redstone_activation = function(pos)
234 local obj = minetest.add_entity(pos,"tnt:tnt")
236 obj:get_luaentity().range = range
237 minetest.remove_node(pos)
239 on_punch = function(pos, node, puncher, pointed_thing)
240 local obj = minetest.add_entity(pos,"tnt:tnt")
242 obj:get_luaentity().range = range
243 minetest.remove_node(pos)
247 minetest.register_node("tnt:uranium_tnt", {
248 description = "Cobblestone",
249 tiles = {"tnt_top.png^[colorize:green:100", "tnt_bottom.png^[colorize:green:100",
250 "tnt_side.png^[colorize:green:100", "tnt_side.png^[colorize:green:100",
251 "tnt_side.png^[colorize:green:100", "tnt_side.png^[colorize:green:100"},
252 groups = {stone = 2, hard = 1, pickaxe = 2, hand = 4},
253 sounds = main.stoneSound(),
254 on_punch = function(pos, node, puncher, pointed_thing)
255 local obj = minetest.add_entity(pos,"tnt:tnt")
257 obj:get_luaentity().range = range
258 obj:get_luaentity().timer = 7
259 obj:get_luaentity().extreme = true
261 minetest.remove_node(pos)
265 minetest.register_node("tnt:uh_oh", {
266 description = "Cobblestone",
267 tiles = {"tnt_top.png", "tnt_bottom.png",
268 "tnt_side.png", "tnt_side.png",
269 "tnt_side.png", "tnt_side.png"},
270 groups = {stone = 2, hard = 1, pickaxe = 2, hand = 4},
271 sounds = main.stoneSound(),
272 on_punch = function(pos, node, puncher, pointed_thing)
274 for x=-range, range do
275 for y=-range, range do
276 for z=-range, range do
277 minetest.add_node(vector.new(pos.x+x,pos.y+y,pos.z+z),{name="tnt:tnt"})
286 minetest.register_craft({
289 {"main:wood", "main:wood", "main:wood"},
290 {"main:wood", "main:coal", "main:wood"},
291 {"main:wood", "main:wood", "main:wood"},