From d6c47903866df0cd5850d19c5c4d18bd2c7760ca Mon Sep 17 00:00:00 2001 From: vlapsley Date: Fri, 18 Aug 2017 17:10:17 +1000 Subject: [PATCH] Remove books from default, replace as mod --- mods/ITEMS/books/depends.txt | 1 + mods/ITEMS/books/init.lua | 303 ++++++++++++++++++ mods/ITEMS/books/mod.conf | 1 + mods/ITEMS/books/textures/books_book.png | Bin 0 -> 255 bytes .../books/textures/books_book_written.png | Bin 0 -> 282 bytes .../books/textures/books_bookshelf.png} | Bin .../books/textures/books_bookshelf_slot.png | Bin 0 -> 191 bytes mods/default/crafting.lua | 36 --- mods/default/craftitems.lua | 162 ---------- mods/default/nodes.lua | 85 ----- mods/default/textures/default_book.png | Bin 201 -> 0 bytes .../default/textures/default_book_written.png | Bin 228 -> 0 bytes .../textures/default_bookshelf_slot.png | Bin 216 -> 0 bytes 13 files changed, 305 insertions(+), 283 deletions(-) create mode 100644 mods/ITEMS/books/depends.txt create mode 100644 mods/ITEMS/books/init.lua create mode 100644 mods/ITEMS/books/mod.conf create mode 100644 mods/ITEMS/books/textures/books_book.png create mode 100644 mods/ITEMS/books/textures/books_book_written.png rename mods/{default/textures/default_bookshelf.png => ITEMS/books/textures/books_bookshelf.png} (100%) mode change 100755 => 100644 create mode 100644 mods/ITEMS/books/textures/books_bookshelf_slot.png delete mode 100755 mods/default/textures/default_book.png delete mode 100755 mods/default/textures/default_book_written.png delete mode 100755 mods/default/textures/default_bookshelf_slot.png diff --git a/mods/ITEMS/books/depends.txt b/mods/ITEMS/books/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/ITEMS/books/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/ITEMS/books/init.lua b/mods/ITEMS/books/init.lua new file mode 100644 index 0000000..0402ad1 --- /dev/null +++ b/mods/ITEMS/books/init.lua @@ -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, +}) + diff --git a/mods/ITEMS/books/mod.conf b/mods/ITEMS/books/mod.conf new file mode 100644 index 0000000..a248002 --- /dev/null +++ b/mods/ITEMS/books/mod.conf @@ -0,0 +1 @@ +name = books diff --git a/mods/ITEMS/books/textures/books_book.png b/mods/ITEMS/books/textures/books_book.png new file mode 100644 index 0000000000000000000000000000000000000000..448a7df0287088582d9e12eaa1189052ace175e2 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnY1=6;f>}3JGm#?3%3F6wa zWyRD9wR2~-uUk7m!kTl>-c8kKJnDdo7)yfuf*Bm1-ADs*lDyqr7&=&GJ%Aj}0*}aI z1_o|n5N2eUHAey{$X?><>&pI+Rg#xWd)2n`YM@ZKr;B3<$Mxg{2eu}rfGAHvH*3y@ zOjUQm1pVi21OwALP3QsWeO-SGoW4zSqkSo+C qFspIn%~b+Pn=GcJC5R*(;9}5y&mAJL(s3Tp3IYh!0T_wQ4_>< z`TF_2ySHuGvSR9l+S@m-tXn&O?#%WGYtHv?Ud))(>7TZfAE=SBB*-tA!Qt7BG!Q4r z+uensgH_f8$l)yTh%9Dc;1&j9Muu5)B!GhKC7!;n>bOd@&XcWP3$~pn0RdDc-S;~`rLTfZ%K%G82Wf5eaJ};n4BQsk?]" - 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", { description = "Coal Lump", inventory_image = "default_coal_lump.png", diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 34b2740..031f0c2 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -162,8 +162,6 @@ Tools / "Advanced" crafting / Non-"natural" default:chest default:chest_locked -default:bookshelf - default:sign_wall_wood 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) minetest.register_node("default:sign_wall_" .. material, { description = desc .. " Sign", diff --git a/mods/default/textures/default_book.png b/mods/default/textures/default_book.png deleted file mode 100755 index 15af2b699894ac23e1f8121870a879bd44128b7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRt!VDzU8V$b#Da8Pv5LX~=tI1v#zX8XFe^CPS|_w3zNea52>sEDy7$S;_|;n|HeAScYz#W95Adh!827S;t@ zCMorl2{Byu>Qi!1bW>Gz6?If)WOGzkRaI1VWn^2Z>E&SgkcCarTU{Y{)`0^OI!sH1 v8*i!b95e}t-W;lUB&E=RSBUBI3AKW1tnLUj_8yGxY{an^LB{Ts5(yKbB diff --git a/mods/default/textures/default_book_written.png b/mods/default/textures/default_book_written.png deleted file mode 100755 index d843e5f6d7c7cc0a7a0740aed086390f33713d7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRt!VDzU8V$b#Dct~{5LX~=r@>Yh!0T_wQ4_>< z`TF_2ySHuGvSR9l+S@m-tXn&O?#%WGYtHv?Ud))(`Ssg7R-gvPk|4ie28U-i(tw;) zPZ!4!j_b(>_*hsMY?-9gk;HPzk4a(Q#tDl%lmZ+)E7o-_n8eV$VDhYwDypuGYzvjW z&hyB+N=vjP%@OH!JuEFD;q5BZdQ`gc))FSy)`MzBdc4AIGj#R_3M8>FX1GwIlAXxF Y@W+}@MPN@vC(uF$Pgg&ebxsLQ07*AZ#Q*>R diff --git a/mods/default/textures/default_bookshelf_slot.png b/mods/default/textures/default_bookshelf_slot.png deleted file mode 100755 index 31c4eb5e6e25b208782e7ec11c8b527a125ebb02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRt!3-oH7vA{>q!^2X+?^QKos)S9~bp9zYIffk$L90|U1(2s1Lwnj--eWH0gb zb!C6R&BkZK>iPBST%eGhr;B5V#O34!1t|j~qeVrIENs&SJGmDg(9sarV>0d*T-YUe zQo~JU^8+!(*C{D3M*N8~o5Wf;Rvo^$^9Lh?f)a!IS@r3CK$93eUHx3vIVCg!0H38d ATmS$7