From 11b759a4642f79093e5c440584508a368fb24ae6 Mon Sep 17 00:00:00 2001 From: James Stevenson Date: Sun, 17 Jan 2016 07:23:02 -0500 Subject: [PATCH] Start furnace conversion --- claycrafter.lua | 314 ++++++++++++++++++++ init.lua | 26 +- textures/claycrafter_claycrafter_bottom.png | Bin 0 -> 583 bytes textures/claycrafter_claycrafter_top.png | Bin 0 -> 596 bytes 4 files changed, 337 insertions(+), 3 deletions(-) create mode 100644 claycrafter.lua create mode 100644 textures/claycrafter_claycrafter_bottom.png create mode 100644 textures/claycrafter_claycrafter_top.png diff --git a/claycrafter.lua b/claycrafter.lua new file mode 100644 index 0000000..c704f78 --- /dev/null +++ b/claycrafter.lua @@ -0,0 +1,314 @@ + +-- +-- Formspecs +-- + +local function active_formspec(fuel_percent, item_percent) + local formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-fuel_percent)..":default_furnace_fire_fg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_name;dst]".. + "listring[current_player;main]".. + "listring[current_name;src]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) + return formspec +end + +local inactive_formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_name;dst]".. + "listring[current_player;main]".. + "listring[current_name;src]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) + +-- +-- Node callback functions that are the same for active and inactive claycrafter +-- + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("fuel") and inv:is_empty("dst") and inv:is_empty("src") +end + +local function allow_metadata_inventory_put(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 == "fuel" then -- "Water" + --if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + if minetest.get_item_group(stack:get_name(), "h2o") > 0 then + if inv:is_empty("src") then + meta:set_string("infotext", "Claycrafter is empty") + end + return stack:get_count() + else + return 0 + end + elseif listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +-- +-- Node definitions +-- + +minetest.register_node("claycrafter:claycrafter", { + description = "Claycrafter", + tiles = { + "claycrafter_claycrafter_top.png", "claycrafter_claycrafter_bottom.png", + "claycrafter_claycrafter_side.png", "claycrafter_claycrafter_side.png", + "claycrafter_claycrafter_back.png", "claycrafter_claycrafter_front.png" + }, + paramtype2 = "facedir", + groups = {choppy = 1, oddly_breakable_by_hand = 1}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + +minetest.register_node("claycrafter:claycrafter_active", { + description = "Claycrafter", + tiles = { + "claycrafter_claycrafter_top.png", "claycrafter_claycrafter_bottom.png", + "claycrafter_claycrafter_side.png", "claycrafter_claycrafter_side.png", + "claycrafter_claycrafter_side.png", + { + image = "claycrafter_claycrafter_front_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + } + }, + paramtype2 = "facedir", + light_source = 8, + drop = "claycrafter:claycrafter", + groups = {choppy = 1, oddly_breakable_by_hand = 1, not_in_creative_inventory = 1}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + +-- +-- ABM +-- + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +minetest.register_abm({ + nodenames = {"claycrafter:claycrafter", "claycrafter:claycrafter_active"}, + interval = 1.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + -- + -- Inizialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + -- + -- Inizialize inventory + -- + local inv = meta:get_inventory() + for listname, size in pairs({ + src = 1, + fuel = 1, + dst = 4, + }) do + if inv:get_size(listname) ~= size then + inv:set_size(listname, size) + end + end + local srclist = inv:get_list("src") + local fuellist = inv:get_list("fuel") + local dstlist = inv:get_list("dst") + + -- + -- Cooking + -- + + --[[ + -- Check if we have cookable content + --local cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + local cooked, aftercooked = minetest.get_item_group(inv:get_stack("src", 1):get_name(), "h2o") + local cookable = true + print(inv:get_stack("fuel", 1):get_name()) + print(cooked) + + --if cooked.time == 0 then + if cooked == 0 then + cookable = false + end + --]] + local cooked, aftercooked + local cooktime = minetest.get_item_group(inv:get_stack("fuel", 1):get_name(), "h2o") + print("cooktime: " .. cooktime) + local cookable = true + print(inv:get_stack("src", 1):get_name()) + if inv:get_stack("src", 1):get_name() ~= "claycrafter:compressed_dirt" then + cookable = false + end + print(tostring(cookable)) + + + -- Check if we have enough fuel to burn + if fuel_time < fuel_totaltime then + -- The claycrafter is currently active and has enough fuel + fuel_time = fuel_time + 1 + + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + 1 + print("src_time: " .. src_time) + if src_time >= cooktime then --cooked.time then + -- Place result in dst list if possible + --if inv:room_for_item("dst", ItemStack({name = "default:clay 4"})) then --cooked.item) then + inv:add_item("dst", {name = "default:clay"}) --cooked.item) + --inv:set_stack("src", 1, aftercooked.items[1]) + src_time = 0 + --end + end + end + else + -- Furnace ran out of fuel + if cookable then + -- We need to get new fuel + local fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + local fueltime = minetest.get_item_group(inv:get_stack("fuel", 1):get_name(), "h2o") + print("fueltime var is: " .. fueltime) + + --if fuel.time == 0 then + if fueltime == 0 then + -- No valid fuel in fuel list + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + else + -- Take fuel from fuel list + --inv:set_stack("fuel", 1, afterfuel.items[1]) + inv:get_stack("fuel", 1):take_item() + + + fuel_totaltime = fueltime + fuel_time = 0 + + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + end + end + + -- + -- Update formspec, infotext and node + -- + local formspec = inactive_formspec + local item_state = "" + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooktime * 100) --cooked.time * 100) + item_state = item_percent .. "%" + else + if srclist[1]:is_empty() then + item_state = "Empty" + else + item_state = "Not cookable" + end + end + + local fuel_state = "Empty" + local active = "inactive " + if fuel_time <= fuel_totaltime and fuel_totaltime ~= 0 then + active = "active " + local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) + fuel_state = fuel_percent .. "%" + formspec = active_formspec(fuel_percent, item_percent) + swap_node(pos, "claycrafter:claycrafter_active") + else + if not fuellist[1]:is_empty() then + fuel_state = "0%" + end + swap_node(pos, "claycrafter:claycrafter") + end + + local infotext = "Claycrafter " .. active .. "(Dirt: " .. item_state .. "; H2O: " .. fuel_state .. ")" + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + meta:set_string("infotext", infotext) + end, +}) diff --git a/init.lua b/init.lua index 4e4e26d..e5cfa95 100644 --- a/init.lua +++ b/init.lua @@ -1,6 +1,7 @@ --the claycrafter is supposed to be some sort of furnace --that uses compressed dirt and glasses of water to make clay, it's not needed to use the mod currently. - + +--[[ minetest.register_node("claycrafter:claycrafter", { description = "Clay crafter", tiles = { @@ -13,6 +14,7 @@ minetest.register_node("claycrafter:claycrafter", { }, groups = {oddly_breakable_by_hand = 1, choppy = 1} }) +--]] --Compressed dirt minetest.register_node("claycrafter:compressed_dirt", { @@ -30,11 +32,18 @@ minetest.register_craft({ }) --Glass of water +-- Water glasses, like full buckets of water, might +-- should have, stack_max = 1 minetest.register_craftitem("claycrafter:glass_of_water", { description = "Glass of Water", - inventory_image = "claycrafter_glass_of_water.png" + inventory_image = "claycrafter_glass_of_water.png", + groups = {h2o = 1}, -- How much compressed dirt will turn to clay + --stack_max = 1 }) +-- Better may be to override the vessels:drinking_glass item +-- and allow scooping water just as the bucket does +-- (Always wanted to do that.) minetest.register_craft({ output = "claycrafter:glass_of_water 8", recipe = { @@ -55,4 +64,15 @@ minetest.register_craft({ replacements = { {"claycrafter:glass_of_water", "vessels:drinking_glass"}, } -}) \ No newline at end of file +}) + +--[[ +minetest.register_craft({ + type = "h2o", -- normal, cooking,or fuel only + output = "default:clay", + recipe = {"claycrafter:compressed_dirt"}, + recplacements = {{"claycrafter:glass_of_water"}} +}) +--]] + +dofile(minetest.get_modpath("claycrafter") .. "/claycrafter.lua") diff --git a/textures/claycrafter_claycrafter_bottom.png b/textures/claycrafter_claycrafter_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1a59c765a5756de3f371c00fd996089784ed89 GIT binary patch literal 583 zcmV-N0=WH&P)0^XCL0aP{arVfSh4(F~>ZCwZ90FldpS3m8dm1Ul#K5uTzeWPjLss zIDB%S^UE_P*%^xfk#id!OYrUJ4-tU`&mQlSJvqZDaBzd2`3!dhLEi--fdpoBov|D$ z*Kco;@Pqvso*}K!Q7M(|-nz%o z*8myrFiCAOK#d?J$F2PtFv(87H{YU$5Re_fHbDxSg{##Fv?L~jt-eEQj^wk;6`#L+ z-^BCv%SVmomRJZPn#G^K{@Cf7uAO*xgmz}L?&wl`? VE7gqr$^ifX002ovPDHLkV1m+U0B8UJ literal 0 HcmV?d00001 diff --git a/textures/claycrafter_claycrafter_top.png b/textures/claycrafter_claycrafter_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0bf25e610dfcb0dc1d66315fc36cee289ca24dd1 GIT binary patch literal 596 zcmV-a0;~OrP)H?A$$Mr_4BFpuk~=9Gt6fLDT2_=rAOtXjA}ZCoqKHbe z{6JN}Vc#YI+#NG;oTx!r%tw4$p11tRczbzUq*N21oQ<sp}nzV{YI=IT)e6FYYiX199K@(X6{_g8(5Y zW`gp&OKSme;;-MUo}n2x)fP8ry=wqrz3mv3fuJ2`e&hgPwcZn=5a+WIAaDco$p{fx zoQzQs#)F7RmY>XsK@kzYe}R|J&Il^R)9DcRtU(^^z}?x@ZO=ibG)B#9hPjQ-i1*t) zW&lI3|5Ol$F@FK}vmm@Csm0I$0000