From 0d61d9c49599446cbf6f295746f60e933ddf70e2 Mon Sep 17 00:00:00 2001 From: E Date: Fri, 16 Apr 2021 23:00:44 -0400 Subject: [PATCH] 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. --- mods/ITEMS/mcl_banners/init.lua | 42 ++++++++++++++++++++++++++ mods/ITEMS/mcl_crafting_table/init.lua | 32 +++++++++++++++++--- mods/ITEMS/mcl_crafting_table/mod.conf | 1 + 3 files changed, 71 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 509fb450..814102f3 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -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 diff --git a/mods/ITEMS/mcl_crafting_table/init.lua b/mods/ITEMS/mcl_crafting_table/init.lua index b3bc839d..0ed51f90 100644 --- a/mods/ITEMS/mcl_crafting_table/init.lua +++ b/mods/ITEMS/mcl_crafting_table/init.lua @@ -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(), diff --git a/mods/ITEMS/mcl_crafting_table/mod.conf b/mods/ITEMS/mcl_crafting_table/mod.conf index 7ae387b3..da51f93c 100644 --- a/mods/ITEMS/mcl_crafting_table/mod.conf +++ b/mods/ITEMS/mcl_crafting_table/mod.conf @@ -1,3 +1,4 @@ name = mcl_crafting_table description = Adds a crafting table. depends = mcl_init, mcl_formspec, mcl_sounds +optional_depends = mcl_banners