Remove books from default, replace as mod
1
mods/ITEMS/books/depends.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
default
|
303
mods/ITEMS/books/init.lua
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
--[[
|
||||||
|
Books
|
||||||
|
--]]
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = 'books:book',
|
||||||
|
recipe = {
|
||||||
|
{'default:paper'},
|
||||||
|
{'default:paper'},
|
||||||
|
{'default:paper'},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = 'books:bookshelf',
|
||||||
|
recipe = {
|
||||||
|
{'group:wood', 'group:wood', 'group:wood'},
|
||||||
|
{'books:book', 'books:book', 'books:book'},
|
||||||
|
{'group:wood', 'group:wood', 'group:wood'},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
local bookshelf_formspec =
|
||||||
|
"size[8,7;]" ..
|
||||||
|
default.gui_bg ..
|
||||||
|
default.gui_bg_img ..
|
||||||
|
default.gui_slots ..
|
||||||
|
"list[context;books;0,0.3;8,2;]" ..
|
||||||
|
"list[current_player;main;0,2.85;8,1;]" ..
|
||||||
|
"list[current_player;main;0,4.08;8,3;8]" ..
|
||||||
|
"listring[context;books]" ..
|
||||||
|
"listring[current_player;main]" ..
|
||||||
|
default.get_hotbar_bg(0,2.85)
|
||||||
|
|
||||||
|
local function get_bookshelf_formspec(inv)
|
||||||
|
local formspec = bookshelf_formspec
|
||||||
|
local invlist = inv and inv:get_list("books")
|
||||||
|
-- Inventory slots overlay
|
||||||
|
local bx, by = 0, 0.3
|
||||||
|
for i = 1, 16 do
|
||||||
|
if i == 9 then
|
||||||
|
bx = 0
|
||||||
|
by = by + 1
|
||||||
|
end
|
||||||
|
if not invlist or invlist[i]:is_empty() then
|
||||||
|
formspec = formspec ..
|
||||||
|
"image[" .. bx .. "," .. by .. ";1,1;books_bookshelf_slot.png]"
|
||||||
|
end
|
||||||
|
bx = bx + 1
|
||||||
|
end
|
||||||
|
return formspec
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_node("books:bookshelf", {
|
||||||
|
description = "Bookshelf",
|
||||||
|
tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
|
||||||
|
"default_wood.png", "books_bookshelf.png", "books_bookshelf.png"},
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
is_ground_content = false,
|
||||||
|
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
|
||||||
|
on_construct = function(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:set_string("formspec", get_bookshelf_formspec(nil))
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
inv:set_size("books", 8 * 2)
|
||||||
|
end,
|
||||||
|
can_dig = function(pos,player)
|
||||||
|
local inv = minetest.get_meta(pos):get_inventory()
|
||||||
|
return inv:is_empty("books")
|
||||||
|
end,
|
||||||
|
allow_metadata_inventory_put = function(pos, listname, index, stack)
|
||||||
|
if minetest.get_item_group(stack:get_name(), "book") ~= 0 then
|
||||||
|
return stack:get_count()
|
||||||
|
end
|
||||||
|
return 0
|
||||||
|
end,
|
||||||
|
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||||
|
minetest.log("action", player:get_player_name() ..
|
||||||
|
" moves stuff in bookshelf at " .. minetest.pos_to_string(pos))
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory()))
|
||||||
|
end,
|
||||||
|
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
||||||
|
minetest.log("action", player:get_player_name() ..
|
||||||
|
" moves stuff to bookshelf at " .. minetest.pos_to_string(pos))
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory()))
|
||||||
|
end,
|
||||||
|
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||||
|
minetest.log("action", player:get_player_name() ..
|
||||||
|
" takes stuff from bookshelf at " .. minetest.pos_to_string(pos))
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory()))
|
||||||
|
end,
|
||||||
|
on_blast = function(pos)
|
||||||
|
local drops = {}
|
||||||
|
default.get_inventory_drops(pos, "books", drops)
|
||||||
|
drops[#drops+1] = "books:bookshelf"
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
return drops
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
local lpp = 14 -- Lines per book's page
|
||||||
|
local function book_on_use(itemstack, user)
|
||||||
|
local player_name = user:get_player_name()
|
||||||
|
local meta = itemstack:get_meta()
|
||||||
|
local title, text, owner = "", "", player_name
|
||||||
|
local page, page_max, lines, string = 1, 1, {}, ""
|
||||||
|
|
||||||
|
-- Backwards compatibility
|
||||||
|
local old_data = minetest.deserialize(itemstack:get_metadata())
|
||||||
|
if old_data then
|
||||||
|
meta:from_table({ fields = old_data })
|
||||||
|
end
|
||||||
|
|
||||||
|
local data = meta:to_table().fields
|
||||||
|
|
||||||
|
if data.owner then
|
||||||
|
title = data.title
|
||||||
|
text = data.text
|
||||||
|
owner = data.owner
|
||||||
|
|
||||||
|
for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do
|
||||||
|
lines[#lines+1] = str
|
||||||
|
end
|
||||||
|
|
||||||
|
if data.page then
|
||||||
|
page = data.page
|
||||||
|
page_max = data.page_max
|
||||||
|
|
||||||
|
for i = ((lpp * page) - lpp) + 1, lpp * page do
|
||||||
|
if not lines[i] then break end
|
||||||
|
string = string .. lines[i] .. "\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local formspec
|
||||||
|
if owner == player_name then
|
||||||
|
formspec = "size[8,8]" .. default.gui_bg ..
|
||||||
|
default.gui_bg_img ..
|
||||||
|
"field[0.5,1;7.5,0;title;Title:;" ..
|
||||||
|
minetest.formspec_escape(title) .. "]" ..
|
||||||
|
"textarea[0.5,1.5;7.5,7;text;Contents:;" ..
|
||||||
|
minetest.formspec_escape(text) .. "]" ..
|
||||||
|
"button_exit[2.5,7.5;3,1;save;Save]"
|
||||||
|
else
|
||||||
|
formspec = "size[8,8]" .. default.gui_bg ..
|
||||||
|
default.gui_bg_img ..
|
||||||
|
"label[0.5,0.5;by " .. owner .. "]" ..
|
||||||
|
"tablecolumns[color;text]" ..
|
||||||
|
"tableoptions[background=#00000000;highlight=#00000000;border=false]" ..
|
||||||
|
"table[0.4,0;7,0.5;title;#FFFF00," .. minetest.formspec_escape(title) .. "]" ..
|
||||||
|
"textarea[0.5,1.5;7.5,7;;" ..
|
||||||
|
minetest.formspec_escape(string ~= "" and string or text) .. ";]" ..
|
||||||
|
"button[2.4,7.6;0.8,0.8;book_prev;<]" ..
|
||||||
|
"label[3.2,7.7;Page " .. page .. " of " .. page_max .. "]" ..
|
||||||
|
"button[4.9,7.6;0.8,0.8;book_next;>]"
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.show_formspec(player_name, "books:book", formspec)
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
|
if formname ~= "books:book" then return end
|
||||||
|
local inv = player:get_inventory()
|
||||||
|
local stack = player:get_wielded_item()
|
||||||
|
|
||||||
|
if fields.save and fields.title ~= "" and fields.text ~= "" then
|
||||||
|
local new_stack, data
|
||||||
|
if stack:get_name() ~= "books:book_written" then
|
||||||
|
local count = stack:get_count()
|
||||||
|
if count == 1 then
|
||||||
|
stack:set_name("books:book_written")
|
||||||
|
else
|
||||||
|
stack:set_count(count - 1)
|
||||||
|
new_stack = ItemStack("books:book_written")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
data = stack:get_meta():to_table().fields
|
||||||
|
end
|
||||||
|
|
||||||
|
if data and data.owner and data.owner ~= player:get_player_name() then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if not data then data = {} end
|
||||||
|
data.title = fields.title
|
||||||
|
data.owner = player:get_player_name()
|
||||||
|
data.description = "\""..fields.title.."\" by "..data.owner
|
||||||
|
data.text = fields.text
|
||||||
|
data.text_len = #data.text
|
||||||
|
data.page = 1
|
||||||
|
data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp)
|
||||||
|
|
||||||
|
if new_stack then
|
||||||
|
new_stack:get_meta():from_table({ fields = data })
|
||||||
|
if inv:room_for_item("main", new_stack) then
|
||||||
|
inv:add_item("main", new_stack)
|
||||||
|
else
|
||||||
|
minetest.add_item(player:getpos(), new_stack)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
stack:get_meta():from_table({ fields = data })
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif fields.book_next or fields.book_prev then
|
||||||
|
local data = stack:get_meta():to_table().fields
|
||||||
|
if not data or not data.page then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
data.page = tonumber(data.page)
|
||||||
|
data.page_max = tonumber(data.page_max)
|
||||||
|
|
||||||
|
if fields.book_next then
|
||||||
|
data.page = data.page + 1
|
||||||
|
if data.page > data.page_max then
|
||||||
|
data.page = 1
|
||||||
|
end
|
||||||
|
else
|
||||||
|
data.page = data.page - 1
|
||||||
|
if data.page == 0 then
|
||||||
|
data.page = data.page_max
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
stack:get_meta():from_table({fields = data})
|
||||||
|
stack = book_on_use(stack, player)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Update stack
|
||||||
|
player:set_wielded_item(stack)
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_craftitem("books:book", {
|
||||||
|
description = "Book",
|
||||||
|
inventory_image = "books_book.png",
|
||||||
|
groups = {book = 1, flammable = 3},
|
||||||
|
on_use = book_on_use,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craftitem("books:book_written", {
|
||||||
|
description = "Book With Text",
|
||||||
|
inventory_image = "books_book_written.png",
|
||||||
|
groups = {book = 1, not_in_creative_inventory = 1, flammable = 3},
|
||||||
|
stack_max = 1,
|
||||||
|
on_use = book_on_use,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
type = "shapeless",
|
||||||
|
output = "books:book_written",
|
||||||
|
recipe = {"books:book", "books:book_written"}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
|
||||||
|
if itemstack:get_name() ~= "books:book_written" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local original
|
||||||
|
local index
|
||||||
|
for i = 1, player:get_inventory():get_size("craft") do
|
||||||
|
if old_craft_grid[i]:get_name() == "books:book_written" then
|
||||||
|
original = old_craft_grid[i]
|
||||||
|
index = i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not original then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local copymeta = original:get_meta():to_table()
|
||||||
|
-- copy of the book held by player's mouse cursor
|
||||||
|
itemstack:get_meta():from_table(copymeta)
|
||||||
|
-- put the book with metadata back in the craft grid
|
||||||
|
craft_inv:set_stack("craft", index, original)
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
type = "fuel",
|
||||||
|
recipe = "books:bookshelf",
|
||||||
|
burntime = 30,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
type = "fuel",
|
||||||
|
recipe = "books:book",
|
||||||
|
burntime = 3,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
type = "fuel",
|
||||||
|
recipe = "books:book_written",
|
||||||
|
burntime = 3,
|
||||||
|
})
|
||||||
|
|
1
mods/ITEMS/books/mod.conf
Normal file
@ -0,0 +1 @@
|
|||||||
|
name = books
|
BIN
mods/ITEMS/books/textures/books_book.png
Normal file
After Width: | Height: | Size: 255 B |
BIN
mods/ITEMS/books/textures/books_book_written.png
Normal file
After Width: | Height: | Size: 282 B |
0
mods/default/textures/default_bookshelf.png → mods/ITEMS/books/textures/books_bookshelf.png
Executable file → Normal file
Before Width: | Height: | Size: 471 B After Width: | Height: | Size: 471 B |
BIN
mods/ITEMS/books/textures/books_bookshelf_slot.png
Normal file
After Width: | Height: | Size: 191 B |
@ -555,24 +555,6 @@ minetest.register_craft({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = 'default:book',
|
|
||||||
recipe = {
|
|
||||||
{'default:paper'},
|
|
||||||
{'default:paper'},
|
|
||||||
{'default:paper'},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
output = 'default:bookshelf',
|
|
||||||
recipe = {
|
|
||||||
{'group:wood', 'group:wood', 'group:wood'},
|
|
||||||
{'default:book', 'default:book', 'default:book'},
|
|
||||||
{'group:wood', 'group:wood', 'group:wood'},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = 'default:ladder_wood 3',
|
output = 'default:ladder_wood 3',
|
||||||
recipe = {
|
recipe = {
|
||||||
@ -983,12 +965,6 @@ minetest.register_craft({
|
|||||||
burntime = 1,
|
burntime = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "fuel",
|
|
||||||
recipe = "default:bookshelf",
|
|
||||||
burntime = 30,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
type = "fuel",
|
type = "fuel",
|
||||||
recipe = "default:ladder_wood",
|
recipe = "default:ladder_wood",
|
||||||
@ -1061,18 +1037,6 @@ minetest.register_craft({
|
|||||||
burntime = 1,
|
burntime = 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "fuel",
|
|
||||||
recipe = "default:book",
|
|
||||||
burntime = 3,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "fuel",
|
|
||||||
recipe = "default:book_written",
|
|
||||||
burntime = 3,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
type = "fuel",
|
type = "fuel",
|
||||||
recipe = "default:dry_shrub",
|
recipe = "default:dry_shrub",
|
||||||
|
@ -12,168 +12,6 @@ minetest.register_craftitem("default:paper", {
|
|||||||
groups = {flammable = 3},
|
groups = {flammable = 3},
|
||||||
})
|
})
|
||||||
|
|
||||||
local lpp = 14 -- Lines per book's page
|
|
||||||
local function book_on_use(itemstack, user)
|
|
||||||
local player_name = user:get_player_name()
|
|
||||||
local data = minetest.deserialize(itemstack:get_metadata())
|
|
||||||
local title, text, owner = "", "", player_name
|
|
||||||
local page, page_max, lines, string = 1, 1, {}, ""
|
|
||||||
|
|
||||||
if data then
|
|
||||||
title = data.title
|
|
||||||
text = data.text
|
|
||||||
owner = data.owner
|
|
||||||
|
|
||||||
for str in (text .. "\n"):gmatch("([^\n]*)[\n]") do
|
|
||||||
lines[#lines+1] = str
|
|
||||||
end
|
|
||||||
|
|
||||||
if data.page then
|
|
||||||
page = data.page
|
|
||||||
page_max = data.page_max
|
|
||||||
|
|
||||||
for i = ((lpp * page) - lpp) + 1, lpp * page do
|
|
||||||
if not lines[i] then break end
|
|
||||||
string = string .. lines[i] .. "\n"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local formspec
|
|
||||||
if owner == player_name then
|
|
||||||
formspec = "size[8,8]" .. default.gui_bg ..
|
|
||||||
default.gui_bg_img ..
|
|
||||||
"field[0.5,1;7.5,0;title;Title:;" ..
|
|
||||||
minetest.formspec_escape(title) .. "]" ..
|
|
||||||
"textarea[0.5,1.5;7.5,7;text;Contents:;" ..
|
|
||||||
minetest.formspec_escape(text) .. "]" ..
|
|
||||||
"button_exit[2.5,7.5;3,1;save;Save]"
|
|
||||||
else
|
|
||||||
formspec = "size[8,8]" .. default.gui_bg ..
|
|
||||||
default.gui_bg_img ..
|
|
||||||
"label[0.5,0.5;by " .. owner .. "]" ..
|
|
||||||
"tablecolumns[color;text]" ..
|
|
||||||
"tableoptions[background=#00000000;highlight=#00000000;border=false]" ..
|
|
||||||
"table[0.4,0;7,0.5;title;#FFFF00," .. minetest.formspec_escape(title) .. "]" ..
|
|
||||||
"textarea[0.5,1.5;7.5,7;;" ..
|
|
||||||
minetest.formspec_escape(string ~= "" and string or text) .. ";]" ..
|
|
||||||
"button[2.4,7.6;0.8,0.8;book_prev;<]" ..
|
|
||||||
"label[3.2,7.7;Page " .. page .. " of " .. page_max .. "]" ..
|
|
||||||
"button[4.9,7.6;0.8,0.8;book_next;>]"
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.show_formspec(player_name, "default:book", formspec)
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
||||||
if formname ~= "default:book" then return end
|
|
||||||
local inv = player:get_inventory()
|
|
||||||
local stack = player:get_wielded_item()
|
|
||||||
|
|
||||||
if fields.save and fields.title ~= "" and fields.text ~= "" then
|
|
||||||
local new_stack, data
|
|
||||||
if stack:get_name() ~= "default:book_written" then
|
|
||||||
local count = stack:get_count()
|
|
||||||
if count == 1 then
|
|
||||||
stack:set_name("default:book_written")
|
|
||||||
else
|
|
||||||
stack:set_count(count - 1)
|
|
||||||
new_stack = ItemStack("default:book_written")
|
|
||||||
end
|
|
||||||
else
|
|
||||||
data = minetest.deserialize(stack:get_metadata())
|
|
||||||
end
|
|
||||||
|
|
||||||
if not data then data = {} end
|
|
||||||
data.title = fields.title
|
|
||||||
data.text = fields.text
|
|
||||||
data.text_len = #data.text
|
|
||||||
data.page = 1
|
|
||||||
data.page_max = math.ceil((#data.text:gsub("[^\n]", "") + 1) / lpp)
|
|
||||||
data.owner = player:get_player_name()
|
|
||||||
local data_str = minetest.serialize(data)
|
|
||||||
|
|
||||||
if new_stack then
|
|
||||||
new_stack:set_metadata(data_str)
|
|
||||||
if inv:room_for_item("main", new_stack) then
|
|
||||||
inv:add_item("main", new_stack)
|
|
||||||
else
|
|
||||||
minetest.add_item(player:getpos(), new_stack)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
stack:set_metadata(data_str)
|
|
||||||
end
|
|
||||||
|
|
||||||
elseif fields.book_next or fields.book_prev then
|
|
||||||
local data = minetest.deserialize(stack:get_metadata())
|
|
||||||
if not data or not data.page then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if fields.book_next then
|
|
||||||
data.page = data.page + 1
|
|
||||||
if data.page > data.page_max then
|
|
||||||
data.page = 1
|
|
||||||
end
|
|
||||||
else
|
|
||||||
data.page = data.page - 1
|
|
||||||
if data.page == 0 then
|
|
||||||
data.page = data.page_max
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local data_str = minetest.serialize(data)
|
|
||||||
stack:set_metadata(data_str)
|
|
||||||
book_on_use(stack, player)
|
|
||||||
end
|
|
||||||
|
|
||||||
player:set_wielded_item(stack)
|
|
||||||
end)
|
|
||||||
|
|
||||||
minetest.register_craftitem("default:book", {
|
|
||||||
description = "Book",
|
|
||||||
inventory_image = "default_book.png",
|
|
||||||
groups = {book = 1, flammable = 3},
|
|
||||||
on_use = book_on_use,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craftitem("default:book_written", {
|
|
||||||
description = "Book With Text",
|
|
||||||
inventory_image = "default_book_written.png",
|
|
||||||
groups = {book = 1, not_in_creative_inventory = 1, flammable = 3},
|
|
||||||
stack_max = 1,
|
|
||||||
on_use = book_on_use,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "shapeless",
|
|
||||||
output = "default:book_written",
|
|
||||||
recipe = {"default:book", "default:book_written"}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
|
|
||||||
if itemstack:get_name() ~= "default:book_written" 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:book_written" then
|
|
||||||
original = old_craft_grid[i]
|
|
||||||
index = i
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if not original then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local copymeta = original:get_metadata()
|
|
||||||
-- copy of the book held by player's mouse cursor
|
|
||||||
itemstack:set_metadata(copymeta)
|
|
||||||
-- put the book with metadata back in the craft grid
|
|
||||||
craft_inv:set_stack("craft", index, original)
|
|
||||||
end)
|
|
||||||
|
|
||||||
minetest.register_craftitem("default:coal_lump", {
|
minetest.register_craftitem("default:coal_lump", {
|
||||||
description = "Coal Lump",
|
description = "Coal Lump",
|
||||||
inventory_image = "default_coal_lump.png",
|
inventory_image = "default_coal_lump.png",
|
||||||
|
@ -162,8 +162,6 @@ Tools / "Advanced" crafting / Non-"natural"
|
|||||||
default:chest
|
default:chest
|
||||||
default:chest_locked
|
default:chest_locked
|
||||||
|
|
||||||
default:bookshelf
|
|
||||||
|
|
||||||
default:sign_wall_wood
|
default:sign_wall_wood
|
||||||
default:sign_wall_steel
|
default:sign_wall_steel
|
||||||
|
|
||||||
@ -1800,89 +1798,6 @@ minetest.register_node("default:chest_locked", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
local bookshelf_formspec =
|
|
||||||
"size[8,7;]" ..
|
|
||||||
default.gui_bg ..
|
|
||||||
default.gui_bg_img ..
|
|
||||||
default.gui_slots ..
|
|
||||||
"list[context;books;0,0.3;8,2;]" ..
|
|
||||||
"list[current_player;main;0,2.85;8,1;]" ..
|
|
||||||
"list[current_player;main;0,4.08;8,3;8]" ..
|
|
||||||
"listring[context;books]" ..
|
|
||||||
"listring[current_player;main]" ..
|
|
||||||
default.get_hotbar_bg(0,2.85)
|
|
||||||
|
|
||||||
local function get_bookshelf_formspec(inv)
|
|
||||||
local formspec = bookshelf_formspec
|
|
||||||
local invlist = inv and inv:get_list("books")
|
|
||||||
-- Inventory slots overlay
|
|
||||||
local bx, by = 0, 0.3
|
|
||||||
for i = 1, 16 do
|
|
||||||
if i == 9 then
|
|
||||||
bx = 0
|
|
||||||
by = by + 1
|
|
||||||
end
|
|
||||||
if not invlist or invlist[i]:is_empty() then
|
|
||||||
formspec = formspec ..
|
|
||||||
"image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]"
|
|
||||||
end
|
|
||||||
bx = bx + 1
|
|
||||||
end
|
|
||||||
return formspec
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_node("default:bookshelf", {
|
|
||||||
description = "Bookshelf",
|
|
||||||
tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
|
|
||||||
"default_wood.png", "default_bookshelf.png", "default_bookshelf.png"},
|
|
||||||
paramtype2 = "facedir",
|
|
||||||
is_ground_content = false,
|
|
||||||
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
|
|
||||||
sounds = default.node_sound_wood_defaults(),
|
|
||||||
|
|
||||||
on_construct = function(pos)
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
meta:set_string("formspec", get_bookshelf_formspec(nil))
|
|
||||||
local inv = meta:get_inventory()
|
|
||||||
inv:set_size("books", 8 * 2)
|
|
||||||
end,
|
|
||||||
can_dig = function(pos,player)
|
|
||||||
local inv = minetest.get_meta(pos):get_inventory()
|
|
||||||
return inv:is_empty("books")
|
|
||||||
end,
|
|
||||||
allow_metadata_inventory_put = function(pos, listname, index, stack)
|
|
||||||
if minetest.get_item_group(stack:get_name(), "book") ~= 0 then
|
|
||||||
return stack:get_count()
|
|
||||||
end
|
|
||||||
return 0
|
|
||||||
end,
|
|
||||||
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
||||||
minetest.log("action", player:get_player_name() ..
|
|
||||||
" moves stuff in bookshelf at " .. minetest.pos_to_string(pos))
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory()))
|
|
||||||
end,
|
|
||||||
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
||||||
minetest.log("action", player:get_player_name() ..
|
|
||||||
" moves stuff to bookshelf at " .. minetest.pos_to_string(pos))
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory()))
|
|
||||||
end,
|
|
||||||
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
||||||
minetest.log("action", player:get_player_name() ..
|
|
||||||
" takes stuff from bookshelf at " .. minetest.pos_to_string(pos))
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
meta:set_string("formspec", get_bookshelf_formspec(meta:get_inventory()))
|
|
||||||
end,
|
|
||||||
on_blast = function(pos)
|
|
||||||
local drops = {}
|
|
||||||
default.get_inventory_drops(pos, "books", drops)
|
|
||||||
drops[#drops+1] = "default:bookshelf"
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
return drops
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
local function register_sign(material, desc, def)
|
local function register_sign(material, desc, def)
|
||||||
minetest.register_node("default:sign_wall_" .. material, {
|
minetest.register_node("default:sign_wall_" .. material, {
|
||||||
description = desc .. " Sign",
|
description = desc .. " Sign",
|
||||||
|
Before Width: | Height: | Size: 201 B |
Before Width: | Height: | Size: 228 B |
Before Width: | Height: | Size: 216 B |