]> git.lizzy.rs Git - Crafter.git/blobdiff - mods/tnt/init.lua
Add TNT
[Crafter.git] / mods / tnt / init.lua
index d677232a20a3e9f9e0e065ed39022716446e6e0a..b6db25107bc6670d830e3bdbd8ba3c7ebca3d3ac 100644 (file)
@@ -1 +1,200 @@
---minetest.bulk_set_node({pos1, pos2, pos3, ...}, node) --use to create easy explosions!!
+--here is where tnt is defined
+
+local function tnt(pos,range)
+       local pos = vector.floor(vector.add(pos,0.5))
+
+       local min = vector.add(pos,range)
+       local max = vector.subtract(pos,range)
+       local vm = minetest.get_voxel_manip()   
+       local emin, emax = vm:read_from_map(min,max)
+       local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
+       local data = vm:get_data()
+       
+       local air = minetest.get_content_id("air")
+       local content_id = minetest.get_name_from_content_id
+       
+       local pos2 = vector.new(0,0,0)
+       
+       for x=-range, range do
+       for y=-range, range do
+       for z=-range, range do
+               if vector.distance(pos2, vector.new(x,y,z)) <= range then
+                       local p_pos = area:index(pos.x+x,pos.y+y,pos.z+z)                                                       
+                       local n = content_id(data[p_pos])
+                       if n == "tnt:tnt" then
+                               --print("adding tnt")
+                               local obj = minetest.add_entity(vector.new(pos.x+x,pos.y+y,pos.z+z),"tnt:tnt")
+                               obj:get_luaentity().range = 5
+                               obj:get_luaentity().timer = math.random(1,10)*math.random()
+                               minetest.sound_play("tnt_ignite", {object=obj, gain = 1.0, max_hear_distance = range*range*range})
+                       elseif n ~= "air" and n ~= "ignore" then
+                               if math.random()>0.99 then
+                                       local item = minetest.get_node_drops(n, "main:diamondpick")[1]
+                                       minetest.add_item(vector.new(pos.x+x,pos.y+y,pos.z+z), item)
+                               end
+                       end
+                       
+                       data[p_pos] = air
+               end
+       end
+       end
+       end
+       
+       vm:set_data(data)
+       vm:write_to_map()
+       vm:update_map()
+       
+       minetest.sound_play("tnt_explode", {pos = pos, gain = 1.0, max_hear_distance = range*range*range})
+       
+       --stop client from lagging
+       local particle = range
+       if particle > 15 then
+               particle = 15
+       end
+       
+       minetest.add_particlespawner({
+                       amount = particle*particle*particle,
+                       time = 0.001,
+                       minpos = pos,
+                       maxpos = pos,
+                       minvel = vector.new(-range,-range,-range),
+                       maxvel = vector.new(range,range,range),
+                       minacc = {x=0, y=0, z=0},
+                       maxacc = {x=0, y=0, z=0},
+                       minexptime = 1.1,
+                       maxexptime = 1.5,
+                       minsize = 1,
+                       maxsize = 2,
+                       collisiondetection = false,
+                       vertical = false,
+                       texture = "smoke.png",
+               })
+end
+
+
+minetest.register_entity("tnt:tnt", {
+       initial_properties = {
+               hp_max = 1,
+               physical = true,
+               collide_with_objects = false,
+               collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+               visual = "cube",
+               visual_size = {x = 1, y = 1},
+               textures = {"tnt_top.png", "tnt_bottom.png",
+                       "tnt_side.png", "tnt_side.png",
+                       "tnt_side.png", "tnt_side.png"},
+               is_visible = true,
+               pointable = true,
+       },
+
+       timer = 5,
+       
+       get_staticdata = function(self)
+               return minetest.serialize({
+                       range = self.range,
+                       timer = self.timer,                     
+               })
+       end,
+       
+       on_activate = function(self, staticdata, dtime_s)
+               self.object:set_armor_groups({immortal = 1})
+               self.object:set_velocity({x = math.random(-5,5), y = 5, z = math.random(-5,5)})
+               self.object:set_acceleration({x = 0, y = -9.81, z = 0})
+               if string.sub(staticdata, 1, string.len("return")) == "return" then
+                       local data = minetest.deserialize(staticdata)
+                       if data and type(data) == "table" then
+                               self.range = data.range
+                               self.timer = data.timer
+                       end
+               end
+               
+               minetest.add_particlespawner({
+                       amount = 50,
+                       time = 0,
+                       minpos = pos,
+                       maxpos = pos,
+                       minvel = vector.new(-0.5,1,-0.5),
+                       maxvel = vector.new(0.5,5,0.5),
+                       minacc = {x=0, y=0, z=0},
+                       maxacc = {x=0, y=0, z=0},
+                       minexptime = 1.1,
+                       maxexptime = 1.5,
+                       minsize = 1,
+                       maxsize = 2,
+                       collisiondetection = false,
+                       vertical = false,
+                       texture = "smoke.png",
+                       attached = self.object,
+               })
+       end,
+               
+       on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
+               local obj = minetest.add_item(self.object:getpos(), "tnt:tnt")
+               obj:get_luaentity().collection_timer = 2
+               self.object:remove()
+       end,
+
+       sound_played = false,
+       on_step = function(self, dtime)
+               self.timer = self.timer - dtime
+               local vel = self.object:getvelocity()
+               vel = vector.multiply(vel,-0.05)
+               self.object:add_velocity(vector.new(vel.x,0,vel.z))
+               
+               if self.timer <= 0 then
+                       local pos = self.object:getpos()
+                       if not self.range then
+                               self.range = 7
+                       end
+                       tnt(pos,self.range)
+                       self.object:remove()
+               end
+       end,
+})
+
+
+minetest.register_node("tnt:tnt", {
+    description = "Cobblestone",
+    tiles = {"tnt_top.png", "tnt_bottom.png",
+                       "tnt_side.png", "tnt_side.png",
+                       "tnt_side.png", "tnt_side.png"},
+    groups = {stone = 2, hard = 1, pickaxe = 2, hand = 4},
+    sounds = main.stoneSound(),
+    on_punch = function(pos, node, puncher, pointed_thing)
+               local obj = minetest.add_entity(pos,"tnt:tnt")
+               local range = 7
+               obj:get_luaentity().range = range
+               minetest.sound_play("tnt_ignite", {object = obj, gain = 1.0, max_hear_distance = range*range*range})
+               minetest.remove_node(pos)
+    end,
+})
+
+minetest.register_node("tnt:uh_oh", {
+    description = "Cobblestone",
+    tiles = {"tnt_top.png", "tnt_bottom.png",
+                       "tnt_side.png", "tnt_side.png",
+                       "tnt_side.png", "tnt_side.png"},
+    groups = {stone = 2, hard = 1, pickaxe = 2, hand = 4},
+    sounds = main.stoneSound(),
+    on_punch = function(pos, node, puncher, pointed_thing)
+               local range = 10
+               for x=-range, range do
+               for y=-range, range do
+               for z=-range, range do 
+                       minetest.add_node(vector.new(pos.x+x,pos.y+y,pos.z+z),{name="tnt:tnt"})
+               end
+               end
+               end
+    end,
+})
+
+
+
+minetest.register_craft({
+       output = "tnt:tnt",
+       recipe = {
+               {"main:wood", "main:wood", "main:wood"},
+               {"main:wood", "main:coal", "main:wood"},
+               {"main:wood", "main:wood", "main:wood"},
+       },
+})