From 71c41abe72fa464f7382378cd1d210fe6cca3a88 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 7 Mar 2018 16:20:13 +0000 Subject: [PATCH] Initial commit! --- .gitignore | 111 +++++++++++++++++++++++++++++ LICENSE.txt | 7 ++ README.md | 111 +++++++++++++++++++++++++++++ api.lua | 182 ++++++++++++++++++++++++++++++++++++++++++++++++ depends.txt | 1 + description.txt | 1 + init.lua | 22 ++++++ mod.conf | 1 + screenshot.png | Bin 0 -> 32641 bytes 9 files changed, 436 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 api.lua create mode 100644 depends.txt create mode 100644 description.txt create mode 100644 init.lua create mode 100644 mod.conf create mode 100644 screenshot.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8349552 --- /dev/null +++ b/.gitignore @@ -0,0 +1,111 @@ + +# Created by https://www.gitignore.io/api/lua,linux,macos,windows + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Lua ### +# Compiled Lua sources +luac.out + +# luarocks build files +*.src.rock +*.zip +*.tar.gz + +# Object files +*.o +*.os +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo +*.def +*.exp + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + + +### macOS ### +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + + +# End of https://www.gitignore.io/api/lua,linux,macos,windows diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..8aa7831 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,7 @@ +Copyright (C) 2016 rubenwardy + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..58bd2f9 --- /dev/null +++ b/README.md @@ -0,0 +1,111 @@ +# Simple Fast Inventory + +![SFINV Screeny](screenshot.png) + +A cleaner, simpler solution to having an advanced inventory in Minetest. + +Written by rubenwardy. +License: MIT + +## API + +### sfinv Methods + +**Pages** + +* sfinv.set_page(player, pagename) - changes the page +* sfinv.get_homepage_name(player) - get the page name of the first page to show to a player +* sfinv.register_page(name, def) - register a page, see section below +* sfinv.override_page(name, def) - overrides fields of an page registered with register_page. + * Note: Page must already be defined, (opt)depend on the mod defining it. +* sfinv.set_player_inventory_formspec(player) - (re)builds page formspec + and calls set_inventory_formspec(). +* sfinv.get_formspec(player, context) - builds current page's formspec + +**Contexts** + +* sfinv.get_or_create_context(player) - gets the player's context +* sfinv.set_context(player, context) + +**Theming** + +* sfinv.make_formspec(player, context, content, show_inv, size) - adds a theme to a formspec + * show_inv, defaults to false. Whether to show the player's main inventory + * size, defaults to `size[8,8.6]` if not specified +* sfinv.get_nav_fs(player, context, nav, current_idx) - creates tabheader or "" + +### sfinv Members + +* pages - table of pages[pagename] = def +* pages_unordered - array table of pages in order of addition (used to build navigation tabs). +* contexts - contexts[playername] = player_context +* enabled - set to false to disable. Good for inventory rehaul mods like unified inventory + +### Context + +A table with these keys: + +* page - current page name +* nav - a list of page names +* nav_titles - a list of page titles +* nav_idx - current nav index (in nav and nav_titles) +* any thing you want to store + * sfinv will clear the stored data on log out / log in + +### sfinv.register_page + +sfinv.register_page(name, def) + +def is a table containing: + +* `title` - human readable page name (required) +* `get(self, player, context)` - returns a formspec string. See formspec variables. (required) +* `is_in_nav(self, player, context)` - return true to show in the navigation (the tab header, by default) +* `on_player_receive_fields(self, player, context, fields)` - on formspec submit. +* `on_enter(self, player, context)` - called when the player changes pages, usually using the tabs. +* `on_leave(self, player, context)` - when leaving this page to go to another, called before other's on_enter + +### get formspec + +Use sfinv.make_formspec to apply a layout: + + return sfinv.make_formspec(player, context, [[ + list[current_player;craft;1.75,0.5;3,3;] + list[current_player;craftpreview;5.75,1.5;1,1;] + image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270] + listring[current_player;main] + listring[current_player;craft] + image[0,4.25;1,1;gui_hb_bg.png] + image[1,4.25;1,1;gui_hb_bg.png] + image[2,4.25;1,1;gui_hb_bg.png] + image[3,4.25;1,1;gui_hb_bg.png] + image[4,4.25;1,1;gui_hb_bg.png] + image[5,4.25;1,1;gui_hb_bg.png] + image[6,4.25;1,1;gui_hb_bg.png] + image[7,4.25;1,1;gui_hb_bg.png] + ]], true) + +See above (methods section) for more options. + +### Customising themes + +Simply override this function to change the navigation: + + function sfinv.get_nav_fs(player, context, nav, current_idx) + return "navformspec" + end + +And override this function to change the layout: + + function sfinv.make_formspec(player, context, content, show_inv, size) + local tmp = { + size or "size[8,8.6]", + theme_main, + sfinv.get_nav_fs(player, context, context.nav_titles, context.nav_idx), + content + } + if show_inv then + tmp[4] = theme_inv + end + return table.concat(tmp, "") + end diff --git a/api.lua b/api.lua new file mode 100644 index 0000000..fdb652b --- /dev/null +++ b/api.lua @@ -0,0 +1,182 @@ +sfinv = { + pages = {}, + pages_unordered = {}, + contexts = {}, + enabled = true +} + +function sfinv.register_page(name, def) + assert(name, "Invalid sfinv page. Requires a name") + assert(def, "Invalid sfinv page. Requires a def[inition] table") + assert(def.get, "Invalid sfinv page. Def requires a get function.") + assert(not sfinv.pages[name], "Attempt to register already registered sfinv page " .. dump(name)) + + sfinv.pages[name] = def + def.name = name + table.insert(sfinv.pages_unordered, def) +end + +function sfinv.override_page(name, def) + assert(name, "Invalid sfinv page override. Requires a name") + assert(def, "Invalid sfinv page override. Requires a def[inition] table") + local page = sfinv.pages[name] + assert(page, "Attempt to override sfinv page " .. dump(name) .. " which does not exist.") + for key, value in pairs(def) do + page[key] = value + end +end + +function sfinv.get_nav_fs(player, context, nav, current_idx) + -- Only show tabs if there is more than one page + if #nav > 1 then + return "tabheader[0,0;sfinv_nav_tabs;" .. table.concat(nav, ",") .. + ";" .. current_idx .. ";true;false]" + else + return "" + end +end + +local theme_main = "bgcolor[#080808BB;true]" .. default.gui_bg .. + default.gui_bg_img + +local theme_inv = default.gui_slots .. [[ + list[current_player;main;0,4.7;8,1;] + list[current_player;main;0,5.85;8,3;8] + ]] + +function sfinv.make_formspec(player, context, content, show_inv, size) + local tmp = { + size or "size[8,8.6]", + theme_main, + sfinv.get_nav_fs(player, context, context.nav_titles, context.nav_idx), + content + } + if show_inv then + tmp[#tmp + 1] = theme_inv + end + return table.concat(tmp, "") +end + +function sfinv.get_homepage_name(player) + return "sfinv:crafting" +end + +function sfinv.get_formspec(player, context) + -- Generate navigation tabs + local nav = {} + local nav_ids = {} + local current_idx = 1 + for i, pdef in pairs(sfinv.pages_unordered) do + if not pdef.is_in_nav or pdef:is_in_nav(player, context) then + nav[#nav + 1] = pdef.title + nav_ids[#nav_ids + 1] = pdef.name + if pdef.name == context.page then + current_idx = #nav_ids + end + end + end + context.nav = nav_ids + context.nav_titles = nav + context.nav_idx = current_idx + + -- Generate formspec + local page = sfinv.pages[context.page] or sfinv.pages["404"] + if page then + return page:get(player, context) + else + local old_page = context.page + local home_page = sfinv.get_homepage_name(player) + + if old_page == home_page then + minetest.log("error", "[sfinv] Couldn't find " .. dump(old_page) .. + ", which is also the old page") + + return "" + end + + context.page = home_page + assert(sfinv.pages[context.page], "[sfinv] Invalid homepage") + minetest.log("warning", "[sfinv] Couldn't find " .. dump(old_page) .. + " so switching to homepage") + + return sfinv.get_formspec(player, context) + end +end + +function sfinv.get_or_create_context(player) + local name = player:get_player_name() + local context = sfinv.contexts[name] + if not context then + context = { + page = sfinv.get_homepage_name(player) + } + sfinv.contexts[name] = context + end + return context +end + +function sfinv.set_context(player, context) + sfinv.contexts[player:get_player_name()] = context +end + +function sfinv.set_player_inventory_formspec(player, context) + local fs = sfinv.get_formspec(player, + context or sfinv.get_or_create_context(player)) + player:set_inventory_formspec(fs) +end + +function sfinv.set_page(player, pagename) + local context = sfinv.get_or_create_context(player) + local oldpage = sfinv.pages[context.page] + if oldpage and oldpage.on_leave then + oldpage:on_leave(player, context) + end + context.page = pagename + local page = sfinv.pages[pagename] + if page.on_enter then + page:on_enter(player, context) + end + sfinv.set_player_inventory_formspec(player, context) +end + +minetest.register_on_joinplayer(function(player) + if sfinv.enabled then + sfinv.set_player_inventory_formspec(player) + end +end) + +minetest.register_on_leaveplayer(function(player) + sfinv.contexts[player:get_player_name()] = nil +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" or not sfinv.enabled then + return false + end + + -- Get Context + local name = player:get_player_name() + local context = sfinv.contexts[name] + if not context then + sfinv.set_player_inventory_formspec(player) + return false + end + + -- Was a tab selected? + if fields.sfinv_nav_tabs and context.nav then + local tid = tonumber(fields.sfinv_nav_tabs) + if tid and tid > 0 then + local id = context.nav[tid] + local page = sfinv.pages[id] + if id and page then + sfinv.set_page(player, id) + end + end + else + -- Pass event to page + local page = sfinv.pages[context.page] + if page and page.on_player_receive_fields then + return page:on_player_receive_fields(player, context, fields) + end + end +end) diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/depends.txt @@ -0,0 +1 @@ +default diff --git a/description.txt b/description.txt new file mode 100644 index 0000000..c62b967 --- /dev/null +++ b/description.txt @@ -0,0 +1 @@ +A cleaner, simpler solution to having an advanced inventory in Minetest. diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..f030222 --- /dev/null +++ b/init.lua @@ -0,0 +1,22 @@ +dofile(minetest.get_modpath("sfinv") .. "/api.lua") + +sfinv.register_page("sfinv:crafting", { + title = "Crafting", + get = function(self, player, context) + return sfinv.make_formspec(player, context, [[ + list[current_player;craft;1.75,0.5;3,3;] + list[current_player;craftpreview;5.75,1.5;1,1;] + image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270] + listring[current_player;main] + listring[current_player;craft] + image[0,4.75;1,1;gui_hb_bg.png] + image[1,4.75;1,1;gui_hb_bg.png] + image[2,4.75;1,1;gui_hb_bg.png] + image[3,4.75;1,1;gui_hb_bg.png] + image[4,4.75;1,1;gui_hb_bg.png] + image[5,4.75;1,1;gui_hb_bg.png] + image[6,4.75;1,1;gui_hb_bg.png] + image[7,4.75;1,1;gui_hb_bg.png] + ]], true) + end +}) diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..721d29f --- /dev/null +++ b/mod.conf @@ -0,0 +1 @@ +name = sfinv diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ed142181f46719a444bfa7fd397a5d6f547765a1 GIT binary patch literal 32641 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 literal 0 HcmV?d00001