Update furnace, workbench, HUD position

master
MoNTE48 2019-06-14 17:28:09 +02:00
parent 49c92b7108
commit a748397bfa
7 changed files with 263 additions and 216 deletions

View File

@ -3,38 +3,37 @@
-- Formspecs
--
local function active_formspec(fuel_percent, item_percent)
local formspec =
"size[9,8.75]"..
"background[-0.2,-0.26;9.41,9.49;formspec_inventory.png]"..
"background[-0.2,-0.26;9.41,9.49;formspec_furnace.png]"..
"bgcolor[#08080880;true]"..
"listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]"..
"image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;true;]"..
"list[current_player;main;0,4.5;9,3;9]"..
"list[current_player;main;0,7.74;9,1;]"..
"list[current_name;src;3,0.5;1,1;]"..
"list[current_name;fuel;3,2.5;1,1;]"..
"list[current_name;dst;5,1.5;1,1;]"..
"list[detached:split;main;8,3.14;1,1;]"..
"image[3,1.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
(100-fuel_percent)..":default_furnace_fire_fg.png]"
return formspec
function default.get_furnace_active_formspec(fuel_percent, item_percent)
return "size[9,8.75]"..
"background[-0.2,-0.26;9.41,9.49;formspec_inventory.png]"..
"background[-0.2,-0.26;9.41,9.49;formspec_furnace.png]"..
"bgcolor[#08080880;true]"..
"listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]"..
"image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;true;]"..
"list[current_player;main;0,4.5;9,3;9]"..
"list[current_player;main;0,7.74;9,1;]"..
"list[current_name;src;3,0.5;1,1;]"..
"list[current_name;fuel;3,2.5;1,1;]"..
"list[current_name;dst;5,1.5;1,1;]"..
"list[detached:split;main;8,3.14;1,1;]"..
"image[3,1.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
(100-fuel_percent)..":default_furnace_fire_fg.png]"
end
local inactive_formspec =
"size[9,8.75]"..
"background[-0.2,-0.26;9.41,9.49;formspec_inventory.png]"..
"background[-0.2,-0.26;9.41,9.49;formspec_furnace.png]"..
"bgcolor[#08080880;true]"..
"listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]"..
"image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;true;]"..
"list[current_player;main;0,4.5;9,3;9]"..
"list[current_player;main;0,7.74;9,1;]"..
"list[current_name;src;3,0.5;1,1;]"..
"list[current_name;fuel;3,2.5;1,1;]"..
"list[current_name;dst;5,1.5;1,1;]"..
"list[detached:split;main;8,3.14;1,1;]"
function default.get_furnace_inactive_formspec()
return "size[9,8.75]"..
"background[-0.2,-0.26;9.41,9.49;formspec_inventory.png]"..
"background[-0.2,-0.26;9.41,9.49;formspec_furnace.png]"..
"bgcolor[#08080880;true]"..
"listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]"..
"image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;true;]"..
"list[current_player;main;0,4.5;9,3;9]"..
"list[current_player;main;0,7.74;9,1;]"..
"list[current_name;src;3,0.5;1,1;]"..
"list[current_name;fuel;3,2.5;1,1;]"..
"list[current_name;dst;5,1.5;1,1;]"..
"list[detached:split;main;8,3.14;1,1;]"
end
local split_inv = minetest.create_detached_inventory("split", {
allow_move = function(_, _, _, _, _, count, _)
@ -56,6 +55,12 @@ split_inv:set_size("main", 1)
local function can_dig(pos, player)
local meta = minetest.get_meta(pos);
local inv = meta:get_inventory()
for _, name in pairs({"fuel", "dst", "src"}) do
local stack = inv:get_stack(name, 1)
minetest.item_drop(stack, nil, pos)
stack:clear()
inv:set_stack(name, 1, stack)
end
return inv:is_empty("fuel") and inv:is_empty("dst") and inv:is_empty("src")
end
@ -95,6 +100,164 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player
return stack:get_count()
end
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
local function furnace_node_timer(pos, elapsed)
--
-- 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
local inv = meta:get_inventory()
local srclist, fuellist
local cookable, cooked
local fuel
local update = true
while elapsed > 0 and update do
update = false
srclist = inv:get_list("src")
fuellist = inv:get_list("fuel")
--
-- Cooking
--
-- Check if we have cookable content
local aftercooked
cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
cookable = cooked.time ~= 0
local el = math.min(elapsed, fuel_totaltime - fuel_time)
if cookable then -- fuel lasts long enough, adjust el to cooking duration
el = math.min(el, cooked.time - src_time)
end
-- Check if we have enough fuel to burn
if fuel_time < fuel_totaltime then
-- The furnace is currently active and has enough fuel
fuel_time = fuel_time + el
-- If there is a cookable item then check if it is ready yet
if cookable then
src_time = src_time + el
if src_time >= cooked.time then
-- Place result in dst list if possible
if inv:room_for_item("dst", cooked.item) then
inv:add_item("dst", cooked.item)
inv:set_stack("src", 1, aftercooked.items[1])
src_time = src_time - cooked.time
update = true
end
else
-- Item could not be cooked: probably missing fuel
update = true
end
end
else
-- Furnace ran out of fuel
if cookable then
-- We need to get new fuel
local afterfuel
fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
if fuel.time == 0 then
-- No valid fuel in fuel list
fuel_totaltime = 0
src_time = 0
else
-- Take fuel from fuel list
inv:set_stack("fuel", 1, afterfuel.items[1])
update = true
fuel_totaltime = fuel.time + (fuel_totaltime - fuel_time)
end
else
-- We don't need to get new fuel since there is no cookable item
fuel_totaltime = 0
src_time = 0
end
fuel_time = 0
end
elapsed = elapsed - el
end
if fuel and fuel_totaltime > fuel.time then
fuel_totaltime = fuel.time
end
if srclist[1]:is_empty() then
src_time = 0
end
--
-- Update formspec, infotext and node
--
local formspec
local item_state
local item_percent = 0
if cookable then
item_percent = math.floor(src_time / cooked.time * 100)
if item_percent > 100 then
item_state = "100% (output full)"
else
item_state = item_percent .. "%"
end
else
if srclist[1]:is_empty() then
item_state = "Empty"
else
item_state = "Not cookable"
end
end
local fuel_state = "Empty"
local active = "inactive"
local result = false
if fuel_totaltime ~= 0 then
active = "active"
local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100)
fuel_state = fuel_percent .. "%"
formspec = default.get_furnace_active_formspec(fuel_percent, item_percent)
swap_node(pos, "default:furnace_active")
-- make sure timer restarts automatically
result = true
else
if not fuellist[1]:is_empty() then
fuel_state = "0%"
end
formspec = default.get_furnace_inactive_formspec()
swap_node(pos, "default:furnace")
-- stop timer on the inactive furnace
minetest.get_node_timer(pos):stop()
end
local infotext = "Furnace " .. active .. "\n(Item: " .. item_state ..
"; Fuel: " .. 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)
return result
end
--
-- Node definitions
--
@ -111,9 +274,37 @@ minetest.register_node("default:furnace", {
legacy_facedir_simple = true,
is_ground_content = false,
sounds = default.node_sound_stone_defaults(),
can_dig = can_dig,
on_timer = furnace_node_timer,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", default.get_furnace_inactive_formspec())
local inv = meta:get_inventory()
inv:set_size('src', 1)
inv:set_size('fuel', 1)
inv:set_size('dst', 4)
end,
on_metadata_inventory_move = function(pos)
minetest.get_node_timer(pos):start(1.0)
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)
end,
on_blast = function(pos)
local drops = {}
default.get_inventory_drops(pos, "src", drops)
default.get_inventory_drops(pos, "fuel", drops)
default.get_inventory_drops(pos, "dst", drops)
drops[#drops+1] = "default:furnace"
minetest.remove_node(pos)
return drops
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,
@ -143,154 +334,11 @@ minetest.register_node("default:furnace_active", {
legacy_facedir_simple = true,
is_ground_content = false,
sounds = default.node_sound_stone_defaults(),
on_timer = furnace_node_timer,
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 = {"default:furnace", "default:furnace_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 cookable = true
if cooked.time == 0 then
cookable = false
end
-- Check if we have enough fuel to burn
if fuel_time < fuel_totaltime then
-- The furnace 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
if src_time >= cooked.time then
-- Place result in dst list if possible
if inv:room_for_item("dst", cooked.item) then
inv:add_item("dst", 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})
if fuel.time == 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])
fuel_totaltime = fuel.time
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 / 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, "default:furnace_active")
else
if not fuellist[1]:is_empty() then
fuel_state = "0%"
end
swap_node(pos, "default:furnace")
end
local infotext = "Furnace " .. active .. "(Item: " .. item_state .. "; Fuel: " .. 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,
})

