214 lines
7.9 KiB
Lua
214 lines
7.9 KiB
Lua
local S = minetest.get_translator("book")
|
|
local F = minetest.formspec_escape
|
|
|
|
local protection_check_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
if minetest.is_protected(pos, player:get_player_name()) and
|
|
not minetest.check_player_privs(player, "protection_bypass") then
|
|
minetest.record_protection_violation(pos, player:get_player_name())
|
|
return 0
|
|
else
|
|
return count
|
|
end
|
|
end
|
|
local protection_check_put_take = function(pos, listname, index, stack, player)
|
|
if minetest.is_protected(pos, player:get_player_name()) and
|
|
not minetest.check_player_privs(player, "protection_bypass") then
|
|
minetest.record_protection_violation(pos, player:get_player_name())
|
|
return 0
|
|
else
|
|
return stack:get_count()
|
|
end
|
|
end
|
|
|
|
-- Bookshelf
|
|
|
|
local reading_bookshelves = {}
|
|
|
|
minetest.register_on_leaveplayer(function(player)
|
|
local name = player:get_player_name()
|
|
reading_bookshelves[name] = nil
|
|
end)
|
|
|
|
local form_bookshelf = rp_formspec.get_page("rp_formspec:2part")
|
|
form_bookshelf = form_bookshelf .. rp_formspec.default.player_inventory
|
|
|
|
local xstart = rp_formspec.default.start_point.x
|
|
local ystart = rp_formspec.default.start_point.y + 1.75
|
|
|
|
form_bookshelf = form_bookshelf .. rp_formspec.get_itemslot_bg(xstart, ystart, 8, 1)
|
|
local function get_bookshelf_formspec(pos)
|
|
local x, y, z = pos.x, pos.y, pos.z
|
|
local context = "nodemeta:"..x..","..y..","..z
|
|
local form = form_bookshelf
|
|
form = form .. "list["..context..";main;"..xstart..","..ystart..";8,1;]"
|
|
form = form .. "listring["..context..";main]"
|
|
form = form .. "listring[current_player;main]"
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
for i=1,8 do
|
|
if inv:get_stack("main", i):get_name() == "rp_default:book" then
|
|
local xoff = (i-1) * 1.25
|
|
form = form .. rp_formspec.image_button(xstart+xoff, ystart + 1.15, 1, 1, "open_"..i, "ui_icon_view.png", S("Read book"))
|
|
end
|
|
end
|
|
return form
|
|
end
|
|
|
|
local bookshelf_meta_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
if not (player and player:is_player()) then
|
|
return
|
|
end
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local stack1 = inv:get_stack(from_list, from_index)
|
|
local stack2 = inv:get_stack(to_list, to_index)
|
|
if stack1:get_name() == "rp_default:book" or stack2:get_name() == "rp_default:book" then
|
|
local pname = player:get_player_name()
|
|
reading_bookshelves[pname] = table.copy(pos)
|
|
minetest.show_formspec(pname, "rp_default:bookshelf", get_bookshelf_formspec(pos))
|
|
end
|
|
end
|
|
local bookshelf_meta_puttake = function(pos, listname, index, stack, player)
|
|
if not (player and player:is_player()) then
|
|
return
|
|
end
|
|
if stack:get_name() == "rp_default:book" then
|
|
local pname = player:get_player_name()
|
|
reading_bookshelves[pname] = table.copy(pos)
|
|
minetest.show_formspec(pname, "rp_default:bookshelf", get_bookshelf_formspec(pos))
|
|
end
|
|
end
|
|
|
|
local bookshelf_def = {
|
|
description = S("Bookshelf"),
|
|
_tt_help = S("Provides 8 inventory slots"),
|
|
tiles = {"rp_book_bookshelf_base.png", "rp_book_bookshelf_base.png", "rp_book_bookshelf_base_side.png^rp_book_bookshelf_overlay.png"},
|
|
paramtype2 = "4dir",
|
|
groups = {choppy = 3,oddly_breakable_by_hand = 2,container=1,paintable=2},
|
|
is_ground_content = false,
|
|
sounds = rp_sounds.node_sound_planks_defaults(),
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("infotext", S("Bookshelf"))
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("main", 4*2)
|
|
end,
|
|
allow_metadata_inventory_move = protection_check_move,
|
|
allow_metadata_inventory_put = protection_check_put_take,
|
|
allow_metadata_inventory_take = protection_check_put_take,
|
|
on_metadata_inventory_move = bookshelf_meta_move,
|
|
on_metadata_inventory_put = bookshelf_meta_puttake,
|
|
on_metadata_inventory_take = bookshelf_meta_puttake,
|
|
on_destruct = function(pos)
|
|
item_drop.drop_items_from_container(pos, {"main"})
|
|
end,
|
|
on_rightclick = function(pos, node, clicker)
|
|
if clicker and clicker:is_player() then
|
|
local pname = clicker:get_player_name()
|
|
reading_bookshelves[pname] = table.copy(pos)
|
|
minetest.show_formspec(pname, "rp_default:bookshelf", get_bookshelf_formspec(pos))
|
|
end
|
|
end,
|
|
write_name = function(pos, text)
|
|
-- TODO: Bring back container naming
|
|
end,
|
|
}
|
|
minetest.register_node(":rp_default:bookshelf", bookshelf_def)
|
|
|
|
local bookshelf_painted_def = table.copy(bookshelf_def)
|
|
bookshelf_painted_def.description = S("Painted Bookshelf")
|
|
bookshelf_painted_def.groups.paintable = 1
|
|
bookshelf_painted_def.groups.not_in_creative_inventory = 1
|
|
bookshelf_painted_def.drop = "rp_default:bookshelf"
|
|
bookshelf_painted_def.paramtype2 = "color4dir"
|
|
bookshelf_painted_def.palette = "rp_paint_palette_64.png"
|
|
bookshelf_painted_def.tiles = {"rp_book_bookshelf_base_painted.png", "rp_book_bookshelf_base_painted.png", "rp_book_bookshelf_base_side_painted.png"}
|
|
bookshelf_painted_def.overlay_tiles = {"", "", {name="rp_book_bookshelf_overlay.png", color="white"}}
|
|
minetest.register_node(":rp_default:bookshelf_painted", bookshelf_painted_def)
|
|
|
|
minetest.register_on_player_receive_fields(
|
|
function(player, form_name, fields)
|
|
if not player or not player:is_player() then
|
|
return
|
|
end
|
|
if form_name == "rp_default:bookshelf" then
|
|
local field_no
|
|
for i=1,8 do
|
|
if fields["open_"..i] then
|
|
field_no = i
|
|
break
|
|
end
|
|
end
|
|
if not field_no then
|
|
return
|
|
end
|
|
local pname = player:get_player_name()
|
|
local shelfpos = reading_bookshelves[pname]
|
|
if not shelfpos then
|
|
return
|
|
end
|
|
|
|
local meta = minetest.get_meta(shelfpos)
|
|
local inv = meta:get_inventory()
|
|
|
|
local book = inv:get_stack("main", field_no)
|
|
if not book or book:get_name() ~= "rp_default:book" then
|
|
return
|
|
end
|
|
local bmeta = book:get_meta()
|
|
local text, title = "", ""
|
|
if bmeta then
|
|
text = bmeta:get_string("book:text")
|
|
title = bmeta:get_string("book:title")
|
|
end
|
|
local form = rp_formspec.get_page("rp_book:book_page")
|
|
form = form .. rp_book.make_read_book_page_formspec(title, text)
|
|
|
|
form = form .. rp_formspec.button(3.5, 9, 3, 1, "return", S("Return"))
|
|
minetest.sound_play({name="rp_book_open_book", gain=0.5}, {pos=player:get_pos(), max_hear_distance=16}, true)
|
|
minetest.show_formspec(pname, "rp_default:read_book_in_bookshelf", form)
|
|
|
|
elseif form_name == "rp_default:read_book_in_bookshelf" then
|
|
if (not fields["return"] and not fields["key_enter"]) then
|
|
return
|
|
end
|
|
local pname = player:get_player_name()
|
|
local shelfpos = reading_bookshelves[pname]
|
|
if not shelfpos then
|
|
return
|
|
end
|
|
local node = minetest.get_node(shelfpos)
|
|
if node.name ~= "rp_default:bookshelf" and node.name ~= "rp_default:bookshelf_painted" then
|
|
return
|
|
end
|
|
minetest.sound_play({name="rp_book_close_book", gain=0.5}, {pos=player:get_pos(), max_hear_distance=16}, true)
|
|
minetest.show_formspec(pname, "rp_default:bookshelf", get_bookshelf_formspec(shelfpos))
|
|
end
|
|
end)
|
|
|
|
minetest.register_lbm({
|
|
label = "Update bookshelf formspec",
|
|
name = "rp_book:update_bookshelf_formspec",
|
|
nodenames = { "rp_default:bookshelf" },
|
|
action = function(pos, node)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", "")
|
|
end,
|
|
})
|
|
|
|
minetest.register_craft(
|
|
{
|
|
type = "fuel",
|
|
recipe = "rp_default:bookshelf",
|
|
burntime = 32,
|
|
})
|
|
|
|
crafting.register_craft(
|
|
{
|
|
output = "rp_default:bookshelf",
|
|
items = {
|
|
"rp_default:book_empty 3",
|
|
"group:planks 6",
|
|
}
|
|
})
|