From 6a0d7178a8f5f4dfe8d199d1e989787cc8a775cf Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Sat, 28 Dec 2019 15:47:48 +0100 Subject: [PATCH 01/66] =?UTF-8?q?Nahr=C3=A1t=20soubory=20do=20''?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test.txt | 1 + test2.txt | 1 + 2 files changed, 2 insertions(+) create mode 100644 test.txt create mode 100644 test2.txt diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..7489acc --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +-- \ No newline at end of file diff --git a/test2.txt b/test2.txt new file mode 100644 index 0000000..7489acc --- /dev/null +++ b/test2.txt @@ -0,0 +1 @@ +-- \ No newline at end of file -- 2.25.1 From df6431c26444ed84da6d80279b1ed340fb1dca10 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Wed, 22 Jul 2020 18:24:16 +0200 Subject: [PATCH 02/66] =?UTF-8?q?Smazat=20=E2=80=9Etest2.txt=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test2.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 test2.txt diff --git a/test2.txt b/test2.txt deleted file mode 100644 index 7489acc..0000000 --- a/test2.txt +++ /dev/null @@ -1 +0,0 @@ --- \ No newline at end of file -- 2.25.1 From 5e494bd7f2c7da5f69810125f5ba5b9fea8f01a3 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Wed, 22 Jul 2020 18:24:24 +0200 Subject: [PATCH 03/66] =?UTF-8?q?Smazat=20=E2=80=9Etest.txt=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 test.txt diff --git a/test.txt b/test.txt deleted file mode 100644 index 7489acc..0000000 --- a/test.txt +++ /dev/null @@ -1 +0,0 @@ --- \ No newline at end of file -- 2.25.1 From 28e0dac6f05d0cc362b62cb355c9e629890ba8ed Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 11:19:02 +0200 Subject: [PATCH 04/66] =?UTF-8?q?Aktualizovat=20=E2=80=9Eworldedit/worlded?= =?UTF-8?q?it/code.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- worldedit/worldedit/code.lua | 111 +++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 52 deletions(-) diff --git a/worldedit/worldedit/code.lua b/worldedit/worldedit/code.lua index a939deb..948cb27 100644 --- a/worldedit/worldedit/code.lua +++ b/worldedit/worldedit/code.lua @@ -1,52 +1,59 @@ ---- Lua code execution functions. --- @module worldedit.code - ---- Executes `code` as a Lua chunk in the global namespace. --- @return An error message if the code fails, or nil on success. -function worldedit.lua(code) - local func, err = loadstring(code) - if not func then -- Syntax error - return err - end - local good, err = pcall(func) - if not good then -- Runtime error - return err - end - return nil -end - - ---- Executes `code` as a Lua chunk in the global namespace with the variable --- pos available, for each node in a region defined by positions `pos1` and --- `pos2`. --- @return An error message if the code fails, or nil on success. -function worldedit.luatransform(pos1, pos2, code) - pos1, pos2 = worldedit.sort_pos(pos1, pos2) - - local factory, err = loadstring("return function(pos) " .. code .. " end") - if not factory then -- Syntax error - return err - end - local func = factory() - - worldedit.keep_loaded(pos1, pos2) - - local pos = {x=pos1.x, y=0, z=0} - while pos.x <= pos2.x do - pos.y = pos1.y - while pos.y <= pos2.y do - pos.z = pos1.z - while pos.z <= pos2.z do - local good, err = pcall(func, pos) - if not good then -- Runtime error - return err - end - pos.z = pos.z + 1 - end - pos.y = pos.y + 1 - end - pos.x = pos.x + 1 - end - return nil -end - +--- Lua code execution functions. +-- @module worldedit.code + +--- Executes `code` as a Lua chunk in the global namespace. +-- @return An error message if the code fails, or nil on success. +function worldedit.lua(code) + local func, err = loadstring(code) + if not func then -- Syntax error + return err + end + local good, err = pcall(func) + if not good then -- Runtime error + return err + end + return nil +end + + +--- Executes `code` as a Lua chunk in the global namespace with the variable +-- pos available, for each node in a region defined by positions `pos1` and +-- `pos2`. +-- @return An error message if the code fails, or nil on success. +function worldedit.luatransform(pos1, pos2, code) + pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + local factory, err = loadstring("return function(pos) " .. code .. " end") + if not factory then -- Syntax error + return err + end + local func = factory() + + worldedit.keep_loaded(pos1, pos2) + + local pos = {x=pos1.x, y=0, z=0} + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local good, err = pcall(func, pos) + if not good then -- Runtime error + return err + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return nil +end + + +local input = io.open(minetest.get_worldpath().."/init.lua", "r") +if input then + local code = input:read("*a") + input:close() + worldedit.lua(code) +end \ No newline at end of file -- 2.25.1 From 2d203008444723937c20d480e7366cdb47c86e86 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 11:20:26 +0200 Subject: [PATCH 05/66] =?UTF-8?q?Aktualizovat=20=E2=80=9Ewine/init.lua?= =?UTF-8?q?=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wine/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/wine/init.lua b/wine/init.lua index c68faf2..a4eff8c 100644 --- a/wine/init.lua +++ b/wine/init.lua @@ -31,6 +31,7 @@ local ferment = { {"wine:blue_agave", "wine:glass_tequila"}, {"farming:wheat", "wine:glass_wheat_beer"}, {"farming:rice", "wine:glass_sake"}, + {"xdecor:honey", "wine:glass_mead"}, } function wine:add_item(list) -- 2.25.1 From 849eab326bf74e46772749a8ba7ac29fae1bfd8e Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 11:21:53 +0200 Subject: [PATCH 06/66] =?UTF-8?q?Aktualizovat=20=E2=80=9Emesecons/mesecons?= =?UTF-8?q?=5Fstickyblocks/init.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mesecons/mesecons_stickyblocks/init.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mesecons/mesecons_stickyblocks/init.lua b/mesecons/mesecons_stickyblocks/init.lua index 094af09..10bcf54 100644 --- a/mesecons/mesecons_stickyblocks/init.lua +++ b/mesecons/mesecons_stickyblocks/init.lua @@ -17,3 +17,12 @@ minetest.register_node("mesecons_stickyblocks:sticky_block_all", { end, sounds = default.node_sound_wood_defaults(), }) + +minetest.register_craft({ + output = "mesecons_stickyblocks:sticky_block_all", + recipe = { + {"mesecons_materials:glue", "mesecons_materials:glue", "mesecons_materials:glue"}, + {"mesecons_materials:glue", "mesecons_materials:glue", "mesecons_materials:glue"}, + {"mesecons_materials:glue", "mesecons_materials:glue", "mesecons_materials:glue"}, + } +}) \ No newline at end of file -- 2.25.1 From f726290d8042f91eaed8c5de6429f179962ee652 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 11:23:16 +0200 Subject: [PATCH 07/66] =?UTF-8?q?Aktualizovat=20=E2=80=9Emesecons/mesecons?= =?UTF-8?q?=5Fcommandblock/init.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mesecons/mesecons_commandblock/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mesecons/mesecons_commandblock/init.lua b/mesecons/mesecons_commandblock/init.lua index 326b8ae..7db099a 100644 --- a/mesecons/mesecons_commandblock/init.lua +++ b/mesecons/mesecons_commandblock/init.lua @@ -141,7 +141,7 @@ local function commandblock_action_on(pos, node) end local commands = resolve_commands(meta:get_string("commands"), pos) - for _, command in pairs(commands:split("\n")) do + for _, command in pairs(commands:split("\n/")) do local pos = command:find(" ") local cmd, param = command, "" if pos then -- 2.25.1 From c682f0d79c40a31154e543da295e9a844cc6c02c Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 11:27:17 +0200 Subject: [PATCH 08/66] =?UTF-8?q?Aktualizovat=20=E2=80=9Exdecor/src/workbe?= =?UTF-8?q?nch.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xdecor/src/workbench.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xdecor/src/workbench.lua b/xdecor/src/workbench.lua index ad69361..f3846b3 100644 --- a/xdecor/src/workbench.lua +++ b/xdecor/src/workbench.lua @@ -242,6 +242,7 @@ xdecor.register("workbench", { for _, d in pairs(workbench.defs) do for i=1, #nodes do + pcall(function() local node = nodes[i] local def = registered_nodes[node] @@ -286,6 +287,7 @@ for i=1, #nodes do on_place = minetest.rotate_node }) end + end) end end -- 2.25.1 From 4c64e68a701562eb7df753913000f230f6481ea8 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 11:38:58 +0200 Subject: [PATCH 09/66] =?UTF-8?q?Nahr=C3=A1t=20soubory=20do=20=E2=80=9Etel?= =?UTF-8?q?eport=5Fpotion=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- teleport_potion/depends.txt | 3 + teleport_potion/init.lua | 503 ++++++++++++++++++++++++++++++++++++ teleport_potion/intllib.lua | 45 ++++ 3 files changed, 551 insertions(+) create mode 100644 teleport_potion/depends.txt create mode 100644 teleport_potion/init.lua create mode 100644 teleport_potion/intllib.lua diff --git a/teleport_potion/depends.txt b/teleport_potion/depends.txt new file mode 100644 index 0000000..8a8d2a2 --- /dev/null +++ b/teleport_potion/depends.txt @@ -0,0 +1,3 @@ +default +intllib? +lucky_block? \ No newline at end of file diff --git a/teleport_potion/init.lua b/teleport_potion/init.lua new file mode 100644 index 0000000..ce4ef93 --- /dev/null +++ b/teleport_potion/init.lua @@ -0,0 +1,503 @@ + +--= Teleport Potion mod by TenPlus1 + +-- Create teleport potion or pad, place then right-click to enter coords +-- and step onto pad or walk into the blue portal light, portal closes after +-- 10 seconds, pad remains, potions are throwable... SFX are license Free... + +-- Load support for intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP.."/intllib.lua") + + +-- max teleport distance +local dist = tonumber(minetest.settings:get("map_generation_limit") or 31000) + +-- creative check +local creative_mode_cache = minetest.settings:get_bool("creative_mode") +local function is_creative(name) + return creative_mode_cache or minetest.check_player_privs(name, {creative = true}) +end + +local check_coordinates = function(str) + + if not str or str == "" then + return nil + end + + -- get coords from string + local x, y, z = string.match(str, "^(-?%d+),(-?%d+),(-?%d+)$") + + -- check coords + if x == nil or string.len(x) > 6 + or y == nil or string.len(y) > 6 + or z == nil or string.len(z) > 6 then + return nil + end + + -- convert string coords to numbers + x = tonumber(x) + y = tonumber(y) + z = tonumber(z) + + -- are coords in map range ? + if x > dist or x < -dist + or y > dist or y < -dist + or z > dist or z < -dist then + return nil + end + + -- return ok coords + return {x = x, y = y, z = z} +end + + +-- particle effects +local function tp_effect(pos) + minetest.add_particlespawner({ + amount = 20, + time = 0.25, + minpos = pos, + maxpos = pos, + minvel = {x = -2, y = 1, z = -2}, + maxvel = {x = 2, y = 2, z = 2}, + minacc = {x = 0, y = -2, z = 0}, + maxacc = {x = 0, y = -4, z = 0}, + minexptime = 0.1, + maxexptime = 1, + minsize = 0.5, + maxsize = 1.5, + texture = "particle.png", + glow = 15, + }) +end + +local teleport_destinations = {} + +local function set_teleport_destination(playername, dest) + teleport_destinations[playername] = dest + tp_effect(dest) + minetest.sound_play("portal_open", { + pos = dest, + gain = 1.0, + max_hear_distance = 10 + }) +end + +-------------------------------------------------------------------------------- +--- Teleport portal +-------------------------------------------------------------------------------- +minetest.register_node("teleport_potion:portal", { + drawtype = "plantlike", + tiles = { + {name="portal.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.0 + } + } + }, + light_source = 13, + walkable = false, + paramtype = "light", + pointable = false, + buildable_to = true, + waving = 1, + sunlight_propagates = true, + damage_per_second = 1, -- walking into portal hurts player + + -- start timer when portal appears + on_construct = function(pos) + minetest.get_node_timer(pos):start(10) + end, + + -- remove portal after 10 seconds + on_timer = function(pos) + + minetest.sound_play("portal_close", { + pos = pos, + gain = 1.0, + max_hear_distance = 10 + }) + + minetest.remove_node(pos) + end, + on_blast = function() end, + drop = {}, +}) + + +-- Throwable potion +local function throw_potion(itemstack, player) + + local playerpos = player:get_pos() + + local obj = minetest.add_entity({ + x = playerpos.x, + y = playerpos.y + 1.5, + z = playerpos.z + }, "teleport_potion:potion_entity") + + local dir = player:get_look_dir() + local velocity = 20 + + obj:set_velocity({ + x = dir.x * velocity, + y = dir.y * velocity, + z = dir.z * velocity + }) + + obj:set_acceleration({ + x = dir.x * -3, + y = -9.5, + z = dir.z * -3 + }) + + obj:set_yaw(player:get_look_horizontal()) + obj:get_luaentity().player = player +end + + +local potion_entity = { + physical = true, + visual = "sprite", + visual_size = {x = 1.0, y = 1.0}, + textures = {"potion.png"}, + collisionbox = {0,0,0,0,0,0}, + lastpos = {}, + player = "", +} + +potion_entity.on_step = function(self, dtime) + + if not self.player then + self.object:remove() + return + end + + local pos = self.object:get_pos() + + if self.lastpos.x ~= nil then + + local vel = self.object:get_velocity() + + -- only when potion hits something physical + if vel.x == 0 + or vel.y == 0 + or vel.z == 0 then + + if self.player ~= "" then + + -- round up coords to fix glitching through doors + self.lastpos = vector.round(self.lastpos) + + self.player:set_pos(self.lastpos) + + minetest.sound_play("portal_close", { + pos = self.lastpos, + gain = 1.0, + max_hear_distance = 5 + }) + + tp_effect(self.lastpos) + end + + self.object:remove() + + return + + end + end + + self.lastpos = pos +end + +minetest.register_entity("teleport_potion:potion_entity", potion_entity) + + +-------------------------------------------------------------------------------- +--- Teleport potion +-------------------------------------------------------------------------------- +minetest.register_node("teleport_potion:potion", { + tiles = {"pad.png"}, + drawtype = "signlike", + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + description = S("Teleport Potion (use to set destination; place to open portal)"), + inventory_image = "potion.png", + wield_image = "potion.png", + groups = {dig_immediate = 3, vessel = 1}, + selection_box = {type = "wallmounted"}, + + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type == "node" then + set_teleport_destination(user:get_player_name(), pointed_thing.above) + else + throw_potion(itemstack, user) + if not is_creative(user:get_player_name()) then + itemstack:take_item() + return itemstack + end + end + end, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + local name = placer:get_player_name() + local dest = teleport_destinations[name] + if dest then + minetest.set_node(pos, {name = "teleport_potion:portal"}) + local meta = minetest.get_meta(pos) + -- Set portal destination + meta:set_int("x", dest.x) + meta:set_int("y", dest.y) + meta:set_int("z", dest.z) + -- Portal open effect and sound + tp_effect(pos) + minetest.sound_play("portal_open", { + pos = pos, + gain = 1.0, + max_hear_distance = 10 + }) + else + minetest.chat_send_player(name, S("Potion failed!")) + minetest.remove_node(pos) + minetest.add_item(pos, "teleport_potion:potion") + end + end, +}) + +-- teleport potion recipe +minetest.register_craft({ + output = "teleport_potion:potion", + recipe = { + {"", "default:diamond", ""}, + {"default:diamond", "vessels:glass_bottle", "default:diamond"}, + {"", "default:diamond", ""}, + }, +}) + +-------------------------------------------------------------------------------- +--- Teleport pad +-------------------------------------------------------------------------------- +local teleport_formspec_context = {} + +minetest.register_node("teleport_potion:pad", { + tiles = {"padd.png", "padd.png^[transformFY"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + legacy_wallmounted = true, + walkable = true, + sunlight_propagates = true, + description = S("Teleport Pad (use to set destination; place to open portal)"), + inventory_image = "padd.png", + wield_image = "padd.png", + light_source = 5, + groups = {snappy = 3}, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + }, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + }, + + -- Save pointed nodes coordinates as destination for further portals + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type == "node" then + set_teleport_destination(user:get_player_name(), pointed_thing.above) + end + end, + + -- Initialize teleport to saved location or the current position + after_place_node = function(pos, placer, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local name = placer:get_player_name() + local dest = teleport_destinations[name] + if not dest then + dest = pos + end + -- Set coords + meta:set_int("x", dest.x) + meta:set_int("y", dest.y) + meta:set_int("z", dest.z) + + meta:set_string("infotext", S("Pad Active (@1,@2,@3)", + dest.x, dest.y, dest.z)) + + minetest.sound_play("portal_open", { + pos = pos, + gain = 1.0, + max_hear_distance = 10 + }) + end, + + -- Show formspec depending on the players privileges. + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local name = clicker:get_player_name() + + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end + + local meta = minetest.get_meta(pos) + local coords = { + x = meta:get_int("x"), + y = meta:get_int("y"), + z = meta:get_int("z") + } + local coords = coords.x .. "," .. coords.y .. "," .. coords.z + local desc = meta:get_string("desc") + formspec = "field[desc;" .. S("Description") .. ";" + .. minetest.formspec_escape(desc) .. "]" + -- Only allow privileged players to change coordinates + if minetest.check_player_privs(name, "teleport") then + formspec = formspec .. + "field[coords;" .. S("Teleport coordinates") .. ";" .. coords .. "]" + end + + teleport_formspec_context[name] = { + pos = pos, + coords = coords, + desc = desc, + } + minetest.show_formspec(name, "teleport_potion:set_destination", formspec) + end, +}) + +-- Check and set coordinates +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "teleport_potion:set_destination" then + return false + end + local name = player:get_player_name() + local context = teleport_formspec_context[name] + if not context then return false end + teleport_formspec_context[name] = nil + local meta = minetest.get_meta(context.pos) + -- Coordinates were changed + if fields.coords and fields.coords ~= context.coords then + local coords = check_coordinates(fields.coords) + if coords then + meta:set_int("x", coords.x) + meta:set_int("y", coords.y) + meta:set_int("z", coords.z) + else + minetest.chat_send_player(name, S("Teleport Pad coordinates failed!")) + end + end + -- Update infotext + if fields.desc and fields.desc ~= "" then + meta:set_string("desc", fields.desc) + meta:set_string("infotext", S("Teleport to @1", fields.desc)) + else + local coords = minetest.string_to_pos("(" .. context.coords .. ")") + meta:set_string("infotext", S("Pad Active (@1,@2,@3)", + coords.x, coords.y, coords.z)) + end + return true +end) + +-- teleport pad recipe +minetest.register_craft({ + output = "teleport_potion:pad", + recipe = { + {"teleport_potion:potion", "default:glass", "teleport_potion:potion"}, + {"default:glass", "default:mese", "default:glass"}, + {"teleport_potion:potion", "default:glass", "teleport_potion:potion"} + } +}) + + +-- check portal & pad, teleport any entities on top +minetest.register_abm({ + label = "Potion/Pad teleportation", + nodenames = {"teleport_potion:portal", "teleport_potion:pad"}, + interval = 2, + chance = 1, + catch_up = false, + + action = function(pos, node, active_object_count, active_object_count_wider) + + -- check objects inside pad/portal + local objs = minetest.get_objects_inside_radius(pos, 1) + + if #objs == 0 then + return + end + + -- get coords from pad/portal + local meta = minetest.get_meta(pos) + + if not meta then return end -- errorcheck + + local target_coords = { + x = meta:get_int("x"), + y = meta:get_int("y"), + z = meta:get_int("z") + } + + for n = 1, #objs do + + if objs[n]:is_player() then + + -- play sound on portal end + minetest.sound_play("portal_close", { + pos = pos, + gain = 1.0, + max_hear_distance = 5 + }) + + -- move player + objs[n]:set_pos(target_coords) + + -- paricle effects on arrival + tp_effect(target_coords) + + -- play sound on destination end + minetest.sound_play("portal_close", { + pos = target_coords, + gain = 1.0, + max_hear_distance = 5 + }) + + -- rotate player to look in pad placement direction + local rot = node.param2 + local yaw = 0 + + if rot == 0 or rot == 20 then + yaw = 0 -- north + elseif rot == 2 or rot == 22 then + yaw = 3.14 -- south + elseif rot == 1 or rot == 23 then + yaw = 4.71 -- west + elseif rot == 3 or rot == 21 then + yaw = 1.57 -- east + end + + objs[n]:set_look_yaw(yaw) + end + end + end +}) + + +-- add lucky blocks + +-- Teleport Potion mod +if minetest.get_modpath("lucky_block") then + lucky_block:add_blocks({ + {"dro", {"teleport_potion:potion"}, 2}, + {"tel"}, + {"dro", {"teleport_potion:pad"}, 1}, + {"lig"}, + }) +end + +print ("[MOD] Teleport Potion loaded") diff --git a/teleport_potion/intllib.lua b/teleport_potion/intllib.lua new file mode 100644 index 0000000..6669d72 --- /dev/null +++ b/teleport_potion/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext -- 2.25.1 From 09816ee989ae3c519987e7e6ca86d68d55dd7835 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 11:39:54 +0200 Subject: [PATCH 10/66] =?UTF-8?q?Nahr=C3=A1t=20soubory=20do=20=E2=80=9Etel?= =?UTF-8?q?eport=5Fpotion/sounds=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- teleport_potion/sounds/portal_close.ogg | Bin 0 -> 9200 bytes teleport_potion/sounds/portal_open.ogg | Bin 0 -> 12153 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 teleport_potion/sounds/portal_close.ogg create mode 100644 teleport_potion/sounds/portal_open.ogg diff --git a/teleport_potion/sounds/portal_close.ogg b/teleport_potion/sounds/portal_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..adce131a344d88406aa06b44660b539e8e7c5b38 GIT binary patch literal 9200 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 Date: Thu, 30 Jul 2020 11:40:16 +0200 Subject: [PATCH 11/66] =?UTF-8?q?Nahr=C3=A1t=20soubory=20do=20=E2=80=9Etel?= =?UTF-8?q?eport=5Fpotion/textures=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- teleport_potion/textures/pad.png | Bin 0 -> 334 bytes teleport_potion/textures/padd.png | Bin 0 -> 201 bytes teleport_potion/textures/particle.png | Bin 0 -> 173 bytes teleport_potion/textures/portal.png | Bin 0 -> 458 bytes teleport_potion/textures/potion.png | Bin 0 -> 171 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 teleport_potion/textures/pad.png create mode 100644 teleport_potion/textures/padd.png create mode 100644 teleport_potion/textures/particle.png create mode 100644 teleport_potion/textures/portal.png create mode 100644 teleport_potion/textures/potion.png diff --git a/teleport_potion/textures/pad.png b/teleport_potion/textures/pad.png new file mode 100644 index 0000000000000000000000000000000000000000..a9525ef78dba6134064d501e39eeeed80bde8479 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(az2X-zY3-Ut+qcc!wPW4! zqq{DgKmFkTtyixefBg7xa&87t8DmM1UoeBivm0q3PLj8~3quF1tOt<8S>O>_%)r1c z48n{Iv*t(u1=&kHeO=k_vB(LCsva~vumLFKSmGK{;+&tGo0?a`;2h-Y7~&sfrI4PY zn^lmSu25#EXP}@_TAZ1euHfnAuHY5m>aI{`W~8a3P*|FnlUY)!V5?wm%5{8A;~k)3 z@t!V@Asp9}6C9Y1wJ{|`9lh$x>0-Qd+0<5z29`_KR;T7P@Lcce>-#3c#+J67PeCIz zA%V|1-Joe{5U+&9orW&!pa!06J$-#<6UxN4f7vAB+99gwmvCBQ>KvX4a~K#NvC34J TTkm-Rw2Hyg)z4*}Q$iB}M2T-y literal 0 HcmV?d00001 diff --git a/teleport_potion/textures/padd.png b/teleport_potion/textures/padd.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7c9378bdbe2e2f849d822e38c08dcb8b14a001 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUJ^kSRqV3ye?%J{L_|aV# z&I7r(UcGw!@uT*Ai4QKdVHJLo(~G zx7HOUe)>1{=fq2G_TdvNU|!JCrx+BRXc83fa?YV=`iaS=AtKKV0$$7i@S5$~l{4+l x#4mb9*FTy~GcI1}YJcwG?pD2sLxB&Z^&NbqDrdYDx&^eC!PC{xWt~$(695*#P`dyC literal 0 HcmV?d00001 diff --git a/teleport_potion/textures/particle.png b/teleport_potion/textures/particle.png new file mode 100644 index 0000000000000000000000000000000000000000..9a53b500b9c6b4d093de78d7cf9eed33927dd7e2 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bO)b&wzHwvqqemy+zJ2=b zThPm{R-hDPNswPKgTu2MX+VyTr;B3<$Mxg{1wo4$4w776Itg|Yjxr=kGTh`#;1m;M zXWk&Qxx1U&I6`m&W5~%v3`=5V9C*@IQ`1!!h>0t^s;a6k5K>chbaZ57V@S8*SX7$W RSO7Ga!PC{xWt~$(699z7GhqM# literal 0 HcmV?d00001 diff --git a/teleport_potion/textures/portal.png b/teleport_potion/textures/portal.png new file mode 100644 index 0000000000000000000000000000000000000000..268c8778bf0303e9fa199c3b476b9e1cb3c37ea8 GIT binary patch literal 458 zcmV;*0X6=KP)$~$ z*x0M$;>hjo<@WYtd&yw{0004WQchC6A^-pZG)Y83R4C7FQo)hLAPn<>8%Qc} zObTGw6yO2(U(*T9-0t3-A4CauBqWH4gl46Wl`8E@^e&!@J^Q0*yw7=#5wo?yY<2Br zch9Q{0G&*Dx=k>&46W#Bm#P+Oss~ExtAzd*Z}u9(Y?DuRNxayBb4YiKUeMYabssX> z`SvceZGs|bU3x&56?!g#p6eey`P-&Svc34V2TPEqWlhMavBBP1D1+X8o+EnzN{@S6 z|0rYJ_dJ)jcHf2_7*n87r$1OeY>{_7_KBh%*?zHva2!75+T&~1jAuGbR>$x)|g`gBYnw z_gf)RkXw;8>+k^o;ZgKBg+|iXb({)4=Tvn50Aa^6TpK*x_W%F@07*qoM6N<$f`)^} ANdN!< literal 0 HcmV?d00001 diff --git a/teleport_potion/textures/potion.png b/teleport_potion/textures/potion.png new file mode 100644 index 0000000000000000000000000000000000000000..96fbf06f0cc1942d161e2111e280259cd334d146 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(aRb*i3$c>)fl$*9==jNTK zi_V`raOCp&3%73GeBztx+yhj`SQ6wH%;50sMjDV~=jq}Y!f`!0L4nVJ(;;Kqr*BLg zt3712o*v*!-r$%acKHDd$6=;Z1$n%tjRsE22|ZyP%|~xYENVNrSJs1p;T#|5H6ha| Q6QD^9p00i_>zopr0C_GtBme*a literal 0 HcmV?d00001 -- 2.25.1 From 68096433126fc43b645615e5274a36884f209102 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 11:42:05 +0200 Subject: [PATCH 12/66] =?UTF-8?q?Nahr=C3=A1t=20soubory=20do=20=E2=80=9Etel?= =?UTF-8?q?eport=5Fpotion=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- teleport_potion/README.md | 23 +++++++++++++++++++++++ teleport_potion/description.txt | 1 + teleport_potion/license.txt | 21 +++++++++++++++++++++ teleport_potion/mod.conf | 1 + teleport_potion/screenshot.png | Bin 0 -> 8722 bytes 5 files changed, 46 insertions(+) create mode 100644 teleport_potion/README.md create mode 100644 teleport_potion/description.txt create mode 100644 teleport_potion/license.txt create mode 100644 teleport_potion/mod.conf create mode 100644 teleport_potion/screenshot.png diff --git a/teleport_potion/README.md b/teleport_potion/README.md new file mode 100644 index 0000000..acf46cf --- /dev/null +++ b/teleport_potion/README.md @@ -0,0 +1,23 @@ +Teleport Potion + +This minetest mod adds both a teleportation potion and pad to the game + +https://forum.minetest.net/viewtopic.php?f=9&t=9234 + + +Change log: + +- 1.1 - Using 0.4.16+ code changes, can only teleport players now +- 1.0 - Added changes by maybe_dragon to bookmark teleport destination before using pads and potions +- 0.9 - Update to newer functions, requires Minetest 0.4.16 to work. +- 0.8 - Teleport pads now have arrows showing direction player will face after use +- 0.7 - Can now enter descriptions for teleport pads e.g. (0,12,0,Home) +- 0.6 - Tweaked and tidied code, added map_generation_limit's +- 0.5 - Added throwable potions +- 0.4 - Code tidy and particle effects added +- 0.3 - Added Teleport Pad +- 0.2 - Bug fixes +- 0.1 - Added SFX +- 0.0 - Initial release + +Lucky Blocks: 4 diff --git a/teleport_potion/description.txt b/teleport_potion/description.txt new file mode 100644 index 0000000..0f227cf --- /dev/null +++ b/teleport_potion/description.txt @@ -0,0 +1 @@ +Adds craftable teleport potions (throwable) and teleport pads. \ No newline at end of file diff --git a/teleport_potion/license.txt b/teleport_potion/license.txt new file mode 100644 index 0000000..fec6f6a --- /dev/null +++ b/teleport_potion/license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/teleport_potion/mod.conf b/teleport_potion/mod.conf new file mode 100644 index 0000000..5afd872 --- /dev/null +++ b/teleport_potion/mod.conf @@ -0,0 +1 @@ +name = teleport_potion \ No newline at end of file diff --git a/teleport_potion/screenshot.png b/teleport_potion/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..dd99b31bb0c8272a9b9282469b9afcc423a7dc8b GIT binary patch literal 8722 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

{u|{L%lIq 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 UYh9R6t1bXtEkn(UE4Zis1<|-8M*si- literal 0 HcmV?d00001 -- 2.25.1 From c4922e7f4bf8c289bc62411c0b9353301de2c269 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 11:42:37 +0200 Subject: [PATCH 13/66] =?UTF-8?q?Nahr=C3=A1t=20soubory=20do=20=E2=80=9Etel?= =?UTF-8?q?eport=5Fpotion/locale=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- teleport_potion/locale/de.po | 59 +++++++++++++++++++++++++++++ teleport_potion/locale/fr.po | 55 +++++++++++++++++++++++++++ teleport_potion/locale/template.pot | 54 ++++++++++++++++++++++++++ 3 files changed, 168 insertions(+) create mode 100644 teleport_potion/locale/de.po create mode 100644 teleport_potion/locale/fr.po create mode 100644 teleport_potion/locale/template.pot diff --git a/teleport_potion/locale/de.po b/teleport_potion/locale/de.po new file mode 100644 index 0000000..2e9df77 --- /dev/null +++ b/teleport_potion/locale/de.po @@ -0,0 +1,59 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-14 08:37+0200\n" +"PO-Revision-Date: 2016-05-27 08:38+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Last-Translator: Xanthin\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: de\n" + +#: init.lua +msgid "Teleport Potion (place and right-click to enchant location)" +msgstr "" +"Teleportationstrank (platzieren und rechtsklicken,\n" +"um Standort zu verzaubern)" + +#: init.lua +msgid "Enter teleport coords (e.g. 200,20,-200)" +msgstr "Koordinaten eingeben (z.B. 200,20,-200)" + +#: init.lua +msgid "Right-click to enchant teleport location" +msgstr "Rechtsklick um Teleportationsort zu verzaubern" + +#: init.lua +msgid "Potion failed!" +msgstr "Trank misslungen!" + +#: init.lua +msgid "Teleport Pad (place and right-click to enchant location)" +msgstr "" +"Teleportationsfeld (platzieren und rechtsklicken,\n" +"um Standort zu verzaubern)" + +#: init.lua +msgid "Enter teleport coords (e.g. 200,20,-200,Home)" +msgstr "Koordinaten eingeben (z.B. 200,20,-200,Haus)" + +#: init.lua +msgid "Teleport to @1" +msgstr "Teleportiere nach @1" + +#: init.lua +msgid "Pad Active (@1,@2,@3)" +msgstr "Feld aktiv (@1,@2,@3)" + +#: init.lua +msgid "Teleport Pad coordinates failed!" +msgstr "Teleportationsfeldkoordinaten fehlgeschlagen!" diff --git a/teleport_potion/locale/fr.po b/teleport_potion/locale/fr.po new file mode 100644 index 0000000..78cd2be --- /dev/null +++ b/teleport_potion/locale/fr.po @@ -0,0 +1,55 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-14 08:35+0200\n" +"PO-Revision-Date: 2017-05-14 08:37+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Last-Translator: Peppy \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: fr\n" + +#: init.lua +msgid "Teleport Potion (place and right-click to enchant location)" +msgstr "Potion de téléportation (poser puis clic-droit pour enchanter l'emplacement)" + +#: init.lua +msgid "Enter teleport coords (e.g. 200,20,-200)" +msgstr "Saisissez les coordonnées de téléportation (ex : 200,20,-200)" + +#: init.lua +msgid "Right-click to enchant teleport location" +msgstr "Clic-droit pour enchanter l'emplacement de téléportation" + +#: init.lua +msgid "Potion failed!" +msgstr "La potion n'a pas fonctionné !" + +#: init.lua +msgid "Teleport Pad (place and right-click to enchant location)" +msgstr "Pad de téléportation (poser puis clic-droit pour enchanter l'emplacement)" + +#: init.lua +msgid "Enter teleport coords (e.g. 200,20,-200,Home)" +msgstr "Saisissez les coordonnées de téléportation (ex : 200,20,-200,Maison)" + +#: init.lua +msgid "Teleport to @1" +msgstr "Téléportation vers @1" + +#: init.lua +msgid "Pad Active (@1,@2,@3)" +msgstr "Pad activé (@1,@,2,@3)" + +#: init.lua +msgid "Teleport Pad coordinates failed!" +msgstr "Les coordonnées du pad sont inchangées !" diff --git a/teleport_potion/locale/template.pot b/teleport_potion/locale/template.pot new file mode 100644 index 0000000..3826160 --- /dev/null +++ b/teleport_potion/locale/template.pot @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-14 08:34+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: init.lua +msgid "Teleport Potion (place and right-click to enchant location)" +msgstr "" + +#: init.lua +msgid "Enter teleport coords (e.g. 200,20,-200)" +msgstr "" + +#: init.lua +msgid "Right-click to enchant teleport location" +msgstr "" + +#: init.lua +msgid "Potion failed!" +msgstr "" + +#: init.lua +msgid "Teleport Pad (place and right-click to enchant location)" +msgstr "" + +#: init.lua +msgid "Enter teleport coords (e.g. 200,20,-200,Home)" +msgstr "" + +#: init.lua +msgid "Teleport to @1" +msgstr "" + +#: init.lua +msgid "Pad Active (@1,@2,@3)" +msgstr "" + +#: init.lua +msgid "Teleport Pad coordinates failed!" +msgstr "" -- 2.25.1 From 1256a8e4da2c0b4ca360aa9b640592cea394bde1 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:16:37 +0200 Subject: [PATCH 14/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/mover.?= =?UTF-8?q?lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/mover.lua | 2518 -------------------------------------- 1 file changed, 2518 deletions(-) delete mode 100644 basic_machines/mover.lua diff --git a/basic_machines/mover.lua b/basic_machines/mover.lua deleted file mode 100644 index 148c1c7..0000000 --- a/basic_machines/mover.lua +++ /dev/null @@ -1,2518 +0,0 @@ ------------------------------------------------------------------------------------------------------------------------------------- --- BASIC MACHINES MOD by rnd --- mod with basic simple automatization for minetest. No background processing, just one abm with 5s timer (clock generator), no other lag causing background processing. ------------------------------------------------------------------------------------------------------------------------------------- - - - --- *** SETTINGS *** -- -local machines_timer = 5 -- main timestep -local machines_minstep = 1 -- minimal allowed activation timestep, if faster machines overheat -local max_range = 10; -- machines normal range of operation -local machines_operations = 10; -- 1 coal will provide 10 mover basic operations ( moving dirt 1 block distance) -local machines_TTL = 16; -- time to live for signals, how many hops before signal dissipates -basic_machines.version = "05/23/2018a"; -basic_machines.clockgen = 1; -- if 0 all background continuously running activity (clockgen/keypad) repeating is disabled - --- how hard it is to move blocks, default factor 1, note fuel cost is this multiplied by distance and divided by machine_operations.. -basic_machines.hardness = { -["default:stone"]=4,["default:tree"]=2,["default:jungletree"]=2,["default:pine_tree"]=2,["default:aspen_tree"]=2,["default:acacia_tree"]=2, -["default:lava_source"]=5950,["default:water_source"]=5950,["default:obsidian"]=20,["bedrock2:bedrock"]=999999}; ---move machines for free -basic_machines.hardness["basic_machines:mover"]=0.; -basic_machines.hardness["basic_machines:keypad"]=0.; -basic_machines.hardness["basic_machines:distributor"]=0.; -basic_machines.hardness["basic_machines:battery"]=0.; -basic_machines.hardness["basic_machines:detector"]=0.; -basic_machines.hardness["basic_machines:generator"]=0.; -basic_machines.hardness["basic_machines:clockgen"]=0.; -basic_machines.hardness["basic_machines:ball_spawner"]=0.; -basic_machines.hardness["basic_machines:light_on"]=0.; -basic_machines.hardness["basic_machines:light_off"]=0.; - --- grief potential items need highest possible upgrades -basic_machines.hardness["boneworld:acid_source_active"]=5950.; -basic_machines.hardness["darkage:mud"]=5950.; - -basic_machines.hardness["es:toxic_water_source"]=5950.;basic_machines.hardness["es:toxic_water_flowing"]=5950; -basic_machines.hardness["default:river_water_source"]=5950.; - --- farming operations are much cheaper -basic_machines.hardness["farming:wheat_8"]=1;basic_machines.hardness["farming:cotton_8"]=1; -basic_machines.hardness["farming:seed_wheat"]=0.5;basic_machines.hardness["farming:seed_cotton"]=0.5; - --- digging mese crystals more expensive -basic_machines.hardness["mese_crystals:mese_crystal_ore1"] = 10; -basic_machines.hardness["mese_crystals:mese_crystal_ore2"] = 10; -basic_machines.hardness["mese_crystals:mese_crystal_ore3"] = 10; -basic_machines.hardness["mese_crystals:mese_crystal_ore4"] = 10; - - --- define which nodes are dug up completely, like a tree -basic_machines.dig_up_table = {["default:cactus"]=true,["default:tree"]=true,["default:jungletree"]=true,["default:pinetree"]=true, -["default:acacia_tree"]=true,["default:papyrus"]=true}; - --- set up nodes for harvest when digging: [nodename] = {what remains after harvest, harvest result} -basic_machines.harvest_table = { -["mese_crystals:mese_crystal_ore4"] = {"mese_crystals:mese_crystal_ore1", "default:mese_crystal 3"}, -- harvesting mese crystals -["mese_crystals:mese_crystal_ore3"] = {"mese_crystals:mese_crystal_ore1", "default:mese_crystal 2"}, -["mese_crystals:mese_crystal_ore2"] = {"mese_crystals:mese_crystal_ore1", "default:mese_crystal 1"}, -["mese_crystals:mese_crystal_ore1"] = {"mese_crystals:mese_crystal_ore1", ""}, -}; - --- set up nodes for plant with reverse on and filter set (for example seeds -> plant) : [nodename] = plant_name -basic_machines.plant_table = {["farming:seed_barley"]="farming:barley_1",["farming:beans"]="farming:beanpole_1", -- so it works with farming redo mod -["farming:blueberries"]="farming:blueberry_1",["farming:carrot"]="farming:carrot_1",["farming:cocoa_beans"]="farming:cocoa_1", -["farming:coffee_beans"]="farming:coffee_1",["farming:corn"]="farming:corn_1",["farming:blueberries"]="farming:blueberry_1", -["farming:seed_cotton"]="farming:cotton_1",["farming:cucumber"]="farming:cucumber_1",["farming:grapes"]="farming:grapes_1", -["farming:melon_slice"]="farming:melon_1",["farming:potato"]="farming:potato_1",["farming:pumpkin_slice"]="farming:pumpkin_1", -["farming:raspberries"]="farming:raspberry_1",["farming:rhubarb"]="farming:rhubarb_1",["farming:tomato"]="farming:tomato_1", -["farming:seed_wheat"]="farming:wheat_1"} - --- list of objects that cant be teleported with mover -basic_machines.no_teleport_table = { -["itemframes:item"] = true, -["signs:text"] = true -} - --- list of nodes mover cant take from in inventory mode -basic_machines.limit_inventory_table = { -- node name = {list of bad inventories to take from} - ["basic_machines:autocrafter"]= {["recipe"]=1, ["output"]=1}, - ["basic_machines:constructor"]= {["recipe"]=1}, - ["basic_machines:battery"] = {["upgrade"] = 1}, - ["basic_machines:generator"] = {["upgrade"] = 1}, - ["basic_machines:mover"] = {["upgrade"] = 1}, - ["moreblocks:circular_saw"] = {["input"]=1,["recycle"]=1,["micro"]=1,["output"]=1}, -} - --- when activated with keypad these will be "punched" to update their text too -basic_machines.signs = { -["default:sign_wall_wood"] = true, -["signs:sign_wall_green"] = true, -["signs:sign_wall_green"] = true, -["signs:sign_wall_yellow"] = true, -["signs:sign_wall_red"] = true, -["signs:sign_wall_red"] = true, -["signs:sign_wall_white_black"] = true, -["signs:sign_yard"] = true -} - --- *** END OF SETTINGS *** -- - - - -local punchset = {}; - -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name(); if name == nil then return end - punchset[name] = {}; - punchset[name].state = 0; -end) - -local get_mover_form = function(pos,player) - - if not player then return end - local meta = minetest.get_meta(pos); - local x0,y0,z0,x1,y1,z1,x2,y2,z2,prefer,mode,mreverse; - - x0=meta:get_int("x0");y0=meta:get_int("y0");z0=meta:get_int("z0");x1=meta:get_int("x1");y1=meta:get_int("y1");z1=meta:get_int("z1");x2=meta:get_int("x2");y2=meta:get_int("y2");z2=meta:get_int("z2"); - - machines.pos1[player:get_player_name()] = {x=pos.x+x0,y=pos.y+y0,z=pos.z+z0};machines.mark_pos1(player:get_player_name()) -- mark pos1 - machines.pos11[player:get_player_name()] = {x=pos.x+x1,y=pos.y+y1,z=pos.z+z1};machines.mark_pos11(player:get_player_name()) -- mark pos11 - machines.pos2[player:get_player_name()] = {x=pos.x+x2,y=pos.y+y2,z=pos.z+z2};machines.mark_pos2(player:get_player_name()) -- mark pos2 - - prefer = meta:get_string("prefer"); - local mreverse = meta:get_int("reverse"); - local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z - local mode_list = {["normal"]=1,["dig"]=2, ["drop"]=3, ["object"]=4, ["inventory"]=5, ["transport"]=6}; - - local mode_string = meta:get_string("mode") or ""; - - local meta1 = minetest.get_meta({x=pos.x+x0,y=pos.y+y0,z=pos.z+z0}); -- source meta - local meta2 = minetest.get_meta({x=pos.x+x2,y=pos.y+y2,z=pos.z+z2}); -- target meta - - - local inv1=1; local inv2=1; - local inv1m = meta:get_string("inv1");local inv2m = meta:get_string("inv2"); - - local list1 = meta1:get_inventory():get_lists(); local inv_list1 = ""; local j; - j=1; -- stupid dropdown requires item index but returns string on receive so we have to find index.. grrr, one other solution: invert the table: key <-> value - - - for i in pairs( list1) do - inv_list1 = inv_list1 .. i .. ","; - if i == inv1m then inv1=j end; j=j+1; - end - local list2 = meta2:get_inventory():get_lists(); local inv_list2 = ""; - j=1; - for i in pairs( list2) do - inv_list2 = inv_list2 .. i .. ","; - if i == inv2m then inv2=j; end; j=j+1; - end - - local upgrade = meta:get_float("upgrade"); if upgrade>0 then upgrade = upgrade - 1 end - local seltab = meta:get_int("seltab"); - local form; - - if seltab == 1 then -- MODE -- - local mode_description = { - ["normal"] = "This will move blocks as they are - without change.", - ["dig"] = "This will transform blocks as if player digged them.", - ["drop"] = "This will take block/item out of chest (you need to set filter) and will drop it", - ["object"] = "make TELEPORTER/ELEVATOR. This will move any object inside sphere (with center source1 and radius defined by source2) to target position. For ELEVATOR teleport points need to be placed exactly vertically in line with mover and you need to upgrade with 1 diamondblock for every 100 height difference. ", - ["inventory"] = "This will move items from inventory of any block at source position to any inventory of block at target position", - ["transport"] = "This will move all blocks at source area to new area starting at target position. This mode preserves all inventories and other metadata", - }; - - local text = mode_description[mode_string] or "description"; - local mode_list = {["normal"]=1,["dig"]=2, ["drop"]=3, ["object"]=4, ["inventory"]=5, ["transport"]=6}; - mode = mode_list[mode_string] or 1; - - form = "size[8,8.25]" .. -- width, height - --"size[6,10]" .. -- width, height - "tabheader[0,0;tabs;MODE OF OPERATION,WHERE TO MOVE;".. seltab .. ";true;true]".. - "label[0.,0;MODE selection]".."button[3,0.25;1,1;help;help]".. - "dropdown[0.,0.35;3,1;mode;normal,dig,drop,object,inventory,transport;".. mode .."]".. - "textarea[0.25,1.25;8,2.;description;;".. text.."]".. - - "field[0.25,3.5;3,1;prefer;FILTER;"..prefer.."]".. - - "list[nodemeta:"..pos.x..','..pos.y..','..pos.z ..";filter;3,3.4;1,1;]".. - "list[nodemeta:"..pos.x..','..pos.y..','..pos.z ..";upgrade;5,3.4;1,1;]".."label[4,3;UPGRADE LVL ".. upgrade .."]" .. - "list[current_player;main;0,4.5;8,4;]".. - "listring[nodemeta:"..pos.x..','..pos.y..','..pos.z ..";upgrade]".. - "listring[current_player;main]".. - "listring[nodemeta:"..pos.x..','..pos.y..','..pos.z ..";filter]".. - "listring[current_player;main] button_exit[5,0.25;1,1;OK;OK]" - - else -- POSITIONS - - local inventory_list1,inventory_list2; - if mode_string == "inventory" then - inventory_list1 = "label[4.5,0.25;source inventory] dropdown[4.5,0.75;1.5,1;inv1;".. inv_list1 ..";" .. inv1 .."]" - inventory_list2 = "label[4.5,3.;target inventory] dropdown[4.5,3.5;1.5,1;inv2;".. inv_list2 .. ";" .. inv2 .."]" - else - inventory_list1 = ""; inventory_list2 = "" - end - - - form = "size[6,5.5]" .. -- width, height - --"size[6,10]" .. -- width, height - "tabheader[0,0;tabs;MODE OF OPERATION,WHERE TO MOVE;".. seltab .. ";true;true]".. - - "label[0.,0;" .. minetest.colorize("lawngreen","INPUT AREA - mover will dig here").."]".. - "field[0.25,1.;1,1;x0;source1;"..x0.."] field[1.25,1.;1,1;y0;;"..y0.."] field[2.25,1.;1,1;z0;;"..z0.."]".. - "image[3,0.75;1,1;machines_pos1.png]".. - inventory_list1.. - "field[0.25,2;1,1;x1;source2;"..x1.."] field[1.25,2;1,1;y1;;"..y1.."] field[2.25,2;1,1;z1;;"..z1.."]".. - "image[3,1.75;1,1;machines_pos11.png]".. - - "label[0.,2.75;" .. minetest.colorize("red","TARGET POSITION - mover will move to here").."]".. - - "field[0.25,3.75;1,1;x2;Target;"..x2.."] field[1.25,3.75;1,1;y2;;"..y2.."] field[2.25,3.75;1,1;z2;;"..z2.."]".. - "image[3,3.5;1,1;machines_pos2.png]".. - inventory_list2 .. - "label[0.,4.25;REVERSE source and target (0/1/2)]".. - "field[0.25,5;1.,1;reverse;;"..mreverse.."]" .. - "listring[current_player;main] button[4,4.75;1,1;help;help] button_exit[5,4.75;1,1;OK;OK]" - end - - return form -end - - -local find_and_connect_battery = function(pos) - local r = 1; - for i = 0,2 do - local positions = minetest.find_nodes_in_area( --find battery - {x=pos.x-r, y=pos.y-r, z=pos.z-r}, - {x=pos.x+r, y=pos.y+r, z=pos.z+r}, - "basic_machines:battery_" .. i ) - if #positions>0 then - local meta = minetest.get_meta(pos); - local fpos = positions[1] ; - meta:set_int("batx", fpos.x);meta:set_int("baty", fpos.y); meta:set_int("batz", fpos.z) - return fpos - end -- pick first battery we found - end - return nil -end - - --- MOVER -- -minetest.register_node("basic_machines:mover", { - description = "Mover - universal digging/harvesting/teleporting/transporting machine, its upgradeable.", - tiles = {"compass_top.png","default_furnace_top.png", "basic_machine_mover_side.png","basic_machine_mover_side.png","basic_machine_mover_side.png","basic_machine_mover_side.png"}, - groups = {cracky=3, mesecon_effector_on = 1}, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos, placer) - local meta = minetest.env:get_meta(pos) - meta:set_string("infotext", "Mover block. Set it up by punching or right click. Activate it by keypad signal.") - meta:set_string("owner", placer:get_player_name()); meta:set_int("public",0); - meta:set_int("x0",0);meta:set_int("y0",-1);meta:set_int("z0",0); -- source1 - meta:set_int("x1",0);meta:set_int("y1",-1);meta:set_int("z1",0); -- source2: defines cube - meta:set_int("pc",0); meta:set_int("dim",1);-- current cube position and dimensions - meta:set_int("pc",0); meta:set_int("dim",1);-- current cube position and dimensions - meta:set_int("x2",0);meta:set_int("y2",1);meta:set_int("z2",0); - meta:set_float("fuel",0) - meta:set_string("prefer", ""); - meta:set_string("mode", "normal"); - meta:set_float("upgrade", 1); - meta:set_int("seltab",1); - - local privs = minetest.get_player_privs(placer:get_player_name()); - if privs.privs then meta:set_float("upgrade", -1); end -- means operation will be for free - - local inv = meta:get_inventory();inv:set_size("upgrade", 1*1);inv:set_size("filter", 1*1) - local name = placer:get_player_name(); punchset[name].state = 0 - - - local text = "This machine can move anything. General idea is the following : \n\n".. - "First you need to define rectangle work area (where it takes, marked by two number 1 boxes that appear in world) and target area (where it puts, marked by one number 2 box) by punching mover then following CHAT instructions exactly.\n\n".. - "CHECK why it doesnt work: 1. did you click OK in mover after changing setting 2. does it have battery, 3. does battery have enough fuel\n\n".. - "IMPORTANT: Please read the help button inside machine before first use."; - - local form = "size [5.5,5.5] textarea[0,0;6,7;help;MOVER INTRODUCTION;".. text.."]" - minetest.show_formspec(name, "basic_machines:intro_mover", form) - - - - end, - - can_dig = function(pos, player) -- dont dig if upgrades inside, cause they will be destroyed - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory(); - return not(inv:contains_item("upgrade", ItemStack({name="default:mese"}))); - end, - - - on_rightclick = function(pos, node, player, itemstack, pointed_thing) - local privs = minetest.get_player_privs(player:get_player_name()); - local cant_build = minetest.is_protected(pos,player:get_player_name()); - if not privs.privs and cant_build then return end -- only ppl sharing protection can setup - - local form = get_mover_form(pos,player) - minetest.show_formspec(player:get_player_name(), "basic_machines:mover_"..minetest.pos_to_string(pos), form) - end, - - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "filter" then - local meta = minetest.get_meta(pos); - local itemname = stack:get_name() or ""; - meta:set_string("prefer",itemname); - --minetest.chat_send_player(player:get_player_name(),"#mover: filter set as " .. itemname) - local form = get_mover_form(pos,player) - minetest.show_formspec(player:get_player_name(), "basic_machines:mover_"..minetest.pos_to_string(pos), form) - return 1; - end - - if listname == "upgrade" then - -- update upgrades - local meta = minetest.get_meta(pos); - local upgrade = 0; - local inv = meta:get_inventory(); - - local upgrade_name = "default:mese"; - if meta:get_int("elevator")==1 then upgrade_name = "default:diamondblock" end - if stack:get_name() == upgrade_name then - --inv:contains_item("upgrade", ItemStack({name="default:mese"})) then - upgrade = (inv:get_stack("upgrade", 1):get_count()) or 0; - upgrade = upgrade + stack:get_count(); - if upgrade > 10 then upgrade = 10 end -- not more than 10 - meta:set_float("upgrade",upgrade+1); - - local form = get_mover_form(pos,player) - minetest.show_formspec(player:get_player_name(), "basic_machines:mover_"..minetest.pos_to_string(pos), form) - end - - - end - - return stack:get_count(); - end, - - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos); - meta:set_float("upgrade",1); -- reset upgrade - local form = get_mover_form(pos,player) - minetest.show_formspec(player:get_player_name(), "basic_machines:mover_"..minetest.pos_to_string(pos), form) - return stack:get_count(); - end, - - mesecons = {effector = { - action_on = function (pos, node,ttl) - - if type(ttl)~="number" then ttl = 1 end - local meta = minetest.get_meta(pos); - local fuel = meta:get_float("fuel"); - - - local x0=meta:get_int("x0"); local y0=meta:get_int("y0"); local z0=meta:get_int("z0"); - local x2=meta:get_int("x2"); local y2=meta:get_int("y2"); local z2=meta:get_int("z2"); - - local mode = meta:get_string("mode"); - local mreverse = meta:get_int("reverse") - local pos1 = {x=x0+pos.x,y=y0+pos.y,z=z0+pos.z}; -- where to take from - local pos2 = {x=x2+pos.x,y=y2+pos.y,z=z2+pos.z}; -- where to put - - local pc = meta:get_int("pc"); local dim = meta:get_int("dim"); pc = (pc+1) % dim;meta:set_int("pc",pc) -- cycle position - local x1=meta:get_int("x1")-x0+1;local y1=meta:get_int("y1")-y0+1;local z1=meta:get_int("z1")-z0+1; -- get dimensions - - --pc = z*a*b+x*b+y, from x,y,z to pc - -- set current input position - pos1.y = y0 + (pc % y1); pc = (pc - (pc % y1))/y1; - pos1.x = x0 + (pc % x1); pc = (pc - (pc % x1))/x1; - pos1.z = z0 + pc; - pos1.x = pos.x+pos1.x;pos1.y = pos.y+pos1.y;pos1.z = pos.z+pos1.z; - - -- special modes that use its own source/target positions: - if mode == "transport" and mreverse<2 then - pos2 = {x=meta:get_int("x2")-x0+pos1.x,y=meta:get_int("y2")-y0+pos1.y,z=meta:get_int("z2")-z0+pos1.z}; -- translation from pos1 - end - - if mreverse ~= 0 and mreverse ~= 2 then -- reverse pos1, pos2 - if mode == "object" then - x0 = pos2.x-pos.x; y0 = pos2.y-pos.y; z0 = pos2.z-pos.z; - pos2 = {x=pos1.x,y=pos1.y,z=pos1.z}; - else - local post = {x=pos1.x,y=pos1.y,z=pos1.z}; - pos1 = {x=pos2.x,y=pos2.y,z=pos2.z}; - pos2 = {x=post.x,y=post.y,z=post.z}; - end - end - - - -- PROTECTION CHECK - local owner = meta:get_string("owner"); - if (minetest.is_protected(pos1, owner) or minetest.is_protected(pos2, owner)) and mode~="object" then - meta:set_string("infotext", "Mover block. Protection fail. ") - return - end - - local node1 = minetest.get_node(pos1);local node2 = minetest.get_node(pos2); - local prefer = meta:get_string("prefer"); - - -- FUEL COST: calculate - local dist = math.abs(pos2.x-pos1.x)+math.abs(pos2.y-pos1.y)+math.abs(pos2.z-pos1.z); - local hardness = basic_machines.hardness[node1.name]; - -- no free teleports from machine blocks - if hardness == 0 and mode == "object" then hardness = 1 end - local fuel_cost = hardness or 1; - - local upgrade = meta:get_float("upgrade") or 1; - - -- taking items from chests/inventory move - if node1.name == "default:chest_locked" or mode == "inventory" then fuel_cost = basic_machines.hardness[prefer] or 1 end; - - fuel_cost=fuel_cost*dist/machines_operations; -- machines_operations=10 by default, so 10 basic operations possible with 1 coal - if mode == "object" then - fuel_cost=fuel_cost*0.1; - if x2==0 and z2==0 then -- check if elevator mode - local requirement = math.floor(math.abs(pos2.y-pos.y)/100)+1; - if upgrade-10 then - found_fuel=supply; - elseif supply<0 then -- no battery at target location, try to find it! - local fpos = find_and_connect_battery(pos); - if not fpos then - meta:set_string("infotext", "Can not find nearby battery to connect to!"); - minetest.sound_play("default_cool_lava", {pos=pos,gain=1.0,max_hear_distance = 8,}) - return - end - - end - - if found_fuel~=0 then - fuel = fuel+found_fuel; - meta:set_float("fuel", fuel); - meta:set_string("infotext", "Mover block refueled. Fuel ".. fuel); - - end - - end - - if fuel < fuel_cost then - meta:set_string("infotext", "Mover block. Energy ".. fuel ..", needed energy " .. fuel_cost .. ". Put nonempty battery next to mover."); - return - end - - - if mode == "object" then -- teleport objects and return - - -- if target is chest put items in it - local target_chest = false - if node2.name == "default:chest" or node2.name == "default:chest_locked" then - target_chest = true - end - local r = math.max(math.abs(x1),math.abs(y1),math.abs(z1)); r = math.min(r,10); - local teleport_any = false; - - if target_chest then -- put objects in target chest - local cmeta = minetest.get_meta(pos2); - local inv = cmeta:get_inventory(); - - for _,obj in pairs(minetest.get_objects_inside_radius({x=x0+pos.x,y=y0+pos.y,z=z0+pos.z}, r)) do - local lua_entity = obj:get_luaentity() - if not obj:is_player() and lua_entity and lua_entity.itemstring ~= "" then - local detected_obj = lua_entity.name or "" - if not basic_machines.no_teleport_table[detected_obj] then -- object on no teleport list - -- put item in chest - local stack = ItemStack(lua_entity.itemstring) - if inv:room_for_item("main", stack) then - teleport_any = true; - inv:add_item("main", stack); - end - obj:setpos({x=0,y=0,z=0}); -- patch for dupe, might not be needed if future minetest object management is better - obj:remove(); - end - end - end - if teleport_any then - fuel = fuel - fuel_cost; meta:set_float("fuel",fuel); - meta:set_string("infotext", "Mover block. Fuel "..fuel); - minetest.sound_play("tng_transporter1", {pos=pos2,gain=1.0,max_hear_distance = 8,}) - end - return - end - - local times = tonumber(prefer) or 0; if times > 20 then times = 20 elseif times<0.2 then times = 0 end - local velocityv; - if times~=0 then - velocityv = { x = pos2.x-x0-pos.x, y = pos2.y-y0-pos.y, z = pos2.z-z0-pos.z}; - local vv=math.sqrt(velocityv.x*velocityv.x+velocityv.y*velocityv.y+velocityv.z*velocityv.z); - local velocitys=0; - if times~=0 then velocitys = vv/times else vv = 0 end - if vv ~= 0 then vv=velocitys/vv else vv = 0 end; - velocityv.x = velocityv.x * vv; velocityv.y = velocityv.y * vv; velocityv.z = velocityv.z* vv - end - - --minetest.chat_send_all(" times ".. times .. " v " .. minetest.pos_to_string(velocityv)); - - -- move objects to another location - local finalsound = true; - for _,obj in pairs(minetest.get_objects_inside_radius({x=x0+pos.x,y=y0+pos.y,z=z0+pos.z}, r)) do - if obj:is_player() then - if not minetest.is_protected(obj:getpos(), owner) and (prefer == "" or obj:get_player_name()== prefer) then -- move player only from owners land - obj:moveto(pos2, false) - teleport_any = true; - end - else - - local lua_entity = obj:get_luaentity(); - local detected_obj = lua_entity.name or "" - if not basic_machines.no_teleport_table[detected_obj] then -- object on no teleport list - if times > 0 then - local finalmove = true; - -- move objects with set velocity in target direction - obj:setvelocity(velocityv); - if obj:get_luaentity() then -- interaction with objects like carts - if lua_entity.name then - if lua_entity.name == "basic_machines:ball" then -- move balls for free - lua_entity.velocity = {x=velocityv.x*times,y=velocityv.y*times,z=velocityv.z*times}; - finalmove = false; - finalsound = false; - end - if lua_entity.name == "carts:cart" then -- just accelerate cart - lua_entity.velocity = {x=velocityv.x*times,y=velocityv.y*times,z=velocityv.z*times}; - fuel = fuel - fuel_cost; meta:set_float("fuel",fuel); - meta:set_string("infotext", "Mover block. Fuel "..fuel); - return; - end - end - end - --obj:setacceleration({x=0,y=0,z=0}); - if finalmove then -- dont move objects like balls to destination after delay - minetest.after(times, function () if obj then obj:setvelocity({x=0,y=0,z=0}); obj:moveto(pos2, false) end end); - end - else - obj:moveto(pos2, false) - end - end - teleport_any = true; - end - end - - if teleport_any then - fuel = fuel - fuel_cost; meta:set_float("fuel",fuel); - meta:set_string("infotext", "Mover block. Fuel "..fuel); - if finalsound then minetest.sound_play("tng_transporter1", {pos=pos2,gain=1.0,max_hear_distance = 8,}) end - end - - return - end - - - local dig=false; if mode == "dig" then dig = true; end -- digs at target location - local drop = false; if mode == "drop" then drop = true; end -- drops node instead of placing it - local harvest = false; -- harvest mode for special nodes: mese crystals - - - -- decide what to do if source or target are chests - local source_chest=false; if string.find(node1.name,"default:chest") then source_chest=true end - if node1.name == "air" then return end -- nothing to move - - local target_chest = false - if node2.name == "default:chest" or node2.name == "default:chest_locked" then - target_chest = true - end - - if not(target_chest) and not(mode=="inventory") and minetest.get_node(pos2).name ~= "air" then return end -- do nothing if target nonempty and not chest - - local invName1="";local invName2=""; - if mode == "inventory" then - invName1 = meta:get_string("inv1");invName2 = meta:get_string("inv2"); - if mreverse == 1 then -- reverse inventory names too - local invNamet = invName1;invName1=invName2;invName2=invNamet; - end - end - - - -- inventory mode - if mode == "inventory" then - --if prefer == "" then meta:set_string("infotext", "Mover block. must set nodes to move (filter) in inventory mode."); return; end - - -- forbidden nodes to take from in inventory mode - to prevent abuses : - if basic_machines.limit_inventory_table[node1.name] then - if basic_machines.limit_inventory_table[node1.name][invName1] then -- forbidden to take from this inventory - return - end - end - - local stack, meta1,inv1; - if prefer == "" then -- if prefer == "" then just pick one item from chest to transfer - meta1 = minetest.get_meta(pos1); - inv1 = meta1:get_inventory(); - if inv1:is_empty(invName1) then return end -- nothing to move - - local size = inv1:get_size(invName1); - - local found = false; - for i = 1, size do -- find item to move in inventory - stack = inv1:get_stack(invName1, i); - if not stack:is_empty() then found = true break end - end - if not found then return end - end - - -- can we move item to target inventory? - if prefer~="" then - stack = ItemStack(prefer); - end - local meta2 = minetest.get_meta(pos2); local inv2 = meta2:get_inventory(); - if not inv2:room_for_item(invName2, stack) then return end - - -- add item to target inventory and remove item from source inventory - if prefer~="" then - meta1 = minetest.get_meta(pos1); inv1 = meta1:get_inventory(); - end - - if inv1:contains_item(invName1, stack) then - inv2:add_item(invName2, stack); - inv1:remove_item(invName1, stack); - else - if upgrade == -1 then -- admin is owner.. just add stuff - inv2:add_item(invName2, stack); - else - return -- item not found in chest - end - end - - minetest.sound_play("chest_inventory_move", {pos=pos2,gain=1.0,max_hear_distance = 8,}) - fuel = fuel - fuel_cost; meta:set_float("fuel",fuel); - meta:set_string("infotext", "Mover block. Fuel "..fuel); - return - end - - -- filtering - if prefer~="" then -- prefered node set - if prefer~=node1.name and not source_chest and mode ~= "inventory" then return end -- only take prefered node or from chests/inventories - if source_chest then -- take stuff from chest - - local cmeta = minetest.get_meta(pos1); - local inv = cmeta:get_inventory(); - local stack = ItemStack(prefer); - - if inv:contains_item("main", stack) then - inv:remove_item("main", stack); - else - return - end - - if mreverse == 1 then -- planting mode: check if transform seed->plant is needed - if basic_machines.plant_table[prefer]~=nil then - prefer = basic_machines.plant_table[prefer]; - end - end - end - - node1 = {}; node1.name = prefer; - end - - if (prefer == "" and source_chest) then return end -- doesnt know what to take out of chest/inventory - - - -- if target chest put in chest - if target_chest then - local cmeta = minetest.get_meta(pos2); - local inv = cmeta:get_inventory(); - - -- dig tree or cactus - local count = 0;-- check for cactus or tree - local dig_up = false; -- digs up node as a tree - if dig then - - if not source_chest and basic_machines.dig_up_table[node1.name] then dig_up = true end - -- do we harvest the node? - if not source_chest then - if basic_machines.harvest_table[node1.name]~=nil then - harvest = true - local remains = basic_machines.harvest_table[node1.name][1]; - local result = basic_machines.harvest_table[node1.name][2]; - minetest.set_node(pos1,{name=remains}); - inv:add_item("main",result); - end - end - - - if dig_up == true then -- dig up to 16 nodes - - local r = 1; if node1.name == "default:cactus" or node1.name == "default:papyrus" then r = 0 end - - local positions = minetest.find_nodes_in_area( -- - {x=pos1.x-r, y=pos1.y, z=pos1.z-r}, - {x=pos1.x+r, y=pos1.y+16, z=pos1.z+r}, - node1.name) - - for _, pos3 in ipairs(positions) do - --if count>16 then break end - minetest.set_node(pos3,{name="air"}); count = count+1; - end - - inv:add_item("main", node1.name .. " " .. count-1);-- if tree or cactus was digged up - end - - - -- minetest drop code emulation - if not harvest then - local table = minetest.registered_items[node1.name]; - if table~=nil then --put in chest - if table.drop~= nil then -- drop handling - if table.drop.items then - --handle drops better, emulation of drop code - local max_items = table.drop.max_items or 0; - if max_items==0 then -- just drop all the items (taking the rarity into consideration) - max_items = #table.drop.items or 0; - end - local drop = table.drop; - local i = 0; - for k,v in pairs(drop.items) do - if i > max_items then break end; i=i+1; - local rare = v.rarity or 1; - if math.random(1, rare)==1 then - node1={};node1.name = v.items[math.random(1,#v.items)]; -- pick item randomly from list - inv:add_item("main",node1.name); - - end - end - else - inv:add_item("main",table.drop); - end - else - inv:add_item("main",node1.name); - end - end - end - - else -- if not dig just put it in - inv:add_item("main",node1.name); - end - - end - - - minetest.sound_play("transporter", {pos=pos2,gain=1.0,max_hear_distance = 8,}) - - if target_chest and source_chest then -- chest to chest transport has lower cost, *0.1 - fuel_cost=fuel_cost*0.1; - end - - fuel = fuel - fuel_cost; meta:set_float("fuel",fuel); - meta:set_string("infotext", "Mover block. Fuel "..fuel); - - - if mode == "transport" then -- transport nodes parallel as defined by source1 and target, clone with complete metadata - local meta1 = minetest.get_meta(pos1):to_table(); - - minetest.set_node(pos2, minetest.get_node(pos1)); - minetest.get_meta(pos2):from_table(meta1); - minetest.set_node(pos1,{name="air"});minetest.get_meta(pos1):from_table(nil) - return; - end - - -- REMOVE DIGGED NODE - if not(target_chest) then - if not drop then minetest.set_node(pos2, {name = node1.name}); end - if drop then - local stack = ItemStack(node1.name); - minetest.add_item(pos2,stack) -- drops it - end - end - if not(source_chest) and not(harvest) then - if dig then nodeupdate(pos1) end - minetest.set_node(pos1, {name = "air"}); - end - end, - - - action_off = function (pos, node,ttl) -- this toggles reverse option of mover - if type(ttl)~="number" then ttl = 1 end - local meta = minetest.get_meta(pos); - local mreverse = meta:get_int("reverse"); - if mreverse == 1 then mreverse = 0 elseif mreverse==0 then mreverse = 1 end - meta:set_int("reverse",mreverse); - end - - - } - } -}) - --- KEYPAD -- - -local function use_keypad(pos,ttl, again) -- position, time to live ( how many times can signal travel before vanishing to prevent infinite recursion ), do we want to activate again - - if ttl<0 then return end; - local meta = minetest.get_meta(pos); - - local t0 = meta:get_int("t"); - local t1 = minetest.get_gametime(); - local T = meta:get_int("T"); -- temperature - - if t0>t1-machines_minstep then -- activated before natural time - T=T+1; - else - if T>0 then - T=T-1 - if t1-t0>5 then T = 0 end - end - end - meta:set_int("T",T); - meta:set_int("t",t1); -- update last activation time - - if T > 2 then -- overheat - minetest.sound_play("default_cool_lava",{pos = pos, max_hear_distance = 16, gain = 0.25}) - meta:set_string("infotext","overheat: temperature ".. T) - return - end - - - local name = meta:get_string("owner"); - if minetest.is_protected(pos,name) then meta:set_string("infotext", "Protection fail. reset."); meta:set_int("count",0); return end - local count = meta:get_int("count") or 0; -- counts how many repeats left - - local repeating = meta:get_int("repeating"); - - if repeating==1 and again~=1 then - -- stop it - meta:set_int("repeating",0); - meta:set_int("count", 0) - meta:set_int("T",4); - meta:set_string("infotext", "#KEYPAD: reseting. Punch again after 5s to activate") - return; - end - - - - if count>0 then -- this is keypad repeating its activation - count = count - 1; meta:set_int("count",count); - else - meta:set_int("repeating",0); - --return - end - - if count>=0 then - meta:set_string("infotext", "Keypad operation: ".. count .." cycles left") - else - meta:set_string("infotext", "Keypad operation: activation ".. -count) - end - - if count>0 then -- only trigger repeat if count on - if repeating == 0 then meta:set_int("repeating",1); end-- its repeating now - if basic_machines.clockgen==0 then return end - minetest.after(machines_timer, function() - use_keypad(pos,machines_TTL,1) - end ) - - end - - local x0,y0,z0,mode; - x0=meta:get_int("x0");y0=meta:get_int("y0");z0=meta:get_int("z0"); - x0=pos.x+x0;y0=pos.y+y0;z0=pos.z+z0; - mode = meta:get_int("mode"); - - -- pass the signal on to target, depending on mode - - local tpos = {x=x0,y=y0,z=z0}; -- target position - local node = minetest.get_node(tpos);if not node.name then return end -- error - local text = meta:get_string("text"); - - if text ~= "" then -- TEXT MODE; set text on target - if text == "@" then -- keyboard mode, set text from input - text = meta:get_string("input") or ""; - meta:set_string("input",""); -- clear input again - end - - local bit = string.byte(text); - if bit == 33 then -- if text starts with !, then we send chat text to all nearby players, radius 5 - text = string.sub(text,2) ; if not text or text == "" then return end - local players = minetest.get_connected_players(); - for _,player in pairs(players) do - local pos1 = player:getpos(); - local dist = math.sqrt((pos1.x-tpos.x)^2 + (pos1.y-tpos.y)^2 + (pos1.z-tpos.z)^2 ); - if dist<=5 then - minetest.chat_send_player(player:get_player_name(), text) - end - end - return - elseif bit == 36 then-- text starts with $, play sound - text = string.sub(text,2) ; if not text or text == "" then return end - minetest.sound_play(text, {pos=pos,gain=1.0,max_hear_distance = 16,}) - end - - local tmeta = minetest.get_meta(tpos);if not tmeta then return end - - if basic_machines.signs[node.name] then -- update text on signs with signs_lib - tmeta:set_string("infotext", text); - tmeta:set_string("text",text); - local table = minetest.registered_nodes[node.name]; - if not table.on_punch then return end -- error - if signs_lib and signs_lib.update_sign then - --signs_lib.update_sign(pos) - table.on_punch(tpos, node, nil); -- warning - this can cause problems if no signs_lib installed - end - - return - end - - -- target is keypad, special functions: @, % that output to target keypad text - if node.name == "basic_machines:keypad" then -- special modify of target keypad text and change its target - - x0=tmeta:get_int("x0");y0=tmeta:get_int("y0");z0=tmeta:get_int("z0"); - x0=tpos.x+x0;y0=tpos.y+y0;z0=tpos.z+z0; - tpos = {x=x0,y=y0,z=z0}; - - if string.byte(text) == 64 then -- target keypad's text starts with @ ( ascii code 64) -> character replacement - text = string.sub(text,2); if not text or text == "" then return end - --read words[j] from blocks above keypad: - local j=0; - text = string.gsub(text, "@", - function() - j=j+1; - return minetest.get_meta({x=pos.x,y=pos.y+j,z=pos.z}):get_string("infotext") - end - ) ; -- replace every @ in ttext with string on blocks above - - -- set target keypad's text xxx - --tmeta = minetest.get_meta(tpos);if not tmeta then return end - tmeta:set_string("text", text); - elseif string.byte(text) == 37 then -- target keypad's text starts with % ( ascii code 37) -> word extraction - - local ttext = minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}):get_string("infotext") - local i = tonumber(string.sub(text,2,2)) or 1; --read the number following the % - --extract i-th word from text - local j = 0; - for word in string.gmatch(ttext, "%S+") do - j=j+1; if j == i then text = word; break; end - end - - -- set target keypad's target's text - --tmeta = minetest.get_meta(tpos); if not tmeta then return end - tmeta:set_string("text", text); - else - - if string.byte(text) == 64 then -- if text starts with @ clear target keypad text - tmeta:set_string("text",""); - return - end - -- just set text.. - --tmeta = minetest.get_meta(tpos); if not tmeta then return end - tmeta:set_string("infotext", text); - end - return - end - - if node.name == "basic_machines:detector" then -- change filter on detector - if string.byte(text) == 64 then -- if text starts with @ clear the filter - tmeta:set_string("node",""); - else - tmeta:set_string("node",text); - end - return - end - - if node.name == "basic_machines:mover" then -- change filter on mover - if string.byte(text) == 64 then -- if text starts with @ clear the filter - tmeta:set_string("prefer",""); - else - tmeta:set_string("prefer",text); - end - return - end - - if node.name == "basic_machines:distributor" then - local i = string.find(text," "); - if i then - local ti = tonumber(string.sub(text,1,i-1)) or 1; - local tm = tonumber(string.sub(text,i+1)) or 1; - if ti>=1 and ti<=16 and tm>=-2 and tm<=2 then - tmeta:set_int("active"..ti,tm) - end - end - return - end - - tmeta:set_string("infotext", text); -- else just set text - end - - - --activate target - local table = minetest.registered_nodes[node.name]; - if not table then return end -- error - if not table.mesecons then return end -- error - if not table.mesecons.effector then return end -- error - local effector=table.mesecons.effector; - - if mode == 3 then -- keypad in toggle mode - local state = meta:get_int("state") or 0;state = 1-state; meta:set_int("state",state); - if state == 0 then mode = 1 else mode = 2 end - end - -- pass the signal on to target - - if mode == 2 then -- on - if not effector.action_on then return end - effector.action_on(tpos,node,ttl-1); -- run - elseif mode == 1 then -- off - if not effector.action_off then return end - effector.action_off(tpos,node,ttl-1); -- run - end - -end - -local function check_keypad(pos,name,ttl) -- called only when manually activated via punch - local meta = minetest.get_meta(pos); - local pass = meta:get_string("pass"); - if pass == "" then - local iter = meta:get_int("iter"); - local count = meta:get_int("count"); - if count value - - for i in pairs( list1) do - inv_list1 = inv_list1 .. i .. ","; - if i == inv1m then inv1=j end; j=j+1; - end - - node=meta:get_string("node") or ""; - NOT=meta:get_int("NOT"); - local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z - local form = - "size[4,6.25]" .. -- width, height - "field[0.25,0.5;1,1;x0;source1;"..x0.."] field[1.25,0.5;1,1;y0;;"..y0.."] field[2.25,0.5;1,1;z0;;"..z0.."]".. - "dropdown[3,0.25;1,1;op; ,AND,OR;".. op .."]".. - "field[0.25,1.5;1,1;x1;source2;"..x1.."] field[1.25,1.5;1,1;y1;;"..y1.."] field[2.25,1.5;1,1;z1;;"..z1.."]".. - "field[0.25,2.5;1,1;x2;target;"..x2.."] field[1.25,2.5;1,1;y2;;"..y2.."] field[2.25,2.5;1,1;z2;;"..z2.."]".. - "field[0.25,3.5;2,1;node;Node/player/object: ;"..node.."]".."field[3.25,2.5;1,1;r;radius;"..r.."]".. - "dropdown[0,4.5;3,1;mode;node,player,object,inventory,infotext,light;".. mode .."]".. - "dropdown[0,5.5;3,1;inv1;"..inv_list1..";".. inv1 .."]".. - "label[0.,4.0;" .. minetest.colorize("lawngreen", "MODE selection") .. "]".. - "label[0.,5.2;inventory selection]".. - "field[2.25,3.5;2,1;NOT;filter out -2/-1/0/1/2/3/4;"..NOT.."]".. - "button[3.,4.4;1,1;help;help] button_exit[3.,5.4;1,1;OK;OK] " - - --if meta:get_string("owner")==player:get_player_name() then - minetest.show_formspec(player:get_player_name(), "basic_machines:detector_"..minetest.pos_to_string(pos), form) - -- else - -- minetest.show_formspec(player:get_player_name(), "view_only_basic_machines_detector", form) - -- end - end, - - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - return 0 - end, - - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - return 0 - end, - - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos); - local mode = "node"; - if to_index == 2 then - mode = "player"; - meta:set_int("r",math.max(meta:get_int("r"),1)) - end - if to_index == 3 then - mode = "object"; - meta:set_int("r",math.max(meta:get_int("r"),1)) - end - meta:set_string("mode",mode) - minetest.chat_send_player(player:get_player_name(), "DETECTOR: Mode of operation set to: "..mode) - return count - end, - - mesecons = {effector = { - action_on = function (pos, node,ttl) - if ttl<0 then return end - - local meta = minetest.get_meta(pos); - - local t0 = meta:get_int("t"); - local t1 = minetest.get_gametime(); - local T = meta:get_int("T"); -- temperature - - if t0>t1-machines_minstep then -- activated before natural time - T=T+1; - else - if T>0 then T=T-1 end - end - meta:set_int("T",T); - meta:set_int("t",t1); -- update last activation time - - if T > 2 then -- overheat - minetest.sound_play("default_cool_lava",{pos = pos, max_hear_distance = 16, gain = 0.25}) - meta:set_string("infotext","overheat: temperature ".. T) - return - end - - - local x0,y0,z0,x1,y1,z1,x2,y2,z2,r,node,NOT,mode,op; - x0=meta:get_int("x0")+pos.x;y0=meta:get_int("y0")+pos.y;z0=meta:get_int("z0")+pos.z; - x2=meta:get_int("x2")+pos.x;y2=meta:get_int("y2")+pos.y;z2=meta:get_int("z2")+pos.z; - - r = meta:get_int("r") or 0; NOT = meta:get_int("NOT") - node=meta:get_string("node") or ""; mode=meta:get_string("mode") or ""; op = meta:get_string("op") or ""; - - local trigger = false - local detected_obj = ""; - - if mode == "node" then - local tnode = minetest.get_node({x=x0,y=y0,z=z0}).name; -- read node at source position - detected_obj = tnode; - - if node~="" and string.find(tnode,"default:chest") then -- if source is chest, look inside chest for items - local cmeta = minetest.get_meta({x=x0,y=y0,z=z0}); - local inv = cmeta:get_inventory(); - local stack = ItemStack(node) - if inv:contains_item("main", stack) then trigger = true end - else -- source not a chest - if (node=="" and tnode~="air") or node == tnode then trigger = true end - if r>0 and node~="" then - local found_node = minetest.find_node_near({x=x0, y=y0, z=z0}, r, {node}) - if node ~= "" and found_node then trigger = true end - end - end - - -- operation: AND, OR... look at other source position too - if op~= "" then - local trigger1 = false; - x1=meta:get_int("x1")+pos.x;y1=meta:get_int("y1")+pos.y;z1=meta:get_int("z1")+pos.z; - tnode = minetest.get_node({x=x1,y=y1,z=z1}).name; -- read node at source position - - if node~="" and string.find(tnode,"default:chest") then -- it source is chest, look inside chest for items - local cmeta = minetest.get_meta({x=x1,y=y1,z=z1}); - local inv = cmeta:get_inventory(); - local stack = ItemStack(node) - if inv:contains_item("main", stack) then trigger1 = true end - else -- source not a chest - if (node=="" and tnode~="air") or node == tnode then trigger1 = true end - if r>0 and node~="" then - local found_node = minetest.find_node_near({x=x0, y=y0, z=z0}, r, {node}) - if node ~= "" and found_node then trigger1 = true end - end - end - if op == "AND" then - trigger = trigger and trigger1; - elseif op == "OR" then - trigger = trigger or trigger1; - end - end - - elseif mode=="inventory" then - local cmeta = minetest.get_meta({x=x0,y=y0,z=z0}); - local inv = cmeta:get_inventory(); - local stack = ItemStack(node); - local inv1m =meta:get_string("inv1"); - if inv:contains_item(inv1m, stack) then trigger = true end - elseif mode == "infotext" then - local cmeta = minetest.get_meta({x=x0,y=y0,z=z0}); - detected_obj = cmeta:get_string("infotext"); - if detected_obj == node or node =="" then trigger = true end - elseif mode == "light" then - detected_obj=minetest.get_node_light({x=x0,y=y0,z=z0}) or 0; - if detected_obj>=(tonumber(node) or 0) or node == "" then trigger = true end - else -- players/objects - local objects = minetest.get_objects_inside_radius({x=x0,y=y0,z=z0}, r) - local player_near=false; - for _,obj in pairs(objects) do - if mode == "player" then - if obj:is_player() then - - player_near = true - detected_obj = obj:get_player_name(); - if (node=="" or detected_obj==node) then - trigger = true break - end - - end; - elseif mode == "object" and not obj:is_player() then - if obj:get_luaentity() then - detected_obj = obj:get_luaentity().itemstring or ""; - if detected_obj == "" then - detected_obj = obj:get_luaentity().name or "" - end - - if detected_obj==node then trigger=true break end - end - if node=="" then trigger = true break end - end - end - - if node~="" and NOT==-1 and not(trigger) and not(player_near) and mode == "player" then - trigger = true - end-- name specified, but noone around and negation -> 0 - - end - - -- negation and output filtering - local state = meta:get_int("state"); - - - if NOT == 1 then -- just go on normally - -- -2: only false, -1: NOT, 0: no signal, 1: normal signal: 2: only true - elseif NOT == -1 then trigger = not trigger -- NEGATION - elseif NOT == -2 and trigger then return -- ONLY FALSE - elseif NOT == 0 then return -- do nothing - elseif NOT == 2 and not trigger then return -- ONLY TRUE - elseif NOT == 3 and ((trigger and state == 1) or (not trigger and state == 0)) then return -- no change of state - end - - local nstate; - if trigger then nstate = 1 else nstate=0 end -- next detector output state - if nstate~=state then meta:set_int("state",nstate) end -- update state if changed - - - local node = minetest.get_node({x=x2,y=y2,z=z2});if not node.name then return end -- error - local table = minetest.registered_nodes[node.name]; - if not table then return end -- error - if not table.mesecons then return end -- error - if not table.mesecons.effector then return end -- error - local effector=table.mesecons.effector; - - if trigger then -- activate target node if succesful - meta:set_string("infotext", "detector: on"); - if not effector.action_on then return end - if NOT == 4 then -- set detected object name as target text (target must be keypad, if not changes infotext) - if minetest.get_node({x=x2,y=y2,z=z2}).name == "basic_machines:keypad" then - detected_obj = detected_obj or ""; - local tmeta = minetest.get_meta({x=x2,y=y2,z=z2}); - tmeta:set_string("text",detected_obj); - end - end - effector.action_on({x=x2,y=y2,z=z2},node,ttl-1); -- run - else - meta:set_string("infotext", "detector: off"); - if not effector.action_off then return end - effector.action_off({x=x2,y=y2,z=z2},node,ttl-1); -- run - end - end - } - } -}) - - -minetest.register_chatcommand("clockgen", { -- test: toggle machine running with clockgens, useful for debugging --- i.e. seeing how machines running affect server performance - description = "", - privs = { - interact = true - }, - func = function(name, param) - local privs = minetest.get_player_privs(name); - if not privs.privs then return end - local player = minetest.get_player_by_name(name); - if basic_machines.clockgen == 0 then basic_machines.clockgen = 1 else basic_machines.clockgen = 0 end - minetest.chat_send_player(name, "#clockgen set to " .. basic_machines.clockgen); - end -}) - - --- CLOCK GENERATOR : periodically activates machine on top of it -minetest.register_abm({ - nodenames = {"basic_machines:clockgen"}, - neighbors = {""}, - interval = machines_timer, - chance = 1, - - action = function(pos, node, active_object_count, active_object_count_wider) - if basic_machines.clockgen == 0 then return end - local meta = minetest.get_meta(pos); - local machines = meta:get_int("machines"); - if machines~=1 then -- no machines privilege - if not minetest.get_player_by_name(meta:get_string("owner")) then -- owner not online - return - end - end - - pos.y=pos.y+1; - node = minetest.get_node(pos);if not node.name or node.name == "air" then return end - local table = minetest.registered_nodes[node.name]; - if table and table.mesecons and table.mesecons.effector then -- check if all elements exist, safe cause it checks from left to right - else return - end - local effector=table.mesecons.effector; - if effector.action_on then - effector.action_on(pos,node,machines_TTL); - end - end - }); - -minetest.register_node("basic_machines:clockgen", { - description = "Clock generator - use sparingly, continually activates top block", - tiles = {"basic_machine_clock_generator.png"}, - groups = {cracky=3, mesecon_effector_on = 1}, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos); - local owner = placer:get_player_name() or ""; - local privs = minetest.get_player_privs(owner); - if privs.machines then meta:set_int("machines",1) end - - meta:set_string("owner",owner); - meta:set_string("infotext","clock generator (owned by " .. owner .. "): place machine to be activated on top of generator"); - end -}) - - - --- DISTRIBUTOR -- -local get_distributor_form = function(pos,player) - if not player then return end - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - local cant_build = minetest.is_protected(pos,player:get_player_name()); - --meta:get_string("owner")~=player:get_player_name() and - if not privs.privs and cant_build then - return - end - - local p = {}; local active = {}; - local n = meta:get_int("n"); - local delay = meta:get_float("delay"); - for i =1,n do - p[i]={x=meta:get_int("x"..i),y=meta:get_int("y"..i),z=meta:get_int("z"..i)}; - active[i]=meta:get_int("active"..i); - end - - local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z - local form = - "size[7,"..(0.75+(n)*0.75).."]" .. -- width, height - "label[0,-0.25;" .. minetest.colorize("lawngreen","target: x y z, MODE -2=only OFF, -1=NOT input/0/1=input, 2 = only ON") .. "]"; - for i =1,n do - form = form.."field[0.25,"..(0.5+(i-1)*0.75)..";1,1;x"..i..";;"..p[i].x.."] field[1.25,"..(0.5+(i-1)*0.75)..";1,1;y"..i..";;"..p[i].y.."] field[2.25,"..(0.5+(i-1)*0.75)..";1,1;z"..i..";;"..p[i].z.."] field [ 3.25,"..(0.5+(i-1)*0.75)..";1,1;active"..i..";;" .. active[i] .. "]" - form = form .. "button[4.,"..(0.25+(i-1)*0.75)..";1.5,1;SHOW"..i..";SHOW "..i.."]".."button_exit[5.25,"..(0.25+(i-1)*0.75)..";1,1;SET"..i..";SET]".."button[6.25,"..(0.25+(i-1)*0.75)..";1,1;X"..i..";X]" - end - - form=form.."button_exit[4.25,"..(0.25+(n)*0.75)..";1,1;ADD;ADD]".."button_exit[3.,"..(0.25+(n)*0.75)..";1,1;OK;OK]".."field[0.25,"..(0.5+(n)*0.75)..";1,1;delay;delay;"..delay .. "]"; - form = form.."button[6.25,"..(0.25+(n)*0.75)..";1,1;help;help]"; - return form - -end - - -minetest.register_node("basic_machines:distributor", { - description = "Distributor - can forward signal up to 16 different targets", - tiles = {"distributor.png"}, - groups = {cracky=3, mesecon_effector_on = 1}, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos, placer) - local meta = minetest.env:get_meta(pos) - meta:set_string("infotext", "Distributor. Right click/punch to set it up.") - meta:set_string("owner", placer:get_player_name()); meta:set_int("public",0); - for i=1,10 do - meta:set_int("x"..i,0);meta:set_int("y"..i,1);meta:set_int("z"..i,0);meta:set_int("active"..i,1) -- target i - end - meta:set_int("n",2); -- how many targets initially - meta:set_float("delay",0); -- delay when transmitting signal - - - meta:set_int("public",0); -- can other ppl set it up? - local name = placer:get_player_name();punchset[name] = {}; punchset[name].node = ""; punchset[name].state = 0 - end, - - mesecons = {effector = { - action_on = function (pos, node,ttl) - if type(ttl)~="number" then ttl = 1 end - if not(ttl>0) then return end - local meta = minetest.get_meta(pos); - - local t0 = meta:get_int("t"); - local t1 = minetest.get_gametime(); - local T = meta:get_int("T"); -- temperature - - if t0>t1-machines_minstep then -- activated before natural time - T=T+1; - else - if T>0 then - T=T-1 - if t1-t0>5 then T = 0 end -- reset temperature if more than 5s elapsed since last punch - end - - end - meta:set_int("T",T); - meta:set_int("t",t1); -- update last activation time - - if T > 2 then -- overheat - minetest.sound_play("default_cool_lava",{pos = pos, max_hear_distance = 16, gain = 0.25}) - meta:set_string("infotext","overheat: temperature ".. T) - return - end - - local delay = minetest.get_meta(pos):get_float("delay"); - - local activate = function() - local posf = {}; local active = {}; - local n = meta:get_int("n");local delay = meta:get_float("delay"); - for i =1,n do - posf[i]={x=meta:get_int("x"..i)+pos.x,y=meta:get_int("y"..i)+pos.y,z=meta:get_int("z"..i)+pos.z}; - active[i]=meta:get_int("active"..i); - end - - local table,node; - - for i=1,n do - if active[i]~=0 then - node = minetest.get_node(posf[i]);if not node.name then return end -- error - table = minetest.registered_nodes[node.name]; - - if table and table.mesecons and table.mesecons.effector then -- check if all elements exist, safe cause it checks from left to right - -- alternative way: overkill - --ret = pcall(function() if not table.mesecons.effector then end end); -- exception handling to determine if structure exists - - local effector=table.mesecons.effector; - local active_i = active[i]; - - if (active_i == 1 or active_i == 2) and effector.action_on then -- normal OR only forward input ON - effector.action_on(posf[i],node,ttl-1); - elseif active_i == -1 and effector.action_off then - effector.action_off(posf[i],node,ttl-1) - end - end - - end - end - end - - if delay>0 then - minetest.after(delay, activate) - elseif delay == 0 then - activate() - else -- delay <0 - do random activation: delay = -500 means 500/1000 chance to activate - if math.random(1000)<=-delay then - activate() - end - end - - end, - - action_off = function (pos, node,ttl) - - if type(ttl)~="number" then ttl = 1 end - if not(ttl>0) then return end - local meta = minetest.get_meta(pos); - - - local t0 = meta:get_int("t"); - local t1 = minetest.get_gametime(); - local T = meta:get_int("T"); -- temperature - - if t0>t1-machines_minstep then -- activated before natural time - T=T+1; - else - if T>0 then T=T-1 end - end - meta:set_int("T",T); - meta:set_int("t",t1); -- update last activation time - - if T > 2 then -- overheat - minetest.sound_play("default_cool_lava",{pos = pos, max_hear_distance = 16, gain = 0.25}) - meta:set_string("infotext","overheat: temperature ".. T) - return - end - local delay = minetest.get_meta(pos):get_float("delay"); - - local activate = function() - local posf = {}; local active = {}; - local n = meta:get_int("n"); - for i =1,n do - posf[i]={x=meta:get_int("x"..i)+pos.x,y=meta:get_int("y"..i)+pos.y,z=meta:get_int("z"..i)+pos.z}; - active[i]=meta:get_int("active"..i); - end - - local node, table - - - for i=1,n do - if active[i]~=0 then - node = minetest.get_node(posf[i]);if not node.name then return end -- error - table = minetest.registered_nodes[node.name]; - if table and table.mesecons and table.mesecons.effector then - local effector=table.mesecons.effector; - if (active[i] == 1 or active[i]==-2) and effector.action_off then -- normal OR only forward input OFF - effector.action_off(posf[i],node,ttl-1); - elseif (active[i] == -1) and effector.action_on then - effector.action_on(posf[i],node,ttl-1); - end - end - end - end - end - - if delay>0 then minetest.after(delay, activate) else activate() end - - end - } - }, - on_rightclick = function(pos, node, player, itemstack, pointed_thing) - local form = get_distributor_form(pos,player) - if form then minetest.show_formspec(player:get_player_name(), "basic_machines:distributor_"..minetest.pos_to_string(pos), form) end - end, - } -) - - --- LIGHT -- - -minetest.register_node("basic_machines:light_off", { - description = "Light off", - tiles = {"light_off.png"}, - groups = {cracky=3, mesecon_effector_on = 1}, - mesecons = {effector = { - action_on = function (pos, node,ttl) - minetest.swap_node(pos,{name = "basic_machines:light_on"}); - local meta = minetest.get_meta(pos); - local deactivate = meta:get_int("deactivate"); - - if deactivate > 0 then - --meta:set_int("active",0); - minetest.after(deactivate, - function() - --if meta:get_int("active") ~= 1 then -- was not activated again, so turn it off - minetest.swap_node(pos,{name = "basic_machines:light_off"}); -- turn off again - --meta:set_int("active",0); - --end - end - ) - end - end - } - }, -}) - - -minetest.register_node("basic_machines:light_on", { - description = "Light on", - tiles = {"light.png"}, - groups = {cracky=3, mesecon_effector_on = 1}, - light_source = LIGHT_MAX, - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos); - local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z - local deactivate = meta:get_int("deactivate"); - local form = "size[2,2] field[0.25,0.5;2,1;deactivate;deactivate after ;"..deactivate.."]".."button_exit[0.,1;1,1;OK;OK]"; - meta:set_string("formspec", form); - end, - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then return end - if fields.deactivate then - local meta = minetest.get_meta(pos); - local deactivate = tonumber(fields.deactivate) or 0; - if deactivate <0 or deactivate > 600 then deactivate = 0 end - meta:set_int("deactivate",deactivate); - local form = "size[2,2] field[0.25,0.5;2,1;deactivate;deactivate after ;"..deactivate.."]".."button_exit[0.,1;1,1;OK;OK]"; - meta:set_string("formspec", form); - end - - end, - - mesecons = {effector = { - action_off = function (pos, node,ttl) - minetest.swap_node(pos,{name = "basic_machines:light_off"}); - end, - action_on = function (pos, node,ttl) - local meta = minetest.get_meta(pos); - local count = tonumber(meta:get_string("infotext")) or 0; - meta:set_string("infotext",count+1); -- increase activate count - end - } - }, - -}) - - - -punchset.known_nodes = {["basic_machines:mover"]=true,["basic_machines:keypad"]=true,["basic_machines:detector"]=true}; - --- SETUP BY PUNCHING -minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) - - -- STRANGE PROBLEM: if player doesnt move it takes another punch at same block for this function to run again, and it works normally if player moved at least one block from his previous position - -- it only happens with keypad - maybe caused by formspec displayed.. - - local name = puncher:get_player_name(); if name==nil then return end - if punchset[name]== nil then -- set up punchstate - punchset[name] = {} - punchset[name].node = "" - punchset[name].pos1 = {x=0,y=0,z=0};punchset[name].pos2 = {x=0,y=0,z=0};punchset[name].pos = {x=0,y=0,z=0}; - punchset[name].state = 0; -- 0 ready for punch, 1 ready for start position, 2 ready for end position - return - end - - - -- check for known node names in case of first punch - if punchset[name].state == 0 and not punchset.known_nodes[node.name] then return end - -- from now on only punches with mover/keypad/... or setup punches - - if punchset.known_nodes[node.name] then -- check if player is suppose to be able to punch interact - if node.name~="basic_machines:keypad" then -- keypad is supposed to be punch interactive! - if minetest.is_protected(pos, name) then return end - end - end - - if node.name == "basic_machines:mover" then -- mover init code - if punchset[name].state == 0 then - -- if not puncher:get_player_control().sneak then - -- return - -- end - minetest.chat_send_player(name, "MOVER: Now punch source1, source2, end position to set up mover.") - punchset[name].node = node.name;punchset[name].pos = {x=pos.x,y=pos.y,z=pos.z}; - punchset[name].state = 1 - return - end - end - - if punchset[name].node == "basic_machines:mover" then -- mover code, not first punch - - if minetest.is_protected(pos,name) then - minetest.chat_send_player(name, "MOVER: Punched position is protected. aborting.") - punchset[name].node = ""; - punchset[name].state = 0; return - end - - local meta = minetest.get_meta(punchset[name].pos); if not meta then return end; - local range = meta:get_float("upgrade") or 1; range = range*max_range; - - if punchset[name].state == 1 then - local privs = minetest.get_player_privs(puncher:get_player_name()); - if not privs.privs and (math.abs(punchset[name].pos.x - pos.x)>range or math.abs(punchset[name].pos.y - pos.y)>range or math.abs(punchset[name].pos.z - pos.z)>range) then - minetest.chat_send_player(name, "MOVER: Punch closer to mover. reseting.") - punchset[name].state = 0; return - end - - if punchset[name].pos.x==pos.x and punchset[name].pos.y==pos.y and punchset[name].pos.z==pos.z then - minetest.chat_send_player(name, "MOVER: Punch something else. aborting.") - punchset[name].state = 0; - return - end - - punchset[name].pos1 = {x=pos.x,y=pos.y,z=pos.z};punchset[name].state = 2; - machines.pos1[name] = punchset[name].pos1;machines.mark_pos1(name) -- mark position - minetest.chat_send_player(name, "MOVER: Source1 position for mover set. Punch again to set source2 position.") - return - end - - - if punchset[name].state == 2 then - local privs = minetest.get_player_privs(puncher:get_player_name()); - if not privs.privs and (math.abs(punchset[name].pos.x - pos.x)>range or math.abs(punchset[name].pos.y - pos.y)>range or math.abs(punchset[name].pos.z - pos.z)>range) then - minetest.chat_send_player(name, "MOVER: Punch closer to mover. reseting.") - punchset[name].state = 0; return - end - - if punchset[name].pos.x==pos.x and punchset[name].pos.y==pos.y and punchset[name].pos.z==pos.z then - minetest.chat_send_player(name, "MOVER: Punch something else. aborting.") - punchset[name].state = 0; - return - end - - punchset[name].pos11 = {x=pos.x,y=pos.y,z=pos.z};punchset[name].state = 3; - machines.pos11[name] = {x=pos.x,y=pos.y,z=pos.z}; - machines.mark_pos11(name) -- mark pos11 - minetest.chat_send_player(name, "MOVER: Source2 position for mover set. Punch again to set target position.") - return - end - - - if punchset[name].state == 3 then - if punchset[name].node~="basic_machines:mover" then punchset[name].state = 0 return end - local privs = minetest.get_player_privs(puncher:get_player_name()); - - local elevator_mode = false; - if punchset[name].pos.x == pos.x and punchset[name].pos.z == pos.z then -- check if elevator mode - if math.abs(punchset[name].pos.y-pos.y)>3 then -- trying to make elevator? - - local meta = minetest.get_meta(punchset[name].pos); - if meta:get_string("mode")=="object" then -- only if object mode - --count number of diamond blocks to determine if elevator can be set up with this height distance - local inv = meta:get_inventory(); - local upgrade = 0; - if inv:get_stack("upgrade", 1):get_name() == "default:diamondblock" then - upgrade = (inv:get_stack("upgrade", 1):get_count()) or 0; - end - - local requirement = math.floor(math.abs(punchset[name].pos.y-pos.y)/100)+1; - if upgraderange or math.abs(punchset[name].pos.y - pos.y)>range or math.abs(punchset[name].pos.z - pos.z)>range) then - minetest.chat_send_player(name, "MOVER: Punch closer to mover. aborting.") - punchset[name].state = 0; return - end - - punchset[name].pos2 = {x=pos.x,y=pos.y,z=pos.z}; punchset[name].state = 0; - machines.pos2[name] = punchset[name].pos2;machines.mark_pos2(name) -- mark pos2 - - minetest.chat_send_player(name, "MOVER: End position for mover set.") - - local x0 = punchset[name].pos1.x-punchset[name].pos.x; - local y0 = punchset[name].pos1.y-punchset[name].pos.y; - local z0 = punchset[name].pos1.z-punchset[name].pos.z; - local meta = minetest.get_meta(punchset[name].pos); - - - local x1 = punchset[name].pos11.x-punchset[name].pos.x; - local y1 = punchset[name].pos11.y-punchset[name].pos.y; - local z1 = punchset[name].pos11.z-punchset[name].pos.z; - - - local x2 = punchset[name].pos2.x-punchset[name].pos.x; - local y2 = punchset[name].pos2.y-punchset[name].pos.y; - local z2 = punchset[name].pos2.z-punchset[name].pos.z; - - if x0>x1 then x0,x1 = x1,x0 end -- this ensures that x0<=x1 - if y0>y1 then y0,y1 = y1,y0 end - if z0>z1 then z0,z1 = z1,z0 end - - meta:set_int("x1",x1);meta:set_int("y1",y1);meta:set_int("z1",z1); - meta:set_int("x0",x0);meta:set_int("y0",y0);meta:set_int("z0",z0); - meta:set_int("x2",x2);meta:set_int("y2",y2);meta:set_int("z2",z2); - - meta:set_int("pc",0); meta:set_int("dim",(x1-x0+1)*(y1-y0+1)*(z1-z0+1)) - return - end - end - - -- KEYPAD - if node.name == "basic_machines:keypad" then -- keypad init/usage code - - local meta = minetest.get_meta(pos); - if not (meta:get_int("x0")==0 and meta:get_int("y0")==0 and meta:get_int("z0")==0) then -- already configured - check_keypad(pos,name)-- not setup, just standard operation - punchset[name].state = 0; - return; - else - if minetest.is_protected(pos, name) then return minetest.chat_send_player(name, "KEYPAD: You must be able to build to set up keypad.") end - --if meta:get_string("owner")~= name then minetest.chat_send_player(name, "KEYPAD: Only owner can set up keypad.") return end - if punchset[name].state == 0 then - minetest.chat_send_player(name, "KEYPAD: Now punch the target block.") - punchset[name].node = node.name;punchset[name].pos = {x=pos.x,y=pos.y,z=pos.z}; - punchset[name].state = 1 - return - end - end - end - - if punchset[name].node=="basic_machines:keypad" then -- keypad setup code - - if minetest.is_protected(pos,name) then - minetest.chat_send_player(name, "KEYPAD: Punched position is protected. aborting.") - punchset[name].node = ""; - punchset[name].state = 0; return - end - - if punchset[name].state == 1 then - local meta = minetest.get_meta(punchset[name].pos); - local x = pos.x-punchset[name].pos.x; - local y = pos.y-punchset[name].pos.y; - local z = pos.z-punchset[name].pos.z; - if math.abs(x)>max_range or math.abs(y)>max_range or math.abs(z)>max_range then - minetest.chat_send_player(name, "KEYPAD: Punch closer to keypad. reseting.") - punchset[name].state = 0; return - end - - machines.pos1[name] = pos; - machines.mark_pos1(name) -- mark pos1 - - meta:set_int("x0",x);meta:set_int("y0",y);meta:set_int("z0",z); - punchset[name].state = 0 - minetest.chat_send_player(name, "KEYPAD: Keypad target set with coordinates " .. x .. " " .. y .. " " .. z) - meta:set_string("infotext", "Punch keypad to use it."); - return - end - end - - -- DETECTOR "basic_machines:detector" - if node.name == "basic_machines:detector" then -- detector init code - local meta = minetest.get_meta(pos); - - --meta:get_string("owner")~= name - if minetest.is_protected(pos,name) then minetest.chat_send_player(name, "DETECTOR: You must be able to build to set up detector.") return end - if punchset[name].state == 0 then - minetest.chat_send_player(name, "DETECTOR: Now punch the source block.") - punchset[name].node = node.name; - punchset[name].pos = {x=pos.x,y=pos.y,z=pos.z}; - punchset[name].state = 1 - return - end - end - - if punchset[name].node == "basic_machines:detector" then - - if minetest.is_protected(pos,name) then - minetest.chat_send_player(name, "DETECTOR: Punched position is protected. aborting.") - punchset[name].node = ""; - punchset[name].state = 0; return - end - - if punchset[name].state == 1 then - if math.abs(punchset[name].pos.x - pos.x)>max_range or math.abs(punchset[name].pos.y - pos.y)>max_range or math.abs(punchset[name].pos.z - pos.z)>max_range then - minetest.chat_send_player(name, "DETECTOR: Punch closer to detector. aborting.") - punchset[name].state = 0; return - end - minetest.chat_send_player(name, "DETECTOR: Now punch the target machine.") - punchset[name].pos1 = {x=pos.x,y=pos.y,z=pos.z}; - machines.pos1[name] = pos;machines.mark_pos1(name) -- mark pos1 - punchset[name].state = 2 - return - end - - - if punchset[name].state == 2 then - if math.abs(punchset[name].pos.x - pos.x)>max_range or math.abs(punchset[name].pos.y - pos.y)>max_range or math.abs(punchset[name].pos.z - pos.z)>max_range then - minetest.chat_send_player(name, "DETECTOR: Punch closer to detector. aborting.") - punchset[name].state = 0; return - end - - if punchset[name].pos.x == pos.x and punchset[name].pos.y == pos.y and punchset[name].pos.z == pos.z then - minetest.chat_send_player(name, "DETECTOR: Punch something else. aborting.") - punchset[name].state = 0; return - end - - - minetest.chat_send_player(name, "DETECTOR: Setup complete.") - machines.pos2[name] = pos;machines.mark_pos2(name) -- mark pos2 - local x = punchset[name].pos1.x-punchset[name].pos.x; - local y = punchset[name].pos1.y-punchset[name].pos.y; - local z = punchset[name].pos1.z-punchset[name].pos.z; - local meta = minetest.get_meta(punchset[name].pos); - meta:set_int("x0",x);meta:set_int("y0",y);meta:set_int("z0",z); - x=pos.x-punchset[name].pos.x;y=pos.y-punchset[name].pos.y;z=pos.z-punchset[name].pos.z; - meta:set_int("x2",x);meta:set_int("y2",y);meta:set_int("z2",z); - punchset[name].state = 0 - return - end - end - - - if punchset[name].node == "basic_machines:distributor" then - - if minetest.is_protected(pos,name) then - minetest.chat_send_player(name, "DISTRIBUTOR: Punched position is protected. aborting.") - punchset[name].node = ""; - punchset[name].state = 0; return - end - - if punchset[name].state > 0 then - if math.abs(punchset[name].pos.x - pos.x)>max_range or math.abs(punchset[name].pos.y - pos.y)>max_range or math.abs(punchset[name].pos.z - pos.z)>max_range then - minetest.chat_send_player(name, "DISTRIBUTOR: Punch closer to distributor. aborting.") - punchset[name].state = 0; return - end - minetest.chat_send_player(name, "DISTRIBUTOR: target set.") - local meta = minetest.get_meta(punchset[name].pos); - local x = pos.x-punchset[name].pos.x; - local y = pos.y-punchset[name].pos.y; - local z = pos.z-punchset[name].pos.z; - local j = punchset[name].state; - - meta:set_int("x"..j,x);meta:set_int("y"..j,y);meta:set_int("z"..j,z); - if x==0 and y==0 and z==0 then meta:set_int("active"..j,0) end - machines.pos1[name] = pos;machines.mark_pos1(name) -- mark pos1 - punchset[name].state = 0; - return - end - - end - - - -end) - - --- FORM PROCESSING for all machines -minetest.register_on_player_receive_fields(function(player,formname,fields) - - -- MOVER - local fname = "basic_machines:mover_" - if string.sub(formname,0,string.len(fname)) == fname then - local pos_s = string.sub(formname,string.len(fname)+1); local pos = minetest.string_to_pos(pos_s) - local name = player:get_player_name(); if name==nil then return end - local meta = minetest.get_meta(pos) - local privs = minetest.get_player_privs(name); - if (minetest.is_protected(pos,name) and not privs.privs) or not fields then return end -- only builder can interact - - - if fields.help == "help" then - local text = "version " .. basic_machines.version .. "\nSETUP: For interactive setup ".. - "punch the mover and then punch source1, source2, target node (follow instructions). Put charged battery within distance 1 from mover. For advanced setup right click mover. Positions are defined by x y z coordinates (see top of mover for orientation). Mover itself is at coordinates 0 0 0. ".. - "\n\nMODES of operation: normal (just teleport block), dig (digs and gives you resulted node - good for harvesting farms), drop ".. - "(drops node on ground), object (teleportation of player and objects. distance between source1/2 defines teleport radius). by setting filter you can specify move time for objects or names for players. ".. - "By setting 'filter' only selected nodes are moved.\nInventory mode can exchange items between node inventories. You need to select inventory name for source/target from the dropdown list on the right and enter node to be moved into filter.".. - "\n*advanced* You can reverse start/end position by setting reverse nonzero. This is useful for placing stuff at many locations-planting. If you put reverse=2/3 in transport mode it will disable parallel transport but will still do reverse effect with 3. If you activate mover with OFF signal it will toggle reverse." .. - "\n\n FUEL CONSUMPTION depends on blocks to be moved and distance. For example, stone or tree is harder to move than dirt, harvesting wheat is very cheap and and moving lava is very hard.".. - "\n\n UPGRADE mover by moving mese blocks in upgrade inventory. Each mese block increases mover range by 10, fuel consumption is divided by (number of mese blocks)+1 in upgrade. Max 10 blocks are used for upgrade. Dont forget to click OK to refresh after upgrade. ".. - "\n\n Activate mover by keypad/detector signal or mese signal (if mesecons mod) ."; - local form = "size [6,7] textarea[0,0;6.5,8.5;help;MOVER HELP;".. text.."]" - minetest.show_formspec(name, "basic_machines:help_mover", form) - return - end - - if fields.tabs then - meta:set_int("seltab", tonumber(fields.tabs) or 1) - local form = get_mover_form(pos,player) - minetest.show_formspec(player:get_player_name(), "basic_machines:mover_"..minetest.pos_to_string(pos), form) - return - end - - if fields.OK == "OK" then --yyy - - local seltab = meta:get_int("seltab"); - - if seltab == 2 then -- POSITIONS - - -- positions - local x0,y0,z0,x1,y1,z1,x2,y2,z2; - x0=tonumber(fields.x0) or 0;y0=tonumber(fields.y0) or -1;z0=tonumber(fields.z0) or 0 - x1=tonumber(fields.x1) or 0;y1=tonumber(fields.y1) or -1;z1=tonumber(fields.z1) or 0 - x2=tonumber(fields.x2) or 0;y2=tonumber(fields.y2) or 1;z2=tonumber(fields.z2) or 0; - - -- did the numbers change from last time? - if meta:get_int("x0")~=x0 or meta:get_int("y0")~=y0 or meta:get_int("z0")~=z0 or - meta:get_int("x1")~=x1 or meta:get_int("y1")~=y1 or meta:get_int("z1")~=z1 or - meta:get_int("x2")~=x2 or meta:get_int("y2")~=y2 or meta:get_int("z2")~=z2 then - -- are new numbers inside bounds? - if not privs.privs and (math.abs(x1)>max_range or math.abs(y1)>max_range or math.abs(z1)>max_range or math.abs(x2)>max_range or math.abs(y2)>max_range or math.abs(z2)>max_range) then - minetest.chat_send_player(name,"#mover: all coordinates must be between ".. -max_range .. " and " .. max_range .. ". For increased range set up positions by punching"); return - end - end - - --local range = meta:get_float("upgrade") or 1; range = range * max_range; - - local x = x0; x0 = math.min(x,x1); x1 = math.max(x,x1); - local y = y0; y0 = math.min(y,y1); y1 = math.max(y,y1); - local z = z0; z0 = math.min(z,z1); z1 = math.max(z,z1); - - if minetest.is_protected({x=pos.x+x0,y=pos.y+y0,z=pos.z+z0},name) then - minetest.chat_send_player(name, "MOVER: position is protected. aborting.") - return - end - - if minetest.is_protected({x=pos.x+x1,y=pos.y+y1,z=pos.z+z1},name) then - minetest.chat_send_player(name, "MOVER: position is protected. aborting.") - return - end - - meta:set_int("x0",x0);meta:set_int("y0",y0);meta:set_int("z0",z0); - meta:set_int("x1",x1);meta:set_int("y1",y1);meta:set_int("z1",z1); - meta:set_int("dim",(x1-x0+1)*(y1-y0+1)*(z1-z0+1)) - meta:set_int("x2",x2);meta:set_int("y2",y2);meta:set_int("z2",z2); - - if fields.reverse then - meta:set_string("reverse",fields.reverse); - end - - if fields.inv1 then - meta:set_string("inv1",fields.inv1); - end - - if fields.inv2 then - meta:set_string("inv2",fields.inv2); - end - - meta:set_string("infotext", "Mover block. Set up with source coordinates ".. x0 ..","..y0..","..z0.. " -> ".. x1 ..","..y1..","..z1.. " and target coord ".. x2 ..","..y2..",".. z2 .. ". Put charged battery next to it and start it with keypad/mese signal."); - - else -- MODE - - if fields.mode then - meta:set_string("mode",fields.mode); - end - - - --filter - local prefer = fields.prefer or ""; - if meta:get_string("prefer")~=prefer then - meta:set_string("prefer",prefer); - end - end - - if meta:get_float("fuel")<0 then meta:set_float("fuel",0) end -- reset block - - -- display battery - local fpos = find_and_connect_battery(pos); - - if not fpos then - minetest.chat_send_player(name,"MOVER: please put battery nearby") - else - minetest.chat_send_player(name,"MOVER: battery found - displaying mark 1") - machines.pos1[name] = fpos; machines.mark_pos1(name) - end - - elseif fields.mode then - meta:set_string("mode",fields.mode); - local form = get_mover_form(pos,player) - minetest.show_formspec(player:get_player_name(), "basic_machines:mover_"..minetest.pos_to_string(pos), form) - return - end - - return - end - - -- KEYPAD - fname = "basic_machines:keypad_" - if string.sub(formname,0,string.len(fname)) == fname then - local pos_s = string.sub(formname,string.len(fname)+1); local pos = minetest.string_to_pos(pos_s) - local name = player:get_player_name(); if name==nil then return end - local meta = minetest.get_meta(pos) - local privs = minetest.get_player_privs(player:get_player_name()); - if (minetest.is_protected(pos,name) and not privs.privs) or not fields then return end -- only builder can interact - - if fields.help then - local text = "target : represents coordinates ( x, y, z ) relative to keypad. (0,0,0) is keypad itself, (0,1,0) is one node above, (0,-1,0) one node below. X coordinate axes goes from east to west, Y from down to up, Z from south to north.".. - "\n\nPassword: enter password and press OK. Password will be encrypted. Next time you use keypad you will need to enter correct password to gain access.".. - "\n\nrepeat: number to control how many times activation is repeated after initial punch".. - - "\n\ntext: if set then text on target node will be changed. In case target is detector/mover, filter settings will be changed. Can be used for special operations.".. - - "\n\n1=OFF/2=ON/3=TOGGLE control the way how target node is activated".. - - "\n**************************************************\nusage\n".. - - "\nJust punch ( left click ) keypad, then the target block will be activated.".. - "\nTo set text on other nodes ( text shows when you look at node ) just target the node and set nonempty text. Upon activation text will be set. When target node is another keypad, its \"text\" field will be set. When targets is mover/detector, its \"filter\" field will be set. To clear \"filter\" set text to \"@\". When target is distributor, you can change i-th target of distributor to mode mode with \"i mode\"".. - - "\n\nkeyboard : to use keypad as keyboard for text input write \"@\" in \"text\" field and set any password. Next time keypad is used it will work as text input device.".. - - "\n\ndisplaying messages to nearby players ( up to 5 blocks around keypad's target ): set text to \"!text\". Upon activation player will see \"text\" in their chat.".. - - "\n\nplaying sound to nearby players : set text to \"$sound_name\"".. - - "\n\nadvanced: ".. - "\ntext replacement : Suppose keypad A is set with text \"@some @. text @!\" and there are blocks on top of keypad A with infotext '1' and '2'. Suppose we target B with A and activate A. Then text of keypad B will be set to \"some 1. text 2!\"".. - "\nword extraction: Suppose similiar setup but now keypad A is set with text \"%1\". Then upon activation text of keypad B will be set to 1.st word of infotext"; - - local form = "size [6,7] textarea[0,0;6.5,8.5;help;KEYPAD HELP;".. text.."]" - minetest.show_formspec(name, "basic_machines:help_keypad", form) - return - end - - if fields.OK == "OK" then - local x0,y0,z0,pass,mode; - x0=tonumber(fields.x0) or 0;y0=tonumber(fields.y0) or 1;z0=tonumber(fields.z0) or 0 - pass = fields.pass or ""; mode = fields.mode or 1; - - if minetest.is_protected({x=pos.x+x0,y=pos.y+y0,z=pos.z+z0},name) then - minetest.chat_send_player(name, "KEYPAD: position is protected. aborting.") - return - end - - if not privs.privs and (math.abs(x0)>max_range or math.abs(y0)>max_range or math.abs(z0)>max_range) then - minetest.chat_send_player(name,"#keypad: all coordinates must be between ".. -max_range .. " and " .. max_range); return - end - meta:set_int("x0",x0);meta:set_int("y0",y0);meta:set_int("z0",z0); - - if fields.pass then - if fields.pass~="" and string.len(fields.pass)<=16 then -- dont replace password with hash which is longer - 27 chars - pass=minetest.get_password_hash(pos.x, pass..pos.y);pass=minetest.get_password_hash(pos.y, pass..pos.z); - meta:set_string("pass",pass); - end - end - - if fields.text then - meta:set_string("text", fields.text); - if string.find(fields.text, "!") then minetest.log("action", string.format("%s set up keypad for message display at %s", name, minetest.pos_to_string(pos))) end - end - - meta:set_int("iter",math.min(tonumber(fields.iter) or 1,500));meta:set_int("mode",mode); - meta:set_string("infotext", "Punch keypad to use it."); - if pass~="" then - if fields.text~="@" then - meta:set_string("infotext",meta:get_string("infotext").. ". Password protected."); - else - meta:set_string("infotext","punch keyboard to use it."); - end - end - - end - return - end - - fname = "basic_machines:check_keypad_" - if string.sub(formname,0,string.len(fname)) == fname then - local pos_s = string.sub(formname,string.len(fname)+1); local pos = minetest.string_to_pos(pos_s) - local name = player:get_player_name(); if name==nil then return end - local meta = minetest.get_meta(pos) - - if fields.OK == "OK" then - - local pass; - pass = fields.pass or ""; - - if meta:get_string("text")=="@" then -- keyboard mode - meta:set_string("input", pass); - meta:set_int("count",1); - use_keypad(pos,machines_TTL,0); - return - end - - - pass=minetest.get_password_hash(pos.x, pass..pos.y);pass=minetest.get_password_hash(pos.y, pass..pos.z); - - if pass~=meta:get_string("pass") then - minetest.chat_send_player(name,"ACCESS DENIED. WRONG PASSWORD.") - return - end - minetest.chat_send_player(name,"ACCESS GRANTED.") - - if meta:get_int("count")<=0 then -- only accept new operation requests if idle - meta:set_int("count",meta:get_int("iter")); - meta:set_int("active_repeats",0); - use_keypad(pos,machines_TTL,0) - else - meta:set_int("count",0); - meta:set_string("infotext","operation aborted by user. punch to activate.") -- reset - end - - return - end - end - - -- DETECTOR - local fname = "basic_machines:detector_" - if string.sub(formname,0,string.len(fname)) == fname then - local pos_s = string.sub(formname,string.len(fname)+1); local pos = minetest.string_to_pos(pos_s) - local name = player:get_player_name(); if name==nil then return end - local meta = minetest.get_meta(pos) - local privs = minetest.get_player_privs(player:get_player_name()); - if (minetest.is_protected(pos,name) and not privs.privs) or not fields then return end -- only builder - - --minetest.chat_send_all("formname " .. formname .. " fields " .. dump(fields)) - - if fields.help == "help" then - local text = "SETUP: right click or punch and follow chat instructions. With detector you can detect nodes, objects, players, or items inside inventories.".. - "If detector activates it will trigger machine at target position.\n\nThere are 4 modes of operation - node/player/object/inventory detection. Inside node/player/object ".. - "write node/player/object name. If you detect players/objects you can specify range of detection. If you want detector to activate target precisely when its not triggered set NOT to 1\n\n".. - "For example, to detect empty space write air, to detect tree write default:tree, to detect ripe wheat write farming:wheat_8, for flowing water write default:water_flowing ... ".. - "If source position is chest it will look into it and check if there are items inside. If mode is inventory it will check for items in specified inventory of source node.".. - "\n\nADVANCED: you can select second source and then select AND/OR from the right top dropdown list to do logical operations. You can also filter output signal:\n -2=only OFF,-1=NOT/0/1=normal,2=only ON, 3 only if changed".. - " 4 = if target keypad set its text to detected object name" ; - local form = "size [5.5,5.5] textarea[0,0;6,7;help;DETECTOR HELP;".. text.."]" - minetest.show_formspec(name, "basic_machines:help_detector", form) - end - - if fields.OK == "OK" then - - - local x0,y0,z0,x1,y1,z1,x2,y2,z2,r,node,NOT; - x0=tonumber(fields.x0) or 0;y0=tonumber(fields.y0) or 0;z0=tonumber(fields.z0) or 0 - x1=tonumber(fields.x1) or 0;y1=tonumber(fields.y1) or 0;z1=tonumber(fields.z1) or 0 - x2=tonumber(fields.x2) or 0;y2=tonumber(fields.y2) or 0;z2=tonumber(fields.z2) or 0 - r=tonumber(fields.r) or 1; - NOT = tonumber(fields.NOT) - - - if minetest.is_protected({x=pos.x+x0,y=pos.y+y0,z=pos.z+z0},name) then - minetest.chat_send_player(name, "DETECTOR: position is protected. aborting.") - return - end - - if minetest.is_protected({x=pos.x+x2,y=pos.y+y2,z=pos.z+z2},name) then - minetest.chat_send_player(name, "DETECTOR: position is protected. aborting.") - return - end - - - if not privs.privs and (math.abs(x0)>max_range or math.abs(y0)>max_range or math.abs(z0)>max_range or math.abs(x1)>max_range or math.abs(y1)>max_range or math.abs(z1)>max_range) then - minetest.chat_send_player(name,"#detector: all coordinates must be between ".. -max_range .. " and " .. max_range); return - end - - if fields.inv1 then - meta:set_string("inv1",fields.inv1); - end - - meta:set_int("x0",x0);meta:set_int("y0",y0);meta:set_int("z0",z0); - meta:set_int("x1",x1);meta:set_int("y1",y1);meta:set_int("z1",z1); - meta:set_int("x2",x2);meta:set_int("y2",y2);meta:set_int("z2",z2); - - meta:set_int("r",math.min(r,10)); - meta:set_int("NOT",NOT); - meta:set_string("node",fields.node or ""); - - local mode = fields.mode or "node"; - meta:set_string("mode",mode); - local op = fields.op or ""; - meta:set_string("op",op); - - end - return - end - - - -- DISTRIBUTOR - local fname = "basic_machines:distributor_" - if string.sub(formname,0,string.len(fname)) == fname then - local pos_s = string.sub(formname,string.len(fname)+1); local pos = minetest.string_to_pos(pos_s) - local name = player:get_player_name(); if name==nil then return end - local meta = minetest.get_meta(pos) - local privs = minetest.get_player_privs(player:get_player_name()); - if (minetest.is_protected(pos,name) and not privs.privs) or not fields then return end -- only builder - --minetest.chat_send_all("formname " .. formname .. " fields " .. dump(fields)) - - if fields.OK == "OK" then - - local posf = {}; local active = {}; - local n = meta:get_int("n"); - for i = 1,n do - posf[i]={x=tonumber(fields["x"..i]) or 0,y=tonumber(fields["y"..i]) or 0,z=tonumber(fields["z"..i]) or 0}; - active[i]=tonumber(fields["active"..i]) or 0; - - if (not (privs.privs) and math.abs(posf[i].x)>max_range or math.abs(posf[i].y)>max_range or math.abs(posf[i].z)>max_range) then - minetest.chat_send_player(name,"#distributor: all coordinates must be between ".. -max_range .. " and " .. max_range); - return - end - - meta:set_int("x"..i,posf[i].x);meta:set_int("y"..i,posf[i].y);meta:set_int("z"..i,posf[i].z); - if posf[i].x==0 and posf[i].y==0 and posf[i].z==0 then - meta:set_int("active"..i,0); -- no point in activating itself - else - meta:set_int("active"..i,active[i]); - end - if fields.delay then - meta:set_float("delay", fields.delay); - end - end - end - - if fields["ADD"] then - local n = meta:get_int("n"); - if n<16 then meta:set_int("n",n+1); end -- max 16 outputs - local form = get_distributor_form(pos,player) - minetest.show_formspec(player:get_player_name(), "basic_machines:distributor_"..minetest.pos_to_string(pos), form) - return - end - - -- SHOWING TARGET - local j=-1;local n = meta:get_int("n"); - for i = 1,n do if fields["SHOW"..i] then j = i end end - --show j-th point - if j>0 then - local posf={x=tonumber(fields["x"..j]) or 0,y=tonumber(fields["y"..j]) or 0,z=tonumber(fields["z"..j]) or 0}; - machines.pos1[player:get_player_name()] = {x=posf.x+pos.x,y=posf.y+pos.y,z=posf.z+pos.z}; - machines.mark_pos1(player:get_player_name()) - return; - end - - --SETUP TARGET - j=-1; - for i = 1,n do if fields["SET"..i] then j = i end end - -- set up j-th point - if j>0 then - punchset[name].node = "basic_machines:distributor"; - punchset[name].state = j - punchset[name].pos = pos; - minetest.chat_send_player(name,"[DISTRIBUTOR] punch the position to set target "..j); - return; - end - - -- REMOVE TARGET - if n>0 then - j=-1; - for i = 1,n do if fields["X"..i] then j = i end end - -- remove j-th point - if j>0 then - for i=j,n-1 do - meta:set_int("x"..i, meta:get_int("x"..(i+1))) - meta:set_int("y"..i, meta:get_int("y"..(i+1))) - meta:set_int("z"..i, meta:get_int("z"..(i+1))) - meta:set_int("active"..i, meta:get_int("active"..(i+1))) - end - - meta:set_int("n",n-1); - local form = get_distributor_form(pos,player) - minetest.show_formspec(player:get_player_name(), "basic_machines:distributor_"..minetest.pos_to_string(pos), form) - return; - end - end - - if fields.help == "help" then - local text = "SETUP: to select target nodes for activation click SET then click target node.\n".. - "You can add more targets with ADD. To see where target node is click SHOW button next to it.\n".. - "Numbers in each row represent (from left to right) : first 3 numbers are target coordinates,\n".. - "last number controls how signal is passed to target. For example, to only pass OFF signal use -2,\n".. - "to only pass ON use 2, -1 negates the signal, 1 = pass original signal, 0 blocks signal\n".. - "delay option adds delay to activations, in seconds. With negative delay activation is randomized with probability -delay/1000.\n\n".. - "ADVANCED: you can use distributor as an event handler. First you must deactivate first target by putting 0 at\n".. - "last place in first line. Meanings of first 2 numbers are as follows: first number 0/1 controls if node/n".. "listens to failed interact attempts around it, second number -1/1 listens to chat and can mute it"; - local form = "size [5.5,5.5] textarea[0,0;6,7;help;DISTRIBUTOR HELP;".. text.."]" - minetest.show_formspec(name, "basic_machines:help_distributor", form) - end - - end - - -end) - - - --- CRAFTS -- - --- minetest.register_craft({ - -- output = "basic_machines:keypad", - -- recipe = { - -- {"default:stick"}, - -- {"default:wood"}, - -- } --- }) - --- minetest.register_craft({ - -- output = "basic_machines:mover", - -- recipe = { - -- {"default:mese_crystal", "default:mese_crystal","default:mese_crystal"}, - -- {"default:mese_crystal", "default:mese_crystal","default:mese_crystal"}, - -- {"default:stone", "basic_machines:keypad", "default:stone"} - -- } --- }) - --- minetest.register_craft({ - -- output = "basic_machines:detector", - -- recipe = { - -- {"default:mese_crystal", "default:mese_crystal"}, - -- {"default:mese_crystal", "default:mese_crystal"}, - -- {"basic_machines:keypad",""} - -- } --- }) - --- minetest.register_craft({ - -- output = "basic_machines:light_on", - -- recipe = { - -- {"default:torch", "default:torch"}, - -- {"default:torch", "default:torch"} - -- } --- }) - - --- minetest.register_craft({ - -- output = "basic_machines:distributor", - -- recipe = { - -- {"default:steel_ingot"}, - -- {"default:mese_crystal"}, - -- {"basic_machines:keypad"} - -- } --- }) - --- minetest.register_craft({ - -- output = "basic_machines:clockgen", - -- recipe = { - -- {"default:diamondblock"}, - -- {"basic_machines:keypad"} - -- } --- }) \ No newline at end of file -- 2.25.1 From 08bc73b572356116a0bb0a616de35e1b91e19364 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:16:44 +0200 Subject: [PATCH 15/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/meseco?= =?UTF-8?q?n=5Fdoors.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/mesecon_doors.lua | 102 ------------------------------- 1 file changed, 102 deletions(-) delete mode 100644 basic_machines/mesecon_doors.lua diff --git a/basic_machines/mesecon_doors.lua b/basic_machines/mesecon_doors.lua deleted file mode 100644 index 1db08cb..0000000 --- a/basic_machines/mesecon_doors.lua +++ /dev/null @@ -1,102 +0,0 @@ --- make doors open/close with signal -local function door_signal_overwrite(name) - local table = minetest.registered_nodes[name]; if not table then return end - local table2 = {} - for i,v in pairs(table) do table2[i] = v end - - -- 0.4.15: line 370 in doors defines thins - local door_on_rightclick = table2.on_rightclick; - - -- this will make door toggle whenever its used - table2.mesecons = {effector = { - action_on = function (pos,node) - local meta = minetest.get_meta(pos);local name = meta:get_string("owner"); - -- create virtual player - local clicker = {}; - function clicker:get_wielded_item() - local item = {} - function item:get_name() return "" end - return item - end - function clicker:get_player_name() return name end; -- define method get_player_name() returning owner name so that we can call on_rightclick function in door - function clicker:is_player() return false end; -- method needed for mods that check this: like denaid areas mod - if door_on_rightclick then door_on_rightclick(pos, nil, clicker,ItemStack(""),{}) end -- safety if it doesnt exist - --minetest.swap_node(pos, {name = "protector:trapdoor", param1 = node.param1, param2 = node.param2}) -- more direct approach?, need to set param2 then too - end - } - }; - - minetest.register_node(":"..name, table2) -end - -minetest.after(0,function() - door_signal_overwrite("doors:door_wood");door_signal_overwrite("doors:door_steel") - door_signal_overwrite("doors:door_wood_a");door_signal_overwrite("doors:door_wood_b"); - door_signal_overwrite("doors:door_steel_a");door_signal_overwrite("doors:door_steel_b"); - door_signal_overwrite("doors:door_glass_a");door_signal_overwrite("doors:door_glass_b"); - door_signal_overwrite("doors:door_obsidian_glass_a");door_signal_overwrite("doors:door_obsidian_glass_b"); - - door_signal_overwrite("doors:trapdoor");door_signal_overwrite("doors:trapdoor_open"); - door_signal_overwrite("doors:trapdoor_steel");door_signal_overwrite("doors:trapdoor_steel_open"); - - end -); - -local function make_it_noclip(name) - - local table = minetest.registered_nodes[name]; if not table then return end - local table2 = {} - for i,v in pairs(table) do - table2[i] = v - end - table2.walkable = false; -- cant be walked on - minetest.register_node(":"..name, table2) -end - -minetest.after(0,function() - make_it_noclip("doors:trapdoor_open"); - make_it_noclip("doors:trapdoor_steel_open"); -end); - - - -local function make_it_nondiggable_but_removable(name, dropname) - - local table = minetest.registered_nodes[name]; if not table then return end - local table2 = {} - for i,v in pairs(table) do - table2[i] = v - end - table2.groups.level = 99; -- cant be digged, but it can be removed by owner or if not protected - table2.on_punch = function(pos, node, puncher, pointed_thing) -- remove node if owner repeatedly punches it 3x - local pname = puncher:get_player_name(); - local meta = minetest.get_meta(pos); - local owner = meta:get_string("doors_owner") - if pname==owner or not minetest.is_protected(pos,pname) then -- can be dug by owner or if unprotected - local t0 = meta:get_int("punchtime");local count = meta:get_int("punchcount"); - local t = minetest.get_gametime(); - - if t-t0<2 then count = (count +1 ) % 3 else count = 0 end - - if count == 1 then - minetest.chat_send_player(pname, "#steel door: punch me one more time to remove me"); - end - if count == 2 then -- remove steel door and drop it - minetest.set_node(pos, {name = "air"}); - local stack = ItemStack(dropname);minetest.add_item(pos,stack) - end - - meta:set_int("punchcount",count);meta:set_int("punchtime",t); - --minetest.chat_send_all("punch by "..name .. " count " .. count) - end - end - minetest.register_node(":"..name, table2) -end - -minetest.after(0,function() - make_it_nondiggable_but_removable("doors:door_steel_a","doors:door_steel"); - make_it_nondiggable_but_removable("doors:door_steel_b","doors:door_steel"); - - make_it_nondiggable_but_removable("doors:trapdoor_steel","doors:trapdoor_steel"); - make_it_nondiggable_but_removable("doors:trapdoor_steel_open","doors:trapdoor_steel"); -end); \ No newline at end of file -- 2.25.1 From a166009a667df074d8760b77d0e5d6494db7676f Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:16:51 +0200 Subject: [PATCH 16/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/constr?= =?UTF-8?q?uctor.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/constructor.lua | 219 --------------------------------- 1 file changed, 219 deletions(-) delete mode 100644 basic_machines/constructor.lua diff --git a/basic_machines/constructor.lua b/basic_machines/constructor.lua deleted file mode 100644 index b9d059c..0000000 --- a/basic_machines/constructor.lua +++ /dev/null @@ -1,219 +0,0 @@ --- rnd 2016: - --- CONSTRUCTOR machine: used to make all other basic_machines - -basic_machines.craft_recipes = { -["keypad"] = {item = "basic_machines:keypad", description = "Turns on/off lights and activates machines or opens doors", craft = {"default:wood","default:stick"}, tex = "keypad"}, -["light"]={item = "basic_machines:light_on", description = "Light in darkness", craft = {"default:torch 4"}, tex = "light"}, -["mover"]={item = "basic_machines:mover", description = "Can dig, harvest, plant, teleport or move items from/in inventories", craft = {"default:mese_crystal 6","default:stone 2", "basic_machines:keypad"}, tex = "basic_machine_mover_side"}, - -["detector"] = {item = "basic_machines:detector", description = "Detect and measure players, objects,blocks,light level", craft = {"default:mese_crystal 4","basic_machines:keypad"}, tex = "detector"}, - -["distributor"]= {item = "basic_machines:distributor", description = "Organize your circuits better", craft = {"default:steel_ingot","default:mese_crystal", "basic_machines:keypad"}, tex = "distributor"}, - -["clock_generator"]= {item = "basic_machines:clockgen", description = "For making circuits that run non stop", craft = {"default:diamondblock","basic_machines:keypad"}, tex = "basic_machine_clock_generator"}, - -["recycler"]= {item = "basic_machines:recycler", description = "Recycle old tools", craft = {"default:mese_crystal 8","default:diamondblock"}, tex = "recycler"}, - -["enviroment"] = {item = "basic_machines:enviro", description = "Change gravity and more", craft = {"basic_machines:generator 8","basic_machines:clockgen"}, tex = "enviro"}, - -["ball_spawner"]={item = "basic_machines:ball_spawner", description = "Spawn moving energy balls", craft = {"basic_machines:power_cell","basic_machines:keypad"}, tex = "basic_machines_ball"}, - -["battery"]={item = "basic_machines:battery_0", description = "Power for machines", craft = {"default:bronzeblock 2","default:mese","default:diamond"}, tex = "basic_machine_battery"}, - -["generator"]={item = "basic_machines:generator", description = "Generate power crystals", craft = {"default:diamondblock 5","basic_machines:battery 5","default:goldblock 5"}, tex = "basic_machine_generator"}, - -["autocrafter"] = {item = "basic_machines:autocrafter", description = "Automate crafting", craft = { "default:steel_ingot 5", "default:mese_crystal 2", "default:diamondblock 2"}, tex = "pipeworks_autocrafter"}, - -["grinder"] = {item = "basic_machines:grinder", description = "Makes dusts and grinds materials", craft = {"default:diamond 13","default:mese 4"}, tex = "grinder"}, - -["power_block"] = {item = "basic_machines:power_block 5", description = "Energy cell, contains 11 energy units", craft = {"basic_machines:power_rod"}, tex = "power_block"}, - -["power_cell"] = {item = "basic_machines:power_cell 5", description = "Energy cell, contains 1 energy unit", craft = {"basic_machines:power_block"}, tex = "power_cell"}, - -["coal_lump"] = {item = "default:coal_lump", description = "Coal lump, contains 1 energy unit", craft = {"basic_machines:power_cell 2"}, tex = "default_coal_lump"}, - -} - -basic_machines.craft_recipe_order = { -- order in which nodes appear - "keypad","light","grinder","mover", "battery","generator","detector", "distributor", "clock_generator","recycler","autocrafter","ball_spawner", "enviroment", "power_block", "power_cell", "coal_lump", -} - - - -local constructor_process = function(pos) - - local meta = minetest.get_meta(pos); - local craft = basic_machines.craft_recipes[meta:get_string("craft")]; - if not craft then return end - local item = craft.item; - local craftlist = craft.craft; - - local inv = meta:get_inventory(); - for _,v in pairs(craftlist) do - if not inv:contains_item("main", ItemStack(v)) then - meta:set_string("infotext", "#CRAFTING: you need " .. v .. " to craft " .. craft.item) - return - end - end - - for _,v in pairs(craftlist) do - inv:remove_item("main", ItemStack(v)); - end - inv:add_item("main", ItemStack(item)); - -end - -local constructor_update_meta = function(pos) - local meta = minetest.get_meta(pos); - local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z - local craft = meta:get_string("craft"); - - local description = basic_machines.craft_recipes[craft]; - local tex; - - if description then - tex = description.tex; - local i = 0; - local itex; - - local inv = meta:get_inventory(); -- set up craft list - for _,v in pairs(description.craft) do - i=i+1; - inv:set_stack("recipe", i, ItemStack(v)) - end - - for j = i+1,6 do - inv:set_stack("recipe", j, ItemStack("")) - end - - description = description.description - - else - description = "" - tex = "" - end - - - local textlist = " "; - - local selected = meta:get_int("selected") or 1; - for _,v in ipairs(basic_machines.craft_recipe_order) do - textlist = textlist .. v .. ", "; - - end - - local form = - "size[8,10]".. - "textlist[0,0;3,1.5;craft;" .. textlist .. ";" .. selected .."]".. - "button[3.5,1;1.25,0.75;CRAFT;CRAFT]".. - "image[3.65,0;1,1;".. tex .. ".png]".. - "label[0,1.85;".. description .. "]".. - "list[context;recipe;5,0;3,2;]".. - "label[0,2.3;Put crafting materials here]".. - "list[context;main;0,2.7;8,3;]".. - --"list[context;dst;5,0;3,2;]".. - "label[0,5.5;player inventory]".. - "list[current_player;main;0,6;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]"; - meta:set_string("formspec", form); -end - - -minetest.register_node("basic_machines:constructor", { - description = "Constructor: used to make machines", - tiles = {"constructor.png"}, - groups = {cracky=3, mesecon_effector_on = 1}, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos); - meta:set_string("infotext", "Constructor: To operate it insert materials, select item to make and click craft button.") - meta:set_string("owner", placer:get_player_name()); - meta:set_string("craft","keypad") - meta:set_int("selected",1); - local inv = meta:get_inventory();inv:set_size("main", 24);--inv:set_size("dst",6); - inv:set_size("recipe",8); - end, - - on_rightclick = function(pos, node, player, itemstack, pointed_thing) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if minetest.is_protected(pos, player:get_player_name()) and not privs.privs then return end -- only owner can interact with recycler - constructor_update_meta(pos); - end, - - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "recipe" then return 0 end - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if meta:get_string("owner")~=player:get_player_name() and not privs.privs then return 0 end - return stack:get_count(); - end, - - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if listname == "recipe" then return 0 end - local privs = minetest.get_player_privs(player:get_player_name()); - if minetest.is_protected(pos, player:get_player_name()) and not privs.privs then return 0 end - return stack:get_count(); - end, - - on_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "recipe" then return 0 end - local privs = minetest.get_player_privs(player:get_player_name()); - if minetest.is_protected(pos, player:get_player_name()) and not privs.privs then return 0 end - return stack:get_count(); - end, - - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - return 0; - end, - - mesecons = {effector = { - action_on = function (pos, node,ttl) - if type(ttl)~="number" then ttl = 1 end - if ttl<0 then return end -- machines_TTL prevents infinite recursion - constructor_process(pos); - end - } - }, - - on_receive_fields = function(pos, formname, fields, sender) - - if minetest.is_protected(pos, sender:get_player_name()) then return end - local meta = minetest.get_meta(pos); - - if fields.craft then - if string.sub(fields.craft,1,3)=="CHG" then - local sel = tonumber(string.sub(fields.craft,5)) or 1 - meta:set_int("selected",sel); - - local i = 0; - for _,v in ipairs(basic_machines.craft_recipe_order) do - i=i+1; - if i == sel then meta:set_string("craft",v); break; end - end - else - return - end - end - - if fields.CRAFT then - constructor_process(pos); - end - - constructor_update_meta(pos); - end, - -}) - - -minetest.register_craft({ - output = "basic_machines:constructor", - recipe = { - {"default:steel_ingot","default:steel_ingot","default:steel_ingot"}, - {"default:steel_ingot","default:copperblock","default:steel_ingot"}, - {"default:steel_ingot","default:steel_ingot","default:steel_ingot"}, - - } -}) \ No newline at end of file -- 2.25.1 From f9ba1dcf4e76e60661584d220aa24016018c94fb Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:16:57 +0200 Subject: [PATCH 17/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/autocr?= =?UTF-8?q?after.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/autocrafter.lua | 354 --------------------------------- 1 file changed, 354 deletions(-) delete mode 100644 basic_machines/autocrafter.lua diff --git a/basic_machines/autocrafter.lua b/basic_machines/autocrafter.lua deleted file mode 100644 index 20053fe..0000000 --- a/basic_machines/autocrafter.lua +++ /dev/null @@ -1,354 +0,0 @@ --- modified and adapted from pipeworks mod by VanessaE --- by rnd --- disabled timers and on/off button, now autocrafter is only activated by signal - -local autocrafterCache = {} -- caches some recipe data to avoid to call the slow function minetest.get_craft_result() every second - -local craft_time = 1 - -local function count_index(invlist) - local index = {} - for _, stack in pairs(invlist) do - if not stack:is_empty() then - local stack_name = stack:get_name() - index[stack_name] = (index[stack_name] or 0) + stack:get_count() - end - end - return index -end - -local function get_item_info(stack) - local name = stack:get_name() - local def = minetest.registered_items[name] - local description = def and def.description or "Unknown item" - return description, name -end - -local function get_craft(pos, inventory, hash) - local hash = hash or minetest.hash_node_position(pos) - local craft = autocrafterCache[hash] - if not craft then - local recipe = inventory:get_list("recipe") - local output, decremented_input = minetest.get_craft_result({method = "normal", width = 3, items = recipe}) - craft = {recipe = recipe, consumption=count_index(recipe), output = output, decremented_input = decremented_input} - autocrafterCache[hash] = craft - end - return craft -end - -local function autocraft(inventory, craft) - if not craft then return false end - local output_item = craft.output.item - - -- check if we have enough room in dst - if not inventory:room_for_item("dst", output_item) then return false end - local consumption = craft.consumption - local inv_index = count_index(inventory:get_list("src")) - -- check if we have enough material available - for itemname, number in pairs(consumption) do - if (not inv_index[itemname]) or inv_index[itemname] < number then return false end - end - -- consume material - for itemname, number in pairs(consumption) do - for i = 1, number do -- We have to do that since remove_item does not work if count > stack_max - inventory:remove_item("src", ItemStack(itemname)) - end - end - - -- craft the result into the dst inventory and add any "replacements" as well - inventory:add_item("dst", output_item) - for i = 1, 9 do - inventory:add_item("dst", craft.decremented_input.items[i]) - end - return true -end - --- returns false to stop the timer, true to continue running --- is started only from start_autocrafter(pos) after sanity checks and cached recipe -local function run_autocrafter(pos, elapsed) - local meta = minetest.get_meta(pos) - local inventory = meta:get_inventory() - local craft = get_craft(pos, inventory) - local output_item = craft.output.item - -- only use crafts that have an actual result - if output_item:is_empty() then - meta:set_string("infotext", "unconfigured Autocrafter: unknown recipe") - return false - end - - for step = 1, math.floor(elapsed/craft_time) do - local continue = autocraft(inventory, craft) - if not continue then return false end - end - return true -end - -local function start_crafter(pos) -- rnd we dont need timer anymore - -- local meta = minetest.get_meta(pos) - -- if meta:get_int("enabled") == 1 then - -- local timer = minetest.get_node_timer(pos) - -- if not timer:is_started() then - -- timer:start(craft_time) - -- end - -- end -end - -local function after_inventory_change(pos) - start_crafter(pos) -end - --- note, that this function assumes allready being updated to virtual items --- and doesn't handle recipes with stacksizes > 1 -local function after_recipe_change(pos, inventory) - local meta = minetest.get_meta(pos) - -- if we emptied the grid, there's no point in keeping it running or cached - if inventory:is_empty("recipe") then - --minetest.get_node_timer(pos):stop() - autocrafterCache[minetest.hash_node_position(pos)] = nil - meta:set_string("infotext", "unconfigured Autocrafter") - return - end - local recipe_changed = false - local recipe = inventory:get_list("recipe") - - local hash = minetest.hash_node_position(pos) - local craft = autocrafterCache[hash] - - if craft then - -- check if it changed - local cached_recipe = craft.recipe - for i = 1, 9 do - if recipe[i]:get_name() ~= cached_recipe[i]:get_name() then - autocrafterCache[hash] = nil -- invalidate recipe - craft = nil - break - end - end - end - - craft = craft or get_craft(pos, inventory, hash) - local output_item = craft.output.item - local description, name = get_item_info(output_item) - meta:set_string("infotext", string.format("'%s' Autocrafter (%s)", description, name)) - inventory:set_stack("output", 1, output_item) - - after_inventory_change(pos) -end - --- clean out unknown items and groups, which would be handled like unknown items in the crafting grid --- if minetest supports query by group one day, this might replace them --- with a canonical version instead -local function normalize(item_list) - for i = 1, #item_list do - local name = item_list[i] - if not minetest.registered_items[name] then - item_list[i] = "" - end - end - return item_list -end - -local function on_output_change(pos, inventory, stack) - if not stack then - inventory:set_list("output", {}) - inventory:set_list("recipe", {}) - else - local input = minetest.get_craft_recipe(stack:get_name()) - if not input.items or input.type ~= "normal" then return end - local items, width = normalize(input.items), input.width - local item_idx, width_idx = 1, 1 - for i = 1, 9 do - if width_idx <= width then - inventory:set_stack("recipe", i, items[item_idx]) - item_idx = item_idx + 1 - else - inventory:set_stack("recipe", i, ItemStack("")) - end - width_idx = (width_idx < 3) and (width_idx + 1) or 1 - end - -- we'll set the output slot in after_recipe_change to the actual result of the new recipe - end - after_recipe_change(pos, inventory) -end - --- returns false if we shouldn't bother attempting to start the timer again after this -local function update_meta(meta, enabled) - --local state = enabled and "on" or "off" - --meta:set_int("enabled", enabled and 1 or 0) - meta:set_string("formspec", - "size[8,11]".. - "list[context;recipe;0,0;3,3;]".. - "image[3,1;1,1;gui_hb_bg.png^[colorize:#141318:255]".. - "list[context;output;3,1;1,1;]".. - --"image_button[3,2;1,1;pipeworks_button_" .. state .. ".png;" .. state .. ";;;false;pipeworks_button_interm.png]" .. -- rnd disable button - "list[context;src;0,3.5;8,3;]".. - "list[context;dst;4,0;4,3;]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - default.get_hotbar_bg(0,7).. - "list[current_player;main;0,7;8,4;]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;recipe]".. - "listring[current_player;main]" - ) - - -- toggling the button doesn't quite call for running a recipe change check - -- so instead we run a minimal version for infotext setting only - -- this might be more written code, but actually executes less - local output = meta:get_inventory():get_stack("output", 1) - if output:is_empty() then -- doesn't matter if paused or not - meta:set_string("infotext", "unconfigured Autocrafter: Place items for recipe top left. To operate place required items in bottom space (src inventory) and activated with keypad signal. Obtain crafted item from top right (dst inventory).") - return false - end - - local description, name = get_item_info(output) - local infotext = enabled and string.format("'%s' Autocrafter (%s)", description, name) - or string.format("paused '%s' Autocrafter", description) - - meta:set_string("infotext", infotext) - return enabled -end - --- 1st version of the autocrafter had actual items in the crafting grid --- the 2nd replaced these with virtual items, dropped the content on update and set "virtual_items" to string "1" --- the third added an output inventory, changed the formspec and added a button for enabling/disabling --- so we work out way backwards on this history and update each single case to the newest version -local function upgrade_autocrafter(pos, meta) - local meta = meta or minetest.get_meta(pos) - local inv = meta:get_inventory() - - if inv:get_size("output") == 0 then -- we are version 2 or 1 - inv:set_size("output", 1) - -- migrate the old autocrafters into an "enabled" state - update_meta(meta, true) - - if meta:get_string("virtual_items") == "1" then -- we are version 2 - -- we allready dropped stuff, so lets remove the metadatasetting (we are not being called again for this node) - meta:set_string("virtual_items", "") - else -- we are version 1 - local recipe = inv:get_list("recipe") - if not recipe then return end - for idx, stack in ipairs(recipe) do - if not stack:is_empty() then - minetest.item_drop(stack, "", pos) - stack:set_count(1) - stack:set_wear(0) - inv:set_stack("recipe", idx, stack) - end - end - end - - -- update the recipe, cache, and start the crafter - autocrafterCache[minetest.hash_node_position(pos)] = nil - after_recipe_change(pos, inv) - end -end - -minetest.register_node("basic_machines:autocrafter", { - description = "Autocrafter", - drawtype = "normal", - tiles = {"pipeworks_autocrafter.png"}, - groups = {cracky=3, mesecon_effector_on = 1}, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("src", 3*8) - inv:set_size("recipe", 3*3) - inv:set_size("dst", 4*3) - inv:set_size("output", 1) - update_meta(meta, false) - end, - on_receive_fields = function(pos, formname, fields, sender) - --if not pipeworks.may_configure(pos, sender) then return end - local meta = minetest.get_meta(pos) - if fields.on then - update_meta(meta, false) - --minetest.get_node_timer(pos):stop() - elseif fields.off then - if update_meta(meta, true) then - start_crafter(pos) - end - end - end, - can_dig = function(pos, player) - upgrade_autocrafter(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return (inv:is_empty("src") and inv:is_empty("dst")) - end, - after_place_node = function(pos, placer) -- rnd : set owner - local meta = minetest.get_meta(pos); - meta:set_string("owner", placer:get_player_name()); - end, - --after_place_node = pipeworks.scan_for_tube_objects, - --after_dig_node = function(pos) - --pipeworks.scan_for_tube_objects(pos) - --end, - on_destruct = function(pos) - autocrafterCache[minetest.hash_node_position(pos)] = nil - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - --if not pipeworks.may_configure(pos, player) then return 0 end - local meta = minetest.get_meta(pos);if meta:get_string("owner")~=player:get_player_name() then return 0 end -- rnd - - upgrade_autocrafter(pos) - local inv = minetest.get_meta(pos):get_inventory() - if listname == "recipe" then - stack:set_count(1) - inv:set_stack(listname, index, stack) - after_recipe_change(pos, inv) - return 0 - elseif listname == "output" then - on_output_change(pos, inv, stack) - return 0 - end - after_inventory_change(pos) - return stack:get_count() - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - --if not pipeworks.may_configure(pos, player) then - -- minetest.log("action", string.format("%s attempted to take from autocrafter at %s", player:get_player_name(), minetest.pos_to_string(pos))) - -- return 0 - -- end - local meta = minetest.get_meta(pos);if meta:get_string("owner")~=player:get_player_name() then return 0 end -- rnd - - upgrade_autocrafter(pos) - local inv = minetest.get_meta(pos):get_inventory() - if listname == "recipe" then - inv:set_stack(listname, index, ItemStack("")) - after_recipe_change(pos, inv) - return 0 - elseif listname == "output" then - on_output_change(pos, inv, nil) - return 0 - end - after_inventory_change(pos) - return stack:get_count() - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - return 0; -- no internal inventory moves! - end, - - mesecons = {effector = { -- rnd: run machine when activated by signal - action_on = function (pos, node,ttl) - if type(ttl)~="number" then ttl = 1 end - if ttl<0 then return end -- machines_TTL prevents infinite recursion - run_autocrafter(pos, craft_time); - end - } - } - --on_timer = run_autocrafter -- rnd -}) - --- minetest.register_craft( { - -- output = "basic_machines:autocrafter", - -- recipe = { - -- { "default:steel_ingot", "default:mese_crystal", "default:steel_ingot" }, - -- { "default:diamondblock", "default:steel_ingot", "default:diamondblock" }, - -- { "default:steel_ingot", "default:mese_crystal", "default:steel_ingot" } - -- }, --- }) \ No newline at end of file -- 2.25.1 From 65ff72ef8e336d947ed0ea3a11da01b32fd0d36b Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:17:03 +0200 Subject: [PATCH 18/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/README?= =?UTF-8?q?=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/README | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 basic_machines/README diff --git a/basic_machines/README b/basic_machines/README deleted file mode 100644 index c46ca2a..0000000 --- a/basic_machines/README +++ /dev/null @@ -1,24 +0,0 @@ -BASIC_MACHINES: lightweight automation mod for minetest -minetest 0.4.14+ -(c) 2015-2016 rnd -textures by rnd, new textures by SaKeL (2016) and Jozet (2017) - - -MANUAL: - 1.WIKI PAGES: https://github.com/ac-minetest/basic_machines/wiki - 2.ingame help: right click mover/detector/keypad.. and click help button - ---------------------------------------------------------------------- -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . ----------------------------------------------------------------------- \ No newline at end of file -- 2.25.1 From a1f0e27050ddd197800efbe8d14ac567f11eb86c Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:17:09 +0200 Subject: [PATCH 19/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/protec?= =?UTF-8?q?t.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/protect.lua | 54 -------------------------------------- 1 file changed, 54 deletions(-) delete mode 100644 basic_machines/protect.lua diff --git a/basic_machines/protect.lua b/basic_machines/protect.lua deleted file mode 100644 index 6bcf063..0000000 --- a/basic_machines/protect.lua +++ /dev/null @@ -1,54 +0,0 @@ --- adds event handler for attempt to dig in protected area - --- tries to activate specially configured nearby distributor at points with coordinates of form 20i, registers dig attempts in radius 10 around --- distributor must have first target filter set to 0 ( disabled ) to handle dig events - -local old_is_protected = minetest.is_protected -local round = math.floor; -local machines_TTL=5 - -function minetest.is_protected(pos, digger) - - local is_protected = old_is_protected(pos, digger); - if is_protected then -- only if protected - local r = 20;local p = {x=round(pos.x/r+0.5)*r,y=round(pos.y/r+0.5)*r+1,z=round(pos.z/r+0.5)*r} - if minetest.get_node(p).name == "basic_machines:distributor" then -- attempt to activate distributor at special grid location: coordinates of the form 10+20*i - local meta = minetest.get_meta(p); - if meta:get_int("active1") == 0 then -- first output is disabled, indicating ready to be used as event handler - if meta:get_int("x1") ~= 0 then -- trigger protection event - meta:set_string("infotext",digger); -- record diggers name onto distributor - local table = minetest.registered_nodes["basic_machines:distributor"]; - local effector=table.mesecons.effector; - local node = nil; - effector.action_on(p,node,machines_TTL); - end - end - end - end - return is_protected; - -end - -minetest.register_on_chat_message(function(name, message) - local player = minetest.get_player_by_name(name); - if not player then return end - local pos = player:getpos(); - local r = 20;local p = {x=round(pos.x/r+0.5)*r,y=round(pos.y/r+0.5)*r+1,z=round(pos.z/r+0.5)*r} - --minetest.chat_send_all(minetest.pos_to_string(p)) - if minetest.get_node(p).name == "basic_machines:distributor" then -- attempt to activate distributor at special grid location: coordinates of the form 20*i - local meta = minetest.get_meta(p); - if meta:get_int("active1") == 0 then -- first output is disabled, indicating ready to be used as event handler - local y1 = meta:get_int("y1"); - if y1 ~= 0 then -- chat event, positive relays message, negative drops it - meta:set_string("infotext",message); -- record diggers message - local table = minetest.registered_nodes["basic_machines:distributor"]; - local effector=table.mesecons.effector; - local node = nil; - effector.action_on(p,node,machines_TTL); - if y1<0 then return true - end - end - end - end -end -) \ No newline at end of file -- 2.25.1 From fd896a697e6a52bec9fd5cb5d6ce9b7c58c6a83d Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:17:14 +0200 Subject: [PATCH 20/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/meseco?= =?UTF-8?q?n=5Flights.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/mesecon_lights.lua | 50 ------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 basic_machines/mesecon_lights.lua diff --git a/basic_machines/mesecon_lights.lua b/basic_machines/mesecon_lights.lua deleted file mode 100644 index de5445d..0000000 --- a/basic_machines/mesecon_lights.lua +++ /dev/null @@ -1,50 +0,0 @@ --- make other light blocks work with mesecon signals - can toggle on/off - -local function enable_toggle_light(name) - -local table = minetest.registered_nodes[name]; if not table then return end - local table2 = {} - for i,v in pairs(table) do - table2[i] = v - end - - if table2.mesecons then return end -- we dont want to overwrite existing stuff! - - local offname = "basic_machines:"..string.gsub(name, ":", "_").. "_OFF"; - - table2.mesecons = {effector = { -- action to toggle light off - action_off = function (pos,node,ttl) - minetest.swap_node(pos,{name = offname}); - end - } - }; - minetest.register_node(":"..name, table2) -- redefine item - - -- STRANGE BUG1: if you dont make new table table3 and reuse table2 definition original node (definition one line above) is changed by below code too!??? - -- STRANGE BUG2: if you dont make new table3.. original node automatically changes to OFF node when placed ???? - - local table3 = {} - for i,v in pairs(table) do - table3[i] = v - end - - table3.light_source = 0; -- off block has light off - table3.mesecons = {effector = { - action_on = function (pos,node,ttl) - minetest.swap_node(pos,{name = name}); - end - } - }; - - -- REGISTER OFF BLOCK - minetest.register_node(":"..offname, table3); - -end - - -enable_toggle_light("xdecor:wooden_lightbox"); -enable_toggle_light("xdecor:iron_lightbox"); -enable_toggle_light("moreblocks:slab_meselamp_1"); -enable_toggle_light("moreblocks:slab_super_glow_glass"); - -enable_toggle_light("darkage:lamp"); \ No newline at end of file -- 2.25.1 From b1c281191fb3e73fc0c9471431c62a59daf43eb0 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:17:19 +0200 Subject: [PATCH 21/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/mark.l?= =?UTF-8?q?ua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/mark.lua | 154 ---------------------------------------- 1 file changed, 154 deletions(-) delete mode 100644 basic_machines/mark.lua diff --git a/basic_machines/mark.lua b/basic_machines/mark.lua deleted file mode 100644 index 9b55cf6..0000000 --- a/basic_machines/mark.lua +++ /dev/null @@ -1,154 +0,0 @@ --- rnd: code borrowed from machines, mark.lua - --- need for marking -machines = {}; - -machines.pos1 = {};machines.pos11 = {}; machines.pos2 = {}; -machines.marker1 = {} -machines.marker11 = {} -machines.marker2 = {} -machines.marker_region = {} - - ---marks machines region position 1 -machines.mark_pos1 = function(name) - local pos1, pos2 = machines.pos1[name], machines.pos2[name] - - if pos1 ~= nil then - --make area stay loaded - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos1, pos1) - end - - if not machines[name] then machines[name]={} end - machines[name].timer = 10; - if machines.marker1[name] ~= nil then --marker already exists - machines.marker1[name]:remove() --remove marker - machines.marker1[name] = nil - end - if pos1 ~= nil then - --add marker - machines.marker1[name] = minetest.add_entity(pos1, "machines:pos1") - if machines.marker1[name] ~= nil then - machines.marker1[name]:get_luaentity().name = name - end - end -end - ---marks machines region position 1 -machines.mark_pos11 = function(name) - local pos11 = machines.pos11[name]; - - if pos11 ~= nil then - --make area stay loaded - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos11, pos11) - end - - if not machines[name] then machines[name]={} end - machines[name].timer = 10; - if machines.marker11[name] ~= nil then --marker already exists - machines.marker11[name]:remove() --remove marker - machines.marker11[name] = nil - end - if pos11 ~= nil then - --add marker - machines.marker11[name] = minetest.add_entity(pos11, "machines:pos11") - if machines.marker11[name] ~= nil then - machines.marker11[name]:get_luaentity().name = name - end - end -end - ---marks machines region position 2 -machines.mark_pos2 = function(name) - local pos1, pos2 = machines.pos1[name], machines.pos2[name] - - if pos2 ~= nil then - --make area stay loaded - local manip = minetest.get_voxel_manip() - manip:read_from_map(pos2, pos2) - end - - if not machines[name] then machines[name]={} end - machines[name].timer = 10; - if machines.marker2[name] ~= nil then --marker already exists - machines.marker2[name]:remove() --remove marker - machines.marker2[name] = nil - end - if pos2 ~= nil then - --add marker - machines.marker2[name] = minetest.add_entity(pos2, "machines:pos2") - if machines.marker2[name] ~= nil then - machines.marker2[name]:get_luaentity().name = name - end - end -end - - - -minetest.register_entity(":machines:pos1", { - initial_properties = { - visual = "cube", - visual_size = {x=1.1, y=1.1}, - textures = {"machines_pos1.png", "machines_pos1.png", - "machines_pos1.png", "machines_pos1.png", - "machines_pos1.png", "machines_pos1.png"}, - collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55}, - physical = false, - }, - on_step = function(self, dtime) - if not machines[self.name] then machines[self.name]={}; machines[self.name].timer = 10 end - machines[self.name].timer = machines[self.name].timer - dtime - if machines[self.name].timer<=0 or machines.marker1[self.name] == nil then - self.object:remove() - end - end, - on_punch = function(self, hitter) - self.object:remove() - machines.marker1[self.name] = nil - machines[self.name].timer = 10 - end, -}) - -minetest.register_entity(":machines:pos11", { - initial_properties = { - visual = "cube", - visual_size = {x=1.1, y=1.1}, - textures = {"machines_pos11.png", "machines_pos11.png", - "machines_pos11.png", "machines_pos11.png", - "machines_pos11.png", "machines_pos11.png"}, - collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55}, - physical = false, - }, - on_step = function(self, dtime) - if not machines[self.name] then machines[self.name]={}; machines[self.name].timer = 10 end - machines[self.name].timer = machines[self.name].timer - dtime - if machines[self.name].timer<=0 or machines.marker11[self.name] == nil then - self.object:remove() - end - end, - on_punch = function(self, hitter) - self.object:remove() - machines.marker11[self.name] = nil - machines[self.name].timer = 10 - end, -}) - -minetest.register_entity(":machines:pos2", { - initial_properties = { - visual = "cube", - visual_size = {x=1.1, y=1.1}, - textures = {"machines_pos2.png", "machines_pos2.png", - "machines_pos2.png", "machines_pos2.png", - "machines_pos2.png", "machines_pos2.png"}, - collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55}, - physical = false, - }, - on_step = function(self, dtime) - if not machines[self.name] then machines[self.name]={}; machines[self.name].timer = 10 end - if machines[self.name].timer<=0 or machines.marker2[self.name] == nil then - self.object:remove() - end - end, -}) -- 2.25.1 From 371252a255554bbbdd60d4fe4900783220686c17 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:17:32 +0200 Subject: [PATCH 22/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/ball.l?= =?UTF-8?q?ua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/ball.lua | 669 ---------------------------------------- 1 file changed, 669 deletions(-) delete mode 100644 basic_machines/ball.lua diff --git a/basic_machines/ball.lua b/basic_machines/ball.lua deleted file mode 100644 index 844ecbe..0000000 --- a/basic_machines/ball.lua +++ /dev/null @@ -1,669 +0,0 @@ --- BALL: energy ball that flies around, can bounce and activate stuff --- rnd 2016: - --- TO DO: move mode: ball just rolling around on ground without hopping, also if inside slope it would "roll down", just increased velocity in slope direction - --- SETTINGS - -basic_machines.ball = {}; -basic_machines.ball.maxdamage = 10; -- player health 20 -basic_machines.ball.bounce_materials = { -- to be used with bounce setting 2 in ball spawner: 1: bounce in x direction, 2: bounce in z direction, otherwise it bounces in y direction -["default:wood"]=1, -["xpanes:bar_2"]=1, -["xpanes:bar_10"]=1, -["darkage:iron_bars"]=1, -["default:glass"] = 2, -}; - --- END OF SETTINGS - -local ballcount = {}; -local function round(x) - if x < 0 then - return -math.floor(-x+0.5); - else - return math.floor(x+0.5); - end -end - - -local ball_spawner_update_form = function (pos) - - local meta = minetest.get_meta(pos); - local x0,y0,z0; - x0=meta:get_int("x0");y0=meta:get_int("y0");z0=meta:get_int("z0"); -- direction of velocity - - local energy,bounce,g,puncheable, gravity,hp,hurt,solid; - local speed = meta:get_float("speed"); -- if positive sets initial ball speed - energy = meta:get_float("energy"); -- if positive activates, negative deactivates, 0 does nothing - bounce = meta:get_int("bounce"); -- if nonzero bounces when hit obstacle, 0 gets absorbed - gravity = meta:get_float("gravity"); -- gravity - hp = meta:get_float("hp"); - hurt = meta:get_float("hurt"); - puncheable = meta:get_int("puncheable"); -- if 1 can be punched by players in protection, if 2 can be punched by anyone - solid = meta:get_int("solid"); -- if 1 then entity is solid - cant be walked on - - local texture = meta:get_string("texture") or "basic_machines_ball.png"; - local visual = meta:get_string("visual") or "sprite"; - local scale = meta:get_int("scale"); - - local form = - "size[4.25,4.75]" .. -- width, height - "field[0.25,0.5;1,1;x0;target;"..x0.."] field[1.25,0.5;1,1;y0;;"..y0.."] field[2.25,0.5;1,1;z0;;"..z0.."]".. - "field[3.25,0.5;1,1;speed;speed;"..speed.."]".. - --speed, jump, gravity,sneak - "field[0.25,1.5;1,1;energy;energy;"..energy.."]".. - "field[1.25,1.5;1,1;bounce;bounce;".. bounce.."]".. - "field[2.25,1.5;1,1;gravity;gravity;"..gravity.."]".. - "field[3.25,1.5;1,1;puncheable;puncheable;"..puncheable.."]".. - "field[3.25,2.5;1,1;solid;solid;"..solid.."]".. - "field[0.25,2.5;1,1;hp;hp;"..hp.."]".."field[1.25,2.5;1,1;hurt;hurt;"..hurt.."]".. - "field[0.25,3.5;4,1;texture;texture;"..minetest.formspec_escape(texture).."]".. - "field[0.25,4.5;1,1;scale;scale;"..scale.."]".."field[1.25,4.5;1,1;visual;visual;"..visual.."]".. - "button_exit[3.25,4.25;1,1;OK;OK]"; - - - - if meta:get_int("admin")==1 then - local lifetime = meta:get_int("lifetime"); - if lifetime <= 0 then lifetime = 20 end - form = form .. "field[2.25,2.5;1,1;lifetime;lifetime;"..lifetime.."]" - end - - meta:set_string("formspec",form); - -end - - - -minetest.register_entity("basic_machines:ball",{ - timer = 0, - lifetime = 20, -- how long it exists before disappearing - energy = 0, -- if negative it will deactivate stuff, positive will activate, 0 wont do anything - puncheable = 1, -- can be punched by players in protection - bounce = 0, -- 0: absorbs in block, 1 = proper bounce=lag buggy, -- to do: 2 = line of sight bounce - gravity = 0, - speed = 5, -- velocity when punched - hurt = 0, -- how much damage it does to target entity, if 0 damage disabled - owner = "", - state = false, - origin = {x=0,y=0,z=0}, - lastpos = {x=0,y=0,z=0}, -- last not-colliding position - hp_max = 100, - elasticity = 0.9, -- speed gets multiplied by this after bounce - visual="sprite", - visual_size={x=.6,y=.6}, - collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, - physical=false, - - --textures={"basic_machines_ball"}, - - on_activate = function(self, staticdata) - self.object:set_properties({textures={"basic_machines_ball.png"}}) - self.object:set_properties({visual_size = {x=1, y=1}}); - self.timer = 0;self.owner = ""; - self.origin = self.object:getpos(); - self.lifetime = 20; - end, - - get_staticdata = function(self) -- this gets called before object put in world and before it hides - if not self.state then return nil end - self.object:remove(); - return nil - end, - - - on_punch = function (self, puncher, time_from_last_punch, tool_capabilities, dir) - if self.puncheable == 0 then return end - if self.puncheable == 1 then -- only those in protection - local name = puncher:get_player_name(); - local pos = self.object:getpos(); - if minetest.is_protected(pos,name) then return end - end - --minetest.chat_send_all(minetest.pos_to_string(dir)) - if time_from_last_punch<0.5 then return end - local v = self.speed or 1; - - local velocity = dir; - velocity.x = velocity.x*v;velocity.y = velocity.y*v;velocity.z = velocity.z*v; - self.object:setvelocity(velocity) - end, - - on_step = function(self, dtime) - self.timer=self.timer+dtime - if self.timer>self.lifetime then - local count = ballcount[self.owner] or 1; count=count-1; ballcount[self.owner] = count; - self.object:remove() - return - end - - if not self.state then self.state = true end - local pos=self.object:getpos() - - local origin = self.origin; - - local r = 30;-- maximal distance when balls disappear - local dist = math.max(math.abs(pos.x-origin.x), math.abs(pos.y-origin.y), math.abs(pos.z-origin.z)); - if dist>r then -- remove if it goes too far - local count = ballcount[self.owner] or 1; count=count-1; ballcount[self.owner] = count; - self.object:remove() - return - end - - local nodename = minetest.get_node(pos).name; - local walkable = false; - if nodename ~= "air" then - walkable = minetest.registered_nodes[nodename].walkable; - if nodename == "basic_machines:ball_spawner" and dist>0.5 then walkable = true end -- ball can activate spawner, just not originating one - end - if not walkable then - self.lastpos = pos - if self.hurt~=0 then -- check for coliding nearby objects - local objects = minetest.get_objects_inside_radius(pos,2); - if #objects>1 then - for _, obj in pairs(objects) do - local p = obj:getpos(); - local d = math.sqrt((p.x-pos.x)^2+(p.y-pos.y)^2+(p.z-pos.z)^2); - if d>0 then - - --if minetest.is_protected(p,self.owner) then return end - if math.abs(p.x)<32 and math.abs(p.y)<32 and math.abs(p.z)<32 then return end -- no damage around spawn - - if obj:is_player() then --player - if obj:get_player_name()==self.owner then break end -- dont hurt owner - - local hp = obj:get_hp() - local newhp = hp-self.hurt; - if newhp<=0 and boneworld and boneworld.killxp then - local killxp = boneworld.killxp[self.owner]; - if killxp then - boneworld.killxp[self.owner] = killxp + 0.01; - end - end - obj:set_hp(newhp) - else -- non player - local lua_entity = obj:get_luaentity(); - if lua_entity and lua_entity.itemstring then - local entname = lua_entity.itemstring; - if entname == "robot" then - self.object:remove() - return; - end - end - local hp = obj:get_hp() - local newhp = hp-self.hurt; - minetest.chat_send_player(self.owner,"#ball: target hp " .. newhp) - if newhp<=0 then obj:remove() else obj:set_hp(newhp) end - end - - - - - local count = ballcount[self.owner] or 1; count=count-1; ballcount[self.owner] = count; - self.object:remove(); - return - end - end - end - end - end - - - if walkable then -- we hit a node - --minetest.chat_send_all(" hit node at " .. minetest.pos_to_string(pos)) - - - local node = minetest.get_node(pos); - local table = minetest.registered_nodes[node.name]; - if table and table.mesecons and table.mesecons.effector then -- activate target - - local energy = self.energy; - if energy~=0 then - if minetest.is_protected(pos,self.owner) then return end - end - local effector = table.mesecons.effector; - - self.object:remove(); - - if energy>0 then - if not effector.action_on then return end - effector.action_on(pos,node,16); - elseif energy<0 then - if not effector.action_off then return end - effector.action_off(pos,node,16); - end - - - else -- bounce ( copyright rnd, 2016 ) - local bounce = self.bounce; - if self.bounce == 0 then - local count = ballcount[self.owner] or 1; count=count-1; ballcount[self.owner] = count; - self.object:remove() - return end - - local n = {x=0,y=0,z=0}; -- this will be bounce normal - local v = self.object:getvelocity(); - local opos = {x=round(pos.x),y=round(pos.y), z=round(pos.z)}; -- obstacle - local bpos ={ x=(pos.x-opos.x),y=(pos.y-opos.y),z=(pos.z-opos.z)}; -- boundary position on cube, approximate - - if bounce == 2 then -- uses special blocks for non buggy lag proof bouncing: by default it bounces in y direction - local bounce_direction = basic_machines.ball.bounce_materials[node.name] or 0; - - if bounce_direction == 0 then - if v.y>=0 then n.y = -1 else n.y = 1 end - elseif bounce_direction == 1 then - if v.x>=0 then n.x = -1 else n.x = 1 end - n.y = 0; - elseif bounce_direction == 2 then - if v.z>=0 then n.z = -1 else n.z = 1 end - n.y = 0; - end - - else -- algorithm to determine bounce direction - problem: with lag its impossible to determine reliable which node was hit and which face .. - - if v.x<=0 then n.x = 1 else n.x = -1 end -- possible bounce directions - if v.y<=0 then n.y = 1 else n.y = -1 end - if v.z<=0 then n.z = 1 else n.z = -1 end - - local dpos = {}; - - dpos.x = 0.5*n.x; dpos.y = 0; dpos.z = 0; -- calculate distance to bounding surface midpoints - - local d1 = (bpos.x-dpos.x)^2 + (bpos.y)^2 + (bpos.z)^2; - dpos.x = 0; dpos.y = 0.5*n.y; dpos.z = 0; - local d2 = (bpos.x)^2 + (bpos.y-dpos.y)^2 + (bpos.z)^2; - dpos.x = 0; dpos.y = 0; dpos.z = 0.5*n.z; - local d3 = (bpos.x)^2 + (bpos.y)^2 + (bpos.z-dpos.z)^2; - local d = math.min(d1,d2,d3); -- we obtain bounce direction from minimal distance - - if d1==d then --x - n.y=0;n.z=0 - elseif d2==d then --y - n.x=0;n.z=0 - elseif d3==d then --z - n.x=0;n.y=0 - end - - - nodename=minetest.get_node({x=opos.x+n.x,y=opos.y+n.y,z=opos.z+n.z}).name -- verify normal - walkable = nodename ~= "air"; - if walkable then -- problem, nonempty node - incorrect normal, fix it - if n.x ~=0 then -- x direction is wrong, try something else - n.x=0; - if v.y>=0 then n.y = -1 else n.y = 1 end -- try y - nodename=minetest.get_node({x=opos.x+n.x,y=opos.y+n.y,z=opos.z+n.z}).name -- verify normal - walkable = nodename ~= "air"; - if walkable then -- still problem, only remaining is z - n.y=0; - if v.z>=0 then n.z = -1 else n.z = 1 end - nodename=minetest.get_node({x=opos.x+n.x,y=opos.y+n.y,z=opos.z+n.z}).name -- verify normal - walkable = nodename ~= "air"; - if walkable then -- messed up, just remove the ball - self.object:remove() - return - end - - end - - end - end - - end - - local elasticity = self.elasticity; - - -- bounce - if n.x~=0 then - v.x=-elasticity*v.x - elseif n.y~=0 then - v.y=-elasticity*v.y - elseif n.z~=0 then - v.z=-elasticity*v.z - end - - local r = 0.2 - bpos = {x=pos.x+n.x*r,y=pos.y+n.y*r,z=pos.z+n.z*r}; -- point placed a bit further away from box - self.object:setpos(bpos) -- place object at last known outside point - - self.object:setvelocity(v); - - minetest.sound_play("default_dig_cracky", {pos=pos,gain=1.0,max_hear_distance = 8,}) - - end - end - return - end, -}) - - -minetest.register_node("basic_machines:ball_spawner", { - description = "Spawns energy ball one block above", - tiles = {"basic_machines_ball.png"}, - groups = {cracky=3, mesecon_effector_on = 1}, - drawtype = "allfaces", - paramtype = "light", - param1=1, - walkable = false, - alpha = 150, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos, placer) - local meta = minetest.env:get_meta(pos) - meta:set_string("owner", placer:get_player_name()); - local privs = minetest.get_player_privs(placer:get_player_name()); if privs.privs then meta:set_int("admin",1) end - - if privs.machines then meta:set_int("machines",1) end - - meta:set_float("hurt",0); - meta:set_string("texture", "basic_machines_ball.png"); - meta:set_float("hp",100); - meta:set_float("speed",5); -- if positive sets initial ball speed - meta:set_float("energy",1); -- if positive activates, negative deactivates, 0 does nothing - meta:set_int("bounce",0); -- if nonzero bounces when hit obstacle, 0 gets absorbed - meta:set_float("gravity",0); -- gravity - meta:set_int("puncheable",0); -- if 0 not puncheable, if 1 can be punched by players in protection, if 2 can be punched by anyone - meta:set_int("scale",100); - meta:set_string("visual","sprite"); - ball_spawner_update_form(pos); - - end, - - mesecons = {effector = { - action_on = function (pos, node,ttl) - if type(ttl)~="number" then ttl = 1 end - if ttl<0 then return end - - local meta = minetest.get_meta(pos); - local t0 = meta:get_int("t"); - local t1 = minetest.get_gametime(); - local T = meta:get_int("T"); -- temperature - - if t0>t1-2 then -- activated before natural time - T=T+1; - else - if T>0 then - T=T-1 - if t1-t0>5 then T = 0 end - end - end - meta:set_int("T",T); - meta:set_int("t",t1); -- update last activation time - - if T > 2 then -- overheat - minetest.sound_play("default_cool_lava",{pos = pos, max_hear_distance = 16, gain = 0.25}) - meta:set_string("infotext","overheat: temperature ".. T) - return - end - - if meta:get_int("machines")~=1 then -- no machines priv, limit ball count - local owner = meta:get_string("owner"); - local count = ballcount[owner]; - if not count or count<0 then count = 0 end - - if count>=2 then - if t1-t0>20 then count = 0 - else return - end - end - - count = count + 1; - ballcount[owner]=count; - --minetest.chat_send_all("count " .. count); - end - - pos.x = round(pos.x);pos.y = round(pos.y);pos.z = round(pos.z); - local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, "basic_machines:ball"); - local luaent = obj:get_luaentity(); - local meta = minetest.get_meta(pos); - - local speed,energy,bounce,gravity,puncheable,solid; - speed = meta:get_float("speed"); - energy = meta:get_float("energy"); -- if positive activates, negative deactivates, 0 does nothing - bounce = meta:get_int("bounce"); -- if nonzero bounces when hit obstacle, 0 gets absorbed - gravity = meta:get_float("gravity"); -- gravity - puncheable = meta:get_int("puncheable"); -- if 1 can be punched by players in protection, if 2 can be punched by anyone - solid = meta:get_int("solid"); - - if energy<0 then - obj:set_properties({textures={"basic_machines_ball.png^[colorize:blue:120"}}) - end - - luaent.bounce = bounce; - luaent.energy = energy; - if gravity>0 then - obj:setacceleration({x=0,y=-gravity,z=0}); - end - luaent.puncheable = puncheable; - luaent.owner = meta:get_string("owner"); - luaent.hurt = meta:get_float("hurt"); - if solid==1 then - luaent.physical = true - end - - obj:set_hp( meta:get_float("hp") ); - - local x0,y0,z0; - if speed>0 then luaent.speed = speed end - - x0=meta:get_int("x0");y0=meta:get_int("y0");z0=meta:get_int("z0"); -- direction of velocity - if speed~=0 and (x0~=0 or y0~=0 or z0~=0) then -- set velocity direction - local velocity = {x=x0,y=y0,z=z0}; - local v = math.sqrt(velocity.x^2+velocity.y^2+velocity.z^2); if v == 0 then v = 1 end - v = v / speed; - velocity.x=velocity.x/v;velocity.y=velocity.y/v;velocity.z=velocity.z/v; - obj:setvelocity(velocity); - end - - if meta:get_int("admin")==1 then - luaent.lifetime = meta:get_float("lifetime"); - end - - - local visual = meta:get_string("visual") - obj:set_properties({visual=visual}); - local texture = meta:get_string("texture"); - if visual=="sprite" then - obj:set_properties({textures={texture}}) - elseif visual == "cube" then - obj:set_properties({textures={texture,texture,texture,texture,texture,texture}}) - end - local scale = meta:get_int("scale");if scale<=0 then scale = 1 else scale = scale/100 end - obj:set_properties({visual_size = {x=scale, y=scale}}); - - - - end, - - action_off = function (pos, node,ttl) - if type(ttl)~="number" then ttl = 1 end - if ttl<0 then return end - pos.x = round(pos.x);pos.y = round(pos.y);pos.z = round(pos.z); - local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, "basic_machines:ball"); - local luaent = obj:get_luaentity(); - luaent.energy = -1; - obj:set_properties({textures={"basic_machines_ball.png^[colorize:blue:120"}}) - end - } - }, - - on_receive_fields = function(pos, formname, fields, sender) - - local name = sender:get_player_name();if minetest.is_protected(pos,name) then return end - - if fields.OK then - local privs = minetest.get_player_privs(sender:get_player_name()); - local meta = minetest.get_meta(pos); - local x0=0; local y0=0; local z0=0; - --minetest.chat_send_all("form at " .. dump(pos) .. " fields " .. dump(fields)) - if fields.x0 then x0 = tonumber(fields.x0) or 0 end - if fields.y0 then y0 = tonumber(fields.y0) or 0 end - if fields.z0 then z0 = tonumber(fields.z0) or 0 end - if not privs.privs and (math.abs(x0)>10 or math.abs(y0)>10 or math.abs(z0) > 10) then return end - - meta:set_int("x0",x0);meta:set_int("y0",y0);meta:set_int("z0",z0); - - local speed,energy,bounce,gravity,puncheable,solid; - energy = meta:get_float("energy"); -- if positive activates, negative deactivates, 0 does nothing - bounce = meta:get_int("bounce"); -- if nonzero bounces when hit obstacle, 0 gets absorbed - gravity = meta:get_float("gravity"); -- gravity - puncheable = meta:get_int("puncheable"); -- if 1 can be punched by players in protection, if 2 can be punched by anyone - solid = meta:get_int("solid"); - - - if fields.speed then - local speed = tonumber(fields.speed) or 0; - if (speed > 10 or speed < 0) and not privs.privs then return end - meta:set_float("speed", speed) - end - - if fields.energy then - local energy = tonumber(fields.energy) or 1; - meta:set_float("energy", energy) - end - - if fields.bounce then - local bounce = tonumber(fields.bounce) or 1; - meta:set_int("bounce",bounce) - end - - if fields.gravity then - local gravity = tonumber(fields.gravity) or 1; - if (gravity<0 or gravity>30) and not privs.privs then return end - meta:set_float("gravity", gravity) - end - if fields.puncheable then - meta:set_int("puncheable", tonumber(fields.puncheable) or 0) - end - - if fields.solid then - meta:set_int("solid", tonumber(fields.solid) or 0) - end - - if fields.lifetime then - meta:set_int("lifetime", tonumber(fields.lifetime) or 0) - end - - if fields.hurt then - meta:set_float("hurt", tonumber(fields.hurt) or 0) - end - - if fields.hp then - meta:set_float("hp", math.abs(tonumber(fields.hp) or 0)) - end - - if fields.texture then - meta:set_string ("texture", fields.texture); - end - - if fields.scale then - local scale = math.abs(tonumber(fields.scale) or 100); - if scale>1000 and not privs.privs then scale = 1000 end - meta:set_int("scale", scale) - end - - if fields.visual then - local visual = fields.visual or ""; - if visual~="sprite" and visual~="cube" then return end - meta:set_string ("visual", fields.visual); - end - - ball_spawner_update_form(pos); - end - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local name = digger:get_player_name(); - local inv = digger:get_inventory(); - inv:remove_item("main", ItemStack("basic_machines:ball_spawner")); - local stack = ItemStack("basic_machines:ball_spell"); - local meta = oldmetadata["fields"]; - meta["formspec"]=nil; - stack:set_metadata(minetest.serialize(meta)); - inv:add_item("main",stack); - end - -}) - - -local spelltime = {}; - --- ball as magic spell user can cast -minetest.register_tool("basic_machines:ball_spell", { - description = "ball spawner", - inventory_image = "basic_machines_ball.png", - tool_capabilities = { - full_punch_interval = 2, - max_drop_level=0, - }, - on_use = function(itemstack, user, pointed_thing) - - local pos = user:getpos();pos.y=pos.y+1; - local meta = minetest.deserialize(itemstack:get_metadata()); - if not meta then return end - local owner = meta["owner"] or ""; - - --if minetest.is_protected(pos,owner) then return end - - local t0 = spelltime[owner] or 0; - local t1 = minetest.get_gametime(); - if t1-t0<2 then return end -- too soon - spelltime[owner]=t1; - - - local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, "basic_machines:ball"); - local luaent = obj:get_luaentity(); - - - local speed,energy,bounce,gravity,puncheable; - speed = tonumber(meta["speed"]) or 0; - energy = tonumber(meta["energy"]) or 0; -- if positive activates, negative deactivates, 0 does nothing - bounce = tonumber(meta["bounce"]) or 0; -- if nonzero bounces when hit obstacle, 0 gets absorbed - gravity = tonumber(meta["gravity"]) or 0; -- gravity - puncheable = tonumber(meta["puncheable"]) or 0; -- if 1 can be punched by players in protection, if 2 can be punched by anyone - - if energy<0 then - obj:set_properties({textures={"basic_machines_ball.png^[colorize:blue:120"}}) - end - - luaent.bounce = bounce; - luaent.energy = energy; - if gravity>0 then - obj:setacceleration({x=0,y=-gravity,z=0}); - end - luaent.puncheable = puncheable; - luaent.owner = meta["owner"]; - luaent.hurt = math.min(tonumber(meta["hurt"]),basic_machines.ball.maxdamage); - - obj:set_hp( tonumber(meta["hp"]) ); - - local x0,y0,z0; - if speed>0 then luaent.speed = speed end - - - - local v = user:get_look_dir(); - v.x=v.x*speed;v.y=v.y*speed;v.z=v.z*speed; - obj:setvelocity(v); - - - if tonumber(meta["admin"])==1 then - luaent.lifetime = tonumber(meta["lifetime"]); - end - - - obj:set_properties({textures={meta["texture"]}}) - - - end, - - -}) - - - --- minetest.register_craft({ - -- output = "basic_machines:ball_spawner", - -- recipe = { - -- {"basic_machines:power_cell"}, - -- {"basic_machines:keypad"} - -- } --- }) \ No newline at end of file -- 2.25.1 From 2b15f6b2488c40cbb96fe3068a4e7fabf4815f02 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:17:39 +0200 Subject: [PATCH 23/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/enviro?= =?UTF-8?q?.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/enviro.lua | 382 -------------------------------------- 1 file changed, 382 deletions(-) delete mode 100644 basic_machines/enviro.lua diff --git a/basic_machines/enviro.lua b/basic_machines/enviro.lua deleted file mode 100644 index 5d2c6d9..0000000 --- a/basic_machines/enviro.lua +++ /dev/null @@ -1,382 +0,0 @@ --- ENVIRO block: change physics and skybox for players --- note: nonadmin players are limited in changes ( cant change skybox and have limits on other allowed changes) - --- rnd 2016: - -local enviro = {}; -enviro.skyboxes = { - ["default"]={type = "regular", tex = {}}, - ["space"]={type="skybox", tex={"sky_pos_y.png","sky_neg_y.png","sky_pos_z.png","sky_neg_z.png","sky_neg_x.png","sky_pos_x.png",}}, -- need textures installed! - ["caves"]={type = "cavebox", tex = {"black.png","black.png","black.png","black.png","black.png","black.png",}}, - }; - -local space_start = 1100; -local ENABLE_SPACE_EFFECTS = false -- enable damage outside protected areas - -local enviro_update_form = function (pos) - - local meta = minetest.get_meta(pos); - - local x0,y0,z0; - x0=meta:get_int("x0");y0=meta:get_int("y0");z0=meta:get_int("z0"); - - local skybox = meta:get_string("skybox"); - local skylist = ""; - local sky_ind,j; - j=1;sky_ind = 3; - for i,_ in pairs(enviro.skyboxes) do - if i == skybox then sky_ind = j end - skylist = skylist .. i .. ","; - j=j+1; - end - local r = meta:get_int("r"); - local speed,jump, g, sneak; - speed = meta:get_float("speed");jump = meta:get_float("jump"); - g = meta:get_float("g"); sneak = meta:get_int("sneak"); - local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z; - - local form = - "size[8,8.5]".. -- width, height - "field[0.25,0.5;1,1;x0;target;"..x0.."] field[1.25,0.5;1,1;y0;;"..y0.."] field[2.25,0.5;1,1;z0;;"..z0.."]".. - "field[3.25,0.5;1,1;r;radius;"..r.."]".. - --speed, jump, gravity,sneak - "field[0.25,1.5;1,1;speed;speed;"..speed.."]".. - "field[1.25,1.5;1,1;jump;jump;"..jump.."]".. - "field[2.25,1.5;1,1;g;gravity;"..g.."]".. - "field[3.25,1.5;1,1;sneak;sneak;"..sneak.."]".. - "label[0.,3.0;Skybox selection]".. - "dropdown[0.,3.35;3,1;skybox;"..skylist..";"..sky_ind.."]".. - "button_exit[3.25,3.25;1,1;OK;OK]".. - "list["..list_name..";fuel;3.25,2.25;1,1;]".. - "list[current_player;main;0,4.5;8,4;]".. - "listring[current_player;main]".. - "listring["..list_name..";fuel]".. - "listring[current_player;main]" - meta:set_string("formspec",form) -end - --- enviroment changer -minetest.register_node("basic_machines:enviro", { - description = "Changes enviroment for players around target location", - tiles = {"enviro.png"}, - drawtype = "allfaces", - paramtype = "light", - param1=1, - groups = {cracky=3, mesecon_effector_on = 1}, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos, placer) - local meta = minetest.env:get_meta(pos) - meta:set_string("infotext", "Right click to set it. Activate by signal.") - meta:set_string("owner", placer:get_player_name()); meta:set_int("public",1); - meta:set_int("x0",0);meta:set_int("y0",0);meta:set_int("z0",0); -- target - meta:set_int("r",5); meta:set_string("skybox","default"); - meta:set_float("speed",1); - meta:set_float("jump",1); - meta:set_float("g",1); - meta:set_int("sneak",1); - meta:set_int("admin",0); - local name = placer:get_player_name(); - meta:set_string("owner",name); - local privs = minetest.get_player_privs(name); - if privs.privs then meta:set_int("admin",1) end - if privs.machines then meta:set_int("machines",1) end - - local inv = meta:get_inventory(); - inv:set_size("fuel",1*1); - - enviro_update_form(pos); - end, - - mesecons = {effector = { - action_on = function (pos, node,ttl) - local meta = minetest.get_meta(pos); - local machines = meta:get_int("machines"); - if not machines == 1 then meta:set_string("infotext","Error. You need machines privs.") return end - - local admin = meta:get_int("admin"); - - local inv = meta:get_inventory(); local stack = ItemStack("default:diamond 1"); - - if inv:contains_item("fuel", stack) then - inv:remove_item("fuel", stack); - else - meta:set_string("infotext","Error. Insert diamond in fuel inventory") - return - end - - local x0,y0,z0,r,skybox,speed,jump,g,sneak; - x0=meta:get_int("x0"); y0=meta:get_int("y0");z0=meta:get_int("z0"); -- target - r= meta:get_int("r",5); skybox=meta:get_string("skybox"); - speed=meta:get_float("speed");jump= meta:get_float("jump"); - g=meta:get_float("g");sneak=meta:get_int("sneak"); if sneak~=0 then sneak = true else sneak = false end - - local players = minetest.get_connected_players(); - for _,player in pairs(players) do - local pos1 = player:getpos(); - local dist = math.sqrt((pos1.x-pos.x)^2 + (pos1.y-pos.y)^2 + (pos1.z-pos.z)^2 ); - if dist<=r then - - player:set_physics_override({speed=speed,jump=jump,gravity=g,sneak=sneak}) - - if admin == 1 then -- only admin can change skybox - local sky = enviro.skyboxes[skybox]; - player:set_sky(0,sky["type"],sky["tex"]); - end - end - end - - -- attempt to set acceleration to balls, if any around - local objects = minetest.get_objects_inside_radius(pos, r) - - for _,obj in pairs(objects) do - if obj:get_luaentity() then - local obj_name = obj:get_luaentity().name or "" - if obj_name == "basic_machines:ball" then - obj:setacceleration({x=0,y=-g,z=0}); - end - end - - end - - - - - end - } - }, - - - on_receive_fields = function(pos, formname, fields, sender) - - local name = sender:get_player_name();if minetest.is_protected(pos,name) then return end - - if fields.OK then - local privs = minetest.get_player_privs(sender:get_player_name()); - local meta = minetest.get_meta(pos); - local x0=0; local y0=0; local z0=0; - --minetest.chat_send_all("form at " .. dump(pos) .. " fields " .. dump(fields)) - if fields.x0 then x0 = tonumber(fields.x0) or 0 end - if fields.y0 then y0 = tonumber(fields.y0) or 0 end - if fields.z0 then z0 = tonumber(fields.z0) or 0 end - if not privs.privs and (math.abs(x0)>10 or math.abs(y0)>10 or math.abs(z0) > 10) then return end - - meta:set_int("x0",x0);meta:set_int("y0",y0);meta:set_int("z0",z0); - if privs.privs then -- only admin can set sky - if fields.skybox then meta:set_string("skybox", fields.skybox) end - end - if fields.r then - local r = tonumber(fields.r) or 0; - if r > 10 and not privs.privs then return end - meta:set_int("r", r) - end - if fields.g then - local g = tonumber(fields.g) or 1; - if (g<0.1 or g>40) and not privs.privs then return end - meta:set_float("g", g) - end - if fields.speed then - local speed = tonumber(fields.speed) or 1; - if (speed>1 or speed < 0) and not privs.privs then return end - meta:set_float("speed", speed) - end - if fields.jump then - local jump = tonumber(fields.jump) or 1; - if (jump<0 or jump>2) and not privs.privs then return end - meta:set_float("jump", jump) - end - if fields.sneak then - meta:set_int("sneak", tonumber(fields.sneak) or 0) - end - - - enviro_update_form(pos); - end - end, - - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if meta:get_string("owner")~=player:get_player_name() and not privs.privs then return 0 end - return stack:get_count(); - end, - - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if meta:get_string("owner")~=player:get_player_name() and not privs.privs then return 0 end - return stack:get_count(); - end, - -}) - - --- DEFAULT (SPAWN) PHYSICS VALUE/SKYBOX - -local reset_player_physics = function(player) - if player then - player:set_physics_override({speed=1,jump=1,gravity=1}) -- value set for extreme test space spawn - local skybox = enviro.skyboxes["default"]; -- default skybox is "default" - player:set_sky(0,skybox["type"],skybox["tex"]); - end -end - --- globally available function -enviro_adjust_physics = function(player) -- adjust players physics/skybox 1 second after various events - minetest.after(1, function() - if player then - local pos = player:getpos(); if not pos then return end - if pos.y > space_start then -- is player in space or not? - player:set_physics_override({speed=1,jump=0.5,gravity=0.1}) -- value set for extreme test space spawn - local skybox = enviro.skyboxes["space"]; - player:set_sky(0,skybox["type"],skybox["tex"]); - else - player:set_physics_override({speed=1,jump=1,gravity=1}) -- value set for extreme test space spawn - local skybox = enviro.skyboxes["default"]; - player:set_sky(0,skybox["type"],skybox["tex"]); - end - end - end) -end - - --- restore default values/skybox on respawn of player -minetest.register_on_respawnplayer(reset_player_physics) - --- when player joins, check where he is and adjust settings -minetest.register_on_joinplayer(enviro_adjust_physics) - - --- SERVER GLOBAL SPACE CODE: uncomment to enable it - -local round = math.floor; -local protector_position = function(pos) - local r = 20; - local ry = 2*r; - return {x=round(pos.x/r+0.5)*r,y=round(pos.y/ry+0.5)*ry,z=round(pos.z/r+0.5)*r}; -end - -local stimer = 0 -local enviro_space = {}; -minetest.register_globalstep(function(dtime) - stimer = stimer + dtime; - if stimer >= 5 then - stimer = 0; - local players = minetest.get_connected_players(); - for _,player in pairs(players) do - local name = player:get_player_name(); - local pos = player:getpos(); - local inspace=0; if pos.y>space_start then inspace = 1 end - local inspace0=enviro_space[name]; - if inspace~=inspace0 then -- only adjust player enviroment ONLY if change occured ( earth->space or space->earth !) - enviro_space[name] = inspace; - enviro_adjust_physics(player); - end - - if ENABLE_SPACE_EFFECTS and inspace==1 then -- special space code - - - if pos.y<1500 and pos.y>1120 then - local hp = player:get_hp(); - - if hp>0 then - minetest.chat_send_player(name,"WARNING: you entered DEADLY RADIATION ZONE"); - local privs = minetest.get_player_privs(name) - if not privs.kick then player:set_hp(hp-15) end - end - return - else - - local ppos = protector_position(pos); - local populated = (minetest.get_node(ppos).name=="basic_protect:protector"); - if populated then - if minetest.get_meta(ppos):get_int("space") == 1 then populated = false end - end - - if not populated then -- do damage if player found not close to protectors - local hp = player:get_hp(); - local privs = minetest.get_player_privs(name); - if hp>0 and not privs.kick then - player:set_hp(hp-10); -- dead in 20/10 = 2 events - minetest.chat_send_player(name,"WARNING: in space you must stay close to spawn or protected areas"); - end - end - end - - end - end - end -end) - --- END OF SPACE CODE - - --- AIR EXPERIMENT --- minetest.register_node("basic_machines:air", { - -- description = "enables breathing in space", - -- drawtype = "liquid", - -- tiles = {"default_water_source_animated.png"}, - - -- drawtype = "glasslike", - -- paramtype = "light", - -- alpha = 150, - -- sunlight_propagates = true, -- Sunlight shines through - -- walkable = false, -- Would make the player collide with the air node - -- pointable = false, -- You can't select the node - -- diggable = false, -- You can't dig the node - -- buildable_to = true, - -- drop = "", - -- groups = {not_in_creative_inventory=1}, - -- after_place_node = function(pos, placer, itemstack, pointed_thing) - -- local r = 3; - -- for i = -r,r do - -- for j = -r,r do - -- for k = -r,r do - -- local p = {x=pos.x+i,y=pos.y+j,z=pos.z+k}; - -- if minetest.get_node(p).name == "air" then - -- minetest.set_node(p,{name = "basic_machines:air"}) - -- end - -- end - -- end - -- end - -- end - --- }) - --- minetest.register_abm({ - -- nodenames = {"basic_machines:air"}, - -- neighbors = {"air"}, - -- interval = 10, - -- chance = 1, - -- action = function(pos, node, active_object_count, active_object_count_wider) - -- minetest.set_node(pos,{name = "air"}) - -- end - -- }); - - -minetest.register_on_punchplayer( -- bring gravity closer to normal with each punch - function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) - - if player:get_physics_override() == nil then return end - local pos = player:getpos(); if pos.y>= space_start then return end - - local gravity = player:get_physics_override().gravity; - if gravity<1 then - gravity = 1; - player:set_physics_override({gravity=gravity}) - end - end - -) - - - --- RECIPE: extremely expensive - --- minetest.register_craft({ - -- output = "basic_machines:enviro", - -- recipe = { - -- {"basic_machines:generator", "basic_machines:clockgen","basic_machines:generator"}, - -- {"basic_machines:generator", "basic_machines:generator","basic_machines:generator"}, - -- {"basic_machines:generator", "basic_machines:generator", "basic_machines:generator"} - -- } --- }) \ No newline at end of file -- 2.25.1 From 850b8d5b39b51703f17234eeb4d0d0734815a199 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:17:51 +0200 Subject: [PATCH 24/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/sounds?= =?UTF-8?q?/transporter.ogg=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/sounds/transporter.ogg | Bin 9251 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/sounds/transporter.ogg diff --git a/basic_machines/sounds/transporter.ogg b/basic_machines/sounds/transporter.ogg deleted file mode 100644 index 8fad54aeb2f9440bd114430fe603e33056b4d9a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9251 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 -- 2.25.1 From a4b146e7f23caffe84c34f582c0746669300c22e Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:17:57 +0200 Subject: [PATCH 25/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/sounds?= =?UTF-8?q?/tng=5Ftransporter1.ogg=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/sounds/tng_transporter1.ogg | Bin 14325 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/sounds/tng_transporter1.ogg diff --git a/basic_machines/sounds/tng_transporter1.ogg b/basic_machines/sounds/tng_transporter1.ogg deleted file mode 100644 index 518d11928b85005e7b2df60bcb0f0a386cf0ccd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14325 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 -- 2.25.1 From db221de681eefaba8e3f11a8b6eab378b77750d0 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:18:06 +0200 Subject: [PATCH 26/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/sounds?= =?UTF-8?q?/chest=5Finventory=5Fmove.ogg=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/sounds/chest_inventory_move.ogg | Bin 9192 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/sounds/chest_inventory_move.ogg diff --git a/basic_machines/sounds/chest_inventory_move.ogg b/basic_machines/sounds/chest_inventory_move.ogg deleted file mode 100644 index d1430c68220aad13954fda10676df800150eecc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9192 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 Date: Thu, 30 Jul 2020 17:18:25 +0200 Subject: [PATCH 27/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/pipeworks=5Fautocrafter.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/pipeworks_autocrafter.png | Bin 316 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/pipeworks_autocrafter.png diff --git a/basic_machines/textures/pipeworks_autocrafter.png b/basic_machines/textures/pipeworks_autocrafter.png deleted file mode 100644 index aeacf17f4012e340cb4f123305677d2598c28909..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmV-C0mJ@@P)gwt( zEiHeN4yUK5gO>}Hm6fouuqGxZDk>_htgM-tnL$B8e2@))l?@ym9HOG4At50X6B9Kx zHG`52e2fl-nhc(vo_UK5IXO9tn+&+PxcN2{i~s-trb$FWR2UfrfQ4}cF$@6LD9P;O zPydBx2q~qMXPPOMr{s*aw?*&o7JIzUXr%V(s-G^^q0UdTS3uwZYD^@rd>rBy%JCZE z62R#eK;xwRhHL@YBI^z0QxHK0Ly*guUT_XM*bcc8vrF9$V2?Fg;PDlZAp&R&*jcHl z6G3rTCbSJG2vDQ(=MP==&?Pd|#Z0+>y~oqXGxpwFA(&aPY>$;`CEGtiatIJ*f^$0n O0000 Date: Thu, 30 Jul 2020 17:18:31 +0200 Subject: [PATCH 28/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/charcoal.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/charcoal.png | Bin 219 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/charcoal.png diff --git a/basic_machines/textures/charcoal.png b/basic_machines/textures/charcoal.png deleted file mode 100644 index ddad47622c0fda6a96e1647a8820f9593d4d7bb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZbuaJ{78aJ3mDSVJ6BQLz zP*Bj+)b#W7v$wamu&{7;cDA*(b$55Sw6ruaF`07jh!RjEV@Z%-FoVOh8)-mJjHioZ z2*>s01P7*`rhv8ys~B7yDkmwm2xhKh5lae*&*2gis;ax?!J%bP0l+XkK3-mpG -- 2.25.1 From 616b72a018d7bf9600949882fbe41f937d36fd5d Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:18:41 +0200 Subject: [PATCH 29/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/basic=5Fmachine=5Fmover=5Fside.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../textures/basic_machine_mover_side.png | Bin 239 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/basic_machine_mover_side.png diff --git a/basic_machines/textures/basic_machine_mover_side.png b/basic_machines/textures/basic_machine_mover_side.png deleted file mode 100644 index 099ecf2f4084876a5472cee61cb5fa611b63947c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!dVo)etEn=(r3Rm@AcK#YnD`V1 z4-=6!Yt~GiI(6fwjk9OZUbJY@^5x4_#aXJ%*PRDyY4&t+43W4T>d(o?tjHlVW%l3y z)!e&sFI|*iI-__>YTmT8i4XZ=>jNZa%;ekUaA-FpV_rLtTF++1*}pZiX8frZ+Q?qB zj)C=kZjIv-kC!Kzs}fIq{nUR%>j+Qex^wqfrxs5B__j&L)qDkq?U{fdNzZ=wYsxS_ nkm&3wToAJLim6G^;jhde4>BK``TUR=&^ZjAu6{1-oD!M Date: Thu, 30 Jul 2020 17:18:48 +0200 Subject: [PATCH 30/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/basic=5Fmachines=5Fball.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/basic_machines_ball.png | Bin 292 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/basic_machines_ball.png diff --git a/basic_machines/textures/basic_machines_ball.png b/basic_machines/textures/basic_machines_ball.png deleted file mode 100644 index bc5667997aa91ab6a01a78dad7581223bf769dfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}RDe&2t9yaZzZaM9Ezr1|tbDIu zV|Av?y+#cqP4NQ<9?vV3yqBx7HCb*;ywsgQh1X#U7fg7sTM9l7RlH#?@F+&2`^>seGkm(R{ySaGlZ@u?f8_CG&+|FntIh4=UW+qpi|UNxyW o@|@5DrMHH+s%xe5PR2?yT#{vN-LAY!9OwoHPgg&ebxsLQ0BfIfBme*a -- 2.25.1 From a57456cb0358c4bd903a7e4582d4210b4f068806 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:18:54 +0200 Subject: [PATCH 31/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/compass=5Ftop.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/compass_top.png | Bin 239 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/compass_top.png diff --git a/basic_machines/textures/compass_top.png b/basic_machines/textures/compass_top.png deleted file mode 100644 index 099ecf2f4084876a5472cee61cb5fa611b63947c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!dVo)etEn=(r3Rm@AcK#YnD`V1 z4-=6!Yt~GiI(6fwjk9OZUbJY@^5x4_#aXJ%*PRDyY4&t+43W4T>d(o?tjHlVW%l3y z)!e&sFI|*iI-__>YTmT8i4XZ=>jNZa%;ekUaA-FpV_rLtTF++1*}pZiX8frZ+Q?qB zj)C=kZjIv-kC!Kzs}fIq{nUR%>j+Qex^wqfrxs5B__j&L)qDkq?U{fdNzZ=wYsxS_ nkm&3wToAJLim6G^;jhde4>BK``TUR=&^ZjAu6{1-oD!M Date: Thu, 30 Jul 2020 17:19:02 +0200 Subject: [PATCH 32/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/detector.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/detector.png | Bin 253 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/detector.png diff --git a/basic_machines/textures/detector.png b/basic_machines/textures/detector.png deleted file mode 100644 index 08dc7a678393818a06c0ab1a436531bc38121ccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmVtgNhZgM*S z004zaL_t&-8CAi@aRWgR13-*h4AvdtW)<8~)sIz!97%{wS=>TshOSENkW;LVgALN8&up00000NkvXXu0mjf DFBN16 -- 2.25.1 From b94e2c1da7bfbe369257d5bf2b78a3a540a7fe9d Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:19:09 +0200 Subject: [PATCH 33/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/enviro.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/enviro.png | Bin 302 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/enviro.png diff --git a/basic_machines/textures/enviro.png b/basic_machines/textures/enviro.png deleted file mode 100644 index eaa84d88143765cf82a6754b89e4df3f1e110f4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmV+}0nz@6P)r6X&(&oJB&__N9P=JDB70otKgp@!a6?#GfNoI@~%h6ZtAOj={vO<3&l0+dB zWp%U*QX~_bl;x-_~(JCY2LDL5U~B0xgO2xN!fE!aus7$~cuKM{x^1A%Wk z{%oKO3>2VXHt77B&1?6jnLUc`?%kVL*Xr8*AK!ilOz(o(8vp Date: Thu, 30 Jul 2020 17:19:16 +0200 Subject: [PATCH 34/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/light=5Foff.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/light_off.png | Bin 214 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/light_off.png diff --git a/basic_machines/textures/light_off.png b/basic_machines/textures/light_off.png deleted file mode 100644 index fff62e013ca25e44ab34b67a5a050f58a6cc38ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!N`Oy@tEQ%AMMXt*b#-H7V@*v> zM@L6#X=z?wUQ0`ho}OM&QIVgoZ|huxQlR==PZ!4!iOad?9fb}ka4jWh6|4(IT?+W-^MPe;)!%jm?PoDux+=JBFpp0ohNz@FoxOv z3@mEOo!`Zu&Hl{(OpDFpCD)JaJ0$C&QTR>x%cecEvTF46&GnmRv19}uxTOHJn8DN4 K&t;ucLK6VhVNTKj -- 2.25.1 From 721a83e4276624879ec0b059e2c33eed6ed25881 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:19:22 +0200 Subject: [PATCH 35/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/light.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/light.png | Bin 218 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/light.png diff --git a/basic_machines/textures/light.png b/basic_machines/textures/light.png deleted file mode 100644 index b0ff766394b9d89504140b5467ed17467639dd1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Vt`MG>xBy!u3o)*;>3wFXU=G8 zY2CPSLtS0{(xpo}Iy!oKdK3El1o|)C04gr=ba4!kxEwpdlj(p02lL`JPyh4lIaa@% zQ^Lb_D0a5b)pnH{bEh3Q&T|MdtXddYfMu(#cufDFmO6A8_wbSFwLsK=28RY3p% -- 2.25.1 From 67ed5f4f487aaad68a7174326f64c6e4449e1028 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:19:28 +0200 Subject: [PATCH 36/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/keypad.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/keypad.png | Bin 315 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/keypad.png diff --git a/basic_machines/textures/keypad.png b/basic_machines/textures/keypad.png deleted file mode 100644 index 3659439a9be29e3a73f5272fc426357cc7d30422..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmV-B0mS}^P)P)t-sKtMnq ze}5l^hOw}*tgNgnD=R1{DB9ZHBO@apfPyYAE|!*-N=iznr>B{jnKw5#9)p6SqM{vo zdL11dlarI4o}MQsCmb9cxVX3t{h~Gi0065=L_t&-87;v{f&?K51i(~*1b408{{Pas zOa#X3)n4Va)7pH`QXuK39g$OxozoVyWKivE8B}{5lz7~{`saap-3=`qh#C-3j(*{goAMC1EQvZcbL=697bp!ko186 z&~L#=?rLuC>WVD*#j0I Date: Thu, 30 Jul 2020 17:19:36 +0200 Subject: [PATCH 37/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/machines=5Fpos11.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/machines_pos11.png | Bin 123 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/machines_pos11.png diff --git a/basic_machines/textures/machines_pos11.png b/basic_machines/textures/machines_pos11.png deleted file mode 100644 index 905c38561bea8f19035f57c1195935577b2c1d3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9t9yYD!=e{!PZ<;dMHowh z{DK)Ap4~_Ta+Ez?978y+C;#|Ae_^9wirDezJ{ S|GO+uIfJLGpUXO@geCyuP9m28 -- 2.25.1 From efb819f61c81468583f3e7c492eb88a8f0e17696 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:19:45 +0200 Subject: [PATCH 38/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/machines=5Fpos2.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/machines_pos2.png | Bin 134 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/machines_pos2.png diff --git a/basic_machines/textures/machines_pos2.png b/basic_machines/textures/machines_pos2.png deleted file mode 100644 index f89f0eeacce99caa17df9a938922c3acb7a5a3f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9t9yaZTN#xnDRp{45yp}r zzhDN3XE)M-96e7L#}JO|$v^(jU)U(vGK=46i+xIlc1ngpN(RFuen}~QBNKC@E%hvl d9kc%bXIv&KcsGtY%?zlM!PC{xWt~$(696VlBuxMS -- 2.25.1 From a27bc2b18f1bec0e53f9f0287c78c0dee2199f48 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:19:51 +0200 Subject: [PATCH 39/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/machines=5Fpos1.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/machines_pos1.png | Bin 123 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/machines_pos1.png diff --git a/basic_machines/textures/machines_pos1.png b/basic_machines/textures/machines_pos1.png deleted file mode 100644 index 84d3bffece7ad0571233f179bc059902e8dcc302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9t9yZu(ncS(@Rqqi5yp}r zzhDN3XE)M-9A!@z#}JO|$v^(jU)U(vA|)+3OIq@lv?EW-m45;)3R(aDvorKY3cQrg S|1Jwu&fw|l=d#Wzp$Pz;$|17= -- 2.25.1 From f96153b2a843bb7c66a15c79a40d8d34d28f7519 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:20:05 +0200 Subject: [PATCH 40/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/basic=5Fmachine=5Fside.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/basic_machine_side.png | Bin 2099 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/basic_machine_side.png diff --git a/basic_machines/textures/basic_machine_side.png b/basic_machines/textures/basic_machine_side.png deleted file mode 100644 index 358878517bb11c87d1189e6daea4412984a668af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2099 zcmeHIOH5o<82-*V|Gh9X9bkX~8I5*fo2DklM{1(3G}J;;3BhiQ&+#a`uy3( z?sNHvo7J;t8ZJE5dhwaIiHV8v@$s>-vC+}dk&%(%;o+g7p~1nyfq{Yk{(k3J*L}Iq z!2i#{xz|7E*}$2%`+8pCw)`)G@4tHd0YKjG?tJ0WdkU@CaB?z?lmy$GEfODu2jY&J zN({?=URgaInH|})MhRdcFxGd@)kiVsQI%xFAQ8RE;6+=IL~^BAaw6L5Xro@olGrGZ&B%z(GgsaT zKEb=nsVZ4VEZXX%tF_84(mR7|U4PEqTB{4acn>Zv*ikOIr)HWK`2}bd# zXc31<)`G<4i8x?#wU1QCpSl%9STPy}<;n$P<)K8P5KU?;A%{qGDZ`f>gW83-UB)zj z9hYZ92`y85t}5cRY=`kCT3iv$%413z_jTTC8v#|6$Zez#>a!vAx<@UB-%zeb&=qtN zaYiW>*CB3EL=h8f2DBNjmxzJDAp@sFzVH}}GEgw9!BNmgbP$U;29u(SktlY8_6}HM ziAafcOsL%&+BFen2^|XTroe`XNQ?C!cUMlaf3h0IXwq9&PQs^6=u%>GQ`tU__Kp>J zdc;-0r#7fjPm}eDLoqxzaf)A9Ssi%7#KH< Date: Thu, 30 Jul 2020 17:20:15 +0200 Subject: [PATCH 41/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/constructor.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/constructor.png | Bin 258 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/constructor.png diff --git a/basic_machines/textures/constructor.png b/basic_machines/textures/constructor.png deleted file mode 100644 index 9f14c24becc7b46ef6fff12debd975c0f52bf51b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmV+d0sa1oP)%pnhc$1FD3`#YM&*MBx4rL(Hs2 zJ*zp$ifVx>4khX+8b^%Ur%vsv4;{nu(&lW3H9ZOnt_w&q9Oscr3cUBVy54#xd&M?e z%d*je;lY^$$0xrg)F;Ec8Ncr=6gljjBaSvunYl9Y=HWbu|43Q}Gm5|7Y5)KL07*qo IM6N<$g1NeGEdT%j -- 2.25.1 From 782ea67fa2d6a1557c363adef93124594b6e5ed6 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:20:25 +0200 Subject: [PATCH 42/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/basic=5Fmachine=5Foutlet.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/basic_machine_outlet.png | Bin 348 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/basic_machine_outlet.png diff --git a/basic_machines/textures/basic_machine_outlet.png b/basic_machines/textures/basic_machine_outlet.png deleted file mode 100644 index c8f7695759d574a0db4e273431a1a7c7a5d1b717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 348 zcmV-i0i*tjP)9Pcm&^6V!QdGeDodBHIitaG+~ZPjir z7;@Dz7?;w{`4b1R(r5~d&b$R>w{K6EvZ!F>g^`hBjGRIUuI>UuiQ^|)gimm83)WOu zjFD{!LF;{DkxN!JK-&ua6ui_mIx2wscD_I;;l4Tp6`i+1nW{A~tY${bg1-s2NZmU1 upO6hk&eLZiPnjmofg&PBjJz_I3?o0;v Date: Thu, 30 Jul 2020 17:20:31 +0200 Subject: [PATCH 43/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/basic=5Fmachine=5Fbattery=5F2.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../textures/basic_machine_battery_2.png | Bin 242 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/basic_machine_battery_2.png diff --git a/basic_machines/textures/basic_machine_battery_2.png b/basic_machines/textures/basic_machine_battery_2.png deleted file mode 100644 index ec12a87c90090b7432caa8dde120f78f1807da9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUT`R79;=~DQX=x=TB`qy2 zK|#SaYt|SW8*kjWaq85mK0ZFnmoJ|=bLOH&i!3cI=gphfvOskrP;afLi(?4K_2e6t z#mCOhF8)_ypkn=d=IULmcNzL Date: Thu, 30 Jul 2020 17:20:36 +0200 Subject: [PATCH 44/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/basic=5Fmachine=5Fbattery=5F1.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../textures/basic_machine_battery_1.png | Bin 398 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/basic_machine_battery_1.png diff --git a/basic_machines/textures/basic_machine_battery_1.png b/basic_machines/textures/basic_machine_battery_1.png deleted file mode 100644 index 29baae2170fe214b7c5614b0f0b3005cf9c2fb72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwt=FTwDi$ivD@JIEGmG*Iv>tYI6`^Nm$p=bwIG)wUB+Cc%x%Noioe!6B|GIS~V$6 zShsd%<(EBW+bj3R$*ap8-SfrnLLt_q}gV?3lBx)2J``dTH+MPjgD2 zxbc?lQQ3CG=KLX>Gn?1tF6L&F-Y3@}(D!P;>=lNM&-g8_@-27Uw8isF>vEPi1z9Su zy+fIggTe~DWM4f;SZc- -- 2.25.1 From ca2f7ca7362f530b71787cafd7fac2add90323e4 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:20:41 +0200 Subject: [PATCH 45/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/basic=5Fmachine=5Fbattery=5F0.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../textures/basic_machine_battery_0.png | Bin 393 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/basic_machine_battery_0.png diff --git a/basic_machines/textures/basic_machine_battery_0.png b/basic_machines/textures/basic_machine_battery_0.png deleted file mode 100644 index 6d0d1edbe375394d7327c9312b56d3dfd984cc65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwt=FTwDi$ihg>!IEGmG_g>O2YGDvy30T+AbwIG)wUB+Cc%x&&wGB?*-<9v-%#dWPR5@$(TKZyPWmP#VcOt z!dJ0B&`X>TRIvZy)o(2#F2UL}53T0@SLiJJcJZA29W13LTPHE`8i{=W^P{F(<+Ca0 zssmA-57#k>`u>&b(n(i(pyw#%E4x;s@Xh`ILB1bki-L7b&(&r~KD?>EZYmGgqwK>~ jk~*#5<(7Z?{f~L+cgacba+41M1A)QQ)z4*}Q$iB}UjLuS -- 2.25.1 From b8e395cf63a5941747c0f69bdbdb21db1c1b079b Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:20:47 +0200 Subject: [PATCH 46/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/basic=5Fmachine=5Fbattery.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/basic_machine_battery.png | Bin 242 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/basic_machine_battery.png diff --git a/basic_machines/textures/basic_machine_battery.png b/basic_machines/textures/basic_machine_battery.png deleted file mode 100644 index ec12a87c90090b7432caa8dde120f78f1807da9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUT`R79;=~DQX=x=TB`qy2 zK|#SaYt|SW8*kjWaq85mK0ZFnmoJ|=bLOH&i!3cI=gphfvOskrP;afLi(?4K_2e6t z#mCOhF8)_ypkn=d=IULmcNzL Date: Thu, 30 Jul 2020 17:21:00 +0200 Subject: [PATCH 47/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/recycler.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/recycler.png | Bin 234 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/recycler.png diff --git a/basic_machines/textures/recycler.png b/basic_machines/textures/recycler.png deleted file mode 100644 index 022ee689a200414fd340f8e810839becb6b4699c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Zh%jS>xmO5TU(V|6Drc7}+5}7w|Uihacsz8kuo-U3d5|@3?JMu9b zaxgnEE3!>`_W%6bZLc=D7H_an=(%NGwl2c@k&Bv!QnE>sf9Tv?#pMf+>uk9Db$gJh zsu$Zk?(hhXxgXpW&n|3}-gqbB8dEmMlR%5h3vY3iw9c-JRSf+0e};hOd?Q`Kb^7yl i15~FG -- 2.25.1 From f3d30bad78ed29018b0b73b4f8d6e18b5a540cb4 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:21:10 +0200 Subject: [PATCH 48/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/distributor.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/distributor.png | Bin 238 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/distributor.png diff --git a/basic_machines/textures/distributor.png b/basic_machines/textures/distributor.png deleted file mode 100644 index a7555d32d1c0a7f34caeebb4285314a3acb955f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!dVo)etE?b{r3Rm=GQ0BHbv|Zd zYu2psFcFzCW5&i!8y7BIxP1BYDO0AXinIJ=P5K7Z(&Xvl7$R{w)Q_9bS&>6q;s4$L zdzznbdJ@`tjEVK?TiKU4-@OzJ*s~ymjn}1PMyK$>!#*kXY<=4VpB$9bc=fI8&YTaQ zGrn_*C%u~aQ`}>sn!DX;&u2eO-nP_hsH~qI+h5F;HT!yLN8o}NdRESMX=^&Z%Q4FD m){U!tpb@Ie>-%-*!uV_A%-u_5Le>FY!{F)a=d#Wzp$Pziwp(Zb -- 2.25.1 From 43c2eb9c35d6b641710e6c044165521546ba8b3b Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:21:27 +0200 Subject: [PATCH 49/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/basic=5Fmachine=5Fclock=5Fgenerator.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../textures/basic_machine_clock_generator.png | Bin 274 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/basic_machine_clock_generator.png diff --git a/basic_machines/textures/basic_machine_clock_generator.png b/basic_machines/textures/basic_machine_clock_generator.png deleted file mode 100644 index cbaa0bbfd8c4702d73fec01cf948b99805a37a51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274 zcmV+t0qy>YP)-`VA&~9r-*2uDggrgKg3}M8P68a)% zeo}%-k@6LhMDf~=cU`YSAY`%jZoIl=MRJ+jTXXk)ipa?SFK!A#%6!Z_l?bpGv;`1| z)vEcbw$>&2EZT%V0R%M+pT?e-5^{ERcB@anq&xtNuD5 Y4-l*c@dS!cNB{r;07*qoM6N<$f~LfAHUIzs -- 2.25.1 From 2125a626b47f8dedcc8ad4fe4f27493f947994a2 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:21:38 +0200 Subject: [PATCH 50/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/power=5Fblock.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/power_block.png | Bin 133 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/power_block.png diff --git a/basic_machines/textures/power_block.png b/basic_machines/textures/power_block.png deleted file mode 100644 index b9c627cefc3111a25392d2663d96e934be5c2b4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjt9yZu-1-Nh;o<2ySEak7aXC5R0N0Fz43Q1290E)}1q{LoElhWqQZg2H cOKLDMRFpB?d{KKu38 Date: Thu, 30 Jul 2020 17:21:43 +0200 Subject: [PATCH 51/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/power=5Fcell.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/power_cell.png | Bin 133 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/power_cell.png diff --git a/basic_machines/textures/power_cell.png b/basic_machines/textures/power_cell.png deleted file mode 100644 index fea4577b4bf289775127bd7189adc50fe0fc8ab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjt9yY@Xn6P|1F!U)tmiLZ zzE(JP94N(D666=m;PC858jz#n>Eak7aXC5R0N0Fz43Q1290E)|1q{LoO-y%~QZg2H cOKLDMRLe0uWIX$!2B@CF)78&qol`;+0AH&le*gdg -- 2.25.1 From 257fa92281ea56f9adf030e14fc1d78ad6cd1417 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:21:48 +0200 Subject: [PATCH 52/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/power=5Frod.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/power_rod.png | Bin 133 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/power_rod.png diff --git a/basic_machines/textures/power_rod.png b/basic_machines/textures/power_rod.png deleted file mode 100644 index 007a1fa0de4468da69ee55ed9beb9a292af7d7aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjt9yZu+=I%{@bL7UtmiLZ z)?P1J1e9Vd3GxeOaCmkj4aiaPba4!kxSX7DfNRDFVdQ&MBb@09zX*i~s-t -- 2.25.1 From 229bf9e5c4ab1f4c2124463364be27e732001976 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:22:01 +0200 Subject: [PATCH 53/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/techni?= =?UTF-8?q?c=5Fpower.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/technic_power.lua | 517 ------------------------------- 1 file changed, 517 deletions(-) delete mode 100644 basic_machines/technic_power.lua diff --git a/basic_machines/technic_power.lua b/basic_machines/technic_power.lua deleted file mode 100644 index ed74b8e..0000000 --- a/basic_machines/technic_power.lua +++ /dev/null @@ -1,517 +0,0 @@ -local machines_timer=5 -local machines_minstep = 1 - --- BATTERY - -local battery_update_meta = function(pos) - local meta = minetest.get_meta(pos) - local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z - local capacity = meta:get_float("capacity") - local maxpower = meta:get_float("maxpower") - local energy = math.ceil(10*meta:get_float("energy"))/10 - local form = - "size[8,6.5]".. -- width, height - "label[0,0;FUEL] ".."label[6,0;UPGRADE] ".. - "label[0.,1.5;UPGRADE: diamond/mese block for power/capacity]".. - "label[0.,1.75;UPGRADE: maxpower ".. maxpower .. " / CAPACITY " .. meta:get_int("capacity") .. "]".. - "list["..list_name..";fuel;0.,0.5;1,1;]".. "list["..list_name..";upgrade;6.,0.5;2,2;]" .. - "list[current_player;main;0,2.5;8,4;]".. - "button[4.5,0.35;1.5,1;OK;REFRESH]".. - "listring["..list_name..";upgrade]".. - "listring[current_player;main]".. - "listring["..list_name..";fuel]".. - "listring[current_player;main]" - meta:set_string("formspec", form) -end - ---[power crystal name] = energy provided -basic_machines.energy_crystals = { - ["basic_machines:power_cell"]=1, - ["basic_machines:power_block"]=11, - ["basic_machines:power_rod"]=100, -} - - -battery_recharge = function(pos) - - local meta = minetest.get_meta(pos); - local energy = meta:get_float("energy"); - local capacity = meta:get_float("capacity"); - local inv = meta:get_inventory(); - local stack = inv:get_stack("fuel", 1); local item = stack:get_name(); - local crystal = false; - - local add_energy=0; - add_energy = basic_machines.energy_crystals[item] or 0; - - if add_energy>0 then - if pos.y>1500 then add_energy=2*add_energy end -- in space recharge is more efficient - crystal = true; - if add_energy<=capacity then - stack:take_item(1); - inv:set_stack("fuel", 1, stack) - else - meta:set_string("infotext", "recharge problem: capacity " .. capacity .. ", needed " .. energy+add_energy) - return energy - end - else -- try do determine caloric value of fuel inside battery - local fuellist = inv:get_list("fuel");if not fuellist then return energy end - local fueladd, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - if fueladd.time > 0 then - add_energy = fueladd.time/40; - if energy+add_energy<=capacity then - inv:set_stack("fuel", 1, afterfuel.items[1]); - end - end - end - - if add_energy>0 then - energy=energy+add_energy - if energy<0 then energy = 0 end - if energy>capacity then energy = capacity end -- excess energy is wasted - meta:set_float("energy",energy); - meta:set_string("infotext", "(R) energy: " .. math.ceil(energy*10)/10 .. " / ".. capacity); - minetest.sound_play("electric_zap", {pos=pos,gain=0.05,max_hear_distance = 8,}) - end - - local full_coef = math.floor(energy/capacity*3); if full_coef > 2 then full_coef = 2 end - minetest.swap_node(pos,{name = "basic_machines:battery_".. full_coef}) -- graphic energy - - return energy; -- new battery energy level -end - -battery_upgrade = function(pos) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory(); - local count1,count2;count1=0;count2=0; - local stack,item,count; - for i=1,4 do - stack = inv:get_stack("upgrade", i);item = stack:get_name();count= stack:get_count(); - if item == "default:mese" then - count1=count1+count - elseif item == "default:diamondblock" then - count2=count2+count - end - end - --if count11500 then count1 = 2*count1; count2=2*count2 end -- space increases efficiency - - - meta:set_int("upgrade",count2); -- diamond for power - -- adjust capacity - --yyy - local capacity = 3+3*count1; -- mese for capacity - local maxpower = 1+count2*2; -- old 99 upgrade -> 200 power - - capacity = math.ceil(capacity*10)/10; - local energy = 0; - meta:set_float("capacity",capacity) - meta:set_float("maxpower",maxpower) - meta:set_float("energy",0) - meta:set_string("infotext", "energy: " .. math.ceil(energy*10)/10 .. " / ".. capacity); -end - -local machines_activate_furnace = minetest.registered_nodes["default:furnace"].on_metadata_inventory_put; -- this function will activate furnace - -minetest.register_node("basic_machines:battery_0", { - description = "battery - stores energy, generates energy from fuel, can power nearby machines, or accelerate/run furnace above it. Its upgradeable.", - tiles = {"basic_machine_outlet.png","basic_machine_side.png","basic_machine_battery_0.png"}, - groups = {cracky=3, mesecon_effector_on = 1}, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos); - meta:set_string("infotext","battery - stores energy, generates energy from fuel, can power nearby machines, or accelerate/run furnace above it when activated by keypad"); - meta:set_string("owner",placer:get_player_name()); - local inv = meta:get_inventory();inv:set_size("fuel", 1*1); -- place to put crystals - inv:set_size("upgrade", 2*2); - meta:set_int("upgrade",0); -- upgrade level determines energy storage capacity and max energy output - meta:set_float("capacity",3);meta:set_float("maxpower",1); - meta:set_float("energy",0); - end, - - mesecons = {effector = { - action_on = function (pos, node,ttl) - if type(ttl)~="number" then ttl = 1 end - if ttl<0 then return end -- machines_TTL prevents infinite recursion - - local meta = minetest.get_meta(pos); - local energy = meta:get_float("energy"); - local capacity = meta:get_float("capacity"); - local full_coef = math.floor(energy/capacity*3); - - -- try to power furnace on top of it - if energy>=1 then -- need at least 1 energy - pos.y=pos.y+1; local node = minetest.get_node(pos).name; - - if node== "default:furnace" or node=="default:furnace_active" then - local fmeta = minetest.get_meta(pos); - local fuel_totaltime = fmeta:get_float("fuel_totaltime") or 0; - local fuel_time = fmeta:get_float("fuel_time") or 0; - local t0 = meta:get_int("ftime"); -- furnace time - local t1 = minetest.get_gametime(); - - if t1-t04 then -- accelerated cooking - local src_time = fmeta:get_float("src_time") or 0 - energy = energy - 0.25*upgrade; -- use energy to accelerate burning - - - if fuel_time>40 or fuel_totaltime == 0 or node=="default:furnace" then -- to add burn time: must burn for at least 40 secs or furnace out of fuel - - fmeta:set_float("fuel_totaltime",60);fmeta:set_float("fuel_time",0) -- add 60 second burn time to furnace - energy=energy-0.5; -- use up energy to add fuel - - -- make furnace start if not already started - if node~="default:furnace_active" and machines_activate_furnace then machines_activate_furnace(pos) end - -- update energy display - end - - - if energy<0 then - energy = 0 - else -- only accelerate if we had enough energy, note: upgrade*0.1*0.25=1 then -- no need to recharge yet, will still work next time - local full_coef_new = math.floor(energy/capacity*3); if full_coef_new>2 then full_coef_new = 2 end - pos.y = pos.y-1; - if full_coef_new ~= full_coef then minetest.swap_node(pos,{name = "basic_machines:battery_".. full_coef_new}) end - return - else - local infotext = meta:get_string("infotext"); - local new_infotext = "furnace needs at least 1 energy"; - if new_infotext~=infotext then -- dont update unnecesarilly - meta:set_string("infotext", new_infotext); - pos.y=pos.y-1; -- so that it points to battery again! - end - end - else - pos.y=pos.y-1; - end - - end - - -- try to recharge by converting inserted fuel/power cells into energy - - if energy2 then full_coef_new = 2 end - if full_coef_new ~= full_coef then minetest.swap_node(pos,{name = "basic_machines:battery_".. full_coef_new}) end - - end - }}, - - on_rightclick = function(pos, node, player, itemstack, pointed_thing) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if minetest.is_protected(pos,player:get_player_name()) and not privs.privs then return end -- only owner can interact with recycler - battery_update_meta(pos); - end, - - on_receive_fields = function(pos, formname, fields, sender) - if fields.quit then return end - local meta = minetest.get_meta(pos); - battery_update_meta(pos); - end, - - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if minetest.is_protected(pos,player:get_player_name()) and not privs.privs then return 0 end - return stack:get_count(); - end, - - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if minetest.is_protected(pos,player:get_player_name()) and not privs.privs then return 0 end - return stack:get_count(); - end, - - on_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname=="fuel" then - battery_recharge(pos); - battery_update_meta(pos); - elseif listname == "upgrade" then - battery_upgrade(pos); - battery_update_meta(pos); - end - return stack:get_count(); - end, - - on_metadata_inventory_take = function(pos, listname, index, stack, player) - if listname == "upgrade" then - battery_upgrade(pos); - battery_update_meta(pos); - end - return stack:get_count(); - end, - - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - return 0; - end, - - can_dig = function(pos) - local meta = minetest.get_meta(pos); - if meta:get_int("upgrade")~=0 then return false else return true end - end - -}) - - - --- GENERATOR - -local generator_update_meta = function(pos) - local meta = minetest.get_meta(pos); - local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z - - local form = - "size[8,6.5]" .. -- width, height - "label[0,0;POWER CRYSTALS] ".."label[6,0;UPGRADE] ".. - "label[1,1;UPGRADE LEVEL ".. meta:get_int("upgrade").." (generator)]".. - "list["..list_name..";fuel;0.,0.5;1,1;]".. - "list["..list_name..";upgrade;6.,0.5;2,1;]".. - "list[current_player;main;0,2.5;8,4;]".. - "button[4.5,1.5;1.5,1;OK;REFRESH]".. - "button[6,1.5;1.5,1;help;help]".. - "listring["..list_name..";fuel]".. - "listring[current_player;main]".. - "listring["..list_name..";upgrade]".. - "listring[current_player;main]" - meta:set_string("formspec", form) -end - - - -generator_upgrade = function(pos) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory(); - local stack,item,count; - count = 0 - for i=1,2 do - stack = inv:get_stack("upgrade", i);item = stack:get_name(); - if item == "basic_machines:generator" then - count= count + stack:get_count(); - end - end - meta:set_int("upgrade",count); -end - -minetest.register_node("basic_machines:generator", { - description = "Generator - very expensive, generates power crystals that provide power. Its upgradeable.", - tiles = {"basic_machine_generator.png"}, - groups = {cracky=3, mesecon_effector_on = 1}, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos); - meta:set_string("infotext","generator - generates power crystals that provide power. Upgrade with up to 99 gold/diamond blocks."); - meta:set_string("owner",placer:get_player_name()); - local inv = meta:get_inventory(); - inv:set_size("fuel", 1*1); -- here generated power crystals are placed - inv:set_size("upgrade", 2*1); - meta:set_int("upgrade",0); -- upgrade level determines quality of produced crystals - - end, - - on_rightclick = function(pos, node, player, itemstack, pointed_thing) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if minetest.is_protected(pos,player:get_player_name()) and not privs.privs then return end -- only owner can interact with recycler - generator_update_meta(pos); - end, - - on_receive_fields = function(pos, formname, fields, sender) - if fields.quit then return end - if fields.help then - local text = "Generator slowly produces power crystals. Those can be used to recharge batteries and come in 3 flavors:\n\n low level (0-4), medium level (5-19) and high level (20+). Upgrading the generator (upgrade with generators) will increase the rate at which the crystals are produced.\n\nYou can automate the process of battery recharging by using mover in inventory mode, taking from inventory \"fuel\""; - local form = "size [6,7] textarea[0,0;6.5,8.5;help;GENERATOR HELP;".. text.."]" - minetest.show_formspec(sender:get_player_name(), "basic_machines:help_mover", form) - return - end - local meta = minetest.get_meta(pos); - - - generator_update_meta(pos); - end, - - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if minetest.is_protected(pos,player:get_player_name()) and not privs.privs then return 0 end - return stack:get_count(); - end, - - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if minetest.is_protected(pos,player:get_player_name()) and not privs.privs then return 0 end - return stack:get_count(); - end, - - on_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "upgrade" then - generator_upgrade(pos); - generator_update_meta(pos); - end - return stack:get_count(); - end, - - on_metadata_inventory_take = function(pos, listname, index, stack, player) - if listname == "upgrade" then - generator_upgrade(pos); - generator_update_meta(pos); - end - return stack:get_count(); - end, - - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - return 0; - end, - - can_dig = function(pos) - local meta = minetest.get_meta(pos); - if meta:get_int("upgrade")~=0 then return false else return true end - end - -}) - - -minetest.register_abm({ - nodenames = {"basic_machines:generator"}, - neighbors = {""}, - interval = 19, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local meta = minetest.get_meta(pos); - local upgrade = meta:get_int("upgrade"); - local inv = meta:get_inventory(); - local stack = inv:get_stack("fuel", 1); - local crystal, text; - - if upgrade >= 20 then - crystal = "basic_machines:power_rod " .. math.floor(1+(upgrade-20)*9/178) - text = "high upgrade: power rod"; - elseif upgrade >=5 then - crystal ="basic_machines:power_block " .. math.floor(1+(upgrade-5)*9/15); - text = "medium upgrade: power block"; - else - crystal ="basic_machines:power_cell " .. math.floor(1+2*upgrade); - text = "low upgrade: power cell"; - end - local morecrystal = ItemStack(crystal) - stack:add_item(morecrystal); - inv:set_stack("fuel", 1, stack) - meta:set_string("infotext",text) - end -}) - - - - --- API for power distribution -function basic_machines.check_power(pos, power_draw) -- mover checks power source - battery - - --minetest.chat_send_all(" battery: check_power " .. minetest.pos_to_string(pos) .. " " .. power_draw) - local batname = "basic_machines:battery"; - if not string.find(minetest.get_node(pos).name,batname) then - return -1 -- battery not found! - end - - local meta = minetest.get_meta(pos); - local energy = meta:get_float("energy"); - local capacity = meta:get_float("capacity"); - local maxpower = meta:get_float("maxpower"); - local full_coef = math.floor(energy/capacity*3); -- 0,1,2 - - if power_draw>maxpower then - meta:set_string("infotext", "Power draw required : " .. power_draw .. " maximum power output " .. maxpower .. ". Please upgrade battery") - return 0; - end - - if power_draw>energy then - energy = battery_recharge(pos); -- try recharge battery and continue operation immidiately - if not energy then return 0 end - end - - energy = energy-power_draw; - if energy<0 then - meta:set_string("infotext", "used fuel provides too little power for current power draw ".. power_draw); - return 0 - end -- recharge wasnt enough, needs to be repeated manually, return 0 power available - meta:set_float("energy", energy); - -- update energy display - meta:set_string("infotext", "energy: " .. math.ceil(energy*10)/10 .. " / ".. capacity); - - local full_coef_new = math.floor(energy/capacity*3); if full_coef_new>2 then full_coef_new = 2 end - if full_coef_new ~= full_coef then minetest.swap_node(pos,{name = "basic_machines:battery_".. full_coef_new}) end -- graphic energy level display - - return power_draw; - -end - ------------------------- --- CRAFTS ------------------------- - --- minetest.register_craft({ - -- output = "basic_machines:battery", - -- recipe = { - -- {"","default:steel_ingot",""}, - -- {"default:steel_ingot","default:mese","default:steel_ingot"}, - -- {"","default:diamond",""}, - - -- } --- }) - --- minetest.register_craft({ - -- output = "basic_machines:generator", - -- recipe = { - -- {"","",""}, - -- {"default:diamondblock","basic_machines:battery","default:diamondblock"}, - -- {"default:diamondblock","default:diamondblock","default:diamondblock"} - - -- } --- }) - -minetest.register_craftitem("basic_machines:power_cell", { - description = "Power cell - provides 1 power", - inventory_image = "power_cell.png", - stack_max = 25 -}) - -minetest.register_craftitem("basic_machines:power_block", { - description = "Power block - provides 11 power", - inventory_image = "power_block.png", - stack_max = 25 -}) - -minetest.register_craftitem("basic_machines:power_rod", { - description = "Power rod - provides 100 power", - inventory_image = "power_rod.png", - stack_max = 25 -}) - --- various battery levels: 0,1,2 (2 >= 66%, 1 >= 33%,0>=0%) -local batdef = {}; -for k,v in pairs(minetest.registered_nodes["basic_machines:battery_0"]) do batdef[k] = v end - -for i = 1,2 do - batdef.tiles[3] = "basic_machine_battery_" .. i ..".png" - minetest.register_node("basic_machines:battery_"..i, batdef) -end -- 2.25.1 From af56b87c95d0fd9a04320dc684ca6ae3b2242095 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:22:07 +0200 Subject: [PATCH 54/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/recycl?= =?UTF-8?q?er.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/recycler.lua | 244 ------------------------------------ 1 file changed, 244 deletions(-) delete mode 100644 basic_machines/recycler.lua diff --git a/basic_machines/recycler.lua b/basic_machines/recycler.lua deleted file mode 100644 index e80fea7..0000000 --- a/basic_machines/recycler.lua +++ /dev/null @@ -1,244 +0,0 @@ --- rnd 2015: - --- this node works as a reverse of crafting process with a 25% loss of items (aka recycling). You can select which recipe to use when recycling. --- There is a fuel cost to recycle - --- prevent unrealistic recyclings -local no_recycle_list = { - ["default:steel_ingot"]=1,["default:copper_ingot"]=1,["default:bronze_ingot"]=1,["default:gold_ingot"]=1, - ["dye:white"]=1,["dye:grey"]=1,["dye:dark_grey"]=1,["dye:black"]=1, - ["dye:violet"]=1,["dye:blue"]=1,["dye:cyan"]=1,["dye:dark_green"]=1, - ["dye:green"]=1,["dye:yellow"]=1,["dye:brown"]=1,["dye:orange"]=1, - ["dye:red"]=1,["dye:magenta"]=1,["dye:pink"]=1, -} - - -local recycler_process = function(pos) - - local node = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}).name; - local meta = minetest.get_meta(pos);local inv = meta:get_inventory(); - - -- FUEL CHECK - local fuel = meta:get_float("fuel"); - - if fuel-1<0 then -- we need new fuel, check chest below - local fuellist = inv:get_list("fuel") - if not fuellist then return end - - local fueladd, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - - local supply=0; - if fueladd.time == 0 then -- no fuel inserted, try look for outlet - -- No valid fuel in fuel list - supply = basic_machines.check_power({x=pos.x,y=pos.y-1,z=pos.z},1) or 0; - if supply>0 then - fueladd.time = 40*supply -- same as 10 coal - else - meta:set_string("infotext", "Please insert fuel."); - return; - end - else - if supply==0 then -- Take fuel from fuel list if no supply available - inv:set_stack("fuel", 1, afterfuel.items[1]) - fueladd.time = fueladd.time*0.1; -- thats 4 for coal - end - end - if fueladd.time>0 then - fuel=fuel + fueladd.time - meta:set_float("fuel",fuel); - meta:set_string("infotext", "added fuel furnace burn time " .. fueladd.time .. ", fuel status " .. fuel); - end - if fuel-1<0 then return end - end - - - - -- RECYCLING: check out inserted items - local stack = inv:get_stack("src",1); - if stack:is_empty() then return end; -- nothing to do - - local src_item = stack:to_string(); - local p=string.find(src_item," "); if p then src_item = string.sub(src_item,1,p-1) end -- take first word to determine what item was - - -- look if we already handled this item - local known_recipe=true; - if src_item~=meta:get_string("node") then-- did we already handle this? if yes read from cache - meta:set_string("node",src_item); - meta:set_string("itemlist","{}"); - meta:set_int("reqcount",0); - known_recipe=false; - end - - local itemlist, reqcount; - reqcount = 1; -- needed count of materials for recycle to work - - if not known_recipe then - - if no_recycle_list[src_item] then meta:set_string("node","") return end -- dont allow recycling of forbidden items - - local recipe = minetest.get_all_craft_recipes( src_item ); - local recipe_id = tonumber(meta:get_int("recipe")) or 1; - - if not recipe then - return - else - itemlist = recipe[recipe_id]; - if not itemlist then meta:set_string("node","") return end; - itemlist=itemlist.items; - end - local output = recipe[recipe_id].output or ""; - if string.find(output," ") then - local par = string.find(output," "); - --if (tonumber(string.sub(output, par)) or 0)>1 then itemlist = {} end - - if par then - reqcount = tonumber(string.sub(output, par)) or 1; - end - - end - - meta:set_string("itemlist",minetest.serialize(itemlist)); -- read cached itemlist - meta:set_int("reqcount",reqcount); - else - itemlist=minetest.deserialize(meta:get_string("itemlist")) or {}; - reqcount = meta:get_int("reqcount") or 1; - end - - if stack:get_count() Date: Thu, 30 Jul 2020 17:22:14 +0200 Subject: [PATCH 55/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/grinde?= =?UTF-8?q?r.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/grinder.lua | 354 ------------------------------------- 1 file changed, 354 deletions(-) delete mode 100644 basic_machines/grinder.lua diff --git a/basic_machines/grinder.lua b/basic_machines/grinder.lua deleted file mode 100644 index e8defa8..0000000 --- a/basic_machines/grinder.lua +++ /dev/null @@ -1,354 +0,0 @@ ---todo: when grinding multiple items compare battery maxpower with number of items and attempt to grind as much as possible - --- rnd 2016: - --- this node works as technic grinder --- There is a certain fuel cost to operate - --- recipe list: [in] ={fuel cost, out, quantity of material required for processing} -basic_machines.grinder_recipes = { - ["default:stone"] = {2,"default:sand",1}, - ["default:desert_stone"] = {2,"default:desert_sand 4",1}, - ["default:cobble"] = {1,"default:gravel",1}, - ["default:gravel"] = {0.5,"default:dirt",1}, - ["default:dirt"] = {0.5,"default:clay_lump 4",1}, - ["es:aikerum_crystal"] ={16,"es:aikerum_dust 2",1}, -- added for es mod - ["es:ruby_crystal"] = {16,"es:ruby_dust 2",1}, - ["es:emerald_crystal"] = {16,"es:emerald_dust 2",1}, - ["es:purpellium_lump"] = {16,"es:purpellium_dust 2",1}, - ["default:obsidian_shard"] = {199,"default:lava_source",1}, - ["gloopblocks:basalt"] = {1, "default:cobble",1}, -- enable coble farms with gloopblocks mod - ["default:ice"] = {1, "default:snow 4",1}, - ["darkage:silt_lump"]={1,"darkage:chalk_powder",1}, -}; - --- es gems dust cooking -local es_gems = function() - local es_gems = { - {name = "emerald", cooktime = 1200},{name = "ruby", cooktime = 1500},{name = "purpellium", cooktime = 1800}, - {name = "aikerum", cooktime = 2000}} - - for _,v in pairs(es_gems) do - minetest.register_craft({ - type = "cooking", - recipe = "es:"..v.name.."_dust", - output = "es:"..v.name .."_crystal", - cooktime = v.cooktime - }) - end -end -minetest.after(0,es_gems); - - -local grinder_process = function(pos) - - local node = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}).name; - local meta = minetest.get_meta(pos);local inv = meta:get_inventory(); - - - -- PROCESS: check out inserted items - local stack = inv:get_stack("src",1); - if stack:is_empty() then return end; -- nothing to do - - local src_item = stack:to_string(); - local p=string.find(src_item," "); if p then src_item = string.sub(src_item,1,p-1) else p = 0 end -- take first word to determine what item was - - local def = basic_machines.grinder_recipes[src_item]; - if not def then - meta:set_string("infotext", "please insert valid materials"); return - end-- unknown node - - if stack:get_count()< def[3] then - meta:set_string("infotext", "Recipe requires at least " .. def[3] .. " " .. src_item); - return - end - - - - -- FUEL CHECK - local fuel = meta:get_float("fuel"); - - - if fuel-def[1]<0 then -- we need new fuel, check chest below - local fuellist = inv:get_list("fuel") - if not fuellist then return end - - local fueladd, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - - local supply=0; - if fueladd.time == 0 then -- no fuel inserted, try look for outlet - -- No valid fuel in fuel list - supply = basic_machines.check_power({x=pos.x,y=pos.y-1,z=pos.z} , def[1]) or 0; -- tweaked so 1 coal = 1 energy - if supply>0 then - fueladd.time = supply -- same as 10 coal - else - meta:set_string("infotext", "Please insert fuel"); - return; - end - else - if supply==0 then -- Take fuel from fuel list if no supply available - inv:set_stack("fuel",1,afterfuel.items[1]) - fueladd.time=fueladd.time*0.1/4 -- thats 1 for coal - --minetest.chat_send_all("FUEL ADD TIME " .. fueladd.time) - end - end - if fueladd.time>0 then - fuel=fuel + fueladd.time - meta:set_float("fuel",fuel); - meta:set_string("infotext", "added fuel furnace burn time " .. fueladd.time .. ", fuel status " .. fuel); - end - if fuel-def[1]<0 then - meta:set_string("infotext", "need at least " .. def[1]-fuel .. " fuel to complete operation "); return - end - - end - - - - -- process items - - -- TO DO: check if there is room for item yyy - local addstack = ItemStack(def[2]); - if inv:room_for_item("dst", addstack) then - inv:add_item("dst",addstack); - else return - end - - --take 1 item from src inventory for each activation - stack=stack:take_item(1); inv:remove_item("src", stack) - - minetest.sound_play("grinder", {pos=pos,gain=0.5,max_hear_distance = 16,}) - - fuel = fuel-def[1]; -- burn fuel - meta:set_float("fuel",fuel); - meta:set_string("infotext", "fuel " .. fuel); - -end - - -local grinder_update_meta = function(pos) - local meta = minetest.get_meta(pos); - local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z - local form = - "size[8,8]".. -- width, height - --"size[6,10]".. -- width, height - "label[0,0;IN] label[1,0;OUT] label[0,2;FUEL] ".. - "list["..list_name..";src;0.,0.5;1,1;]".. - "list["..list_name..";dst;1.,0.5;3,3;]".. - "list["..list_name..";fuel;0.,2.5;1,1;]".. - "list[current_player;main;0,4;8,4;]".. - "button[6.5,0.5;1,1;OK;OK]".. - "button[6.5,1.5;1,1;help;help]".. - "listring["..list_name..";dst]".. - "listring[current_player;main]".. - "listring["..list_name..";src]".. - "listring[current_player;main]".. - "listring["..list_name..";fuel]".. - "listring[current_player;main]" - meta:set_string("formspec", form) -end - -minetest.register_node("basic_machines:grinder", { - description = "Grinder", - tiles = {"grinder.png"}, - groups = {cracky=3, mesecon_effector_on = 1}, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos); - meta:set_string("infotext", "Grinder: To operate it insert fuel, then insert item to grind or use keypad to activate it.") - meta:set_string("owner", placer:get_player_name()); - meta:set_float("fuel",0); - local inv = meta:get_inventory();inv:set_size("src", 1);inv:set_size("dst",9);inv:set_size("fuel",1); - end, - - on_rightclick = function(pos, node, player, itemstack, pointed_thing) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if minetest.is_protected(pos, player:get_player_name()) and not privs.privs then return end -- only owner can interact with recycler - grinder_update_meta(pos); - end, - - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if meta:get_string("owner")~=player:get_player_name() and not privs.privs then return 0 end - return stack:get_count(); - end, - - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos); - local privs = minetest.get_player_privs(player:get_player_name()); - if meta:get_string("owner")~=player:get_player_name() and not privs.privs then return 0 end - return stack:get_count(); - end, - - on_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname =="dst" then return end - grinder_process(pos); - end, - - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - return 0; - end, - - mesecons = {effector = { - action_on = function (pos, node,ttl) - if type(ttl)~="number" then ttl = 1 end - if ttl<0 then return end -- machines_TTL prevents infinite recursion - grinder_process(pos); - end - } - }, - - on_receive_fields = function(pos, formname, fields, sender) - if fields.quit then return end - local meta = minetest.get_meta(pos); - - if fields.help then - --recipe list: [in] ={fuel cost, out, quantity of material required for processing} - --basic_machines.grinder_recipes - local text = "RECIPES\n\n"; - for key,v in pairs(basic_machines.grinder_recipes) do - text = text .. "INPUT ".. key .. " " .. v[3] .. " OUTPUT " .. v[2] .. "\n" - end - - local form = "size [6,7] textarea[0,0;6.5,8.5;grinderhelp;GRINDER RECIPES;".. text.."]" - minetest.show_formspec(sender:get_player_name(), "grinderhelp", form) - - end - grinder_update_meta(pos); - end, - -}) - - --- minetest.register_craft({ - -- output = "basic_machines:grinder", - -- recipe = { - -- {"default:diamond","default:mese","default:diamond"}, - -- {"default:mese","default:diamondblock","default:mese"}, - -- {"default:diamond","default:mese","default:diamond"}, - - -- } --- }) - - - - --- REGISTER DUSTS - - -local function register_dust(name,input_node_name,ingot,grindcost,cooktime,R,G,B) - - if not R then R = "FF" end - if not G then G = "FF" end - if not B then B = "FF" end - - local purity_table = {"33","66"}; - - for i = 1,#purity_table do - local purity = purity_table[i]; - minetest.register_craftitem("basic_machines:"..name.."_dust_".. purity, { - description = name.. " dust purity " .. purity .. "%" , - inventory_image = "basic_machines_dust.png^[colorize:#"..R..G..B..":180", - }) - end - - basic_machines.grinder_recipes[input_node_name] = {grindcost,"basic_machines:"..name.."_dust_".. purity_table[1].." 2",1} -- register grinder recipe - - if ingot~="" then - - for i = 1,#purity_table-1 do - minetest.register_craft({ - type = "cooking", - recipe = "basic_machines:"..name.."_dust_".. purity_table[i], - output = "basic_machines:"..name.."_dust_".. purity_table[i+1], - cooktime = cooktime - }) - end - - minetest.register_craft({ - type = "cooking", - recipe = "basic_machines:"..name.."_dust_".. purity_table[#purity_table], - groups = {not_in_creative_inventory=1}, - output = ingot, - cooktime = cooktime - }) - - end -end - - -register_dust("iron","default:iron_lump","default:steel_ingot",4,8,"99","99","99") -register_dust("copper","default:copper_lump","default:copper_ingot",4,8,"C8","80","0D") --c8800d -register_dust("tin","default:tin_lump","default:tin_ingot",4,8,"9F","9F","9F") -register_dust("gold","default:gold_lump","default:gold_ingot",6,25,"FF","FF","00") - --- grinding ingots gives dust too -basic_machines.grinder_recipes["default:steel_ingot"] = {4,"basic_machines:iron_dust_33 2",1}; -basic_machines.grinder_recipes["default:copper_ingot"] = {4,"basic_machines:copper_dust_33 2",1}; -basic_machines.grinder_recipes["default:gold_ingot"] = {6,"basic_machines:gold_dust_33 2",1}; -basic_machines.grinder_recipes["default:tin_ingot"] = {4,"basic_machines:tin_dust_33 2",1}; - --- are moreores (tin, silver, mithril) present? - -local table = minetest.registered_items["moreores:tin_lump"]; if table then - --register_dust("tin","moreores:tin_lump","moreores:tin_ingot",4,8,"FF","FF","FF") - register_dust("silver","moreores:silver_lump","moreores:silver_ingot",5,15,"BB","BB","BB") - register_dust("mithril","moreores:mithril_lump","moreores:mithril_ingot",16,750,"00","00","FF") - - basic_machines.grinder_recipes["moreores:tin_ingot"] = {4,"basic_machines:tin_dust_33 2",1}; - basic_machines.grinder_recipes["moreores:silver_ingot"] = {5,"basic_machines:silver_dust_33 2",1}; - basic_machines.grinder_recipes["moreores:mithril_ingot"] = {16,"basic_machines:mithril_dust_33 2",1}; -end - - -register_dust("mese","default:mese_crystal","default:mese_crystal",8,250,"CC","CC","00") -register_dust("diamond","default:diamond","default:diamond",16,500,"00","EE","FF") -- 0.3hr cooking time to make diamond! - --- darkage recipes and ice -minetest.register_craft({ - type = "cooking", - recipe = "default:ice", - output = "default:water_flowing", - cooktime = 4 -}) - -minetest.register_craft({ - type = "cooking", - recipe = "default:stone", - output = "darkage:basalt", - cooktime = 60 -}) - -minetest.register_craft({ - type = "cooking", - recipe = "darkage:slate", - output = "darkage:schist", - cooktime = 20 -}) - --- dark age recipe: cook schist to get gneiss - -minetest.register_craft({ - type = "cooking", - recipe = "darkage:gneiss", - output = "darkage:marble", - cooktime = 20 -}) - - - -minetest.register_craft({ - output = "darkage:serpentine", - recipe = { - {"darkage:marble","default:cactus"} - } -}) - -minetest.register_craft({ - output = "darkage:mud", - recipe = { - {"default:dirt","default:water_flowing"} - } -}) \ No newline at end of file -- 2.25.1 From 1e49e32eb80adab4fd94a1482b53442b5177df97 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:22:26 +0200 Subject: [PATCH 56/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/depend?= =?UTF-8?q?s.txt=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/depends.txt | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 basic_machines/depends.txt diff --git a/basic_machines/depends.txt b/basic_machines/depends.txt deleted file mode 100644 index 9d0fcb6..0000000 --- a/basic_machines/depends.txt +++ /dev/null @@ -1,5 +0,0 @@ -default -protector? -areas? -boneworld? -moreores? \ No newline at end of file -- 2.25.1 From e83068d1233883ce586a2929e0f8eceb8aa58672 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Thu, 30 Jul 2020 17:23:12 +0200 Subject: [PATCH 57/66] =?UTF-8?q?Aktualizovat=20=E2=80=9Ebasic=5Fmachines/?= =?UTF-8?q?init.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/init.lua | 91 +---------------------------------------- 1 file changed, 1 insertion(+), 90 deletions(-) diff --git a/basic_machines/init.lua b/basic_machines/init.lua index edad2dd..7489acc 100644 --- a/basic_machines/init.lua +++ b/basic_machines/init.lua @@ -1,90 +1 @@ --- BASIC_MACHINES: lightweight automation mod for minetest --- minetest 0.4.14 --- (c) 2015-2016 rnd - --- This program is free software: you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation, either version 3 of the License, or --- (at your option) any later version. - --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- You should have received a copy of the GNU General Public License --- along with this program. If not, see . - - -basic_machines = {}; - - -dofile(minetest.get_modpath("basic_machines").."/mark.lua") -- used for markings, borrowed and adapted from worldedit mod -dofile(minetest.get_modpath("basic_machines").."/mover.lua") -- mover, detector, keypad, distributor -dofile(minetest.get_modpath("basic_machines").."/technic_power.lua") -- technic power for mover -dofile(minetest.get_modpath("basic_machines").."/recycler.lua") -- recycle old used tools -dofile(minetest.get_modpath("basic_machines").."/grinder.lua") -- grind materials into dusts -dofile(minetest.get_modpath("basic_machines").."/autocrafter.lua") -- borrowed and adapted from pipeworks mod -dofile(minetest.get_modpath("basic_machines").."/constructor.lua") -- enable crafting of all machines - -dofile(minetest.get_modpath("basic_machines").."/protect.lua") -- enable interaction with players, adds local on protect/chat event handling - --- OPTIONAL ADDITIONAL STUFF ( comment to disable ) - -dofile(minetest.get_modpath("basic_machines").."/ball.lua") -- interactive flying ball, can activate blocks or be used as a weapon -dofile(minetest.get_modpath("basic_machines").."/enviro.lua") -- enviro blocks that can change surrounding enviroment physics, uncomment spawn/join code to change global physics, disabled by default -minetest.after(0, function() - dofile(minetest.get_modpath("basic_machines").."/mesecon_doors.lua") -- if you want open/close doors with signal, also steel doors are made impervious to dig through, removal by repeat punch - dofile(minetest.get_modpath("basic_machines").."/mesecon_lights.lua") -- adds ability for other light blocks to toggle light -end) - - --- MACHINE PRIVILEGE -minetest.register_privilege("machines", { - description = "Player is expert basic_machine user: his machines work while not present on server, can spawn more than 2 balls at once", -}) - --- machines fuel related recipes --- CHARCOAL - -minetest.register_craftitem("basic_machines:charcoal", { - description = "Wood charcoal", - inventory_image = "charcoal.png", -}) - - -minetest.register_craft({ - type = 'cooking', - recipe = "default:tree", - cooktime = 30, - output = "basic_machines:charcoal", -}) - -minetest.register_craft({ - output = "default:coal_lump", - recipe = { - {"basic_machines:charcoal"}, - {"basic_machines:charcoal"}, - } -}) - -minetest.register_craft({ - type = "fuel", - recipe = "basic_machines:charcoal", - -- note: to make it you need to use 1 tree block for fuel + 1 tree block, thats 2, caloric value 2*30=60 - burntime = 40, -- coal lump has 40, tree block 30, coal block 370 (9*40=360!) -}) - --- add since minetest doesnt have moreores tin ingot recipe -minetest.register_craft({ - output = "default:tin_ingot", - recipe = { - {"moreores:tin_ingot"}, - } -}) - --- COMPATIBILITY -minetest.register_alias("basic_machines:battery", "basic_machines:battery_0") - - -print("[MOD] basic_machines " .. basic_machines.version .. " loaded.") \ No newline at end of file +-- \ No newline at end of file -- 2.25.1 From 4fc0b0cad6c65ba1b1bc94379b056bc65214dc06 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Wed, 5 Aug 2020 17:32:59 +0200 Subject: [PATCH 58/66] =?UTF-8?q?Aktualizovat=20=E2=80=9Edigilines/invento?= =?UTF-8?q?ry.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- digilines/inventory.lua | 68 +++++++++-------------------------------- 1 file changed, 15 insertions(+), 53 deletions(-) diff --git a/digilines/inventory.lua b/digilines/inventory.lua index 693f882..dcf86cc 100644 --- a/digilines/inventory.lua +++ b/digilines/inventory.lua @@ -71,7 +71,7 @@ minetest.register_node("digilines:chest", { return end if fields.channel ~= nil then - minetest.get_meta(pos):set_string("channel",fields.channel) + minetest.get_meta(pos):set_string("channel", fields.channel) end end, digiline = { @@ -81,70 +81,32 @@ minetest.register_node("digilines:chest", { } }, tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("main", stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("main", stack) + end, connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1}, - connects = function(i,param2) - return not pipeworks.connects.facingFront(i,param2) - end, input_inventory = "main", - can_insert = function(pos, _, stack) - return can_insert(pos, stack) - end, - insert_object = function(pos, _, stack) - local inv = minetest.get_meta(pos):get_inventory() - local leftover = inv:add_item("main", stack) - local count = leftover:get_count() - if count == 0 then - local derpstack = stack:get_name()..' 1' - if not inv:room_for_item("main", derpstack) then - -- when you can't put a single more of whatever you just put, - -- you'll get a put for it, then a full - sendMessage(pos,"full "..maybeString(stack)..' '..tostring(count)) - end - else - -- this happens when the chest has received two stacks in a row and - -- filled up exactly with the first one. - -- You get a put for the first stack, a put for the second - -- and then a overflow with the first in stack and the second in leftover - -- and NO full? - sendMessage(pos,"overflow "..maybeString(stack)..' '..tostring(count)) - end - return leftover - end, }, - allow_metadata_inventory_put = function(pos, _, _, stack) - if not can_insert(pos, stack) then - sendMessage(pos,"uoverflow "..maybeString(stack)) - end - return stack:get_count() - end, on_metadata_inventory_move = function(pos, _, _, _, _, _, player) minetest.log("action", player:get_player_name().." moves stuff in chest at "..minetest.pos_to_string(pos)) end, on_metadata_inventory_put = function(pos, _, _, stack, player) local channel = minetest.get_meta(pos):get_string("channel") - local send = function(msg) - sendMessage(pos,msg,channel) - end - -- direction is only for furnaces - -- as the item has already been put, can_insert should return false if the chest is now full. - local derpstack = stack:get_name()..' 1' - if can_insert(pos,derpstack) then - send("uput "..maybeString(stack)) - else - send("ufull "..maybeString(stack)) - end + sendMessage(pos, "uput "..maybeString(stack), channel) minetest.log("action", player:get_player_name().." puts stuff into chest at "..minetest.pos_to_string(pos)) end, on_metadata_inventory_take = function(pos, listname, _, stack, player) - local meta = minetest.get_meta(pos) - local channel = meta:get_string("channel") - local inv = meta:get_inventory() - if inv:is_empty(listname) then - sendMessage(pos, "empty", channel) - end - sendMessage(pos,"utake "..maybeString(stack)) + local channel = minetest.get_meta(pos):get_string("channel") + sendMessage(pos, "utake "..maybeString(stack), channel) minetest.log("action", player:get_player_name().." takes stuff from chest at "..minetest.pos_to_string(pos)) - end + end, }) minetest.register_craft({ -- 2.25.1 From af2974bf9fa96653f9052ddd25fb27c6834e5f6b Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Wed, 5 Aug 2020 17:44:31 +0200 Subject: [PATCH 59/66] =?UTF-8?q?Aktualizovat=20=E2=80=9Emesecons/mesecons?= =?UTF-8?q?=5Fmvps/init.lua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mesecons/mesecons_mvps/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mesecons/mesecons_mvps/init.lua b/mesecons/mesecons_mvps/init.lua index b8abdd7..4aa62d9 100644 --- a/mesecons/mesecons_mvps/init.lua +++ b/mesecons/mesecons_mvps/init.lua @@ -70,6 +70,7 @@ function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky) while #frontiers > 0 do local np = frontiers[1] local nn = minetest.get_node(np) + if nn.name == "ignore" then return nil end if not node_replaceable(nn.name) then table.insert(nodes, {node = nn, pos = np}) @@ -90,6 +91,7 @@ function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky) for _, r in ipairs(mesecon.rules.alldirs) do local adjpos = vector.add(np, r) local adjnode = minetest.get_node(adjpos) + if adjnode.name == "ignore" then return nil end if minetest.registered_nodes[adjnode.name] and minetest.registered_nodes[adjnode.name].mvps_sticky then local sticksto = minetest.registered_nodes[adjnode.name] @@ -155,7 +157,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti if not nodes then return end -- determine if one of the nodes blocks the push / pull for id, n in ipairs(nodes) do - if mesecon.is_mvps_stopper(n.node, movedir, nodes, id) then + if mesecon.is_mvps_stopper(n.node, movedir, nodes, id) or minetest.is_protected(n.pos, "mvps") then return end end -- 2.25.1 From 3abf8b62249e7a1a6e1b6ed8a1cd4c8e0dfeb3a0 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Tue, 18 Aug 2020 18:10:20 +0200 Subject: [PATCH 60/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/sounds?= =?UTF-8?q?/electric=5Fzap.ogg=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/sounds/electric_zap.ogg | Bin 19711 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/sounds/electric_zap.ogg diff --git a/basic_machines/sounds/electric_zap.ogg b/basic_machines/sounds/electric_zap.ogg deleted file mode 100644 index f031d0c4256b79dd420c5cbdc237ba337d70d417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19711 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

Date: Tue, 18 Aug 2020 18:10:27 +0200 Subject: [PATCH 61/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/sounds?= =?UTF-8?q?/grinder.ogg=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/sounds/grinder.ogg | Bin 29792 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/sounds/grinder.ogg diff --git a/basic_machines/sounds/grinder.ogg b/basic_machines/sounds/grinder.ogg deleted file mode 100644 index c0f98b25cb42a3f2fc9a68d2b31c6a5ab3bf79e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29792 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 -- 2.25.1 From 123418b6699e8f82a69b8fee7e2a68ad893ab9fb Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Tue, 18 Aug 2020 18:10:32 +0200 Subject: [PATCH 62/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/sounds?= =?UTF-8?q?/recycler.ogg=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/sounds/recycler.ogg | Bin 29982 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/sounds/recycler.ogg diff --git a/basic_machines/sounds/recycler.ogg b/basic_machines/sounds/recycler.ogg deleted file mode 100644 index 66630e8134382f8e6589a67df617a8acf2e8e477..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29982 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 -- 2.25.1 From 524a5cfd3ca362f5af012037c68f10ac66dc9eb7 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Tue, 18 Aug 2020 18:10:43 +0200 Subject: [PATCH 63/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/init.l?= =?UTF-8?q?ua=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/init.lua | 1 - 1 file changed, 1 deletion(-) delete mode 100644 basic_machines/init.lua diff --git a/basic_machines/init.lua b/basic_machines/init.lua deleted file mode 100644 index 7489acc..0000000 --- a/basic_machines/init.lua +++ /dev/null @@ -1 +0,0 @@ --- \ No newline at end of file -- 2.25.1 From d696e719680082083ca54fff241c861549220e58 Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Tue, 18 Aug 2020 18:10:49 +0200 Subject: [PATCH 64/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/basic=5Fmachine=5Fgenerator.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../textures/basic_machine_generator.png | Bin 240 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/basic_machine_generator.png diff --git a/basic_machines/textures/basic_machine_generator.png b/basic_machines/textures/basic_machine_generator.png deleted file mode 100644 index 1341faf9496e1b4c010bbda5cb480377dde59d7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!R)9~4>&{)fJUu=4?%lh4&+e^@ zEv_Ec4-O9Y_xFE%*?7yAEe|ewg@%S6I&|pn`RGgWk2rw38a-VcLnJPn_FZIZ73651 z{-?F#|8-m4b9x4A*FTuVHGP*V6I*D;{wAp)Xo7b}Z^9gM^Lb z7xmXOE_Wa7Z!#;rk!z98>%_ZHI{WFu2}usWKY#cycU?HEI{iV_T;mf8)8-|=%{`^6 oC6pf=_Va;=aWS{B@cF}aswON#DU*2410BQQ>FVdQ&MBb@0NW5=^Z)<= -- 2.25.1 From 817d58ac35cc899e68e95c153f78aaec3eec988a Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Tue, 18 Aug 2020 18:10:54 +0200 Subject: [PATCH 65/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/basic=5Fmachines=5Fdust.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/basic_machines_dust.png | Bin 119 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/basic_machines_dust.png diff --git a/basic_machines/textures/basic_machines_dust.png b/basic_machines/textures/basic_machines_dust.png deleted file mode 100644 index efa2dbedca39aacb27c3a27c8144b7b7fe968ff7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uI>dsXU?4Y|NnnN<5Df4 zAY)08UoeBivm0qZj*O>^V+hCfTj%_euXS+CcrZ9t)HS=kA!G|ED O89ZJ6T-G@yGywqkXdwLn -- 2.25.1 From 7a5555a3e849231d31783a70689cf53b32a26dae Mon Sep 17 00:00:00 2001 From: Milan2018 Date: Tue, 18 Aug 2020 18:10:58 +0200 Subject: [PATCH 66/66] =?UTF-8?q?Smazat=20=E2=80=9Ebasic=5Fmachines/textur?= =?UTF-8?q?es/grinder.png=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic_machines/textures/grinder.png | Bin 325 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 basic_machines/textures/grinder.png diff --git a/basic_machines/textures/grinder.png b/basic_machines/textures/grinder.png deleted file mode 100644 index d80a2663a78ce89f6246c3ab536b2be86358648a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325 zcmV-L0lNN)P)p6GB2lr>CcPLk6Ov zqLh@Ba5)7qFfe{Y1D>9q0000?OiZ}AxQ30}MgRZ+uSrBfR2UfrK!;HPArRbyi)8qu z_Ft%jbzSM|C!H&$FZB+UTS}86rO7Kracw7?PR3lB_Car)-LfG+$g?C|LXX1<24)w< zy73EtXjp|&IY_1EVOHG+vfT?^U?V)D#uyOA*>HqM)Zic738x{CaKNMHDhpqm%n=b0 z)3_|COrA~#R3^GR)*iWXM$JH;Me(