]> git.lizzy.rs Git - Crafter.git/blobdiff - mods/tnt/init.lua
remove server debug
[Crafter.git] / mods / tnt / init.lua
index c62c6ec7ea93753c905f123e69c57ac27667acb5..b5457e9a2359ec02a74d2bf2df1e5d16bce61587 100644 (file)
@@ -1,5 +1,5 @@
-local minetest,type,vector,math,ipairs = 
-minetest,type,vector,math,ipairs
+local minetest,type,vector,math,ipairs,os = 
+minetest,type,vector,math,ipairs,os
 
 
 local function extreme_tnt(pos,range,explosion_type)
@@ -69,30 +69,39 @@ local force
 local hp
 local explosion_force
 local explosion_depletion
+local range_calc
+local boom_time = minetest.get_us_time()/1000000
+local digging_nodes = {
+       ["utility:chest_open"] = true,
+       ["utility:chest"] = true,
+       ["utility:furnace_active"] = true,
+       ["utility:furnace"] = true,
+}
 function tnt(pos,range,explosion_type)
        in_node = minetest.get_node(pos).name
        in_water =  ( in_node == "main:water" or minetest.get_node(pos).name == "main:waterflow")
        min = vector.add(pos,range)
        max = vector.subtract(pos,range)
        vm = minetest.get_voxel_manip(min,max)
-       emin, emax = vm:read_from_map(min,max)
-       area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
-       data = vm:get_data()
-       vm:get_light_data()
-       
-       if data and in_water == false then
+               emin, emax = vm:read_from_map(min,max)
+               area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
+               data = vm:get_data()
+               
+       if in_water == false then
+               vm:get_light_data()
+               range_calc = range/100
                explosion_depletion = range/2
                --raycast explosion
                for x=-range, range do
                for y=-range, range do
                for z=-range, range do
                        distance = vector.distance(pos2, vector.new(x,y,z))
-                       if distance <= range and distance >= range-1 then                       
+                       if distance <= range and distance >= range-1 then
                                ray = minetest.raycast(pos, vector.new(pos.x+x,pos.y+y,pos.z+z), false, false)
                                explosion_force = range
                                for pointed_thing in ray do
                                        explosion_force = explosion_force - math.random()
-                                       if explosion_force  >= explosion_depletion then
+                                       if pointed_thing and explosion_force >= explosion_depletion then
                                                n_pos = area:index(pointed_thing.under.x,pointed_thing.under.y,pointed_thing.under.z)
 
                                                if n_pos and data[n_pos] then
@@ -100,17 +109,19 @@ function tnt(pos,range,explosion_type)
                                                        
                                                        if node2 == "nether:obsidian" or node2 == "nether:bedrock" then
                                                                break
+                                                       elseif digging_nodes[node2] then
+                                                               minetest.dig_node({x=pointed_thing.under.x,y=pointed_thing.under.y,z=pointed_thing.under.z})
+                                                               data[n_pos] = air
                                                        elseif node2 == "tnt:tnt" then
                                                                data[n_pos] = air
                                                                minetest.add_entity({x=pointed_thing.under.x,y=pointed_thing.under.y,z=pointed_thing.under.z}, "tnt:tnt",minetest.serialize({do_ignition_particles=true,timer = math.random()}))
-                                                       else
+                                                       elseif not string.match(node2, "mob_spawners:") then
                                                                data[n_pos] = air
-                                                               
+
                                                                minetest.after(0, function(pointed_thing)
                                                                        minetest.check_for_falling({x=pointed_thing.under.x,y=pointed_thing.under.y+1,z=pointed_thing.under.z})
                                                                end,pointed_thing)
-
-                                                               if math.random()>0.9 then
+                                                               if range_calc < 1 and math.random() > 0.9 + range_calc then
                                                                        item = minetest.get_node_drops(node2, "main:diamondpick")[1]
                                                                        ppos = {x=pointed_thing.under.x,y=pointed_thing.under.y,z=pointed_thing.under.z}
                                                                        obj = minetest.add_item(ppos, item)
@@ -135,8 +146,10 @@ function tnt(pos,range,explosion_type)
                vm:update_liquids()
                vm:write_to_map()
        end
-       
-       minetest.sound_play("tnt_explode", {pos = pos, gain = 1.0, max_hear_distance = range*range}) --hear twice as far away
+       if minetest.get_us_time()/1000000 - boom_time >= 0.1 then
+               boom_time = minetest.get_us_time()/1000000
+               minetest.sound_play("tnt_explode", {pos = pos, gain = 1.0, max_hear_distance = 64}) --hear twice as far away
+       end
        
        --throw players and items
        for _,object in ipairs(minetest.get_objects_inside_radius(pos, range)) do
@@ -187,8 +200,10 @@ function tnt(pos,range,explosion_type)
                                                                full_punch_interval=1.5,
                                                                damage_groups = {damage=math.floor(power)},
                                                                })
-                                                       object:set_velocity(force)
+                                               elseif object:get_luaentity().name == "__builtin:item" then
+                                                       object:get_luaentity().poll_timer = 0
                                                end
+                                               object:set_velocity(force)
                                        end
                                end
                        end
@@ -221,6 +236,68 @@ function tnt(pos,range,explosion_type)
        })
 end
 
