minetest-mm/mods/ts_paper/init.lua
2020-10-25 19:05:08 +01:00

255 lines
No EOL
7.3 KiB
Lua
Executable file

local style = "size[8,9]" ..
default.gui_bg ..
default.gui_bg_img ..
default.gui_slots ..
"label[5,8.85;" .. minetest.colorize("#777777", "Signed letters cannot be edited!") .. "]"
local paper_formspec = style ..
"label[0.25,0;Write a letter:]" ..
"label[0.25,0.75;Title:]" ..
"field[1.5,0.75;6.5,1.25;title;;${title}]" ..
"textarea[0.5,1.5;7.5,7.5;text;;${text}]" ..
"button[0.25,8;2,1;save;Save]" ..
"button[4.75,8;3,1;sign;Sign the letter]"
local letter_formspec = style ..
"label[0.25,0;Edit the letter:]" ..
"label[0.25,0.75;Title:]" ..
"field[1.5,0.75;6.5,1.25;title;;${title}]" ..
"textarea[0.5,1.5;7.5,7.5;text;;${text}]" ..
"button[0.25,8;2,1;save;Save]" ..
"button[4.75,8;3,1;sign;Sign the letter]"
local signed_letter_formspec = style ..
"label[0.25,0.25;Title:]" ..
"field[1.5,0.25;6.5,1.25;title;;${title}]" ..
"textarea[0.5,1;7.5,8.2 5;text;;${text}]"
local function save(pos, fields, sender)
local meta = minetest.get_meta(pos)
meta:set_string("text", fields.text)
meta:set_string("title", fields.title)
if fields.title == "" then
meta:set_string("description", "Letter")
else
meta:set_string("description", "Letter: " .. fields.title)
end
meta:set_string("formspec", letter_formspec)
local node = minetest.get_node(pos)
if fields.text == "" and fields.title == "" then
if node.name ~= "default:paper" then
node.name = "default:paper"
minetest.swap_node(pos, node)
meta:set_string("formspec", paper_formspec)
end
return
end
if node.name ~= "default:letter" then
node.name = "default:letter"
minetest.swap_node(pos, node)
end
end
local function sign(pos, fields, sender)
local node = minetest.get_node(pos)
if node.name ~= "default:signed_letter" then
node.name = "default:signed_letter"
minetest.swap_node(pos, node)
end
local meta = minetest.get_meta(pos)
local name = sender:get_player_name()
meta:set_string("signed_by", name)
local signed_by = minetest.formspec_escape(name)
meta:set_string("formspec", signed_letter_formspec .. "label[0.25,8;Signed by " .. signed_by .. "]")
if fields.title == "" then
meta:set_string("description", "Letter signed by " .. name)
else
meta:set_string("description", "Letter signed by " .. name .. ": " .. fields.title)
end
end
minetest.register_node(":default:paper", {
description = "Paper",
tiles = {
"default_paper.png",
"default_paper.png^[transformFY",
},
inventory_image = "default_paper.png",
paramtype2 = "facedir",
drawtype = "nodebox",
paramtype = "light",
walkable = false,
node_box = {
type = "fixed",
fixed = {
{ -0.4375, -0.5, -0.4375, 0.4375, -0.49, 0.4375 },
}
},
groups = { flammable = 3, snappy = 3 },
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", paper_formspec)
end,
on_receive_fields = function(pos, formname, fields, sender)
if fields.save then
save(pos, fields, sender)
elseif fields.sign then
save(pos, fields, sender)
sign(pos, fields, sender)
end
end,
})
minetest.register_node(":default:letter", {
description = "Letter",
tiles = {
"default_paper.png^ts_paper_text.png",
"default_paper.png^ts_paper_text.png^[transformFY",
},
inventory_image = "default_paper.png^ts_paper_text.png",
paramtype2 = "facedir",
drawtype = "nodebox",
paramtype = "light",
walkable = false,
stack_max = 1,
node_box = {
type = "fixed",
fixed = {
{ -0.4375, -0.5, -0.4375, 0.4375, -0.49, 0.4375 },
}
},
groups = { flammable = 3, snappy = 3 },
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", letter_formspec)
end,
on_receive_fields = function(pos, formname, fields, sender)
if fields.save then
save(pos, fields, sender)
elseif fields.sign then
save(pos, fields, sender)
sign(pos, fields, sender)
end
end,
on_dig = function(pos, node, digger)
local stack = ItemStack("default:letter")
stack:get_meta():from_table(minetest.get_meta(pos):to_table())
if digger:is_player() and digger:get_inventory() then
local inv = digger:get_inventory()
if inv:room_for_item("main", stack) then
inv:add_item("main", stack)
else
minetest.add_item(digger:getpos(), stack)
end
end
minetest.remove_node(pos)
end,
after_place_node = function(pos, placer, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
local stack_meta = itemstack:get_meta()
local old_meta = minetest.deserialize(itemstack:get_metadata())
if old_meta then
meta:from_table(old_meta)
else
meta:from_table(stack_meta:to_table())
end
meta:set_string("formspec", letter_formspec)
end
})
minetest.register_node(":default:signed_letter", {
description = "Letter",
tiles = {
"default_paper.png^ts_paper_text.png^ts_paper_seal.png",
"default_paper.png^ts_paper_text.png^ts_paper_seal.png^[transformFY",
},
inventory_image = "default_paper.png^ts_paper_text.png^ts_paper_seal.png",
paramtype2 = "facedir",
drawtype = "nodebox",
paramtype = "light",
walkable = false,
stack_max = 1,
node_box = {
type = "fixed",
fixed = {
{ -0.4375, -0.5, -0.5, 0.4375, -0.49, 0.4375 },
}
},
groups = { flammable = 3, snappy = 3 },
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local text = meta:get_string("text")
local signed_by = meta:get_string("signed_by")
meta:set_string("formspec", style .. "label[0.5,1;" .. text .. "]label[0.25,8;Signed by " .. signed_by .. "]")
end,
on_dig = function(pos, node, digger)
local stack = ItemStack("default:signed_letter")
stack:get_meta():from_table(minetest.get_meta(pos):to_table())
if digger:is_player() and digger:get_inventory() then
local inv = digger:get_inventory()
if inv:room_for_item("main", stack) then
inv:add_item("main", stack)
else
minetest.add_item(digger:getpos(), stack)
end
end
minetest.remove_node(pos)
end,
after_place_node = function(pos, placer, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
local stack_meta = itemstack:get_meta()
local old_meta = minetest.deserialize(itemstack:get_metadata())
if old_meta then
meta:from_table(old_meta)
else
meta:from_table(stack_meta:to_table())
end
local signed_by = minetest.formspec_escape(meta:get_string("signed_by"))
meta:set_string("formspec", signed_letter_formspec .. "label[0.25,8;Signed by " .. signed_by .. "]")
end
})
minetest.register_craft({
type = "shapeless",
output = "default:letter",
recipe = { "default:paper", "default:letter" }
})
minetest.register_craft({
type = "shapeless",
output = "default:signed_letter",
recipe = { "default:paper", "default:signed_letter" }
})
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
if itemstack:get_name() ~= "default:letter" and itemstack:get_name() ~= "default:signed_letter" then
return
end
local original
local index
for i = 1, player:get_inventory():get_size("craft") do
if old_craft_grid[i]:get_name() == "default:letter" or old_craft_grid[i]:get_name() == "signed_letter" then
original = old_craft_grid[i]
index = i
end
end
if not original then
return
end
local copymeta = original:get_metadata()
itemstack:set_metadata(copymeta)
craft_inv:set_stack("craft", index, original)
end)
minetest.register_craft({
type = "fuel",
recipe = "default:letter",
burntime = 1,
})
minetest.register_craft({
type = "fuel",
recipe = "default:signed_letter",
burntime = 1,
})