View File

@ -39,9 +39,8 @@ end
hud.register("xp_bar", {
hud_elem_type = "statbar",
position = {x = 0.5, y = 1},
size = {x = 31, y = 13},
alignment = {x = -1, y = -1},
offset = {x = -249, y = -79},
offset = {x = -184, y = -59},
text = "expbar_full.png",
background = "expbar_empty.png",
number = MAX_HUD_XP,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 B

After

Width:  |  Height:  |  Size: 134 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 B

After

Width:  |  Height:  |  Size: 133 B

View File

@ -1,8 +1,8 @@
HUD_SB_SIZE = {x = 24, y = 24}
HUD_HEALTH_OFFSET = {x = -255, y = -109}
HUD_AIR_OFFSET = {x = 15, y = -134}
HUD_HUNGER_OFFSET = {x = 15, y = -109}
HUD_ARMOR_OFFSET = {x = -255, y = -134}
HUD_HEALTH_OFFSET = {x = -249, y = -109}
HUD_AIR_OFFSET = {x = 8, y = -134}
HUD_HUNGER_OFFSET = {x = 8, y = -109}
HUD_ARMOR_OFFSET = {x = -249, y = -134}
hud.register("health", {
hud_elem_type = "statbar",

View File

@ -2,10 +2,9 @@ hud = {}
hud.show_armor = minetest.get_modpath("3d_armor") ~= nil
local modpath = minetest.get_modpath("hud")
dofile(modpath .. "/api.lua")
if minetest.settings:get_bool("enable_damage") then
local modpath = minetest.get_modpath("hud")
dofile(modpath .. "/api.lua")
dofile(modpath .. "/builtin.lua")
end

View File

@ -55,7 +55,7 @@ workbench.defs = {
{ 0, 15, 8, 16, 1, 8 }},
{"cube", 4, { 0, 0, 0, 8, 8, 8 }},
{"panel", 4, { 0, 0, 0, 16, 8, 8 }},
{"slab", 2, { 0, 0, 0, 16, 8, 16 }},
{"slab", 2, { 0, 0, 0, 16, 8, 16 }},
{"doublepanel", 2, { 0, 0, 0, 16, 8, 8 },
{ 0, 8, 8, 16, 8, 8 }},
{"halfstair", 2, { 0, 0, 0, 8, 8, 16 },
@ -70,7 +70,6 @@ workbench.defs = {
{ 0, 8, 0, 8, 8, 8 }}
}
-- Tools allowed to be repaired
function workbench:repairable(stack)
local tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"}
@ -260,7 +259,7 @@ function workbench.on_take(pos, listname, index, stack, player)
local stackname = stack:get_name()
if listname == "input" then
if stackname == inputname then
if stackname == inputname and registered_nodes[inputname.."_cube"] then
workbench:get_output(inv, input, stackname)
else
inv:set_list("forms", {})
@ -296,29 +295,7 @@ minetest.register_node("workbench:workbench", {
on_metadata_inventory_put = workbench.on_put,
on_metadata_inventory_take = workbench.on_take,
allow_metadata_inventory_put = workbench.put,
allow_metadata_inventory_move = workbench.move,
})
minetest.register_tool("workbench:hammer", {
description = "Hammer",
inventory_image = "workbench_hammer.png",
on_use = function() do return end end
})
minetest.register_craft({
output = "workbench:workbench",
recipe = {
{"group:wood", "group:wood"},
{"group:wood", "group:wood"}
}
})
minetest.register_craft({
output = "workbench:hammer",
recipe = {
{"default:steel_ingot", "group:stick", "default:steel_ingot"},
{"", "group:stick", ""}
}
allow_metadata_inventory_move = workbench.move
})
for _, d in pairs(workbench.defs) do
@ -338,7 +315,7 @@ for i=1, #nodes do
end
if def.tiles then
if #def.tiles > 1 and not (def.drawtype:sub(1,5) == "glass") then
if #def.tiles > 1 and (def.drawtype:sub(1,5) ~= "glass") then
tiles = def.tiles
else
tiles = {def.tiles[1]}
@ -361,7 +338,7 @@ for i=1, #nodes do
sounds = def.sounds,
tiles = tiles,
groups = groups,
-- `unpack` has been changed to `table.unpack` in newest Lua versions.
-- `unpack` has been changed to `table.unpack` in newest Lua versions
node_box = workbench:pixelbox(16, {unpack(d, 3)}),
sunlight_propagates = true,
on_place = minetest.rotate_node
@ -369,3 +346,27 @@ for i=1, #nodes do
end
end
end
-- Craft items
minetest.register_tool("workbench:hammer", {
description = "Hammer",
inventory_image = "workbench_hammer.png",
on_use = function() do return end end
})
minetest.register_craft({
output = "workbench:workbench",
recipe = {
{"group:wood", "group:wood"},
{"group:wood", "group:wood"}
}
})
minetest.register_craft({
output = "workbench:hammer",
recipe = {
{"default:steel_ingot", "group:stick", "default:steel_ingot"},
{"", "group:stick", ""}
}
})