+local pos
+local vel
+local range
+local tnt_boom = function(self,dtime)
+       self.timer = self.timer - dtime
+       if not self.shot or not self.redstone_activated then
+               vel = self.object:getvelocity()
+               vel = vector.multiply(vel,-0.05)
+               self.object:add_velocity(vector.new(vel.x,0,vel.z))
+       end
+       if self.timer <= 0 then
+               if not self.range then
+                       self.range = 7
+               end
+               pos = self.object:get_pos()
+               range = self.range
+               self.object:remove()
+               tnt(pos,range)
+       end
+end
+local activation = function(self, staticdata, dtime_s)
+       self.object:set_armor_groups({immortal = 1})
+       self.object:set_velocity({x = math.random(-3,3), y = 3, z = math.random(-3,3)})
+       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
+                       self.exploded = data.exploded
+               end
+       end
+       if self.timer == self.timer_max then
+               minetest.add_particlespawner({
+                       amount = 10,
+                       time = 0,
+                       minpos = vector.new(0,0.5,0),
+                       minpos = vector.new(0,0.5,0),
+                       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 = 0.5,
+                       maxexptime = 1.0,
+                       minsize = 1,
+                       maxsize = 2,
+                       collisiondetection = false,
+                       vertical = false,
+                       texture = "smoke.png",
+                       attached = self.object,
+               })
+               minetest.sound_play("tnt_ignite", {object = self.object, gain = 1.0, max_hear_distance = 64})
+       end
+end
+
+local static = function(self)
+       return minetest.serialize({
+               range = self.range,
+               timer = self.timer,
+               exploded = self.exploded,       
+       })
+end
 
 minetest.register_entity("tnt:tnt", {
        initial_properties = {
@@ -241,74 +318,27 @@ minetest.register_entity("tnt:tnt", {
        timer_max = 5, --this has to be equal to timer
        range = 7,
        get_staticdata = function(self)
-               return minetest.serialize({
-                       range = self.range,
-                       timer = self.timer,
-                       exploded = self.exploded,       
-               })
+               return(static(self))
        end,
        
        on_activate = function(self, staticdata, dtime_s)
-               self.object:set_armor_groups({immortal = 1})
-               self.object:set_velocity({x = math.random(-3,3), y = 3, z = math.random(-3,3)})
-               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
-                               self.exploded = data.exploded
-                       end
-               end
-               if self.timer == self.timer_max then
-                       minetest.add_particlespawner({
-                               amount = 10,
-                               time = 0,
-                               minpos = vector.new(0,0.5,0),
-                               minpos = vector.new(0,0.5,0),
-                               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 = 0.5,
-                               maxexptime = 1.0,
-                               minsize = 1,
-                               maxsize = 2,
-                               collisiondetection = false,
-                               vertical = false,
-                               texture = "smoke.png",
-                               attached = self.object,
-                       })
-                       minetest.sound_play("tnt_ignite", {object = self.object, gain = 1.0, max_hear_distance = self.range*self.range*self.range})
-               end
+               activation(self, staticdata, dtime_s)
        end,
                
        on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
-               local obj = minetest.add_item(self.object:get_pos(), "tnt:tnt")
+               minetest.throw_item(self.object:get_pos(), "tnt:tnt")
                self.object:remove()
        end,
 
        sound_played = false,
        on_step = function(self, dtime) 
-               self.timer = self.timer - dtime
-               if not self.shot or not self.redstone_activated then
-                       local vel = self.object:getvelocity()
-                       vel = vector.multiply(vel,-0.05)
-                       self.object:add_velocity(vector.new(vel.x,0,vel.z))
-               end
-               if self.timer <= 0 then
-                       if not self.range then
-                               self.range = 7
-                       end
-                       tnt(self.object:get_pos(),self.range)
-                       self.object:remove()
-               end
+               tnt_boom(self,dtime)
        end,
 })
 
 
 minetest.register_node("tnt:tnt", {
-    description = "Cobblestone",
+    description = "TNT",
     tiles = {"tnt_top.png", "tnt_bottom.png",
                        "tnt_side.png", "tnt_side.png",
                        "tnt_side.png", "tnt_side.png"},
@@ -316,21 +346,21 @@ minetest.register_node("tnt:tnt", {
     sounds = main.stoneSound(),
     redstone_activation = function(pos)
                local obj = minetest.add_entity(pos,"tnt:tnt")
-               local range = 7
+               local range = 4
                obj:get_luaentity().range = range
                obj:get_luaentity().redstone_activated = true
                minetest.remove_node(pos)
     end,
     on_punch = function(pos, node, puncher, pointed_thing)
                local obj = minetest.add_entity(pos,"tnt:tnt")
-               local range = 7
+               local range = 4
                obj:get_luaentity().range = range
                minetest.remove_node(pos)
     end,
 })
 
 minetest.register_node("tnt:uranium_tnt", {
-    description = "Cobblestone",
+    description = "Uranium TNT",
     tiles = {"tnt_top.png^[colorize:green:100", "tnt_bottom.png^[colorize:green:100",
                        "tnt_side.png^[colorize:green:100", "tnt_side.png^[colorize:green:100",
                        "tnt_side.png^[colorize:green:100", "tnt_side.png^[colorize:green:100"},
@@ -348,7 +378,7 @@ minetest.register_node("tnt:uranium_tnt", {
 })
 
 minetest.register_node("tnt:uh_oh", {
-    description = "Cobblestone",
+    description = "Uh Oh",
     tiles = {"tnt_top.png", "tnt_bottom.png",
                        "tnt_side.png", "tnt_side.png",
                        "tnt_side.png", "tnt_side.png"},