Add tnt mod (freeminer version)
authorBlockMen <nmuelll@web.de>
Sat, 19 Apr 2014 17:43:53 +0000 (19:43 +0200)
committerBlockMen <nmuelll@web.de>
Sat, 5 Jul 2014 14:02:58 +0000 (16:02 +0200)
17 files changed:
mods/tnt/README.txt [new file with mode: 0644]
mods/tnt/depends.txt [new file with mode: 0644]
mods/tnt/init.lua [new file with mode: 0644]
mods/tnt/sounds/tnt_explode.ogg [new file with mode: 0644]
mods/tnt/sounds/tnt_gunpowder_burning.ogg [new file with mode: 0644]
mods/tnt/sounds/tnt_ignite.ogg [new file with mode: 0644]
mods/tnt/textures/tnt_boom.png [new file with mode: 0644]
mods/tnt/textures/tnt_bottom.png [new file with mode: 0644]
mods/tnt/textures/tnt_gunpowder.png [new file with mode: 0644]
mods/tnt/textures/tnt_gunpowder_burning.png [new file with mode: 0644]
mods/tnt/textures/tnt_gunpowder_burning_animated.png [new file with mode: 0644]
mods/tnt/textures/tnt_gunpowder_inventory.png [new file with mode: 0644]
mods/tnt/textures/tnt_side.png [new file with mode: 0644]
mods/tnt/textures/tnt_smoke.png [new file with mode: 0644]
mods/tnt/textures/tnt_top.png [new file with mode: 0644]
mods/tnt/textures/tnt_top_burning.png [new file with mode: 0644]
mods/tnt/textures/tnt_top_burning_animated.png [new file with mode: 0644]

