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:
E 2021-04-16 23:00:44 -04:00
parent 51fe431635
commit 0d61d9c495
3 changed files with 71 additions and 4 deletions

View File

@ -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

View File

@ -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(),

View File

@ -1,3 +1,4 @@
name = mcl_crafting_table
description = Adds a crafting table.
depends = mcl_init, mcl_formspec, mcl_sounds
optional_depends = mcl_banners