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