diff --git a/mods/tnt/README.txt b/mods/tnt/README.txt
new file mode 100644 (file)
index 0000000..46d3fca
--- /dev/null
@@ -0,0 +1,45 @@
+=== TNT-MOD for MINETEST-C55 ===
+by PilzAdam
+
+Introduction:
+This mod adds TNT to Minetest. TNT is a tool to help the player
+in mining.
+
+How to install:
+Unzip the archive an place it in minetest-base-directory/mods/minetest/
+if you have a windows client or a linux run-in-place client. If you have
+a linux system-wide instalation place it in ~/.minetest/mods/minetest/.
+If you want to install this mod only in one world create the folder
+worldmods/ in your worlddirectory.
+For further information or help see:
+http://wiki.minetest.com/wiki/Installing_Mods
+
+How to use the mod:
+Craft gunpowder by placing coal and gravel in the crafting area. The
+gunpowder can be used to craft TNT or as fuze for TNT. To craft TNT
+surround gunpowder with 4 wood in a + shape.
+There are different ways to blow up TNT:
+1. Hit it with a torch.
+2. Hit a gunpowder fuze that leads to a TNT block with a torch.
+3. Activate it with mesecons (fastest way)
+Be aware of the damage radius of 7 blocks!
+
+License:
+WTFPL (see below)
+
+See also:
+http://minetest.net/
+
+         DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+                    Version 2, December 2004
+
+ Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
+
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. You just DO WHAT THE FUCK YOU WANT TO.
diff --git a/mods/tnt/depends.txt b/mods/tnt/depends.txt
new file mode 100644 (file)
index 0000000..70715c7
--- /dev/null
@@ -0,0 +1,2 @@
+default
+fire
diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua
new file mode 100644 (file)
index 0000000..4da0713
--- /dev/null
@@ -0,0 +1,350 @@
+-- loss probabilities array (one in X will be lost)
+local loss_prob = {}
+
+loss_prob["default:cobble"] = 3
+loss_prob["default:dirt"] = 4
+
+local radius_max = tonumber(minetest.setting_get("tnt_radius_max") or 25)
+
+local eject_drops = function(pos, stack)
+       local obj = minetest.add_item(pos, stack)
+
+       if obj == nil then
+               return
+       end
+       obj:get_luaentity().collect = true
+       obj:setacceleration({x=0, y=-10, z=0})
+       obj:setvelocity({x=math.random(0,6)-3, y=10, z=math.random(0,6)-3})
+end
+
+local add_drop = function(drops, pos, item)
+       if loss_prob[item] ~= nil then
+               if math.random(1,loss_prob[item]) == 1 then
+                       return
+               end
+       end
+
+       if drops[item] == nil then
+               drops[item] = ItemStack(item)
+       else
+               drops[item]:add_item(item)
+       end
+
+       if drops[item]:get_free_space() == 0 then
+               stack = drops[item]
+               eject_drops(pos, stack)
+               drops[item] = nil
+       end
+end
+
+local destroy = function(drops, pos, last, fast)
+       local nodename = minetest.get_node(pos).name
+       if nodename ~= "air" then
+               minetest.remove_node(pos, (fast and 1 or 0))
+               if last then
+                       nodeupdate(pos)
+               end
+               if minetest.registered_nodes[nodename].groups.flammable ~= nil then
+                       minetest.set_node(pos, {name="fire:basic_flame"}, (fast and 2 or 0))
+                       return
+               end
+               local drop = minetest.get_node_drops(nodename, "")
+               for _,item in ipairs(drop) do
+                       if type(item) == "string" then
+                               add_drop(drops, pos, item)
+                       else
+                               for i=1,item:get_count() do
+                                       add_drop(drops, pos, item:get_name())
+                               end
+                       end
+               end
+       end
+end
+
+boom = function(pos, time)
+       minetest.after(time, function(pos)
+               if minetest.get_node(pos).name ~= "tnt:tnt_burning" then
+                       return
+               end
+               minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64})
+               minetest.set_node(pos, {name="tnt:boom"})
+               minetest.after(0.5, function(pos)
+                       minetest.remove_node(pos)
+               end, {x=pos.x, y=pos.y, z=pos.z})
+               
+
+               local radius = 2
+               local drops = {}
+               local list = {}
+               local dr = 0
+               local tnts = 1
+               local destroyed = 0
+               while dr<radius do
+                       dr=dr+1
+                       for dx=-dr,dr,dr*2 do
+                               for dy=-dr,dr,1 do
+                                       for dz=-dr,dr,1 do
+                                               table.insert(list, {x=dx, y=dy, z=dz})
+                                       end
+                               end
+                       end
+                       for dy=-dr,dr,dr*2 do
+                               for dx=-dr+1,dr-1,1 do
+                                       for dz=-dr,dr,1 do
+                                               table.insert(list, {x=dx, y=dy, z=dz})
+                                       end
+                               end
+                       end
+                       for dz=-dr,dr,dr*2 do
+                               for dx=-dr+1,dr-1,1 do
+                                       for dy=-dr+1,dr-1,1 do
+                                               table.insert(list, {x=dx, y=dy, z=dz})
+                                       end
+                               end
+                       end
+                               for _,p in ipairs(list) do
+                                       local np = {x=pos.x+p.x, y=pos.y+p.y, z=pos.z+p.z}
+                                       
+                                       local node =  minetest.get_node(np)
+                                       if node.name == "air" then
+                                       elseif node.name == "tnt:tnt" or node.name == "tnt:tnt_burning" then
+                                               if radius < radius_max then
+                                                       if radius <= 5 then
+                                                               radius = radius + 1
+                                                       elseif radius <= 10 then
+                                                               radius = radius + 0.5
+                                                       else
+                                                               radius = radius + 0.3
+                                                       end
+                                                       minetest.remove_node(np, 2)
+                                               tnts = tnts + 1
+                                               else
+                                               minetest.set_node(np, {name="tnt:tnt_burning"})
+                                               boom(np, 1)
+                                               end
+                                       elseif node.name == "fire:basic_flame"
+                                               --or string.find(node.name, "default:water_") 
+                                               --or string.find(node.name, "default:lava_") 
+                                               or node.name == "tnt:boom"
+                                               then
+                                               
+                                       else
+                                               if math.abs(p.x)<2 and math.abs(p.y)<2 and math.abs(p.z)<2 then
+                                                       destroy(drops, np, dr == radius, radius > 7)
+                                                       destroyed = destroyed + 1
+                                               else
+                                                       if math.random(1,5) <= 4 then
+                                                               destroy(drops, np, dr == radius, radius > 7)
+                                                               destroyed = destroyed + 1
+                                                       end
+                                               end
+                                       end
+                               end
+               end
+
+               local objects = minetest.get_objects_inside_radius(pos, radius*2)
+               for _,obj in ipairs(objects) do
+                       --if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then
+                               local p = obj:getpos()
+                               local v = obj:getvelocity()
+                               local vec = {x=p.x-pos.x, y=p.y-pos.y, z=p.z-pos.z}
+                               local dist = (vec.x^2+vec.y^2+vec.z^2)^0.5
+                               local damage = ((radius*20)/dist)
+                               --print("DMG dist="..dist.." damage="..damage)
+                               if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then
+                               obj:punch(obj, 1.0, {
+                                       full_punch_interval=1.0,
+                                       damage_groups={fleshy=damage},
+                               }, vec)
+                               end
+                               if v ~= nil then
+                                       --obj:setvelocity({x=(p.x - pos.x) + (radius / 4) + v.x, y=(p.y - pos.y) + (radius / 2) + v.y, z=(p.z - pos.z) + (radius / 4) + v.z})
+                                       obj:setvelocity({x=(p.x - pos.x) + (radius / 2) + v.x, y=(p.y - pos.y) + radius + v.y,       z=(p.z - pos.z) + (radius / 2) + v.z})
+                               end
+                       --end
+               end
+
+
+               print("TNT exploded=" .. tnts .. " radius=" .. radius .. " destroyed="..destroyed)
+
+               for _,stack in pairs(drops) do
+                       eject_drops(pos, stack)
+               end
+               local radiusp = radius+1
+               minetest.add_particlespawner(
+                       100, --amount
+                       0.1, --time
+                       {x=pos.x-radiusp, y=pos.y-radiusp, z=pos.z-radiusp}, --minpos
+                       {x=pos.x+radiusp, y=pos.y+radiusp, z=pos.z+radiusp}, --maxpos
+                       {x=-0, y=-0, z=-0}, --minvel
+                       {x=0, y=0, z=0}, --maxvel
+                       {x=-0.5,y=5,z=-0.5}, --minacc
+                       {x=0.5,y=5,z=0.5}, --maxacc
+                       0.1, --minexptime
+                       1, --maxexptime
+                       8, --minsize
+                       15, --maxsize
+                       false, --collisiondetection
+                       "tnt_smoke.png" --texture
+               )
+       end, pos)
+end
+
+minetest.register_node("tnt:tnt", {
+       description = "TNT",
+       tiles = {"tnt_top.png", "tnt_bottom.png", "tnt_side.png"},
+       groups = {dig_immediate=2, mesecon=2},
+       sounds = default.node_sound_wood_defaults(),
+       
+       on_punch = function(pos, node, puncher)
+               if puncher:get_wielded_item():get_name() == "default:torch" then
+                       minetest.sound_play("tnt_ignite", {pos=pos})
+                       minetest.set_node(pos, {name="tnt:tnt_burning"})
+                       boom(pos, 4)
+               end
+       end,
+       
+       mesecons = {
+               effector = {
+                       action_on = function(pos, node)
+                               minetest.set_node(pos, {name="tnt:tnt_burning"})
+                               boom(pos, 0)
+                       end
+               },
+       },
+})
+
+minetest.register_node("tnt:tnt_burning", {
+       tiles = {{name="tnt_top_burning_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}}, "tnt_bottom.png", "tnt_side.png"},
+       light_source = 5,
+       drop = "",
+       sounds = default.node_sound_wood_defaults(),
+})
+
+minetest.register_node("tnt:boom", {
+       drawtype = "plantlike",
+       tiles = {"tnt_boom.png"},
+       light_source = LIGHT_MAX,
+       walkable = false,
+       drop = "",
+       groups = {dig_immediate=3},
+})
+
+burn = function(pos)
+       if minetest.get_node(pos).name == "tnt:tnt" then
+               minetest.sound_play("tnt_ignite", {pos=pos})
+               minetest.set_node(pos, {name="tnt:tnt_burning"})
+               boom(pos, 1)
+               return
+       end
+       if minetest.get_node(pos).name ~= "tnt:gunpowder" then
+               return
+       end
+       minetest.sound_play("tnt_gunpowder_burning", {pos=pos, gain=2})
+       minetest.set_node(pos, {name="tnt:gunpowder_burning"})
+       
+       minetest.after(1, function(pos)
+               if minetest.get_node(pos).name ~= "tnt:gunpowder_burning" then
+                       return
+               end
+               minetest.after(0.5, function(pos)
+                       minetest.remove_node(pos)
+               end, {x=pos.x, y=pos.y, z=pos.z})
+               for dx=-1,1 do
+                       for dz=-1,1 do
+                               for dy=-1,1 do
+                                       pos.x = pos.x+dx
+                                       pos.y = pos.y+dy
+                                       pos.z = pos.z+dz
+                                       
+                                       if not (math.abs(dx) == 1 and math.abs(dz) == 1) then
+                                               if dy == 0 then
+                                                       burn({x=pos.x, y=pos.y, z=pos.z})
+                                               else
+                                                       if math.abs(dx) == 1 or math.abs(dz) == 1 then
+                                                               burn({x=pos.x, y=pos.y, z=pos.z})
+                                                       end
+                                               end
+                                       end
+                                       
+                                       pos.x = pos.x-dx
+                                       pos.y = pos.y-dy
+                                       pos.z = pos.z-dz
+                               end
+                       end
+               end
+       end, pos)
+end
+
+minetest.register_node("tnt:gunpowder", {
+       description = "Gun Powder",
+       drawtype = "raillike",
+       paramtype = "light",
+       sunlight_propagates = true,
+       walkable = false,
+       tiles = {"tnt_gunpowder.png",},
+       inventory_image = "tnt_gunpowder_inventory.png",
+       wield_image = "tnt_gunpowder_inventory.png",
+       selection_box = {
+               type = "fixed",
+               fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
+       },
+       groups = {dig_immediate=2,attached_node=1},
+       sounds = default.node_sound_leaves_defaults(),
+       
+       on_punch = function(pos, node, puncher)
+               if puncher:get_wielded_item():get_name() == "default:torch" then
+                       burn(pos)
+               end
+       end,
+})
+
+minetest.register_node("tnt:gunpowder_burning", {
+       drawtype = "raillike",
+       paramtype = "light",
+       sunlight_propagates = true,
+       walkable = false,
+       light_source = 5,
+       tiles = {{name="tnt_gunpowder_burning_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}}},
+       selection_box = {
+               type = "fixed",
+               fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
+       },
+       drop = "",
+       groups = {dig_immediate=2,attached_node=1},
+       sounds = default.node_sound_leaves_defaults(),
+})
+
+minetest.register_abm({
+       nodenames = {"tnt:tnt", "tnt:gunpowder"},
+       neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"},
+       interval = 2,
+       chance = 10,
+       action = function(pos, node)
+               if node.name == "tnt:tnt" then
+                       minetest.set_node(pos, {name="tnt:tnt_burning"})
+                       boom({x=pos.x, y=pos.y, z=pos.z}, 0)
+               else
+                       burn(pos)
+               end
+       end
+})
+
+minetest.register_craft({
+       output = "tnt:gunpowder",
+       type = "shapeless",
+       recipe = {"default:coal_lump", "default:gravel"}
+})
+
+minetest.register_craft({
+       output = "tnt:tnt",
+       recipe = {
+               {"", "group:wood", ""},
+               {"group:wood", "tnt:gunpowder", "group:wood"},
+               {"", "group:wood", ""}
+       }
+})
+
+if minetest.setting_get("log_mods") then
+       minetest.log("action", "tnt loaded")
+end
diff --git a/mods/tnt/sounds/tnt_explode.ogg b/mods/tnt/sounds/tnt_explode.ogg
new file mode 100644 (file)
index 0000000..a414ea0
Binary files /dev/null and b/mods/tnt/sounds/tnt_explode.ogg differ
diff --git a/mods/tnt/sounds/tnt_gunpowder_burning.ogg b/mods/tnt/sounds/tnt_gunpowder_burning.ogg
new file mode 100644 (file)
index 0000000..5c5bfaf
Binary files /dev/null and b/mods/tnt/sounds/tnt_gunpowder_burning.ogg differ
diff --git a/mods/tnt/sounds/tnt_ignite.ogg b/mods/tnt/sounds/tnt_ignite.ogg
new file mode 100644 (file)
index 0000000..199f206
Binary files /dev/null and b/mods/tnt/sounds/tnt_ignite.ogg differ
diff --git a/mods/tnt/textures/tnt_boom.png b/mods/tnt/textures/tnt_boom.png
new file mode 100644 (file)
index 0000000..5588723
Binary files /dev/null and b/mods/tnt/textures/tnt_boom.png differ
diff --git a/mods/tnt/textures/tnt_bottom.png b/mods/tnt/textures/tnt_bottom.png
new file mode 100644 (file)
index 0000000..68e1b1c
Binary files /dev/null and b/mods/tnt/textures/tnt_bottom.png differ
diff --git a/mods/tnt/textures/tnt_gunpowder.png b/mods/tnt/textures/tnt_gunpowder.png
new file mode 100644 (file)
index 0000000..53c2815
Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder.png differ
diff --git a/mods/tnt/textures/tnt_gunpowder_burning.png b/mods/tnt/textures/tnt_gunpowder_burning.png
new file mode 100644 (file)
index 0000000..080a8a4
Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_burning.png differ
diff --git a/mods/tnt/textures/tnt_gunpowder_burning_animated.png b/mods/tnt/textures/tnt_gunpowder_burning_animated.png
new file mode 100644 (file)
index 0000000..e5a3404
Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_burning_animated.png differ
diff --git a/mods/tnt/textures/tnt_gunpowder_inventory.png b/mods/tnt/textures/tnt_gunpowder_inventory.png
new file mode 100644 (file)
index 0000000..4e593fc
Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_inventory.png differ
diff --git a/mods/tnt/textures/tnt_side.png b/mods/tnt/textures/tnt_side.png
new file mode 100644 (file)
index 0000000..a243c9d
Binary files /dev/null and b/mods/tnt/textures/tnt_side.png differ
diff --git a/mods/tnt/textures/tnt_smoke.png b/mods/tnt/textures/tnt_smoke.png
new file mode 100644 (file)
index 0000000..6c07c30
Binary files /dev/null and b/mods/tnt/textures/tnt_smoke.png differ
diff --git a/mods/tnt/textures/tnt_top.png b/mods/tnt/textures/tnt_top.png
new file mode 100644 (file)
index 0000000..e63de0e
Binary files /dev/null and b/mods/tnt/textures/tnt_top.png differ
diff --git a/mods/tnt/textures/tnt_top_burning.png b/mods/tnt/textures/tnt_top_burning.png
new file mode 100644 (file)
index 0000000..04e39a2
Binary files /dev/null and b/mods/tnt/textures/tnt_top_burning.png differ
diff --git a/mods/tnt/textures/tnt_top_burning_animated.png b/mods/tnt/textures/tnt_top_burning_animated.png
new file mode 100644 (file)
index 0000000..c8afd47
Binary files /dev/null and b/mods/tnt/textures/tnt_top_burning_animated.png differ