From b2d8e78ea2597aa86b187583748f4808c5f07732 Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Mon, 6 Feb 2017 10:55:58 -0500 Subject: update coloredwood, homedecor, stained_glass, unifiedbricks, unifieddyes --- homedecor/books.lua | 346 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 203 insertions(+), 143 deletions(-) (limited to 'homedecor/books.lua') diff --git a/homedecor/books.lua b/homedecor/books.lua index fecbcec..b6790e3 100644 --- a/homedecor/books.lua +++ b/homedecor/books.lua @@ -3,158 +3,153 @@ local S = homedecor_i18n.gettext local function N_(x) return x end -local bookcolors = { - { N_("red"), "#c00000:150" }, - { N_("green"), "#008000:150" }, - { N_("blue"), "#4040c0:150" }, - { N_("violet"), "#600070:150" }, - { N_("grey"), "#202020:150" }, - { N_("brown"), "#603010:175" } -} - local BOOK_FORMNAME = "homedecor:book_form" local player_current_book = { } -for _, c in ipairs(bookcolors) do - local color, hue = unpack(c) +local function book_dig(pos, node, digger) + if minetest.is_protected(pos, digger:get_player_name()) then return end + local meta = minetest.get_meta(pos) + local data = minetest.serialize({ + title = meta:get_string("title") or "", + text = meta:get_string("text") or "", + owner = meta:get_string("owner") or "", + _recover = meta:get_string("_recover") or "", + }) + local stack = ItemStack({ + name = "homedecor:book", + metadata = data, + }) + stack = digger:get_inventory():add_item("main", stack) + if not stack:is_empty() then + minetest.item_drop(stack, digger, pos) + end + minetest.remove_node(pos) +end - local function book_dig(pos, node, digger) - if minetest.is_protected(pos, digger:get_player_name()) then return end - local meta = minetest.get_meta(pos) - local data = minetest.serialize({ - title = meta:get_string("title") or "", - text = meta:get_string("text") or "", - owner = meta:get_string("owner") or "", - _recover = meta:get_string("_recover") or "", - }) - local stack = ItemStack({ - name = "homedecor:book_"..color, - metadata = data, +local inv_img = "homedecor_book_inv.png^homedecor_book_trim_inv.png" + +homedecor.register("book", { + description = S("Writable Book"), + mesh = "homedecor_book.obj", + tiles = { + "homedecor_book_cover.png", + { name = "homedecor_book_edges.png", color = 0xffffffff }, + { name = "homedecor_book_cover_trim.png", color = 0xffffffff } + }, + inventory_image = inv_img, + wield_image = inv_img, + groups = { snappy=3, oddly_breakable_by_hand=3, book=1, ud_param2_colorable = 1 }, + walkable = false, + paramtype2 = "colorwallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + after_place_node = homedecor.fix_rotation_nsew, + after_dig_node = unifieddyes.after_dig_node, + stack_max = 1, + on_punch = function(pos, node, puncher, pointed_thing) + local fdir = node.param2 + minetest.swap_node(pos, { name = "homedecor:book_open", param2 = fdir }) + end, + on_place = function(itemstack, placer, pointed_thing) + local plname = placer:get_player_name() + local pos = pointed_thing.under + local node = minetest.get_node_or_nil(pos) + local def = node and minetest.registered_nodes[node.name] + if not def or not def.buildable_to then + pos = pointed_thing.above + node = minetest.get_node_or_nil(pos) + def = node and minetest.registered_nodes[node.name] + if not def or not def.buildable_to then return itemstack end + end + if minetest.is_protected(pos, plname) then return itemstack end + local fdir = minetest.dir_to_facedir(placer:get_look_dir()) + minetest.set_node(pos, { + name = "homedecor:book", + param2 = fdir, }) - stack = digger:get_inventory():add_item("main", stack) - if not stack:is_empty() then - minetest.item_drop(stack, digger, pos) + local text = itemstack:get_metadata() or "" + local meta = minetest.get_meta(pos) + local data = minetest.deserialize(text) or {} + if type(data) ~= "table" then + data = {} + -- Store raw metadata in case some data is lost by the + -- transition to the new meta format, so it is not lost + -- and can be recovered if needed. + meta:set_string("_recover", text) end - minetest.remove_node(pos) - end + meta:set_string("title", data.title or "") + meta:set_string("text", data.text or "") + meta:set_string("owner", data.owner or "") + if data.title and data.title ~= "" then + meta:set_string("infotext", data.title) + end + if not homedecor.expect_infinite_stacks then + itemstack:take_item() + end + return itemstack + end, + on_dig = book_dig, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.25, 0.2, -0.35, 0.25} + } +}) - local inv_img = "homedecor_book_inv.png^[colorize:"..hue.."^homedecor_book_trim_inv.png" - - homedecor.register("book_"..color, { - description = S("Writable Book (@1)", S(color)), - mesh = "homedecor_book.obj", - tiles = { - "(homedecor_book_cover.png^[colorize:"..hue..")^homedecor_book_cover_trim.png", - "homedecor_book_edges.png" - }, - inventory_image = inv_img, - wield_image = inv_img, - groups = { snappy=3, oddly_breakable_by_hand=3, book=1 }, - walkable = false, - stack_max = 1, - on_punch = function(pos, node, puncher, pointed_thing) - local fdir = node.param2 - minetest.swap_node(pos, { name = "homedecor:book_open_"..color, param2 = fdir }) - end, - on_place = function(itemstack, placer, pointed_thing) - local plname = placer:get_player_name() - local pos = pointed_thing.under - local node = minetest.get_node_or_nil(pos) - local def = node and minetest.registered_nodes[node.name] - if not def or not def.buildable_to then - pos = pointed_thing.above - node = minetest.get_node_or_nil(pos) - def = node and minetest.registered_nodes[node.name] - if not def or not def.buildable_to then return itemstack end - end - if minetest.is_protected(pos, plname) then return itemstack end - local fdir = minetest.dir_to_facedir(placer:get_look_dir()) - minetest.set_node(pos, { - name = "homedecor:book_"..color, - param2 = fdir, +homedecor.register("book_open", { + mesh = "homedecor_book_open.obj", + tiles = { + "homedecor_book_cover.png", + { name = "homedecor_book_edges.png", color = 0xffffffff }, + { name = "homedecor_book_pages.png", color = 0xffffffff } + }, + groups = { snappy=3, oddly_breakable_by_hand=3, not_in_creative_inventory=1, ud_param2_colorable = 1 }, + drop = "homedecor:book", + walkable = false, + paramtype2 = "colorwallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + after_place_node = homedecor.fix_rotation_nsew, + after_dig_node = unifieddyes.after_dig_node, + on_dig = book_dig, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local player_name = clicker:get_player_name() + local title = meta:get_string("title") or "" + local text = meta:get_string("text") or "" + local owner = meta:get_string("owner") or "" + local formspec + if owner == "" or owner == player_name then + formspec = "size[8,8]"..default.gui_bg..default.gui_bg_img.. + "field[0.5,1;7.5,0;title;Book title :;".. + minetest.formspec_escape(title).."]".. + "textarea[0.5,1.5;7.5,7;text;Book content :;".. + minetest.formspec_escape(text).."]".. + "button_exit[2.5,7.5;3,1;save;Save]" + else + formspec = "size[8,8]"..default.gui_bg.. + "button_exit[7,0.25;1,0.5;close;X]".. + default.gui_bg_img.. + "label[0.5,0.5;by "..owner.."]".. + "label[0.5,0;"..minetest.formspec_escape(title).."]".. + "textarea[0.5,1.5;7.5,7;;"..minetest.formspec_escape(text)..";]" + end + player_current_book[player_name] = pos + minetest.show_formspec(player_name, BOOK_FORMNAME, formspec) + return itemstack + end, + on_punch = function(pos, node, puncher, pointed_thing) + local fdir = node.param2 + minetest.swap_node(pos, { name = "homedecor:book", param2 = fdir }) + minetest.sound_play("homedecor_book_close", { + pos=pos, + max_hear_distance = 3, + gain = 2, }) - local text = itemstack:get_metadata() or "" - local meta = minetest.get_meta(pos) - local data = minetest.deserialize(text) or {} - if type(data) ~= "table" then - data = {} - -- Store raw metadata in case some data is lost by the - -- transition to the new meta format, so it is not lost - -- and can be recovered if needed. - meta:set_string("_recover", text) - end - meta:set_string("title", data.title or "") - meta:set_string("text", data.text or "") - meta:set_string("owner", data.owner or "") - if data.title and data.title ~= "" then - meta:set_string("infotext", data.title) - end - if not homedecor.expect_infinite_stacks then - itemstack:take_item() - end - return itemstack - end, - on_dig = book_dig, - selection_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.25, 0.2, -0.35, 0.25} - } - }) - - homedecor.register("book_open_"..color, { - mesh = "homedecor_book_open.obj", - tiles = { - "(homedecor_book_cover.png^[colorize:"..hue..")^homedecor_book_cover_trim.png", - "homedecor_book_edges.png", - "homedecor_book_pages.png" - }, - groups = { snappy=3, oddly_breakable_by_hand=3, not_in_creative_inventory=1 }, - drop = "homedecor:book_"..color, - walkable = false, - on_dig = book_dig, - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - local meta = minetest.get_meta(pos) - local player_name = clicker:get_player_name() - local title = meta:get_string("title") or "" - local text = meta:get_string("text") or "" - local owner = meta:get_string("owner") or "" - local formspec - if owner == "" or owner == player_name then - formspec = "size[8,8]"..default.gui_bg..default.gui_bg_img.. - "field[0.5,1;7.5,0;title;Book title :;".. - minetest.formspec_escape(title).."]".. - "textarea[0.5,1.5;7.5,7;text;Book content :;".. - minetest.formspec_escape(text).."]".. - "button_exit[2.5,7.5;3,1;save;Save]" - else - formspec = "size[8,8]"..default.gui_bg.. - "button_exit[7,0.25;1,0.5;close;X]".. - default.gui_bg_img.. - "label[0.5,0.5;by "..owner.."]".. - "label[0.5,0;"..minetest.formspec_escape(title).."]".. - "textarea[0.5,1.5;7.5,7;;"..minetest.formspec_escape(text)..";]" - end - player_current_book[player_name] = pos - minetest.show_formspec(player_name, BOOK_FORMNAME, formspec) - return itemstack - end, - on_punch = function(pos, node, puncher, pointed_thing) - local fdir = node.param2 - minetest.swap_node(pos, { name = "homedecor:book_"..color, param2 = fdir }) - minetest.sound_play("homedecor_book_close", { - pos=pos, - max_hear_distance = 3, - gain = 2, - }) - end, - selection_box = { - type = "fixed", - fixed = {-0.35, -0.5, -0.25, 0.35, -0.4, 0.25} - } - }) - -end + end, + selection_box = { + type = "fixed", + fixed = {-0.35, -0.5, -0.25, 0.35, -0.4, 0.25} + } +}) minetest.register_on_player_receive_fields(function(player, form_name, fields) if form_name ~= BOOK_FORMNAME or not fields.save then @@ -173,3 +168,68 @@ minetest.register_on_player_receive_fields(function(player, form_name, fields) minetest.log("action", S("@1 has written in a book (title: \"@2\"): \"@3\" at location @4", player:get_player_name(), fields.title, fields.text, minetest.pos_to_string(player:getpos()))) end) + +-- convert old static nodes to param2 + +local bookcolors = { + "red", + "green", + "blue", + "violet", + "grey", + "brown" +} + +homedecor.old_static_books = {} +for _, color in ipairs(bookcolors) do + table.insert(homedecor.old_static_books, "homedecor:book_"..color) + table.insert(homedecor.old_static_books, "homedecor:book_open_"..color) +end + +minetest.register_lbm({ + name = "homedecor:convert_books", + label = "Convert homedecor books to use param2 color", + run_at_every_load = true, + nodenames = homedecor.old_static_books, + action = function(pos, node) + local name = node.name + local color = string.sub(name, string.find(name, "_", -7)+1) + local newname = "homedecor:book" + if string.find(name, "open") then + newname = "homedecor:book_open" + end + + local old_fdir = math.floor(node.param2 % 32) + local new_fdir = 3 + + if old_fdir == 0 then + new_fdir = 3 + elseif old_fdir == 1 then + new_fdir = 4 + elseif old_fdir == 2 then + new_fdir = 2 + elseif old_fdir == 3 then + new_fdir = 5 + end + + if color == "grey" then + color = "dark_grey" + elseif color == "violet" then + color = "dark_magenta" + elseif color == "brown" then + color = "dark_orange" + elseif color == "blue" then + color = "light_blue" + else + color = "medium_"..color + end + + local paletteidx = unifieddyes.getpaletteidx("unifieddyes:"..color, "wallmounted") + local param2 = paletteidx + new_fdir + + minetest.swap_node(pos, { name = newname, param2 = param2 }) + local meta = minetest.get_meta(pos) + meta:set_string("dye", "unifieddyes:"..color) + + end +}) -- cgit v1.2.3