mirror of
https://github.com/mt-mods/homedecor_modpack.git
synced 2025-07-19 22:10:21 +02:00
revert a599b041d4
(param2 colorization of books)
The intention of this is to fix books in peoples' inventories that are now inaccessible. They can be placed, viewed, edited like normal now. Side effect: all books that were already in-world and that have already been converted to the param2 colorization before will be grey now, and most will end up turned some wierd direction, but that can be fixed with the screwdriver. If you need to re-color one of the now-grey books, you'll need to craft one of the desired color, place it, and copy and paste your text from the grey book. Newly-placed colored books will behave normally.
This commit is contained in:
@ -1,155 +1,159 @@
|
||||
|
||||
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 = { }
|
||||
|
||||
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
|
||||
for _, c in ipairs(bookcolors) do
|
||||
local color, hue = unpack(c)
|
||||
|
||||
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_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,
|
||||
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 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)
|
||||
local stack = ItemStack({
|
||||
name = "homedecor:book_"..color,
|
||||
metadata = data,
|
||||
})
|
||||
stack = digger:get_inventory():add_item("main", stack)
|
||||
if not stack:is_empty() then
|
||||
minetest.item_drop(stack, digger, 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
|
||||
unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
|
||||
return itemstack
|
||||
end,
|
||||
on_rotate = unifieddyes.fix_after_screwdriver_nsew,
|
||||
on_dig = book_dig,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.2, -0.5, -0.25, 0.2, -0.35, 0.25}
|
||||
}
|
||||
})
|
||||
minetest.remove_node(pos)
|
||||
end
|
||||
|
||||
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 = unifieddyes.fix_rotation_nsew,
|
||||
after_dig_node = unifieddyes.after_dig_node,
|
||||
on_rotate = unifieddyes.fix_after_screwdriver_nsew,
|
||||
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 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,
|
||||
})
|
||||
end,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.35, -0.5, -0.25, 0.35, -0.4, 0.25}
|
||||
}
|
||||
})
|
||||
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
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, form_name, fields)
|
||||
if form_name ~= BOOK_FORMNAME or not fields.save then
|
||||
@ -169,67 +173,4 @@ minetest.register_on_player_receive_fields(function(player, form_name, fields)
|
||||
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 = false,
|
||||
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
|
||||
})
|
||||
minetest.register_alias("homedecor:book", "homedecor:book_grey")
|
||||
|
Reference in New Issue
Block a user