1 --here is where tnt is defined
3 local function tnt(pos,range)
4 local pos = vector.floor(vector.add(pos,0.5))
6 --throw players and items
7 for _,object in ipairs(minetest.get_objects_inside_radius(pos, range)) do
8 if object:is_player() then
9 local ppos = object:getpos()
10 local power = (range - vector.distance(pos,ppos))*2
11 local distance = vector.subtract(ppos,pos)
12 local force = vector.multiply(distance,power)
13 object:add_player_velocity(force)
14 elseif object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
15 local ppos = object:getpos()
16 local power = (range - vector.distance(pos,ppos))*2
17 local distance = vector.subtract(pos,ppos)
18 local force = vector.multiply(distance,power)
19 object:setvelocity(force)
25 local min = vector.add(pos,range)
26 local max = vector.subtract(pos,range)
27 local vm = minetest.get_voxel_manip()
28 local emin, emax = vm:read_from_map(min,max)
29 local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
30 local data = vm:get_data()
32 local air = minetest.get_content_id("air")
33 local content_id = minetest.get_name_from_content_id
35 local pos2 = vector.new(0,0,0)
37 for x=-range, range do
38 for y=-range, range do
39 for z=-range, range do
40 if vector.distance(pos2, vector.new(x,y,z)) <= range then
41 local p_pos = area:index(pos.x+x,pos.y+y,pos.z+z)
42 local n = content_id(data[p_pos])
43 if n == "tnt:tnt" then
45 local obj = minetest.add_entity(vector.new(pos.x+x,pos.y+y,pos.z+z),"tnt:tnt")
46 obj:get_luaentity().range = 5
47 obj:get_luaentity().timer = math.random(1,10)*math.random()
48 --minetest.sound_play("tnt_ignite", {object=obj, gain = 1.0, max_hear_distance = range*range*range})
49 elseif n ~= "air" and n ~= "ignore" then
50 if math.random()>0.99 then
51 local item = minetest.get_node_drops(n, "main:diamondpick")[1]
52 minetest.add_item(vector.new(pos.x+x,pos.y+y,pos.z+z), item)
66 minetest.sound_play("tnt_explode", {pos = pos, gain = 1.0, max_hear_distance = range*range*range})
68 --stop client from lagging
69 local particle = range
74 minetest.add_particlespawner({
75 amount = particle*particle*particle,
79 minvel = vector.new(-range,-range,-range),
80 maxvel = vector.new(range,range,range),
81 minacc = {x=0, y=0, z=0},
82 maxacc = {x=0, y=0, z=0},
87 collisiondetection = false,
89 texture = "smoke.png",
94 minetest.register_entity("tnt:tnt", {
95 initial_properties = {
98 collide_with_objects = false,
99 collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
101 visual_size = {x = 1, y = 1},
102 textures = {"tnt_top.png", "tnt_bottom.png",
103 "tnt_side.png", "tnt_side.png",
104 "tnt_side.png", "tnt_side.png"},
112 get_staticdata = function(self)
113 return minetest.serialize({
119 on_activate = function(self, staticdata, dtime_s)
120 self.object:set_armor_groups({immortal = 1})
121 self.object:set_velocity({x = math.random(-5,5), y = 5, z = math.random(-5,5)})
122 self.object:set_acceleration({x = 0, y = -9.81, z = 0})
123 if string.sub(staticdata, 1, string.len("return")) == "return" then
124 local data = minetest.deserialize(staticdata)
125 if data and type(data) == "table" then
126 self.range = data.range
127 self.timer = data.timer
131 minetest.add_particlespawner({
136 minvel = vector.new(-0.5,1,-0.5),
137 maxvel = vector.new(0.5,5,0.5),
138 minacc = {x=0, y=0, z=0},
139 maxacc = {x=0, y=0, z=0},
144 collisiondetection = false,
146 texture = "smoke.png",
147 attached = self.object,
149 minetest.sound_play("tnt_ignite", {object = self.object, gain = 1.0, max_hear_distance = self.range*self.range*self.range})
152 on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
153 local obj = minetest.add_item(self.object:getpos(), "tnt:tnt")
154 obj:get_luaentity().collection_timer = 2
158 sound_played = false,
159 on_step = function(self, dtime)
160 self.timer = self.timer - dtime
161 local vel = self.object:getvelocity()
162 vel = vector.multiply(vel,-0.05)
163 self.object:add_velocity(vector.new(vel.x,0,vel.z))
165 if self.timer <= 0 then
166 local pos = self.object:getpos()
167 if not self.range then
177 minetest.register_node("tnt:tnt", {
178 description = "Cobblestone",
179 tiles = {"tnt_top.png", "tnt_bottom.png",
180 "tnt_side.png", "tnt_side.png",
181 "tnt_side.png", "tnt_side.png"},
182 groups = {stone = 2, hard = 1, pickaxe = 2, hand = 4},
183 sounds = main.stoneSound(),
184 on_punch = function(pos, node, puncher, pointed_thing)
185 local obj = minetest.add_entity(pos,"tnt:tnt")
187 obj:get_luaentity().range = range
188 minetest.remove_node(pos)
192 minetest.register_node("tnt:uh_oh", {
193 description = "Cobblestone",
194 tiles = {"tnt_top.png", "tnt_bottom.png",
195 "tnt_side.png", "tnt_side.png",
196 "tnt_side.png", "tnt_side.png"},
197 groups = {stone = 2, hard = 1, pickaxe = 2, hand = 4},
198 sounds = main.stoneSound(),
199 on_punch = function(pos, node, puncher, pointed_thing)
201 for x=-range, range do
202 for y=-range, range do
203 for z=-range, range do
204 minetest.add_node(vector.new(pos.x+x,pos.y+y,pos.z+z),{name="tnt:tnt"})
213 minetest.register_craft({
216 {"main:wood", "main:wood", "main:wood"},
217 {"main:wood", "main:coal", "main:wood"},
218 {"main:wood", "main:wood", "main:wood"},