forked from Mineclonia/Mineclonia
mcl_banners, mcl_crafting_table: show banner crafting preview
A preview of a crafted banner is now shown next to the craft result box to help players visualize what they're crafting. Due to the formspec version, the preview can't be shown over top of the actual result slot. A utility function (mcl_banners.get_overlay) is added to generate formspec-able texture strings for arbitrary banners.
This commit is contained in:
parent
5255c0e6d0
commit
519c3814aa
|
@ -144,6 +144,47 @@ local on_destruct_hanging_banner = function(pos)
|
|||
return on_destruct_banner(pos, true)
|
||||
end
|
||||
|
||||
local make_banner_overlay = function(base_color, layers)
|
||||
local colorize = mcl_banners.colors[base_color][4]
|
||||
-- Base texture with base color
|
||||
local base = "(mcl_banners_item_base.png^(mcl_banners_item_overlay.png^[colorize:"..colorize..":"..base_color_ratio..")^[resize:32x32)"
|
||||
|
||||
-- Optional pattern layers
|
||||
if layers then
|
||||
local lovl = ""
|
||||
for l=1, #layers do
|
||||
local layerinfo = layers[l]
|
||||
local pattern = "mcl_banners_" .. layerinfo.pattern .. ".png"
|
||||
local color = mcl_banners.colors[layerinfo.color][4]
|
||||
|
||||
-- Generate layer texture
|
||||
local layer = "(([combine:20x40:-2,-2="..pattern.."^[resize:16x24^[colorize:"..color..":"..layer_ratio..")^[mask:"..pattern..")"
|
||||
|
||||
lovl = (lovl ~= "" and (lovl .. "^") or "") .. layer
|
||||
end
|
||||
|
||||
function escape(text)
|
||||
return text:gsub("%^", "\\%^"):gsub(":", "\\:") -- :gsub("%(", "\\%("):gsub("%)", "\\%)")
|
||||
end
|
||||
|
||||
return "[combine:32x32:0,0=" .. escape(base) .. ":8,4=" .. escape(lovl)
|
||||
end
|
||||
return base
|
||||
end
|
||||
|
||||
function mcl_banners.get_overlay(istk)
|
||||
local imeta = istk:get_meta()
|
||||
local layers_raw = imeta:get_string("layers")
|
||||
if not layers_raw or layers_raw == "" then
|
||||
return
|
||||
end
|
||||
local basec = istk:get_definition()._base_color
|
||||
if not basec then
|
||||
basec="unicolor_white"
|
||||
end
|
||||
return make_banner_overlay(basec, minetest.deserialize(layers_raw))
|
||||
end
|
||||
|
||||
local make_banner_texture = function(base_color, layers)
|
||||
local colorize
|
||||
if mcl_banners.colors[base_color] then
|
||||
|
@ -420,6 +461,7 @@ for colorid, colortab in pairs(mcl_banners.colors) do
|
|||
groups = groups,
|
||||
stack_max = 16,
|
||||
|
||||
_base_color=colorid,
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
local above = pointed_thing.above
|
||||
local under = pointed_thing.under
|
||||
|
|
|
@ -5,12 +5,14 @@ local C = minetest.colorize
|
|||
local text_color = mcl_colors.BLACK or "#313131"
|
||||
local itemslot_bg = mcl_formspec.get_itemslot_bg
|
||||
|
||||
mcl_crafting_table = {}
|
||||
function mcl_crafting_table.show_crafting_form(player)
|
||||
mcl_crafting_table = {
|
||||
last_table={}
|
||||
}
|
||||
function mcl_crafting_table.show_crafting_form(player, overlay)
|
||||
player:get_inventory():set_width("craft", 3)
|
||||
player:get_inventory():set_size("craft", 9)
|
||||
|
||||
show_formspec(player:get_player_name(), "main",
|
||||
show_formspec(player:get_player_name(), "mcl_crafting_table:main",
|
||||
"size[9,8.75]"..
|
||||
"image[4.7,1.5;1.5,1;gui_crafting_arrow.png]"..
|
||||
"label[0,4;"..formspec_escape(C(text_color, S("Inventory"))).."]".. --"#313131"
|
||||
|
@ -26,10 +28,31 @@ function mcl_crafting_table.show_crafting_form(player)
|
|||
"image_button[0.75,1.5;1,1;craftguide_book.png;__mcl_craftguide;]"..
|
||||
"tooltip[__mcl_craftguide;"..formspec_escape(S("Recipe book")).."]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[current_player;craft]"
|
||||
"listring[current_player;craft]"..
|
||||
(overlay and "image[7.1,1.5;1,1;"..formspec_escape(overlay).."]" or "")
|
||||
-- The overlay can be scooted back over top of the craftpreview once this formspec is
|
||||
-- updated to version 3.
|
||||
)
|
||||
end
|
||||
|
||||
if minetest.get_modpath("mcl_banners") then
|
||||
minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv)
|
||||
if mcl_crafting_table.last_table[player:get_player_name()] then
|
||||
local ovl=mcl_banners.get_overlay(itemstack)
|
||||
mcl_crafting_table.show_crafting_form(player, ovl)
|
||||
end
|
||||
end)
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if formname ~= "mcl_crafting_table:main" then
|
||||
return false
|
||||
end
|
||||
if fields["quit"] then
|
||||
mcl_crafting_table.last_table[player:get_player_name()]=nil
|
||||
minetest.close_formspec(player:get_player_name(), formname)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
local show_crafting_form = mcl_crafting_table.show_crafting_form --cache function for better performances
|
||||
minetest.register_node("mcl_crafting_table:crafting_table", {
|
||||
description = S("Crafting Table"),
|
||||
|
@ -43,6 +66,7 @@ minetest.register_node("mcl_crafting_table:crafting_table", {
|
|||
paramtype2 = "facedir",
|
||||
groups = {handy=1,axey=1, deco_block=1, material_wood=1,flammable=-1},
|
||||
on_rightclick = function(pos, node, player, itemstack)
|
||||
mcl_crafting_table.last_table[player:get_player_name()]=node
|
||||
show_crafting_form(player)
|
||||
end,
|
||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name = mcl_crafting_table
|
||||
description = Adds a crafting table.
|
||||
depends = mcl_init, mcl_formspec, mcl_sounds
|
||||
optional_depends = mcl_colors
|
||||
optional_depends = mcl_colors, mcl_banners
|
||||
|
|
Loading…
Reference in New Issue