]> git.lizzy.rs Git - Crafter.git/blobdiff - mods/utility/furnace.lua
Fix furnace inv swap xp glitch
[Crafter.git] / mods / utility / furnace.lua
index d15f62ac720ec8ea70731db92e1d451b00f959a2..0086b88e0b8aa1c82f1d07b7b1f8d6f9825c31f1 100644 (file)
@@ -2,6 +2,8 @@ local furnace = {}
 
 function furnace.get_furnace_active_formspec(fuel_percent, item_percent)
        return "size[9,8.75]"..
+               "background[-0.19,-0.25;9.41,9.49;gui_hb_bg.png]"..
+               "listcolors[#8b8a89;#c9c3c6;#3e3d3e;#000000;#FFFFFF]"..
                "list[context;src;2.75,0.5;1,1;]"..
                "list[context;fuel;2.75,2.5;1,1;]"..
                "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
@@ -10,7 +12,7 @@ function furnace.get_furnace_active_formspec(fuel_percent, item_percent)
                (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]"..
                "list[context;dst;4.75,0.96;2,2;]"..
                "list[current_player;main;0,4.5;9,1;]".. --hotbar
-               "list[current_player;main;0,6;9,3;8]".. --inventory
+               "list[current_player;main;0,6;9,3;9]".. --inventory
                
                "listring[context;dst]"..
                "listring[current_player;main]"..
@@ -23,13 +25,15 @@ end
 
 function furnace.get_furnace_inactive_formspec()
        return "size[9,8.75]"..
+               "background[-0.19,-0.25;9.41,9.49;gui_hb_bg.png]"..
+               "listcolors[#8b8a89;#c9c3c6;#3e3d3e;#000000;#FFFFFF]"..
                "list[context;src;2.75,0.5;1,1;]"..
                "list[context;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[context;dst;4.75,0.96;2,2;]"..
                "list[current_player;main;0,4.5;9,1;]"..
-               "list[current_player;main;0,6;9,3;8]"..
+               "list[current_player;main;0,6;9,3;9]"..
                "listring[context;dst]"..
                "listring[current_player;main]"..
                "listring[context;src]"..
@@ -43,11 +47,13 @@ end
 -- Node callback functions that are the same for active and inactive furnace
 --
 
+--[[
 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
@@ -145,6 +151,9 @@ local function furnace_node_timer(pos, elapsed)
                                                inv:set_stack("src", 1, aftercooked.items[1])
                                                src_time = src_time - cooked.time
                                                update = true
+                                               local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95)
+                                               local newpos = vector.add(pos,dir)
+                                               minetest.throw_experience(newpos, 1)
                                        else
                                                dst_full = true
                                        end
@@ -262,6 +271,19 @@ local function furnace_node_timer(pos, elapsed)
 
        return result
 end
+--throw all items in furnace out on destroy
+local function destroy_furnace(pos)
+       local meta = minetest.get_meta(pos)
+       local inv = meta:get_inventory()
+       local lists = inv:get_lists()
+       for listname,_ in pairs(lists) do
+               local size = inv:get_size(listname)
+               for i = 1,size do
+                       local stack = inv:get_stack(listname, i)
+                       minetest.add_item(pos, stack)
+               end
+       end
+end
 
 --
 -- Node definitions
@@ -280,7 +302,7 @@ minetest.register_node("utility:furnace", {
        is_ground_content = false,
        sounds = main.stoneSound(),
 
-       can_dig = can_dig,
+       --can_dig = can_dig,
 
        on_timer = furnace_node_timer,
 
@@ -294,12 +316,19 @@ minetest.register_node("utility:furnace", {
        end,
 
        on_metadata_inventory_move = function(pos)
-               minetest.get_node_timer(pos):start(1.0)
+               local timer = minetest.get_node_timer(pos)
+               if timer:is_started() == false then
+                       timer:start(1.0)
+               end
        end,
        on_metadata_inventory_put = function(pos)
                -- start timer function, it will sort out whether furnace can burn or not.
-               minetest.get_node_timer(pos):start(1.0)
+               local timer = minetest.get_node_timer(pos)
+               if timer:is_started() == false then
+                       timer:start(1.0)
+               end
        end,
+       --[[
        on_blast = function(pos)
                local drops = {}
                furnace.get_inventory_drops(pos, "src", drops)
@@ -309,10 +338,14 @@ minetest.register_node("utility:furnace", {
                minetest.remove_node(pos)
                return drops
        end,
-
+       ]]--
+       on_destruct = function(pos)
+               destroy_furnace(pos)
+       end,
        allow_metadata_inventory_put = allow_metadata_inventory_put,
        allow_metadata_inventory_move = allow_metadata_inventory_move,
        allow_metadata_inventory_take = allow_metadata_inventory_take,
+       on_metadata_inventory_take = on_metadata_inventory_take,
 })
 
 minetest.register_node("utility:furnace_active", {
@@ -341,18 +374,22 @@ minetest.register_node("utility:furnace_active", {
        sounds = main.stoneSound(),
        on_timer = furnace_node_timer,
 
-       can_dig = can_dig,
+       --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,
+       on_metadata_inventory_take = on_metadata_inventory_take,
+       on_destruct = function(pos)
+               destroy_furnace(pos)
+       end,
 })
 
 minetest.register_craft({
        output = "utility:furnace",
        recipe = {
-               {"group:stone", "group:stone", "group:stone"},
-               {"group:stone", "", "group:stone"},
-               {"group:stone", "group:stone", "group:stone"},
+               {"main:cobble", "main:cobble", "main:cobble"},
+               {"main:cobble", "",            "main:cobble"},
+               {"main:cobble", "main:cobble", "main:cobble"},
        }
 })