diff --git a/etc/Mods,WIP/mock_tnt/README.txt b/etc/Mods,WIP/mock_tnt/README.txt new file mode 100644 index 0000000..0b55072 --- /dev/null +++ b/etc/Mods,WIP/mock_tnt/README.txt @@ -0,0 +1,15 @@ +# Mock TNT +Mod for Minetest + +## Usage +* Place in mods folder such as in your subgame +* "Unknown Explosive" (mock_tnt:mock_tnt) can coexist with TNT if TNT is enabled, but gunpowder and mock_tnt work even if enable_tnt is false. + +## Differences from regular TNT +* Does not harm any block or entity + +## Known Issues +* also ignite gunpowder with "default:torch", "fire:permanent_flame" (minetest_game only ignites via "fire:basic_flame", "default:lava_source", "default:lava_flowing") -- for some reason torch works already but permanent_flame does not +* Make gunpowder ignite via "building_blocks:Fireplace" +* Make TNT ignite via neighbors "throwing:arrow_fireworks_blue", "throwing:arrow_fireworks_red" +* Make "fire:flint_and_steel" item ignite TNT and gunpowder \ No newline at end of file diff --git a/etc/Mods,WIP/mock_tnt/depends.txt b/etc/Mods,WIP/mock_tnt/depends.txt new file mode 100644 index 0000000..1a59d96 --- /dev/null +++ b/etc/Mods,WIP/mock_tnt/depends.txt @@ -0,0 +1,3 @@ +default + + diff --git a/etc/Mods,WIP/mock_tnt/etc/8bit/mock_tnt_blast.png b/etc/Mods,WIP/mock_tnt/etc/8bit/mock_tnt_blast.png new file mode 100644 index 0000000..b6aeabd Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/etc/8bit/mock_tnt_blast.png differ diff --git a/etc/Mods,WIP/mock_tnt/etc/mock_tnt_background.png b/etc/Mods,WIP/mock_tnt/etc/mock_tnt_background.png new file mode 100644 index 0000000..db7a3e6 Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/etc/mock_tnt_background.png differ diff --git a/etc/Mods,WIP/mock_tnt/etc/mock_tnt_side-normal.png b/etc/Mods,WIP/mock_tnt/etc/mock_tnt_side-normal.png new file mode 100644 index 0000000..53fd642 Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/etc/mock_tnt_side-normal.png differ diff --git a/etc/Mods,WIP/mock_tnt/etc/mock_tnt_tnt_item.png b/etc/Mods,WIP/mock_tnt/etc/mock_tnt_tnt_item.png new file mode 100644 index 0000000..c8cf616 Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/etc/mock_tnt_tnt_item.png differ diff --git a/etc/Mods,WIP/mock_tnt/etc/mock_tnt_tnt_node.png b/etc/Mods,WIP/mock_tnt/etc/mock_tnt_tnt_node.png new file mode 100644 index 0000000..cb59ff4 Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/etc/mock_tnt_tnt_node.png differ diff --git a/etc/Mods,WIP/mock_tnt/etc/mock_tnt_tnt_object.png b/etc/Mods,WIP/mock_tnt/etc/mock_tnt_tnt_object.png new file mode 100644 index 0000000..c0166c3 Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/etc/mock_tnt_tnt_object.png differ diff --git a/etc/Mods,WIP/mock_tnt/init.lua b/etc/Mods,WIP/mock_tnt/init.lua new file mode 100644 index 0000000..989bc61 --- /dev/null +++ b/etc/Mods,WIP/mock_tnt/init.lua @@ -0,0 +1,471 @@ +-- nondestructive replacement for tnt +-- uses some code from minetest\games\default\mods\tnt\init.lua +mock_tnt = {} +-- Default to enabled when in singleplayer +local enable_tnt = minetest.setting_getbool("enable_tnt") +if enable_tnt == nil then + enable_tnt = minetest.is_singleplayer() +end + +local tnt_radius = tonumber(minetest.setting_get("tnt_radius") or 3) + +local function rand_pos(center, pos, radius) + local def + local reg_nodes = minetest.registered_nodes + local i = 0 + repeat + -- Give up and use the center if this takes too long + if i > 4 then + pos.x, pos.z = center.x, center.z + break + end + pos.x = center.x + math.random(-radius, radius) + pos.z = center.z + math.random(-radius, radius) + def = reg_nodes[minetest.get_node(pos).name] + i = i + 1 + until def and not def.walkable +end + + +-- minetest.register_node( "mock_tnt:mock_tnt", { +-- description = "Unknown Explosive", +-- tiles = { "mock_tnt_top.png", "mock_tnt_sides.png", "mock_tnt_sides.png", "mock_tnt_sides.png", "mock_tnt_sides.png", "mock_tnt_sides.png" }, +-- is_ground_content = true, +-- groups = {cracky = 1, level = 2}, +-- sounds = default.node_sound_sand_defaults(), +-- }) + +minetest.register_alias("tnt:tnt", "mock_tnt:mock_tnt") + +-- Only when "not" to not overlap tnt mod: +if not enable_tnt then + minetest.register_craft({ + output = "mock_tnt:mock_tnt", + recipe = { + {"group:wood", "tnt:gunpowder", "group:wood"}, + {"tnt:gunpowder", "tnt:gunpowder", "tnt:gunpowder"}, + {"group:wood", "tnt:gunpowder", "group:wood"} + } + }) + + minetest.register_abm({ + label = "mock_tnt ignition", + nodenames = {"group:tnt", "tnt:gunpowder"}, + neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing", "default:torch", "fire:permanent_flame"}, + interval = 4, + chance = 1, + action = function(pos, node) + mock_tnt.burn(pos, node.name) + end, + }) +end + + +local function add_effects(pos, radius) + minetest.add_particle({ + pos = pos, + velocity = vector.new(), + acceleration = vector.new(), + expirationtime = 0.4, + size = radius * 10, + collisiondetection = false, + vertical = false, + texture = "mock_tnt_boom.png", + }) + minetest.add_particlespawner({ + amount = 64, + time = 0.5, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -10, y = -10, z = -10}, + maxvel = {x = 10, y = 10, z = 10}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 1, + maxexptime = 2.5, + minsize = radius * 3, + maxsize = radius * 5, + texture = "mock_tnt_smoke.png", + }) + + -- we just dropped some items. Look at the items entities and pick + -- one of them to use as texture + local texture = "mock_tnt_blast.png" --fallback texture + -- local most = 0 + -- for name, stack in pairs(drops) do + -- local count = stack:get_count() + -- if count > most then + -- most = count + -- local def = minetest.registered_nodes[name] + -- if def and def.tiles and def.tiles[1] then + -- texture = def.tiles[1] + -- end + -- end + -- end + + minetest.add_particlespawner({ + amount = 64, + time = 0.1, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -3, y = 0, z = -3}, + maxvel = {x = 3, y = 5, z = 3}, + minacc = {x = 0, y = -10, z = 0}, + maxacc = {x = 0, y = -10, z = 0}, + minexptime = 0.8, + maxexptime = 2.0, + minsize = radius * 0.66, + maxsize = radius * 2, + texture = texture, + collisiondetection = true, + }) +end + +function mock_tnt.burn(pos, nodename) + local name = nodename or minetest.get_node(pos).name + local group = minetest.get_item_group(name, "mock_tnt") + if group > 0 then + minetest.sound_play("tnt_ignite", {pos = pos}) + minetest.set_node(pos, {name = name .. "_burning"}) + minetest.get_node_timer(pos):start(1) + elseif name == "tnt:gunpowder" then + minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) + end +end + +local function UNUSED_mock_tnt_explode(pos, radius, ignore_protection, ignore_on_blast) + -- NOTE: register_tnt def param and register_tnt itself leave ignore_protection undefined + -- which translates to false below. + pos = vector.round(pos) + -- scan for adjacent TNT nodes first, and enlarge the explosion + local vm1 = VoxelManip() + local p1 = vector.subtract(pos, 2) + local p2 = vector.add(pos, 2) + local minp, maxp = vm1:read_from_map(p1, p2) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm1:get_data() + local count = 0 + local c_tnt = minetest.get_content_id("mock_tnt:mock_tnt") + local c_tnt_burning = minetest.get_content_id("mock_tnt:mock_tnt_burning") + local c_tnt_boom = minetest.get_content_id("mock_tnt:boom") + local c_air = minetest.get_content_id("air") + + for z = pos.z - 2, pos.z + 2 do + for y = pos.y - 2, pos.y + 2 do + local vi = a:index(pos.x - 2, y, z) + for x = pos.x - 2, pos.x + 2 do + local cid = data[vi] + if cid == c_tnt or cid == c_tnt_boom or cid == c_tnt_burning then + count = count + 1 + data[vi] = c_air + end + vi = vi + 1 + end + end + end + + vm1:set_data(data) + vm1:write_to_map() + + -- recalculate new radius + radius = math.floor(radius * math.pow(count, 1/3)) + + -- perform the explosion + local vm = VoxelManip() + local pr = PseudoRandom(os.time()) + p1 = vector.subtract(pos, radius) + p2 = vector.add(pos, radius) + minp, maxp = vm:read_from_map(p1, p2) + a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + data = vm:get_data() + + local drops = {} + local on_blast_queue = {} + + local c_fire = minetest.get_content_id("fire:basic_flame") + -- for z = -radius, radius do + -- for y = -radius, radius do + -- local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z) + -- for x = -radius, radius do + -- local r = vector.length(vector.new(x, y, z)) + -- if (radius * radius) / (r * r) >= (pr:next(80, 125) / 100) then + -- local cid = data[vi] + -- local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z} + -- if cid ~= c_air then + -- data[vi] = destroy(drops, p, cid, c_air, c_fire, + -- on_blast_queue, ignore_protection, + -- ignore_on_blast) + -- end + -- end + -- vi = vi + 1 + -- end + -- end + -- end + + -- vm:set_data(data) + -- vm:write_to_map() + -- vm:update_map() + -- vm:update_liquids() + + -- call check_single_for_falling for everything within 1.5x blast radius + for y = -radius * 1.5, radius * 1.5 do + for z = -radius * 1.5, radius * 1.5 do + for x = -radius * 1.5, radius * 1.5 do + local rad = {x = x, y = y, z = z} + local s = vector.add(pos, rad) + local r = vector.length(rad) + if r / radius < 1.4 then + minetest.check_single_for_falling(s) + end + end + end + end + + for _, queued_data in pairs(on_blast_queue) do + local dist = math.max(1, vector.distance(queued_data.pos, pos)) + local intensity = (radius * radius) / (dist * dist) + local node_drops = queued_data.on_blast(queued_data.pos, intensity) + if node_drops then + for _, item in pairs(node_drops) do + add_drop(drops, item) + end + end + end + + return drops, radius +end + +function mock_tnt.boom(pos, def) + minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 2*64}) + minetest.set_node(pos, {name = "mock_tnt:boom"}) + -- local drops, radius = mock_tnt_explode(pos, def.radius, def.ignore_protection, + -- def.ignore_on_blast) + -- append entity drops + -- local damage_radius = (radius / def.radius) * def.damage_radius + local damage_radius = def.damage_radius + -- entity_physics(pos, damage_radius, drops) + -- if not def.disable_drops then + -- eject_drops(drops, pos, radius) + -- end + -- add_effects(pos, radius, drops) + add_effects(pos, damage_radius) +end + +minetest.register_node("mock_tnt:boom", { + drawtype = "airlike", + light_source = default.LIGHT_MAX, + walkable = false, + drop = "", + groups = {dig_immediate = 3}, + on_construct = function(pos) + minetest.get_node_timer(pos):start(0.4) + end, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, + -- unaffected by explosions + on_blast = function() end, +}) + +function mock_tnt.register_tnt(def) + local name + if not def.name:find(':') then + name = "mock_tnt:" .. def.name + else + name = def.name + def.name = def.name:match(":([%w_]+)") + end + if not def.tiles then def.tiles = {} end + local tnt_top = def.tiles.top or def.name .. "_top.png" + local tnt_bottom = def.tiles.bottom or def.name .. "_bottom.png" + local tnt_side = def.tiles.side or def.name .. "_side.png" + local tnt_burning = def.tiles.burning or def.name .. "_top_burning_animated.png" + if not def.damage_radius then def.damage_radius = def.radius * 2 end + + -- if "not" since only make fake if real does not exist: + + -- if not enable_tnt then + minetest.register_node(":" .. name, { + description = def.description, + tiles = { tnt_top, tnt_bottom, tnt_side }, + is_ground_content = false, + groups = {dig_immediate = 2, mesecon = 2, tnt = 1, flammable = 5}, + sounds = default.node_sound_sand_defaults(), + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == "default:torch" then + minetest.set_node(pos, {name = name .. "_burning"}) + end + end, + on_blast = function(pos, intensity) + minetest.after(0.1, function() + mock_tnt.boom(pos, def) + end) + end, + mesecons = {effector = + {action_on = + function(pos) + mock_tnt.boom(pos, def) + end + } + }, + on_burn = function(pos) + minetest.set_node(pos, {name = name .. "_burning"}) + end, + on_ignite = function(pos, igniter) + minetest.set_node(pos, {name = name .. "_burning"}) + end, + }) + -- end + + minetest.register_node(":" .. name .. "_burning", { + tiles = { + { + name = tnt_burning, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + tnt_bottom, tnt_side + }, + light_source = 5, + drop = "", + sounds = default.node_sound_sand_defaults(), + groups = {falling_node = 1}, + on_timer = function(pos, elapsed) + mock_tnt.boom(pos, def) + end, + -- unaffected by explosions + on_blast = function() end, + on_construct = function(pos) + minetest.sound_play("tnt_ignite", {pos = pos}) + minetest.get_node_timer(pos):start(4) + minetest.check_for_falling(pos) + end, + }) +end + +mock_tnt.register_tnt({ + name = "mock_tnt:mock_tnt", + description = "Unknown Explosive", + radius = tnt_radius, +}) + + + +-- ALREADY DONE by minetest_game tnt mod even if tnt_enable is false: + +-- minetest.register_node("tnt:gunpowder_burning", { +-- drawtype = "raillike", +-- paramtype = "light", +-- sunlight_propagates = true, +-- walkable = false, +-- light_source = 5, +-- tiles = {{ +-- name = "mock_tnt_gunpowder_burning_straight_animated.png", +-- animation = { +-- type = "vertical_frames", +-- aspect_w = 16, +-- aspect_h = 16, +-- length = 1, +-- } +-- }, +-- { +-- name = "mock_tnt_gunpowder_burning_curved_animated.png", +-- animation = { +-- type = "vertical_frames", +-- aspect_w = 16, +-- aspect_h = 16, +-- length = 1, +-- } +-- }, +-- { +-- name = "mock_tnt_gunpowder_burning_t_junction_animated.png", +-- animation = { +-- type = "vertical_frames", +-- aspect_w = 16, +-- aspect_h = 16, +-- length = 1, +-- } +-- }, +-- { +-- name = "mock_tnt_gunpowder_burning_crossing_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, connect_to_raillike = minetest.raillike_group("gunpowder")}, +-- sounds = default.node_sound_leaves_defaults(), +-- on_timer = function(pos, elapsed) +-- for dx = -1, 1 do +-- for dz = -1, 1 do +-- for dy = -1, 1 do +-- if not (dx == 0 and dz == 0) then +-- mock_tnt.burn({ +-- x = pos.x + dx, +-- y = pos.y + dy, +-- z = pos.z + dz, +-- }) +-- end +-- end +-- end +-- end +-- minetest.remove_node(pos) +-- end, +-- -- unaffected by explosions +-- on_blast = function() end, +-- on_construct = function(pos) +-- minetest.sound_play("mock_tnt_gunpowder_burning", {pos = pos, gain = 2}) +-- minetest.get_node_timer(pos):start(1) +-- end, +-- }) +-- +-- minetest.register_craft({ +-- output = "tnt:gunpowder 5", +-- type = "shapeless", +-- recipe = {"default:coal_lump", "default:gravel"} +-- }) + +-- minetest.register_node("tnt:gunpowder", { +-- description = "Gun Powder", +-- drawtype = "raillike", +-- paramtype = "light", +-- is_ground_content = false, +-- sunlight_propagates = true, +-- walkable = false, +-- tiles = {"mock_tnt_gunpowder_straight.png", "mock_tnt_gunpowder_curved.png", "mock_tnt_gunpowder_t_junction.png", "mock_tnt_gunpowder_crossing.png"}, +-- inventory_image = "mock_tnt_gunpowder_inventory.png", +-- wield_image = "mock_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, flammable = 5, +-- connect_to_raillike = minetest.raillike_group("gunpowder")}, +-- sounds = default.node_sound_leaves_defaults(), +-- +-- on_punch = function(pos, node, puncher) +-- if puncher:get_wielded_item():get_name() == "default:torch" then +-- minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) +-- end +-- end, +-- on_blast = function(pos, intensity) +-- minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) +-- end, +-- on_burn = function(pos) +-- minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) +-- end, +-- on_ignite = function(pos, igniter) +-- minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) +-- end, +-- }) diff --git a/etc/Mods,WIP/mock_tnt/textures/mock_tnt_blast.png b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_blast.png new file mode 100644 index 0000000..dfa3192 Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_blast.png differ diff --git a/etc/Mods,WIP/mock_tnt/textures/mock_tnt_boom.png b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_boom.png new file mode 100644 index 0000000..9b6351a Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_boom.png differ diff --git a/etc/Mods,WIP/mock_tnt/textures/mock_tnt_bottom.png b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_bottom.png new file mode 100644 index 0000000..82137b6 Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_bottom.png differ diff --git a/etc/Mods,WIP/mock_tnt/textures/mock_tnt_side.png b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_side.png new file mode 100644 index 0000000..41a12f4 Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_side.png differ diff --git a/etc/Mods,WIP/mock_tnt/textures/mock_tnt_smoke.png b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_smoke.png new file mode 100644 index 0000000..5bc6de6 Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_smoke.png differ diff --git a/etc/Mods,WIP/mock_tnt/textures/mock_tnt_top.png b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_top.png new file mode 100644 index 0000000..00a583c Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_top.png differ diff --git a/etc/Mods,WIP/mock_tnt/textures/mock_tnt_top_burning_animated.png b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_top_burning_animated.png new file mode 100644 index 0000000..08997e8 Binary files /dev/null and b/etc/Mods,WIP/mock_tnt/textures/mock_tnt_top_burning_animated.png differ diff --git a/etc/Mods,WIP/mock_tnt/update local.bat b/etc/Mods,WIP/mock_tnt/update local.bat new file mode 100644 index 0000000..212211c --- /dev/null +++ b/etc/Mods,WIP/mock_tnt/update local.bat @@ -0,0 +1,3 @@ +copy /y *.lua C:\games\Minetest\games\ENLIVEN\mods\mock_tnt\ +copy /y textures\*.png C:\games\Minetest\games\ENLIVEN\mods\mock_tnt\textures\ +if NOT ["%errorlevel%"]==["0"] pause \ No newline at end of file diff --git a/etc/minetestserver-install-git-ENABLE_REDIS b/etc/minetestserver-install-git-ENABLE_REDIS index 0e7e15e..1e67af1 100644 --- a/etc/minetestserver-install-git-ENABLE_REDIS +++ b/etc/minetestserver-install-git-ENABLE_REDIS @@ -4,7 +4,8 @@ sudo apt-get install build-essential cmake git libirrlicht-dev libbz2-dev libget #above is from http://dev.minetest.net/Compiling_Minetest#Compiling_on_GNU.2FLinux #as per : -sudo add-apt-repository ppa:chris-lea/redis-server +#this ppa doesn't work anymore (tested 2017-04) +#sudo add-apt-repository ppa:chris-lea/redis-server sudo apt-get update sudo apt-get install redis-server diff --git a/games/ENLIVEN/mods/homedecor_modpack/homedecor/crafts.lua b/games/ENLIVEN/mods/homedecor_modpack/homedecor/crafts.lua index d99f79f..5f445f3 100644 --- a/games/ENLIVEN/mods/homedecor_modpack/homedecor/crafts.lua +++ b/games/ENLIVEN/mods/homedecor_modpack/homedecor/crafts.lua @@ -2936,7 +2936,7 @@ minetest.register_craft({ { "default:steel_ingot","default:steel_ingot","default:steel_ingot" } }, }) -minetest.register_alias("homedecor:beer_tap", "homedecor:drink_tap") +-- already done in gastronomy.lua: minetest.register_alias("homedecor:beer_tap", "homedecor:drink_tap") minetest.register_craft({ output = "homedecor:swing",