From 00a4358a8274637530cad4b76afc879fe5f4c9ac Mon Sep 17 00:00:00 2001 From: Alexsandro Percy Date: Thu, 10 Aug 2023 21:06:14 -0300 Subject: [PATCH] added biofuel inside airutils --- airutils_biofuel.lua | 257 ++++++++++++++++++++++++++ init.lua | 5 + inventory_management.lua | 44 ++--- mod.conf | 2 +- models/airutils_biofuel_distiller.b3d | Bin 0 -> 36957 bytes textures/airutils_aluminum.png | Bin 0 -> 2482 bytes textures/airutils_biofuel_inv.png | Bin 0 -> 6216 bytes textures/airutils_copper.png | Bin 0 -> 2614 bytes 8 files changed, 285 insertions(+), 23 deletions(-) create mode 100644 airutils_biofuel.lua create mode 100644 models/airutils_biofuel_distiller.b3d create mode 100755 textures/airutils_aluminum.png create mode 100644 textures/airutils_biofuel_inv.png create mode 100755 textures/airutils_copper.png diff --git a/airutils_biofuel.lua b/airutils_biofuel.lua new file mode 100644 index 0000000..8263ad2 --- /dev/null +++ b/airutils_biofuel.lua @@ -0,0 +1,257 @@ +---------- +--biofuel +---------- + +local module_name = "airutils" + +if minetest.get_modpath("technic") then + if technic then + technic.register_extractor_recipe({input = {"farming:wheat 33"}, output = "biofuel:biofuel 1"}) + technic.register_extractor_recipe({input = {"farming:corn 33"}, output = "biofuel:biofuel 1"}) + technic.register_extractor_recipe({input = {"farming:potato 33"}, output = "biofuel:biofuel 1"}) + technic.register_extractor_recipe({input = {"default:papyrus 99"}, output = "biofuel:biofuel 1"}) + end +end + + +if minetest.get_modpath("basic_machines") then + if basic_machines then + basic_machines.grinder_recipes["farming:wheat"] = {50,"biofuel:biofuel",1} + basic_machines.grinder_recipes["farming:corn"] = {50,"biofuel:biofuel",1} + basic_machines.grinder_recipes["farming:potato"] = {50,"biofuel:biofuel",1} + basic_machines.grinder_recipes["default:papyrus"] = {70,"biofuel:biofuel",1} + end +end + +if minetest.get_modpath("default") then + minetest.register_craft({ + output = module_name .. ":biofuel_distiller", + recipe = { + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + {"default:steel_ingot" , "", "default:steel_ingot"}, + {"default:steel_ingot" , "default:steel_ingot", "default:steel_ingot"}, + }, + }) +end +if minetest.get_modpath("mcl_core") then + minetest.register_craft({ + output = module_name .. ":biofuel_distiller", + recipe = { + {"mcl_copper:copper_ingot", "mcl_copper:copper_ingot", "mcl_copper:copper_ingot"}, + {"mcl_core:iron_ingot" , "", "mcl_core:iron_ingot"}, + {"mcl_core:iron_ingot" , "mcl_core:iron_ingot", "mcl_core:iron_ingot"}, + }, + }) +end + + +-- biofuel +minetest.register_craftitem(":biofuel:biofuel",{ + description = "Bio Fuel", + inventory_image = "biofuel_inv.png", +}) + +minetest.register_craft({ + type = "fuel", + recipe = "biofuel:biofuel", + burntime = 50, +}) + +local ferment = { + {"default:papyrus", "biofuel:biofuel"}, + {"farming:wheat", "biofuel:biofuel"}, + {"farming:corn", "biofuel:biofuel"}, + {"farming:baked_potato", "biofuel:biofuel"}, + {"farming:potato", "biofuel:biofuel"} +} + +local ferment_groups = {'flora', 'leaves', 'flower', 'sapling', 'tree', 'wood', 'stick', 'plant', 'seed', + 'leafdecay', 'leafdecay_drop', 'mushroom', 'vines' } + +-- distiller +local biofueldistiller_formspec = "size[8,9]" + .. "list[current_name;src;2,1;1,1;]" .. airutils.get_itemslot_bg(2, 1, 1, 1) + .. "list[current_name;dst;5,1;1,1;]" .. airutils.get_itemslot_bg(5, 1, 1, 1) + .. "list[current_player;main;0,5;8,4;]" .. airutils.get_itemslot_bg(0, 5, 8, 4) + .. "listring[current_name;dst]" + .. "listring[current_player;main]" + .. "listring[current_name;src]" + .. "listring[current_player;main]" + .. "image[3.5,1;1,1;gui_furnace_arrow_bg.png^[transformR270]" + +minetest.register_node( module_name .. ":biofuel_distiller", { + description = "Biofuel Distiller", + tiles = {"airutils_metal.png", "airutils_aluminum.png", "airutils_copper.png" }, + drawtype = "mesh", + mesh = "airutils_biofuel_distiller.b3d", + paramtype = "light", + paramtype2 = "facedir", + groups = { + choppy = 2, oddly_breakable_by_hand = 1, flammable = 2 + }, + legacy_facedir_simple = true, + + on_place = minetest.rotate_node, + + on_construct = function(pos) + + local meta = minetest.get_meta(pos) + + meta:set_string("formspec", biofueldistiller_formspec) + meta:set_string("infotext", "Biofuel Distiller") + meta:set_float("status", 0.0) + + local inv = meta:get_inventory() + + inv:set_size("src", 1) + inv:set_size("dst", 1) + end, + + can_dig = function(pos,player) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if not inv:is_empty("dst") + or not inv:is_empty("src") then + return false + end + + return true + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + return stack:get_count() + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + + if to_list == "src" then + return count + elseif to_list == "dst" then + return 0 + end + end, + + on_metadata_inventory_put = function(pos) + + local timer = minetest.get_node_timer(pos) + + timer:start(5) + end, + + on_timer = function(pos) + + local meta = minetest.get_meta(pos) ; if not meta then return end + local inv = meta:get_inventory() + + -- is barrel empty? + if not inv or inv:is_empty("src") then + + meta:set_float("status", 0.0) + meta:set_string("infotext", "Fuel Distiller") + + return false + end + + -- does it contain any of the source items on the list? + local has_item + + --normal items + for n = 1, #ferment do + if inv:contains_item("src", ItemStack(ferment[n][1])) then + has_item = n + break + end + end + + --groups + local has_group + if not has_item then + local inv_content = inv:get_list("src") + if inv_content then + for k, v in pairs(inv_content) do + local item_name = v:get_name() + for n = 1, #ferment_groups do + if minetest.get_item_group(item_name, ferment_groups[n]) == 1 then + has_group = n + break + end + end + end + end + end + + if not has_item and not has_group then + return false + end + + -- is there room for additional fermentation? + if has_item and not inv:room_for_item("dst", ferment[has_item][2]) then + meta:set_string("infotext", "Fuel Distiller (FULL)") + return true + end + + if has_group and not inv:room_for_item("dst", "biofuel:biofuel") then + meta:set_string("infotext", "Fuel Distiller (FULL)") + return true + end + + local status = meta:get_float("status") + + -- fermenting (change status) + if status < 100 then + meta:set_string("infotext", "Fuel Distiller " .. status .. "% done") + meta:set_float("status", status + 5) + else + if not has_group then + inv:remove_item("src", ferment[has_item][1]) + inv:add_item("dst", ferment[has_item][2]) + else + for i,itemstack in pairs(inv:get_list("src")) do + inv:remove_item("src", ItemStack(itemstack:get_name().." 1")) + end + inv:add_item("dst", "biofuel:biofuel") + end + + meta:set_float("status", 0,0) + end + + if inv:is_empty("src") then + meta:set_float("status", 0.0) + meta:set_string("infotext", "Fuel Distiller") + end + + return true + end, +}) + diff --git a/init.lua b/init.lua index 8fd36fb..7ab7bf8 100644 --- a/init.lua +++ b/init.lua @@ -35,6 +35,7 @@ end if not minetest.settings:get_bool('airutils.disable_repair') then dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "airutils_repair.lua") end + airutils.get_wind = dofile(minetest.get_modpath("airutils") .. DIR_DELIM ..'/wind.lua') dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "common_entities.lua") dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "airutils_wind.lua") @@ -43,6 +44,10 @@ dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "light.lua") dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "physics_lib.lua") dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "lib_planes" .. DIR_DELIM .. "init.lua") +if not minetest.settings:get_bool('airutils.disable_biofuel') then + dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "airutils_biofuel.lua") +end + if minetest.get_modpath("player_api") and not minetest.settings:get_bool('airutils.disable_uniforms') then dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "pilot_skin_manager.lua") end diff --git a/inventory_management.lua b/inventory_management.lua index a671b31..5643172 100644 --- a/inventory_management.lua +++ b/inventory_management.lua @@ -2,8 +2,8 @@ local storage = minetest.get_mod_storage() airutils.modname = minetest.get_current_modname() --function to format formspec for mineclone. In case of minetest, just returns an empty string -local function get_itemslot_bg(a, b, c, d) - if airutils.is_mcl then +function airutils.get_itemslot_bg(a, b, c, d) + if mcl_formspec then return mcl_formspec.get_itemslot_bg(a,b,c,d) end return "" @@ -19,54 +19,54 @@ local function get_formspec_by_size(self, size) end local default_inventory_formspecs = { ["2"]="size[8,6]".. background .. - "list[detached:" .. self._inv_id .. ";main;3.0,0;3,1;]" .. get_itemslot_bg(3.0, 0, 2, 1) .. - "list[current_player;main;0,2;8,4;]" .. get_itemslot_bg(0, 2, 8, 4) .. + "list[detached:" .. self._inv_id .. ";main;3.0,0;3,1;]" .. airutils.get_itemslot_bg(3.0, 0, 2, 1) .. + "list[current_player;main;0,2;8,4;]" .. airutils.get_itemslot_bg(0, 2, 8, 4) .. "listring[]", ["3"]="size[8,6]".. background .. - "list[detached:" .. self._inv_id .. ";main;2.5,0;3,1;]" .. get_itemslot_bg(2.5, 0, 3, 1) .. - "list[current_player;main;0,2;8,4;]" .. get_itemslot_bg(0, 2, 8, 4) .. + "list[detached:" .. self._inv_id .. ";main;2.5,0;3,1;]" .. airutils.get_itemslot_bg(2.5, 0, 3, 1) .. + "list[current_player;main;0,2;8,4;]" .. airutils.get_itemslot_bg(0, 2, 8, 4) .. "listring[]", ["4"]="size[8,6]".. background .. - "list[detached:" .. self._inv_id .. ";main;2,0;4,1;]" .. get_itemslot_bg(2.0, 0, 4, 1) .. - "list[current_player;main;0,2;8,4;]" .. get_itemslot_bg(0, 2, 8, 4) .. + "list[detached:" .. self._inv_id .. ";main;2,0;4,1;]" .. airutils.get_itemslot_bg(2.0, 0, 4, 1) .. + "list[current_player;main;0,2;8,4;]" .. airutils.get_itemslot_bg(0, 2, 8, 4) .. "listring[]", ["6"]="size[8,6]".. background .. - "list[detached:" .. self._inv_id .. ";main;1,0;6,1;]".. get_itemslot_bg(1.0, 0, 6, 1) .. - "list[current_player;main;0,2;8,4;]" .. get_itemslot_bg(0, 2, 8, 4) .. + "list[detached:" .. self._inv_id .. ";main;1,0;6,1;]".. airutils.get_itemslot_bg(1.0, 0, 6, 1) .. + "list[current_player;main;0,2;8,4;]" .. airutils.get_itemslot_bg(0, 2, 8, 4) .. "listring[]", ["8"]="size[8,6]".. background .. - "list[detached:" .. self._inv_id .. ";main;0,0;8,1;]".. get_itemslot_bg(0, 0, 8, 1) .. - "list[current_player;main;0,2;8,4;]" .. get_itemslot_bg(0, 2, 8, 4) .. + "list[detached:" .. self._inv_id .. ";main;0,0;8,1;]".. airutils.get_itemslot_bg(0, 0, 8, 1) .. + "list[current_player;main;0,2;8,4;]" .. airutils.get_itemslot_bg(0, 2, 8, 4) .. "listring[]", ["12"]="size[8,7]".. background .. - "list[detached:" .. self._inv_id .. ";main;1,0;6,2;]".. get_itemslot_bg(1, 0, 6, 2) .. - "list[current_player;main;0,3;8,4;]" .. get_itemslot_bg(0, 3, 8, 4) .. + "list[detached:" .. self._inv_id .. ";main;1,0;6,2;]".. airutils.get_itemslot_bg(1, 0, 6, 2) .. + "list[current_player;main;0,3;8,4;]" .. airutils.get_itemslot_bg(0, 3, 8, 4) .. "listring[]", ["16"]="size[8,7]".. background .. - "list[detached:" .. self._inv_id .. ";main;0,0;8,2;]".. get_itemslot_bg(0, 0, 8, 2) .. - "list[current_player;main;0,3;8,4;]" .. get_itemslot_bg(0, 3, 8, 4) .. + "list[detached:" .. self._inv_id .. ";main;0,0;8,2;]".. airutils.get_itemslot_bg(0, 0, 8, 2) .. + "list[current_player;main;0,3;8,4;]" .. airutils.get_itemslot_bg(0, 3, 8, 4) .. "listring[]", ["24"]="size[8,8]".. background .. - "list[detached:" .. self._inv_id .. ";main;0,0;8,3;]".. get_itemslot_bg(0, 0, 8, 3) .. - "list[current_player;main;0,4;8,4;]" .. get_itemslot_bg(0, 4, 8, 4) .. + "list[detached:" .. self._inv_id .. ";main;0,0;8,3;]".. airutils.get_itemslot_bg(0, 0, 8, 3) .. + "list[current_player;main;0,4;8,4;]" .. airutils.get_itemslot_bg(0, 4, 8, 4) .. "listring[]", ["32"]="size[8,9]".. background .. - "list[detached:" .. self._inv_id .. ";main;0,0.3;8,4;]".. get_itemslot_bg(0, 0.3, 8, 4) .. - "list[current_player;main;0,5;8,4;]".. get_itemslot_bg(0, 5, 8, 4) .. + "list[detached:" .. self._inv_id .. ";main;0,0.3;8,4;]".. airutils.get_itemslot_bg(0, 0.3, 8, 4) .. + "list[current_player;main;0,5;8,4;]".. airutils.get_itemslot_bg(0, 5, 8, 4) .. "listring[]" .. hotbar, ["50"]="size[10,10]".. background .. - "list[detached:" .. self._inv_id .. ";main;0,0;10,5;]".. get_itemslot_bg(0, 0, 10, 5) .. - "list[current_player;main;1,6;8,4;]" .. get_itemslot_bg(1, 6, 8, 4) .. + "list[detached:" .. self._inv_id .. ";main;0,0;10,5;]".. airutils.get_itemslot_bg(0, 0, 10, 5) .. + "list[current_player;main;1,6;8,4;]" .. airutils.get_itemslot_bg(1, 6, 8, 4) .. "listring[]", } diff --git a/mod.conf b/mod.conf index 7a8e6b6..a4a24eb 100644 --- a/mod.conf +++ b/mod.conf @@ -2,4 +2,4 @@ name = airutils title=AirUtils description=A lib for airplanes and some useful tools author=apercy -optional_depends=player_api, emote, climate_api +optional_depends=player_api, emote, climate_api, biofuel diff --git a/models/airutils_biofuel_distiller.b3d b/models/airutils_biofuel_distiller.b3d new file mode 100644 index 0000000000000000000000000000000000000000..f6d37aa7938954147b50457afdde2ea8e5ee6643 GIT binary patch literal 36957 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 JXLpbt{1+aFmumn3 literal 0 HcmV?d00001 diff --git a/textures/airutils_aluminum.png b/textures/airutils_aluminum.png new file mode 100755 index 0000000000000000000000000000000000000000..5b4e746e63a4e620e800b898b6a733ec313adebd GIT binary patch literal 2482 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 literal 0 HcmV?d00001 diff --git a/textures/airutils_biofuel_inv.png b/textures/airutils_biofuel_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf24697504f855e106b3e6cfdd6ad7c31471fee GIT binary patch literal 6216 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 OMs##@xVSnX>VE(=L(&QW literal 0 HcmV?d00001 diff --git a/textures/airutils_copper.png b/textures/airutils_copper.png new file mode 100755 index 0000000000000000000000000000000000000000..f90530fb3ae4c1d20150e32857d3fb25da82662b GIT binary patch literal 2614 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