diff --git a/API.md b/API.md index f4c2dfd..f151400 100644 --- a/API.md +++ b/API.md @@ -16,15 +16,15 @@ ### Tabs -#### `i3.new_tab(name, def)` +#### `i4.new_tab(name, def)` - `name` is the tab name. - `def` is the tab definition. -Custom tabs can be added to the `i3` inventory as follow (example): +Custom tabs can be added to the `i4` inventory as follow (example): ```Lua -i3.new_tab("stuff", { +i4.new_tab("stuff", { description = "Stuff", image = "image.png", -- Optional, add an image next to the tab description slots = true -- Optional, whether the inventory slots are shown or not. Disabled by default. @@ -62,28 +62,28 @@ i3.new_tab("stuff", { - `data` are the user data. - `fs` is the formspec table which is callable with a metamethod. Every call adds a new entry. -#### `i3.set_fs(player)` +#### `i4.set_fs(player)` Update the current formspec. -#### `i3.remove_tab(tabname)` +#### `i4.remove_tab(tabname)` Delete a tab by name. -#### `i3.get_current_tab(player)` +#### `i4.get_current_tab(player)` Return the current player tab. `player` is an `ObjectRef` to the user. -#### `i3.set_tab(player[, tabname])` +#### `i4.set_tab(player[, tabname])` Set the current tab by name. `player` is an `ObjectRef` to the user. `tabname` can be omitted to get an empty tab. -#### `i3.override_tab(tabname, def)` +#### `i4.override_tab(tabname, def)` -Override a tab by name. `def` is the tab definition like seen in `i3.set_tab` +Override a tab by name. `def` is the tab definition like seen in `i4.set_tab` -#### `i3.tabs` +#### `i4.tabs` A list of registered tabs. @@ -91,7 +91,7 @@ A list of registered tabs. ### Footer buttons -`i3.new_footer_button(name, def)` +`i4.new_footer_button(name, def)` * `name` is the footer button’s name. * `def` is the button defintion. @@ -99,7 +99,7 @@ A list of registered tabs. Custom footer buttons can be added beside the trash, sort, and settings buttons. For example: ```Lua -i3.new_footer_button("broadcast_msg", { +i4.new_footer_button("broadcast_msg", { description = "Broadcast message", image = "speech_icon.png", -- Required, this is the button’s icon. @@ -114,14 +114,14 @@ i3.new_footer_button("broadcast_msg", { -- Build the formspec formspec = function(player, data, fs) - -- Button style nicked from i3 directly. + -- Button style nicked from i4 directly. fs([[ style[send_msg_button,confirm_trash_no,set_home;noclip=true;font_size=16; - bgimg=i3_btn9.png;bgimg_hovered=i3_btn9_hovered.png; - bgimg_pressed=i3_btn9_pressed.png;bgimg_middle=4,6] + bgimg=i4_btn9.png;bgimg_hovered=i4_btn9_hovered.png; + bgimg_pressed=i4_btn9_pressed.png;bgimg_middle=4,6] ]]) - fs("image[5,10.65;3,0.5;i3_bg_goto.png]") + fs("image[5,10.65;3,0.5;i4_bg_goto.png]") fs("field[5,10.65;3,0.5;chat_msg_field;;]") fs("button[8,10.65;1,0.5;send_msg_button;Send]") -- No need to return anything @@ -137,15 +137,15 @@ i3.new_footer_button("broadcast_msg", { end, }) ``` -#### `i3.remove_footer_button(button_name)` +#### `i4.remove_footer_button(button_name)` Delete a footer button by name. -#### `i3.override_footer_button(button_name, def)` +#### `i4.override_footer_button(button_name, def)` -Override a footer button by name. `def` is the button definition like seen in `i3.new_footer_button` +Override a footer button by name. `def` is the button definition like seen in `i4.new_footer_button` -#### `i3.footer_buttons` +#### `i4.footer_buttons` A list of registered footer buttons. @@ -162,7 +162,7 @@ Examples: #### Registering a custom crafting type ```Lua -i3.register_craft_type("digging", { +i4.register_craft_type("digging", { description = "Digging", icon = "default_tool_steelpick.png", }) @@ -171,7 +171,7 @@ i3.register_craft_type("digging", { #### Registering a custom crafting recipe ```Lua -i3.register_craft { +i4.register_craft { type = "digging", result = "default:cobble 2", items = {"default:stone"}, @@ -179,7 +179,7 @@ i3.register_craft { ``` ```Lua -i3.register_craft { +i4.register_craft { result = "default:cobble 16", items = { "default:stone, default:stone, default:stone", @@ -192,7 +192,7 @@ i3.register_craft { Recipes can be registered in a Minecraft-like way: ```Lua -i3.register_craft { +i4.register_craft { grid = { "X #", " ## ", @@ -210,7 +210,7 @@ i3.register_craft { Multiple recipes can also be registered at once: ```Lua -i3.register_craft { +i4.register_craft { { result = "default:mese", items = { @@ -234,8 +234,8 @@ i3.register_craft { Recipes can be registered from a given URL containing a JSON file (HTTP support is required¹): ```Lua -i3.register_craft { - url = "https://raw.githubusercontent.com/minetest-mods/i3/main/tests/test_online_recipe.json" +i4.register_craft { + url = "https://raw.githubusercontent.com/minetest-mods/i4/main/tests/test_online_recipe.json" } ``` @@ -246,7 +246,7 @@ i3.register_craft { Manage the tabs on the right panel of the inventory. Allow to make a sensible list sorted by specific groups of items. -#### `i3.new_minitab(name, def)` +#### `i4.new_minitab(name, def)` Add a new minitab (limited to 6). @@ -256,7 +256,7 @@ Add a new minitab (limited to 6). Example: ```Lua -i3.new_minitab("test", { +i4.new_minitab("test", { description = "Test", -- Whether this tab is visible or not. Optional. @@ -276,13 +276,13 @@ i3.new_minitab("test", { - `data` are the user data. - `item` is an item name string. -#### `i3.remove_minitab(name)` +#### `i4.remove_minitab(name)` Remove a minitab by name. - `name` is the name of the tab to remove. -#### `i3.minitabs` +#### `i4.minitabs` A list of registered minitabs. @@ -293,7 +293,7 @@ A list of registered minitabs. Recipe filters can be used to filter the recipes shown to players. Progressive mode is implemented as a recipe filter. -#### `i3.add_recipe_filter(name, function(recipes, player))` +#### `i4.add_recipe_filter(name, function(recipes, player))` Add a recipe filter with the given `name`. The filter function returns the recipes to be displayed, given the available recipes and an `ObjectRef` to the @@ -303,7 +303,7 @@ user. Each recipe is a table of the form returned by Example function to hide recipes for items from a mod called "secretstuff": ```lua -i3.add_recipe_filter("Hide secretstuff", function(recipes) +i4.add_recipe_filter("Hide secretstuff", function(recipes) local filtered = {} for _, recipe in ipairs(recipes) do if recipe.output:sub(1,12) ~= "secretstuff:" then @@ -315,11 +315,11 @@ i3.add_recipe_filter("Hide secretstuff", function(recipes) end) ``` -#### `i3.set_recipe_filter(name, function(recipe, player))` +#### `i4.set_recipe_filter(name, function(recipe, player))` Remove all recipe filters and add a new one. -#### `i3.recipe_filters` +#### `i4.recipe_filters` A map of recipe filters, indexed by name. @@ -341,7 +341,7 @@ Notes: - If `optional_name` is omitted, the search filter will apply to all items, without pre-filtering. - The `+groups` filter is currently implemented by default. -#### `i3.add_search_filter(name, function(item, values))` +#### `i4.add_search_filter(name, function(item, values))` Add a search filter. The search function must return a boolean value (whether the given item should be listed or not). @@ -352,7 +352,7 @@ The search function must return a boolean value (whether the given item should b Example function sorting items by drawtype: ```lua -i3.add_search_filter("types", function(item, drawtypes) +i4.add_search_filter("types", function(item, drawtypes) local t = {} for i, dt in ipairs(drawtypes) do @@ -365,7 +365,7 @@ i3.add_search_filter("types", function(item, drawtypes) end) ``` -#### `i3.search_filters` +#### `i4.search_filters` A map of search filters, indexed by name. @@ -375,7 +375,7 @@ A map of search filters, indexed by name. Sorting methods are used to filter the player's main inventory. -#### `i3.add_sorting_method(name, def)` +#### `i4.add_sorting_method(name, def)` Add a player inventory sorting method. @@ -385,7 +385,7 @@ Add a player inventory sorting method. Example: ```Lua -i3.add_sorting_method("test", { +i4.add_sorting_method("test", { description = "Cool sorting method", func = function(list, data) -- `list`: inventory list @@ -400,7 +400,7 @@ i3.add_sorting_method("test", { ``` -#### `i3.sorting_methods` +#### `i4.sorting_methods` A table containing all sorting methods. @@ -408,9 +408,9 @@ A table containing all sorting methods. ### Item list compression -`i3` can reduce the item list size by compressing a group of items. +`i4` can reduce the item list size by compressing a group of items. -#### `i3.compress(item, def)` +#### `i4.compress(item, def)` Add a new group of items to compress. @@ -420,14 +420,14 @@ Add a new group of items to compress. Example: ```Lua -i3.compress("default:diamondblock", { +i4.compress("default:diamondblock", { replace = "diamond", by = {"bronze", "copper", "gold", "steel", "tin"} }) ``` -#### `i3.compress_groups` +#### `i4.compress_groups` A map of all compressed item groups, indexed by stereotypes. @@ -435,9 +435,9 @@ A map of all compressed item groups, indexed by stereotypes. ### Waypoints -`i3` allows you to manage the waypoints of a specific player. +`i4` allows you to manage the waypoints of a specific player. -#### `i3.add_waypoint(player_name, def)` +#### `i4.add_waypoint(player_name, def)` Add a waypoint to specific player. @@ -447,7 +447,7 @@ Add a waypoint to specific player. Example: ```Lua -i3.add_waypoint("Test", { +i4.add_waypoint("Test", { player = "singleplayer", pos = {x = 0, y = 2, z = 0}, color = 0xffff00, @@ -455,7 +455,7 @@ i3.add_waypoint("Test", { }) ``` -#### `i3.remove_waypoint(player_name, waypoint_name)` +#### `i4.remove_waypoint(player_name, waypoint_name)` Remove a waypoint for specific player. @@ -465,10 +465,10 @@ Remove a waypoint for specific player. Example: ```Lua -i3.remove_waypoint("singleplayer", "Test") +i4.remove_waypoint("singleplayer", "Test") ``` -#### `i3.get_waypoints(player_name)` +#### `i4.get_waypoints(player_name)` Return a table of all waypoints of a specific player. @@ -478,7 +478,7 @@ Return a table of all waypoints of a specific player. ### Miscellaneous -#### `i3.hud_notif(name, msg[, img])` +#### `i4.hud_notif(name, msg[, img])` Show a Steam-like HUD notification on the bottom-left corner of the screen. @@ -486,11 +486,11 @@ Show a Steam-like HUD notification on the bottom-left corner of the screen. - `msg` is the HUD message to show. - `img` (optional) is the HUD image to show (preferably 16x16 px). -#### `i3.get_recipes(item)` +#### `i4.get_recipes(item)` Return a table of recipes and usages of `item`. -#### `i3.export_url` +#### `i4.export_url` If set, the mod will export all the cached recipes and usages in a JSON format to the given URL (HTTP support is required¹). @@ -502,4 +502,4 @@ given a number between 1 and 4. --- -**[1]** Add `i3` to the `secure.http_mods` or `secure.trusted_mods` setting in `minetest.conf`. +**[1]** Add `i4` to the `secure.http_mods` or `secure.trusted_mods` setting in `minetest.conf`. diff --git a/README.md b/README.md index ac4775d..3cb2bf4 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,9 @@ -![logo](https://user-images.githubusercontent.com/7883281/145490041-d91d6bd6-a654-438d-b208-4d5736845ab7.png) +![i4 logo](res/i4_logo_scaled.png) -[![GitHub Release](https://img.shields.io/github/release/minetest-mods/i3.svg?style=flat)]() ![workflow](https://github.com/minetest-mods/i3/actions/workflows/luacheck.yml/badge.svg) [![ContentDB](https://content.minetest.net/packages/jp/i3/shields/downloads/)](https://content.minetest.net/packages/jp/i3/) [![PayPal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.me/jpg84240) - -#### **`i3`** is a next-generation inventory for Minetest. +#### **`i4`** is an inventory mod for Minetest. This mod features a modern, powerful inventory menu with a good user experience. -**`i3`** provides a rich [**API**](https://github.com/minetest-mods/i3/blob/master/API.md) for mod developers who want to extend it. +**`i4`** provides a rich [**API**](API.md) for mod developers who want to extend it. This mod requires **Minetest 5.6+** @@ -23,7 +21,7 @@ This mod requires **Minetest 5.6+** - Home **¹** *This mode is a Terraria-like system that shows recipes you can craft from items you ever had in your inventory. -To enable it: `i3_progressive_mode = true` in `minetest.conf`.* +To enable it: `i4_progressive_mode = true` in `minetest.conf`.* #### This mod officially supports the following mods: - [**`3d_armor`**](https://content.minetest.net/packages/stu/3d_armor/) @@ -46,15 +44,13 @@ You can also use the font size slider in the inventory, settings window. #### Notes -`i3` uses a larger inventory than the usual inventories in Minetest games. +`i4` uses a larger inventory than the usual inventories in Minetest games. Thus, most chests will be unadapted to this inventory size. -The `i3` inventory is 9 slots wide by default, such as Minecraft. +The `i4` inventory is 9 slots wide by default, such as Minecraft. -Report bugs on the [**Bug Tracker**](https://github.com/minetest-mods/i3/issues). +Report bugs on the [**Bug Tracker**](https:///notabug.org/jadedctrl/i4). -**Video review on YouTube:** https://www.youtube.com/watch?v=Xd14BCdEZ3o - -![Preview](https://user-images.githubusercontent.com/7883281/185755315-23c2fffa-203d-4115-9dc3-576c92615733.png) +![Preview](res/screenshot.png) #### License diff --git a/init.lua b/init.lua index bd34cee..671279c 100644 --- a/init.lua +++ b/init.lua @@ -1,16 +1,4 @@ -print[[ - - Powered by - - ██╗██████╗ - ██║╚════██╗ - ██║ █████╔╝ - ██║ ╚═══██╗ - ██║██████╔╝ - ╚═╝╚═════╝ -]] - -local modpath = core.get_modpath"i3" +local modpath = core.get_modpath"i4" local http = core.request_http_api() local storage = core.get_mod_storage() local _loadfile = dofile(modpath .. "/src/preprocessor.lua") @@ -19,9 +7,10 @@ local function lf(path) return assert(_loadfile(modpath .. path)) end -i3 = { +i4 = { version = 1162, data = core.deserialize(storage:get_string"data") or {}, + imported = storage:get_int"imported_from_i3", settings = { debug_mode = false, @@ -37,7 +26,7 @@ i3 = { hud_timer_max = 3, damage_enabled = core.settings:get_bool"enable_damage", - progressive_mode = core.settings:get_bool"i3_progressive_mode", + progressive_mode = core.settings:get_bool"i4_progressive_mode" or core.settings:get_bool"i3_progressive_mode", }, categories = { @@ -110,19 +99,21 @@ i3 = { sorting_methods = {}, } -i3.files.common() -i3.files.api(http) -i3.files.compress() -i3.files.detached() -i3.files.fields() -i3.files.groups() -i3.files.callbacks(http, storage) +i3 = i4 -if i3.settings.progressive_mode then - i3.files.progressive() +i4.files.common() +i4.files.api(http) +i4.files.compress() +i4.files.detached() +i4.files.fields() +i4.files.groups() +i4.files.callbacks(http, storage) + +if i4.settings.progressive_mode then + i4.files.progressive() end -if i3.settings.debug_mode then +if i4.settings.debug_mode then lf("/tests/test_tabs.lua")() lf("/tests/test_waypoints.lua")() -- lf("/tests/test_operators.lua")() diff --git a/mod.conf b/mod.conf index 04452f7..4d02197 100644 --- a/mod.conf +++ b/mod.conf @@ -1,4 +1,4 @@ -name = i3 +name = i4 description = Next-generation inventory optional_depends = 3d_armor, skinsdb, awards min_minetest_version = 5.6 diff --git a/res/i4_logo.png b/res/i4_logo.png new file mode 100644 index 0000000..52eb263 Binary files /dev/null and b/res/i4_logo.png differ diff --git a/res/i4_logo_scaled.png b/res/i4_logo_scaled.png new file mode 100644 index 0000000..ceb6593 Binary files /dev/null and b/res/i4_logo_scaled.png differ diff --git a/res/screenshot.png b/res/screenshot.png new file mode 100644 index 0000000..0a761a9 Binary files /dev/null and b/res/screenshot.png differ diff --git a/settingtypes.txt b/settingtypes.txt index a97f54a..6f9fae5 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -1,2 +1,2 @@ # The progressive mode shows recipes you can craft from items you ever had in your inventory. -i3_progressive_mode (Learn crafting recipes progressively) bool false +i4_progressive_mode (Learn crafting recipes progressively) bool false diff --git a/src/api.lua b/src/api.lua index 9c9dccc..8b932a5 100644 --- a/src/api.lua +++ b/src/api.lua @@ -1,6 +1,6 @@ local http = ... -local make_fs, get_inventory_fs, confirm_trash_footer_fs, settings_footer_fs = i3.files.gui() -local home_footer_fields, confirm_trash_footer_fields, settings_footer_fields = i3.files.fields() +local make_fs, get_inventory_fs, confirm_trash_footer_fs, settings_footer_fs = i4.files.gui() +local home_footer_fields, confirm_trash_footer_fields, settings_footer_fields = i4.files.fields() IMPORT("sorter", "sort_inventory", "play_sound") IMPORT("sort", "concat", "copy", "insert", "remove") @@ -8,19 +8,19 @@ IMPORT("get_player_by_name", "add_hud_waypoint", "init_hud_notif") IMPORT("gmatch", "split", "S", "err", "fmt", "reg_items", "pos_to_str") IMPORT("true_str", "true_table", "is_str", "is_func", "is_table", "clean_name") -function i3.register_craft_type(name, def) +function i4.register_craft_type(name, def) if not true_str(name) then - return err "i3.register_craft_type: name missing" + return err "i4.register_craft_type: name missing" elseif not true_table(def) then - return err "i3.register_craft_type: definition missing" + return err "i4.register_craft_type: definition missing" elseif not is_str(def.description) then def.description = "" end - i3.craft_types[name] = def + i4.craft_types[name] = def end -function i3.register_craft(def) +function i4.register_craft(def) local width, c = 0, 0 if http and true_str(def.url) then @@ -28,7 +28,7 @@ function i3.register_craft(def) if result.succeeded then local t = core.parse_json(result.data) if is_table(t) then - return i3.register_craft(t) + return i4.register_craft(t) end end end) @@ -37,12 +37,12 @@ function i3.register_craft(def) end if not true_table(def) then - return err "i3.register_craft: craft definition missing" + return err "i4.register_craft: craft definition missing" end if #def > 1 then for _, v in pairs(def) do - i3.register_craft(v) + i4.register_craft(v) end return end @@ -53,7 +53,7 @@ function i3.register_craft(def) end if not true_str(def.output) and not def.url then - return err "i3.register_craft: output missing" + return err "i4.register_craft: output missing" end if not is_table(def.items) then @@ -112,63 +112,63 @@ function i3.register_craft(def) end local item = ItemStack(def.output):get_name() - i3.recipes_cache[item] = i3.recipes_cache[item] or {} + i4.recipes_cache[item] = i4.recipes_cache[item] or {} def.custom = true def.width = width - insert(i3.recipes_cache[item], def) + insert(i4.recipes_cache[item], def) end -function i3.add_recipe_filter(name, f) +function i4.add_recipe_filter(name, f) if not true_str(name) then - return err "i3.add_recipe_filter: name missing" + return err "i4.add_recipe_filter: name missing" elseif not is_func(f) then - return err "i3.add_recipe_filter: function missing" + return err "i4.add_recipe_filter: function missing" end - i3.recipe_filters[name] = f + i4.recipe_filters[name] = f end -function i3.set_recipe_filter(name, f) +function i4.set_recipe_filter(name, f) if not is_str(name) then - return err "i3.set_recipe_filter: name missing" + return err "i4.set_recipe_filter: name missing" elseif not is_func(f) then - return err "i3.set_recipe_filter: function missing" + return err "i4.set_recipe_filter: function missing" end - i3.recipe_filters = {[name] = f} + i4.recipe_filters = {[name] = f} end -function i3.add_search_filter(name, f) +function i4.add_search_filter(name, f) if not true_str(name) then - return err "i3.add_search_filter: name missing" + return err "i4.add_search_filter: name missing" elseif not is_func(f) then - return err "i3.add_search_filter: function missing" + return err "i4.add_search_filter: function missing" end - i3.search_filters[name] = f + i4.search_filters[name] = f end -function i3.get_recipes(item) +function i4.get_recipes(item) item = core.registered_aliases[item] or item - local recipes = i3.recipes_cache[item] - local usages = i3.usages_cache[item] + local recipes = i4.recipes_cache[item] + local usages = i4.usages_cache[item] return {recipes = recipes, usages = usages} end -function i3.set_fs(player) +function i4.set_fs(player) if not player or player.is_fake_player then return end local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] if not data then return end if data.auto_sorting then sort_inventory(player, data) end - for i, tab in ipairs(i3.tabs) do + for i, tab in ipairs(i4.tabs) do if data.tab == i and tab.access and not tab.access(player, data) then data.tab = 1 break @@ -179,137 +179,137 @@ function i3.set_fs(player) player:set_inventory_formspec(fs) end -function i3.new_tab(name, def) +function i4.new_tab(name, def) if not true_str(name) then - return err "i3.new_tab: tab name missing" + return err "i4.new_tab: tab name missing" elseif not true_table(def) then - return err "i3.new_tab: tab definition missing" + return err "i4.new_tab: tab definition missing" elseif not true_str(def.description) then - return err "i3.new_tab: description missing" - elseif #i3.tabs == 6 then - return err(fmt("i3.new_tab: cannot add '%s' tab. Limit reached (6).", def.name)) + return err "i4.new_tab: description missing" + elseif #i4.tabs == 6 then + return err(fmt("i4.new_tab: cannot add '%s' tab. Limit reached (6).", def.name)) end def.name = name - insert(i3.tabs, def) + insert(i4.tabs, def) end -i3.new_tab("inventory", { +i4.new_tab("inventory", { description = S"Inventory", formspec = get_inventory_fs, slots = true, }) -function i3.remove_tab(name) +function i4.remove_tab(name) if not true_str(name) then - return err "i3.remove_tab: tab name missing" + return err "i4.remove_tab: tab name missing" end - for i = #i3.tabs, 2, -1 do - local def = i3.tabs[i] + for i = #i4.tabs, 2, -1 do + local def = i4.tabs[i] if def and name == def.name then - remove(i3.tabs, i) + remove(i4.tabs, i) end end end -function i3.get_current_tab(player) +function i4.get_current_tab(player) local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] return data.tab end -function i3.set_tab(player, tabname) +function i4.set_tab(player, tabname) local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] if not tabname or tabname == "" then data.tab = 0 return end - for i, tab in ipairs(i3.tabs) do + for i, tab in ipairs(i4.tabs) do if tab.name == tabname then data.tab = i return end end - err(fmt("i3.set_tab: tab name '%s' does not exist", tabname)) + err(fmt("i4.set_tab: tab name '%s' does not exist", tabname)) end -function i3.override_tab(name, newdef) +function i4.override_tab(name, newdef) if not true_str(name) then - return err "i3.override_tab: tab name missing" + return err "i4.override_tab: tab name missing" elseif not true_table(newdef) then - return err "i3.override_tab: tab definition missing" + return err "i4.override_tab: tab definition missing" elseif not true_str(newdef.description) then - return err "i3.override_tab: description missing" + return err "i4.override_tab: description missing" end newdef.name = name - for i, def in ipairs(i3.tabs) do + for i, def in ipairs(i4.tabs) do if def.name == name then - i3.tabs[i] = newdef + i4.tabs[i] = newdef break end end end -function i3.new_footer_button(name, def) +function i4.new_footer_button(name, def) if not true_str(name) then - return err "i3.new_footer_button: button name missing" + return err "i4.new_footer_button: button name missing" elseif not true_table(def) then - return err "i3.new_footer_button: button definition missing" + return err "i4.new_footer_button: button definition missing" elseif not true_str(def.description) then - return err "i3.new_footer_button: description missing" + return err "i4.new_footer_button: description missing" elseif not def.image then - return err "i3.new_footer_button: image missing" - elseif #i3.footer_buttons == 16 then - return err(fmt("i3.new_footer_button: cannot add '%s' button. Limit reached (16).", def.name)) + return err "i4.new_footer_button: image missing" + elseif #i4.footer_buttons == 16 then + return err(fmt("i4.new_footer_button: cannot add '%s' button. Limit reached (16).", def.name)) end def.name = name - insert(i3.footer_buttons, def) + insert(i4.footer_buttons, def) end -function i3.remove_footer_button(name) +function i4.remove_footer_button(name) if not true_str(name) then - return err "i3.remove_footer_button: tab name missing" + return err "i4.remove_footer_button: tab name missing" end - for i = #i3.footer_buttons, 2, -1 do - local def = i3.footer_buttons[i] + for i = #i4.footer_buttons, 2, -1 do + local def = i4.footer_buttons[i] if def and name == def.name then - remove(i3.footer_buttons, i) + remove(i4.footer_buttons, i) end end end -function i3.override_footer_button(name, newdef) +function i4.override_footer_button(name, newdef) if not true_str(name) then - return err "i3.override_footer_button: button name missing" + return err "i4.override_footer_button: button name missing" elseif not true_table(newdef) then - return err "i3.override_footer_button: button definition missing" + return err "i4.override_footer_button: button definition missing" elseif not true_str(newdef.description) then - return err "i3.override_footer_button: description missing" + return err "i4.override_footer_button: description missing" elseif not true_str(newdef.image) then - return err "i3.override_footer_button: image missing" + return err "i4.override_footer_button: image missing" end newdef.name = name - for i, def in ipairs(i3.footer_buttons) do + for i, def in ipairs(i4.footer_buttons) do if def.name == name then - i3.footer_buttons[i] = newdef + i4.footer_buttons[i] = newdef break end end end -i3.new_footer_button("trash", { +i4.new_footer_button("trash", { description = S"Clear inventory", image = "i3_trash.png", formspec = confirm_trash_footer_fs, @@ -317,7 +317,7 @@ i3.new_footer_button("trash", { }) -i3.new_footer_button("sort", { +i4.new_footer_button("sort", { description = S"Sort inventory", image = "i3_sort.png", fields = function(player, data, fields) @@ -327,30 +327,30 @@ i3.new_footer_button("sort", { end, }) -i3.new_footer_button("settings", { +i4.new_footer_button("settings", { description = S"Settings", image = "i3_settings.png", formspec = settings_footer_fs, fields = settings_footer_fields, }) -i3.new_footer_button("home", { +i4.new_footer_button("home", { description = S"Go home", image = "i3_home.png", fields = home_footer_fields, }) -i3.register_craft_type("digging", { +i4.register_craft_type("digging", { description = S"Digging", icon = "i3_steelpick.png", }) -i3.register_craft_type("digging_chance", { +i4.register_craft_type("digging_chance", { description = S"Digging (by chance)", icon = "i3_mesepick.png", }) -i3.add_search_filter("groups", function(item, groups) +i4.add_search_filter("groups", function(item, groups) local def = reg_items[item] local has_groups = true @@ -364,42 +364,42 @@ i3.add_search_filter("groups", function(item, groups) return has_groups end) -function i3.compress(item, def) +function i4.compress(item, def) if not true_str(item) then - return err "i3.compress: item name missing" + return err "i4.compress: item name missing" elseif not true_table(def) then - return err "i3.compress: replace definition missing" + return err "i4.compress: replace definition missing" elseif not true_str(def.replace) then - return err "i3.compress: replace string missing" + return err "i4.compress: replace string missing" elseif not is_table(def.by) then - return err "i3.compress: replace substrings missing" - elseif i3.compressed[item] then - return err(fmt("i3.compress: item '%s' is already compressed", item)) + return err "i4.compress: replace substrings missing" + elseif i4.compressed[item] then + return err(fmt("i4.compress: item '%s' is already compressed", item)) end local t = {} - i3.compress_groups[item] = i3.compress_groups[item] or {} + i4.compress_groups[item] = i4.compress_groups[item] or {} for _, str in ipairs(def.by) do local it = item:gsub(def.replace, str) insert(t, it) - insert(i3.compress_groups[item], it) + insert(i4.compress_groups[item], it) - i3.compressed[it] = true + i4.compressed[it] = true end end -function i3.hud_notif(name, msg, img) +function i4.hud_notif(name, msg, img) if not true_str(name) then - return err "i3.hud_notif: player name missing" + return err "i4.hud_notif: player name missing" elseif not true_str(msg) then - return err "i3.hud_notif: message missing" + return err "i4.hud_notif: message missing" end - local data = i3.data[name] + local data = i4.data[name] if not data then - return err "i3.hud_notif: no player data initialized" + return err "i4.hud_notif: no player data initialized" end local player = get_player_by_name(name) @@ -429,20 +429,20 @@ function i3.hud_notif(name, msg, img) end end -function i3.add_sorting_method(name, def) +function i4.add_sorting_method(name, def) if not true_str(name) then - return err "i3.add_sorting_method: name missing" + return err "i4.add_sorting_method: name missing" elseif not true_table(def) then - return err "i3.add_sorting_method: definition missing" + return err "i4.add_sorting_method: definition missing" elseif not is_func(def.func) then - return err "i3.add_sorting_method: function missing" + return err "i4.add_sorting_method: function missing" end def.name = name - insert(i3.sorting_methods, def) + insert(i4.sorting_methods, def) end -i3.add_sorting_method("alphabetical", { +i4.add_sorting_method("alphabetical", { description = S"Sort items by name (A-Z)", func = function(list, data) sorter(list, data, 1) @@ -450,7 +450,7 @@ i3.add_sorting_method("alphabetical", { end }) -i3.add_sorting_method("numerical", { +i4.add_sorting_method("numerical", { description = S"Sort items by number of items per stack", func = function(list, data) sorter(list, data, 2) @@ -458,18 +458,18 @@ i3.add_sorting_method("numerical", { end, }) -function i3.add_waypoint(name, def) +function i4.add_waypoint(name, def) if not true_str(name) then - return err "i3.add_waypoint: name missing" + return err "i4.add_waypoint: name missing" elseif not true_table(def) then - return err "i3.add_waypoint: definition missing" + return err "i4.add_waypoint: definition missing" elseif not true_str(def.player) then - return err "i3.add_waypoint: player name missing" + return err "i4.add_waypoint: player name missing" end - local data = i3.data[def.player] + local data = i4.data[def.player] if not data then - return err "i3.add_waypoint: no player data initialized" + return err "i4.add_waypoint: no player data initialized" end local player = get_player_by_name(def.player) @@ -487,19 +487,19 @@ function i3.add_waypoint(name, def) data.scrbar_inv += 1000 end - i3.set_fs(player) + i4.set_fs(player) end -function i3.remove_waypoint(player_name, name) +function i4.remove_waypoint(player_name, name) if not true_str(player_name) then - return err "i3.remove_waypoint: player name missing" + return err "i4.remove_waypoint: player name missing" elseif not true_str(name) then - return err "i3.remove_waypoint: waypoint name missing" + return err "i4.remove_waypoint: waypoint name missing" end - local data = i3.data[player_name] + local data = i4.data[player_name] if not data then - return err "i3.remove_waypoint: no player data initialized" + return err "i4.remove_waypoint: no player data initialized" end local player = get_player_by_name(player_name) @@ -515,49 +515,49 @@ function i3.remove_waypoint(player_name, name) end end - i3.set_fs(player) + i4.set_fs(player) end -function i3.get_waypoints(player_name) +function i4.get_waypoints(player_name) if not true_str(player_name) then - return err "i3.get_waypoints: player name missing" + return err "i4.get_waypoints: player name missing" end - local data = i3.data[player_name] + local data = i4.data[player_name] if not data then - return err "i3.get_waypoints: no player data initialized" + return err "i4.get_waypoints: no player data initialized" end return data.waypoints end -function i3.new_minitab(name, def) - if #i3.minitabs == 6 then - return err "i3.new_minitab: limit reached (6)" +function i4.new_minitab(name, def) + if #i4.minitabs == 6 then + return err "i4.new_minitab: limit reached (6)" elseif not true_str(name) then - return err "i3.new_minitab: name missing" + return err "i4.new_minitab: name missing" elseif not true_table(def) then - return err "i3.new_minitab: definition missing" + return err "i4.new_minitab: definition missing" end def.name = name - insert(i3.minitabs, def) + insert(i4.minitabs, def) end -function i3.remove_minitab(name) +function i4.remove_minitab(name) if not true_str(name) then - return err "i3.remove_minitab: name missing" + return err "i4.remove_minitab: name missing" end - for i = #i3.minitabs, 2, -1 do - local v = i3.minitabs[i] + for i = #i4.minitabs, 2, -1 do + local v = i4.minitabs[i] if v and v.name == name then - remove(i3.minitabs, i) + remove(i4.minitabs, i) end end end -i3.new_minitab("all", { +i4.new_minitab("all", { description = "All", sorter = function() @@ -565,7 +565,7 @@ i3.new_minitab("all", { end }) -i3.new_minitab("nodes", { +i4.new_minitab("nodes", { description = "Nodes", sorter = function(item) @@ -573,7 +573,7 @@ i3.new_minitab("nodes", { end }) -i3.new_minitab("items", { +i4.new_minitab("items", { description = "Items", sorter = function(item) diff --git a/src/bags.lua b/src/bags.lua index 5b3deca..c840d84 100644 --- a/src/bags.lua +++ b/src/bags.lua @@ -1,4 +1,4 @@ -local set_fs = i3.set_fs +local set_fs = i4.set_fs IMPORT("get_bag_description", "ItemStack") IMPORT("S", "ES", "fmt", "msg", "slz", "dslz") @@ -16,7 +16,7 @@ end local function init_bags(player) local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] local bag = create_inventory(fmt("i3_bag_%s", name), { allow_put = function(inv, _, _, stack) @@ -142,22 +142,22 @@ local bag_recipes = { }, medium = { rcp = { - {"farming:string", "i3:bag_small", "farming:string"}, - {"farming:string", "i3:bag_small", "farming:string"}, + {"farming:string", "i4:bag_small", "farming:string"}, + {"farming:string", "i4:bag_small", "farming:string"}, }, size = 3, }, large = { rcp = { - {"farming:string", "i3:bag_medium", "farming:string"}, - {"farming:string", "i3:bag_medium", "farming:string"}, + {"farming:string", "i4:bag_medium", "farming:string"}, + {"farming:string", "i4:bag_medium", "farming:string"}, }, size = 4, }, } for size, item in pairs(bag_recipes) do - local bagname = fmt("i3:bag_%s", size) + local bagname = fmt("i4:bag_%s", size) core.register_craftitem(bagname, { description = fmt("%s Backpack", size:gsub("^%l", string.upper)), @@ -165,6 +165,7 @@ for size, item in pairs(bag_recipes) do groups = {bag = item.size}, stack_max = 1, }) + minetest.register_alias_force(fmt("i3:bag_%s", size), bagname) core.register_craft{output = bagname, recipe = item.rcp} core.register_craft{type = "fuel", recipe = bagname, burntime = 3} diff --git a/src/caches.lua b/src/caches.lua index efa3303..b698580 100644 --- a/src/caches.lua +++ b/src/caches.lua @@ -13,7 +13,7 @@ end local function cache_fuel(item) local burntime = get_burntime(item) if burntime > 0 then - i3.fuel_cache[item] = { + i4.fuel_cache[item] = { type = "fuel", items = {item}, burntime = burntime, @@ -23,15 +23,15 @@ local function cache_fuel(item) end local function cache_groups(group, groups) - i3.groups[group] = {} - i3.groups[group].groups = groups - i3.groups[group].items = groups_to_items(groups) + i4.groups[group] = {} + i4.groups[group].groups = groups + i4.groups[group].items = groups_to_items(groups) if #groups == 1 then - i3.groups[group].stereotype = get_group_stereotype(groups[1]) + i4.groups[group].stereotype = get_group_stereotype(groups[1]) end - local items = i3.groups[group].items + local items = i4.groups[group].items if #items <= 1 then return end local px, lim, c = 64, 10, 0 @@ -56,15 +56,15 @@ local function cache_groups(group, groups) if c > 1 then sprite = sprite:gsub("WxH", px .. "x" .. px * c) - i3.groups[group].sprite = sprite - i3.groups[group].count = c + i4.groups[group].sprite = sprite + i4.groups[group].count = c end end local function get_item_usages(item, recipe, added) if is_group(item) then local group = item:sub(7) - local group_cache = i3.groups[group] + local group_cache = i4.groups[group] local groups = group_cache and group_cache.groups or extract_groups(item) if not group_cache then @@ -76,15 +76,15 @@ local function get_item_usages(item, recipe, added) local usage = copy(recipe) table_replace(usage.items, item, name) - i3.usages_cache[name] = i3.usages_cache[name] or {} - insert(i3.usages_cache[name], 1, usage) + i4.usages_cache[name] = i4.usages_cache[name] or {} + insert(i4.usages_cache[name], 1, usage) added[name] = true end end elseif valid_item(reg_items[item]) then - i3.usages_cache[item] = i3.usages_cache[item] or {} - insert(i3.usages_cache[item], 1, recipe) + i4.usages_cache[item] = i4.usages_cache[item] or {} + insert(i4.usages_cache[item], 1, recipe) end end @@ -102,14 +102,14 @@ local function get_usages(recipe) end local function cache_usages(item) - local recipes = i3.recipes_cache[item] or {} + local recipes = i4.recipes_cache[item] or {} for i = 1, #recipes do get_usages(recipes[i]) end - if i3.fuel_cache[item] then - i3.usages_cache[item] = table_merge(i3.usages_cache[item] or {}, {i3.fuel_cache[item]}) + if i4.fuel_cache[item] then + i4.usages_cache[item] = table_merge(i4.usages_cache[item] or {}, {i4.fuel_cache[item]}) end end @@ -133,7 +133,7 @@ local function drop_table(name, drop) if not empty and (dname ~= name or (dname == name and dcount > 1)) then local rarity = valid_rarity and di.rarity - i3.register_craft { + i4.register_craft { type = rarity and "digging_chance" or "digging", items = {name}, output = fmt("%s %u", dname, dcount), @@ -157,7 +157,7 @@ local function cache_drops(name, drop) local empty = dstack:is_empty() if not empty and dname ~= name then - i3.register_craft { + i4.register_craft { type = "digging", items = {name}, output = drop, @@ -188,7 +188,7 @@ local function cache_recipes(item) end if recipes then - i3.recipes_cache[item] = table_merge(recipes, i3.recipes_cache[item] or {}) + i4.recipes_cache[item] = table_merge(recipes, i4.recipes_cache[item] or {}) end end @@ -204,7 +204,7 @@ core.register_craft = function(def) old_register_craft(def) if def.type == "toolrepair" then - i3.toolrepair = def.additional_wear * -100 + i4.toolrepair = def.additional_wear * -100 end local output = def.output or (true_str(def.recipe) and def.recipe) or nil @@ -244,20 +244,20 @@ end local function resolve_aliases(hash) for oldname, newname in pairs(reg_aliases) do cache_recipes(oldname) - local recipes = i3.recipes_cache[oldname] + local recipes = i4.recipes_cache[oldname] if recipes then - if not i3.recipes_cache[newname] then - i3.recipes_cache[newname] = {} + if not i4.recipes_cache[newname] then + i4.recipes_cache[newname] = {} end local similar - for i = 1, #i3.recipes_cache[oldname] do - local rcp_old = i3.recipes_cache[oldname][i] + for i = 1, #i4.recipes_cache[oldname] do + local rcp_old = i4.recipes_cache[oldname][i] - for j = 1, #i3.recipes_cache[newname] do - local rcp_new = copy(i3.recipes_cache[newname][j]) + for j = 1, #i4.recipes_cache[newname] do + local rcp_new = copy(i4.recipes_cache[newname][j]) rcp_new.output = oldname if table_eq(rcp_old, rcp_new) then @@ -267,13 +267,13 @@ local function resolve_aliases(hash) end if not similar then - insert(i3.recipes_cache[newname], rcp_old) + insert(i4.recipes_cache[newname], rcp_old) end end end - if newname ~= "" and i3.recipes_cache[oldname] and reg_items[newname] and not hash[newname] then - insert(i3.init_items, newname) + if newname ~= "" and i4.recipes_cache[oldname] and reg_items[newname] and not hash[newname] then + insert(i4.init_items, newname) end end end @@ -294,21 +294,21 @@ local function init_recipes() for name in pairs(_preselect) do cache_usages(name) - insert(i3.init_items, name) + insert(i4.init_items, name) _select[name] = true end resolve_aliases(_select) - sort(i3.init_items) + sort(i4.init_items) - if http and true_str(i3.export_url) then + if http and true_str(i4.export_url) then local post_data = { - recipes = i3.recipes_cache, - usages = i3.usages_cache, + recipes = i4.recipes_cache, + usages = i4.usages_cache, } http.fetch_async { - url = i3.export_url, + url = i4.export_url, post_data = core.write_json(post_data), } end @@ -321,12 +321,12 @@ local function init_cubes() local tiles = def.tiles or def.tile_images if is_cube(def.drawtype) then - i3.cubes[id] = get_cube(tiles) + i4.cubes[id] = get_cube(tiles) elseif sub(def.drawtype, 1, 9) == "plantlike" or sub(def.drawtype, 1, 8) == "firelike" then local texture = true_str(def.inventory_image) and def.inventory_image or tiles[1] if texture then - i3.plants[id] = texture + i4.plants[id] = texture end end end diff --git a/src/callbacks.lua b/src/callbacks.lua index f72bae4..7bbdc66 100644 --- a/src/callbacks.lua +++ b/src/callbacks.lua @@ -1,15 +1,15 @@ local http, storage = ... -local init_bags = i3.files.bags() -local fill_caches = i3.files.caches(http) -local init_hud = i3.files.hud() -local set_fs = i3.set_fs +local init_bags = i4.files.bags() +local fill_caches = i4.files.caches(http) +local init_hud = i4.files.hud() +local set_fs = i4.set_fs IMPORT("slz", "min", "insert", "copy", "ItemStack") IMPORT("spawn_item", "reset_data", "get_detached_inv", "play_sound", "update_inv_size") core.register_on_player_hpchange(function(player, hpchange) local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] if not data then return end local hp_max = player:get_properties().hp_max @@ -20,10 +20,10 @@ end) core.register_on_dieplayer(function(player) local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] if not data then return end - if i3.settings.drop_bag_on_die then + if i4.settings.drop_bag_on_die then local bagstack = ItemStack(data.bag) spawn_item(player, bagstack) end @@ -45,7 +45,7 @@ end) core.register_on_priv_grant(function(name, _, priv) if priv == "creative" or priv == "all" then - local data = i3.data[name] + local data = i4.data[name] reset_data(data) data.favs = {} @@ -66,7 +66,7 @@ core.register_on_player_inventory_action(function(player, _, _, info) end) if core.global_exists"armor" then - i3.modules.armor = true + i4.modules.armor = true local group_indexes = { {"armor_head", "i3_heavy_helmet"}, @@ -84,7 +84,7 @@ if core.global_exists"armor" then local _, armor_inv = armor:get_valid_player(player, "3d_armor") local def = stack:get_definition() local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] for i, v in ipairs(group_indexes) do local group, sound = unpack(v) @@ -128,7 +128,7 @@ if core.global_exists"armor" then core.register_on_player_inventory_action(function(player, action, _, info) if action ~= "take" then return end local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] if data.armor_disallow then local inv = player:get_inventory() @@ -144,11 +144,11 @@ if core.global_exists"armor" then end if core.global_exists"skins" then - i3.modules.skins = true + i4.modules.skins = true end if core.global_exists"awards" then - i3.modules.awards = true + i4.modules.awards = true core.register_on_craft(function(_, player) set_fs(player) @@ -193,17 +193,17 @@ local function get_formspec_version(info) end local function outdated(name) - core.show_formspec(name, "i3_outdated", + core.show_formspec(name, "i4_outdated", ("size[6.5,1.3]image[0,0;1,1;i3_book.png]label[1,0;%s]button_exit[2.6,0.8;1,1;;OK]"):format( "Your Minetest client is outdated.\nGet the latest version on minetest.net to play the game.")) end local function init_data(player, info) local name = player:get_player_name() - i3.data[name] = i3.data[name] or {} - local data = i3.data[name] + i4.data[name] = i4.data[name] or {} + local data = i4.data[name] - for k, v in pairs(i3.default_data) do + for k, v in pairs(i4.default_data) do local val = data[k] if val == nil then val = v @@ -216,8 +216,8 @@ local function init_data(player, info) data.filter = "" data.pagenum = 1 data.skin_pagenum = 1 - data.items = i3.init_items - data.items_raw = i3.init_items + data.items = i4.init_items + data.items_raw = i4.init_items data.favs = {} data.show_setting = "home" data.crafting_counts = {} @@ -234,28 +234,31 @@ local function init_data(player, info) end local function save_data(player_name) - local _data = copy(i3.data) + local _data = copy(i4.data) for name, v in pairs(_data) do for dat in pairs(v) do - if not i3.saves[dat] then + if not i4.saves[dat] then _data[name][dat] = nil - if player_name and i3.data[player_name] then - i3.data[player_name][dat] = nil -- To free up some memory + if player_name and i4.data[player_name] then + i4.data[player_name][dat] = nil -- To free up some memory end end end end storage:set_string("data", slz(_data)) + if i4.imported then + storage:set_int("imported_from_i3", 1) + end end insert(core.registered_on_joinplayers, 1, function(player) local name = player:get_player_name() local info = core.get_player_information and core.get_player_information(name) - if not info or get_formspec_version(info) < i3.settings.min_fs_version then + if not info or get_formspec_version(info) < i4.settings.min_fs_version then return outdated(name) end @@ -273,7 +276,7 @@ core.register_on_shutdown(save_data) local function routine() save_data() - core.after(i3.settings.save_interval, routine) + core.after(i4.settings.save_interval, routine) end -core.after(i3.settings.save_interval, routine) +core.after(i4.settings.save_interval, routine) diff --git a/src/common.lua b/src/common.lua index 4cdc3f0..34602fa 100644 --- a/src/common.lua +++ b/src/common.lua @@ -27,7 +27,7 @@ function core.is_creative_enabled(name) return core.check_player_privs(name, {creative = true}) or old_is_creative_enabled(name) end -local S = core.get_translator"i3" +local S = core.get_translator"i4" local ES = function(...) return core.formspec_escape(S(...)) end local function is_num(x) @@ -60,7 +60,7 @@ local function reset_compression(data) end local function msg(name, str) - local prefix = "[i3]" + local prefix = "[i4]" return core.chat_send_player(name, fmt("%s %s", core.colorize("#ff0", prefix), str)) end @@ -100,14 +100,14 @@ local function search(data) local filter = data.filter local opt = "^(.-)%+([%w_]+)=([%w_,]+)" - local search_filter = next(i3.search_filters) and match(filter, opt) + local search_filter = next(i4.search_filters) and match(filter, opt) local filters = {} if search_filter then search_filter = search_filter:trim() for filter_name, values in gmatch(filter, sub(opt, 6)) do - if i3.search_filters[filter_name] then + if i4.search_filters[filter_name] then values = split(values, ",") filters[filter_name] = values end @@ -126,7 +126,7 @@ local function search(data) if search_filter then for filter_name, values in pairs(filters) do if values then - local func = i3.search_filters[filter_name] + local func = i4.search_filters[filter_name] to_add = (j > 1 and temp[item] or j == 1) and func(item, values) and (search_filter == "" or find(search_in, search_filter, 1, true)) @@ -268,7 +268,7 @@ local function valid_item(def) end local function get_group_stereotype(group) - local stereotype = i3.group_stereotypes[group] + local stereotype = i4.group_stereotypes[group] local def = reg_items[stereotype] if valid_item(def) then @@ -320,7 +320,7 @@ local function get_cube(tiles) end local function apply_recipe_filters(recipes, player) - for _, filter in pairs(i3.recipe_filters) do + for _, filter in pairs(i4.recipe_filters) do recipes = filter(recipes, player) end @@ -328,7 +328,7 @@ local function apply_recipe_filters(recipes, player) end local function recipe_filter_set() - return next(i3.recipe_filters) + return next(i4.recipe_filters) end local function compression_active(data) @@ -336,7 +336,7 @@ local function compression_active(data) end local function compressible(item, data) - return compression_active(data) and i3.compress_groups[item] + return compression_active(data) and i4.compress_groups[item] end local function is_fav(data) @@ -360,7 +360,7 @@ local function sort_by_category(data) for i = 1, #items do local item = items[i] - local tab = i3.minitabs[data.itab] + local tab = i4.minitabs[data.itab] local to_add = tab.sorter(item, data) if to_add then @@ -382,8 +382,8 @@ end local function get_recipes(player, item) item = core.registered_aliases[item] or item - local recipes = i3.recipes_cache[item] - local usages = i3.usages_cache[item] + local recipes = i4.recipes_cache[item] + local usages = i4.usages_cache[item] if recipes then recipes = apply_recipe_filters(recipes, player) @@ -410,7 +410,7 @@ end local function get_group_items(name) local groups = extract_groups(name) - return i3.groups[name:sub(7)].items or groups_to_items(groups) + return i4.groups[name:sub(7)].items or groups_to_items(groups) end local function craft_stack(player, data, craft_rcp) @@ -579,7 +579,7 @@ local function sort_inventory(player, data) list = data.inv_compress and compress_items(list, start_i) or pre_sorting(list, start_i) - local new_inv = i3.sorting_methods[data.sort].func(list, data) + local new_inv = i4.sorting_methods[data.sort].func(list, data) if not new_inv then return end if not data.ignore_hotbar then @@ -830,7 +830,7 @@ local _ = { vec_round = vector.round, } -function i3.get(...) +function i4.get(...) local t = {} for i, var in ipairs{...} do diff --git a/src/compression.lua b/src/compression.lua index fd06624..20ae782 100644 --- a/src/compression.lua +++ b/src/compression.lua @@ -310,4 +310,4 @@ for _, v2 in ipairs(v) do end end -i3.compress_groups, i3.compressed = compressed, _compressed +i4.compress_groups, i4.compressed = compressed, _compressed diff --git a/src/detached_inv.lua b/src/detached_inv.lua index 9fd750d..994e3b8 100644 --- a/src/detached_inv.lua +++ b/src/detached_inv.lua @@ -1,4 +1,4 @@ -local set_fs = i3.set_fs +local set_fs = i4.set_fs IMPORT("play_sound", "create_inventory") local trash = create_inventory("i3_trash", { @@ -10,7 +10,7 @@ local trash = create_inventory("i3_trash", { inv:set_list(listname, {}) local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] data.armor_allow = nil play_sound(name, "i3_trash", 1.0) diff --git a/src/fields.lua b/src/fields.lua index 5f5c46c..4532873 100644 --- a/src/fields.lua +++ b/src/fields.lua @@ -1,4 +1,4 @@ -local set_fs = i3.set_fs +local set_fs = i4.set_fs IMPORT("min", "max", "vec_round") IMPORT("reg_items", "reg_aliases") @@ -20,7 +20,7 @@ local function inv_fields(player, data, fields) data.font_size = tonumber(fields.sb_font_size:match"-?%d+$") end - local footer = data.footer_button and i3.footer_buttons[data.footer_button] + local footer = data.footer_button and i4.footer_buttons[data.footer_button] if footer and footer.fields then if not footer.fields(player, data, fields) then data.footer_button = nil @@ -29,7 +29,7 @@ local function inv_fields(player, data, fields) for field in pairs(fields) do if sub(field, 1, 4) == "btn_" then - data.subcat = indexof(i3.categories, sub(field, 5)) + data.subcat = indexof(i4.categories, sub(field, 5)) break elseif sub(field, 1, 3) == "cb_" then @@ -117,7 +117,7 @@ local function inv_fields(player, data, fields) data.bag_rename = true elseif fields.confirm_rename then - local bag = get_detached_inv("bag", name) + local bag = get_detached_inv("i3:bag", name) local bagstack = bag:get_stack("main", 1) local meta = bagstack:get_meta() local desc = translate(data.lang_code, bagstack:get_description()) @@ -136,7 +136,7 @@ local function inv_fields(player, data, fields) data.bag_rename = nil elseif fields.waypoint_add then - local max_waypoints = i3.settings.max_waypoints + local max_waypoints = i4.settings.max_waypoints if #data.waypoints >= max_waypoints then play_sound(name, "i3_cannot", 0.8) @@ -211,8 +211,8 @@ local function select_item(player, data, fields) data.alt_items = copy(data.items) data.expand = item - if i3.compress_groups[item] then - local items = copy(i3.compress_groups[item]) + if i4.compress_groups[item] then + local items = copy(i4.compress_groups[item]) insert(items, fmt("_%s", item)) sort(items, function(a, b) @@ -347,7 +347,7 @@ local function rcp_fields(player, data, fields) elseif fields.fav then local fav = is_fav(data) - if #data.favs < i3.settings.max_favs and not fav then + if #data.favs < i4.settings.max_favs and not fav then insert(data.favs, data.query_item) elseif fav then remove(data.favs, fav) @@ -398,7 +398,7 @@ local function home_footer_fields(player, data, fields) else msg(name, S"Welcome back home!") end - -- Otherwise, use i3’s home. + -- Otherwise, use i4’s home. elseif not data.home then msg(name, "No home set") elseif name then @@ -424,11 +424,12 @@ end -- Fields input-handler for the settings footer-dialogue. local function settings_footer_fields(player, data, fields) + local name = player:get_player_name() if fields.set_home and not check_privs(name, {home = true}) then return msg(name, "'home' privilege missing") elseif fields.set_home then if sethome then - sethome.set(player:get_player_name(), player:get_pos()) + sethome.set(name, player:get_pos()) else data.home = pos_to_str(player:get_pos(), 1) end @@ -439,7 +440,7 @@ end core.register_on_player_receive_fields(function(player, formname, fields) local name = player:get_player_name() - if formname == "i3_outdated" then + if formname == "i4_outdated" then return false, core.kick_player(name, S"Your Minetest client needs updating (www.minetest.net)") elseif formname ~= "" then return false @@ -453,7 +454,7 @@ core.register_on_player_receive_fields(function(player, formname, fields) end -- print(dump(fields)) - local data = i3.data[name] + local data = i4.data[name] if not data then return end local sb_inv = fields.scrbar_inv @@ -465,7 +466,7 @@ core.register_on_player_receive_fields(function(player, formname, fields) for f in pairs(fields) do if sub(f, 1, 4) == "tab_" then local tabname = sub(f, 5) - i3.set_tab(player, tabname) + i4.set_tab(player, tabname) break elseif sub(f, 1, 5) == "itab_" then data.pagenum = 1 @@ -474,7 +475,7 @@ core.register_on_player_receive_fields(function(player, formname, fields) break elseif sub(f, 1, 7) == "footer_" then local footer_name = sub(f, 8) - for i, footer in ipairs(i3.footer_buttons) do + for i, footer in ipairs(i4.footer_buttons) do if footer.name == footer_name then data.footer_button = i break @@ -485,7 +486,7 @@ core.register_on_player_receive_fields(function(player, formname, fields) rcp_fields(player, data, fields) - local tab = i3.tabs[data.tab] + local tab = i4.tabs[data.tab] if tab then if tab.slots then inv_fields(player, data, fields) diff --git a/src/groups.lua b/src/groups.lua index 6db4cd0..80b18dc 100644 --- a/src/groups.lua +++ b/src/groups.lua @@ -1,6 +1,6 @@ IMPORT("S") -i3.group_stereotypes = { +i4.group_stereotypes = { dye = "dye:white", wool = "wool:white", wood = "default:wood", @@ -18,7 +18,7 @@ i3.group_stereotypes = { mesecon_conductor_craftable = "mesecons:wire_00000000_off", } -i3.group_names = { +i4.group_names = { dye = S"Any dye", coal = S"Any coal", sand = S"Any sand", diff --git a/src/gui.lua b/src/gui.lua index 84de221..5b9bf2c 100644 --- a/src/gui.lua +++ b/src/gui.lua @@ -1,8 +1,8 @@ -local damage_enabled = i3.settings.damage_enabled -local debug_mode = i3.settings.debug_mode +local damage_enabled = i4.settings.damage_enabled +local debug_mode = i4.settings.debug_mode -local model_aliases = i3.files.model_alias() -local PNG, styles, fs_elements, colors = i3.files.styles() +local model_aliases = i4.files.model_alias() +local PNG, styles, fs_elements, colors = i4.files.styles() local sprintf = string.format local VoxelArea, VoxelManip = VoxelArea, VoxelManip @@ -29,7 +29,7 @@ end local function repairable(tool) local def = reg_tools[tool] - return i3.toolrepair and def and def.groups and def.groups.disable_repair ~= 1 + return i4.toolrepair and def and def.groups and def.groups.disable_repair ~= 1 end local function weird_desc(str) @@ -96,7 +96,7 @@ local function get_stack_max(inv, data, is_recipe, rcp) local def = reg_items[item] if def then - local group_cache = i3.groups[name:sub(7)] + local group_cache = i4.groups[name:sub(7)] local groups = group_cache and group_cache.groups or extract_groups(name) if item_has_groups(def.groups, groups) then @@ -229,8 +229,8 @@ local function get_isometric_view(fs, pos, X, Y, t, cubes, depth, high) local data = vm:get_data() for idx in area:iterp(pos1, pos2) do - local cube = i3.cubes[data[idx]] - local plant = i3.plants[data[idx]] + local cube = i4.cubes[data[idx]] + local plant = i4.plants[data[idx]] local img = cube or plant if img then @@ -526,7 +526,7 @@ local function get_container(fs, data, player, yoffset, ctn_len, award_list, awa local yextra = .2 - for i, title in ipairs(i3.categories) do + for i, title in ipairs(i4.categories) do local btn_name = fmt("btn_%s", title) fs("style[btn_%s;fgimg=%s;fgimg_hovered=%s;content_offset=0]", title, data.subcat == i and PNG[fmt("%s_hover", title)] or PNG[title], @@ -548,7 +548,7 @@ local function get_container(fs, data, player, yoffset, ctn_len, award_list, awa get_crafting_tab_fs(fs, data, player, esc_name, yextra, ctn_len) elseif data.subcat == 2 then - if not i3.modules.armor then + if not i4.modules.armor then return not_installed "3d_armor" end @@ -558,7 +558,7 @@ local function get_container(fs, data, player, yoffset, ctn_len, award_list, awa get_bag_fs(fs, data, bag_size, yextra) elseif data.subcat == 4 then - if not i3.modules.skins then + if not i4.modules.skins then return not_installed "skinsdb" end @@ -612,7 +612,7 @@ local function settings_footer_fs(player, data, fs) local home = data.home if sethome then - -- i3 stores home coordinates with one decimal of precision, as the blow fmt() statement + -- i4 stores home coordinates with one decimal of precision, as the blow fmt() statement -- assumes. So we need to trim sethome’s coordinates to one decimal, likewise. local home_pos = sethome.get(player:get_player_name()) home = string.format("(%.1f,%.1f,%.1f)", home_pos.x, home_pos.y, home_pos.z) @@ -665,7 +665,7 @@ local function settings_footer_fs(player, data, fs) local methods = {} - for _, v in ipairs(i3.sorting_methods) do + for _, v in ipairs(i4.sorting_methods) do local name = toupper(v.name) insert(methods, name) end @@ -673,7 +673,7 @@ local function settings_footer_fs(player, data, fs) label(5.3, 10.4, ES"Sorting method:") fs("dropdown[%f,%f;2.6,0.5;dd_sorting_method;%s;%u;true]", 5.3, 10.6, concat(methods, ","), data.sort) - local desc = i3.sorting_methods[data.sort].description + local desc = i4.sorting_methods[data.sort].description if desc then tooltip(5.3, 10.6, 2.4, 0.5, ESC(desc)) end @@ -694,8 +694,8 @@ end -- Get the inventory-footer’s formspec. local function get_footer(fs, data, player) -- Render individual footer buttons. - local starting_x = 3.43 - (.3 * (#i3.footer_buttons - 4)) -- Center the icons - for i, btn in ipairs(i3.footer_buttons) do + local starting_x = 3.43 - (.3 * (#i4.footer_buttons - 4)) -- Center the icons + for i, btn in ipairs(i4.footer_buttons) do local btn_name = "footer_" .. btn.name fs("style[%s;fgimg=%s;fgimg_hovered=%s^\\[brighten^\\[colorize:#fff:100;content_offset=0]", btn_name, btn.image, btn.image) @@ -704,7 +704,7 @@ local function get_footer(fs, data, player) end -- Render the current-selected button’s formspec, if one is active. - footer = i3.footer_buttons[data.footer_button] + footer = i4.footer_buttons[data.footer_button] if footer then if footer.formspec then footer.formspec(player, data, fs) @@ -748,7 +748,7 @@ local function get_inventory_fs(player, data, fs) if props.mesh ~= "" then local anim = player:get_local_animation() - local armor_skin = i3.modules.armor or i3.modules.skins + local armor_skin = i4.modules.armor or i4.modules.skins local t = {} for _, v in ipairs(props.textures) do @@ -774,7 +774,7 @@ local function get_inventory_fs(player, data, fs) if data.subcat == 3 and bag_size > 0 then max_val += min(0, ((bag_size - 1) * 10)) - elseif i3.modules.skins and data.subcat == 4 then + elseif i4.modules.skins and data.subcat == 4 then local spp = 24 local _skins = skins.get_skinlist_for_player(data.player_name) local nb = #_skins @@ -782,7 +782,7 @@ local function get_inventory_fs(player, data, fs) max_val += ceil(num / 3.5) * (nb > spp and 34 or 31) - elseif i3.modules.awards and data.subcat == 6 then + elseif i4.modules.awards and data.subcat == 6 then award_list = awards.get_award_states(data.player_name) award_list_nb = #award_list @@ -818,7 +818,7 @@ local function get_tooltip(item, info, lang_code) if info.groups then sort(info.groups) - tooltip = i3.group_names[concat(info.groups, ",")] + tooltip = i4.group_names[concat(info.groups, ",")] if not tooltip then local groupstr = {} @@ -862,7 +862,7 @@ local function get_tooltip(item, info, lang_code) end if info.repair then - tooltip = add(S("Repairable by step of @1", clr("#ff0", i3.toolrepair .. "%"))) + tooltip = add(S("Repairable by step of @1", clr("#ff0", i4.toolrepair .. "%"))) end if info.rarity then @@ -906,7 +906,7 @@ local function get_true_count(data, count, is_recipe, is_usage) end local function get_output_fs(fs, data, rcp, is_recipe, is_usage, shapeless, right, btn_size, btn_size2) - local custom_recipe = i3.craft_types[rcp.type] + local custom_recipe = i4.craft_types[rcp.type] local cooking = rcp.type == "cooking" local fuel = rcp.type == "fuel" @@ -941,7 +941,7 @@ local function get_output_fs(fs, data, rcp, is_recipe, is_usage, shapeless, righ end end - local BTN_SIZE = i3.settings.item_btn_size + local BTN_SIZE = i4.settings.item_btn_size local arrow_X = right + 0.2 + (btn_size2 or BTN_SIZE) local X = arrow_X + 1.2 local Y = data.yoffset + 1.4 @@ -978,7 +978,7 @@ local function get_output_fs(fs, data, rcp, is_recipe, is_usage, shapeless, righ local unknown = not def or nil local desc = def and def.description local weird = name ~= "" and desc and weird_desc(desc) or nil - local burntime = i3.fuel_cache[name] and i3.fuel_cache[name].burntime + local burntime = i4.fuel_cache[name] and i4.fuel_cache[name].burntime local short_desc = meta:get_string"short_description" local long_desc = meta:get_string"description" @@ -1002,7 +1002,7 @@ end local function get_grid_fs(fs, data, rcp, is_recipe, is_usage) local width = rcp.width or 1 local right = 0 - local btn_size, _btn_size = i3.settings.item_btn_size + local btn_size, _btn_size = i4.settings.item_btn_size local cooktime, shapeless if rcp.type == "cooking" then @@ -1061,7 +1061,7 @@ local function get_grid_fs(fs, data, rcp, is_recipe, is_usage) end local groups - local group_cache = i3.groups[name:sub(7)] + local group_cache = i4.groups[name:sub(7)] if is_group(name) then groups = group_cache and group_cache.groups or extract_groups(name) @@ -1132,7 +1132,7 @@ local function get_grid_fs(fs, data, rcp, is_recipe, is_usage) unknown = not groups and unknown or nil local desc = def and def.description local weird = name ~= "" and desc and weird_desc(desc) or nil - local burntime = i3.fuel_cache[name] and i3.fuel_cache[name].burntime + local burntime = i4.fuel_cache[name] and i4.fuel_cache[name].burntime local short_desc = meta:get_string"short_description" local long_desc = meta:get_string"description" @@ -1162,7 +1162,7 @@ local function get_rcp_lbl(fs, data, panel, rn, is_recipe, is_usage) local rcp = is_recipe and panel.rcp[data.rnum] or panel.rcp[data.unum] if rcp.custom then - local craft_type = i3.craft_types[rcp.type] + local craft_type = i4.craft_types[rcp.type] if craft_type then local desc = craft_type.description hypertext(data.inv_width + 4.8, data.yoffset + 0.12, 3, 1, "custom_rcp", @@ -1245,7 +1245,7 @@ end local function get_header(fs, data) local fav = is_fav(data) local nfavs = #data.favs - local max_favs = i3.settings.max_favs + local max_favs = i4.settings.max_favs local star_x, star_y, size = data.inv_width + 0.3, data.yoffset + 0.2, 0.4 if nfavs < max_favs or (nfavs == max_favs and fav) then @@ -1374,7 +1374,7 @@ local function get_rcp_extra(fs, data, player, panel, is_recipe, is_usage) for item, count in pairs(missing) do if count > 0 then - local name = is_group(item) and (i3.group_names[item:sub(7)] or item) or + local name = is_group(item) and (i4.group_names[item:sub(7)] or item) or get_desc(item, data.lang_code) str = fmt("%s\n%s %s", str, clr("#ff0", count .. '×'), name) end @@ -1399,7 +1399,7 @@ local function hide_items(player, data) for i = 1, #data.items do local item = data.items[i] - if not i3.compressed[item] then + if not i4.compressed[item] then insert(new, item) end end @@ -1446,7 +1446,7 @@ local function get_header_items_fs(fs, data) local cat = {{"all", "all items"}} if not recipe_filter_set() then - for _, v in ipairs(i3.minitabs) do + for _, v in ipairs(i4.minitabs) do if v.name == "nodes" then insert(cat, {"node", "nodes only"}) end @@ -1519,7 +1519,7 @@ end local function get_minitabs(fs, data, player, full_height) local minitabs = {} - for i, v in ipairs(i3.minitabs) do + for i, v in ipairs(i4.minitabs) do local access = v.access if access == nil or access(player, data) then minitabs[i] = v.description @@ -1567,7 +1567,7 @@ local function get_items_fs(fs, data, player, full_height) local lbl = ES"No item to show" local icon, width, offset = PNG.no_result, 4, 2 - if recipe_filter_set() and #i3.init_items > 0 and data.filter == "" then + if recipe_filter_set() and #i4.init_items > 0 and data.filter == "" then lbl = ES"Collect items to reveal more recipes" -- Progressive mode, etc. icon, width, offset = PNG.find_more, 2.5, 2.75 end @@ -1627,7 +1627,7 @@ local function get_items_fs(fs, data, player, full_height) end local function get_favs(fs, data) - local btn_size = i3.settings.item_btn_size + local btn_size = i4.settings.item_btn_size label(data.inv_width + 0.4, data.yoffset + 0.4, ES"Bookmarks") for i, item in ipairs(data.favs) do @@ -1665,9 +1665,9 @@ end local function get_tabs_fs(fs, player, data, full_height) local tab_len, tab_hgh, c, over = 3, 0.5, 0 - local _tabs = copy(i3.tabs) + local _tabs = copy(i4.tabs) - for i, def in ipairs(i3.tabs) do + for i, def in ipairs(i4.tabs) do if def.access and not def.access(player, data) then remove(_tabs, i) end @@ -1768,13 +1768,13 @@ local function make_fs(player, data) local full_height = 12 fs("formspec_version[%u]size[%f,%f]no_prepend[]bgcolor[#0000]", - i3.settings.min_fs_version, data.inv_width + 8, full_height) + i4.settings.min_fs_version, data.inv_width + 8, full_height) fs(styles) bg9(0, 0, data.inv_width, full_height, PNG.bg_full) - local tab = i3.tabs[data.tab] + local tab = i4.tabs[data.tab] if tab then if tab.formspec then @@ -1796,9 +1796,9 @@ local function make_fs(player, data) end end - local visible_tabs = #i3.tabs + local visible_tabs = #i4.tabs - for _, def in ipairs(i3.tabs) do + for _, def in ipairs(i4.tabs) do if def.access and not def.access(player, data) then visible_tabs -= 1 end diff --git a/src/hud.lua b/src/hud.lua index 1ada388..bc13b8d 100644 --- a/src/hud.lua +++ b/src/hud.lua @@ -3,12 +3,12 @@ IMPORT("get_connected_players", "add_hud_waypoint") local function init_hud(player) local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] local wdesc_y = -90 if core.global_exists"hb" then wdesc_y -= ceil(hb.hudbars_count / 2) * 5 - elseif not i3.settings.damage_enabled then + elseif not i4.settings.damage_enabled then wdesc_y += 15 end @@ -49,7 +49,7 @@ local function show_hud(player, data, notif, idx, dt) end if notif.show then - local speed = i3.settings.hud_speed * (100 * get_progress(offset.y, notif.max.y)) * dt + local speed = i4.settings.hud_speed * (100 * get_progress(offset.y, notif.max.y)) * dt for _, def in pairs(notif.elems) do local hud_info = player:hud_get(def) @@ -59,8 +59,8 @@ local function show_hud(player, data, notif, idx, dt) y = hud_info.offset.y - (speed * max(1, (#data.hud.notifs - idx + 1) / 1.45)) }) end - elseif notif.show == false and notif.hud_timer >= i3.settings.hud_timer_max then - local speed = (i3.settings.hud_speed * 2.6) * (100 * get_progress(offset.x, notif.max.x)) * dt + elseif notif.show == false and notif.hud_timer >= i4.settings.hud_timer_max then + local speed = (i4.settings.hud_speed * 2.6) * (100 * get_progress(offset.x, notif.max.x)) * dt for _, def in pairs(notif.elems) do local hud_info = player:hud_get(def) @@ -85,7 +85,7 @@ core.register_globalstep(function(dt) for i = 1, players[0] do local player = players[i] local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] if not data then return end for idx, notif in ipairs(data.hud.notifs) do @@ -107,7 +107,7 @@ core.register_globalstep(function(dt) local wieldidx = player:get_wield_index() if wieldidx == data.old_wieldidx then - if data.timer >= i3.settings.wielditem_fade_after and has_text then + if data.timer >= i4.settings.wielditem_fade_after and has_text then player:hud_change(data.hud.wielditem, "text", "") end return @@ -130,7 +130,7 @@ end) local function init_waypoints(player) local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] data.waypoints = data.waypoints or {} for _, v in ipairs(data.waypoints) do diff --git a/src/preprocessor.lua b/src/preprocessor.lua index 138842e..11ed1be 100644 --- a/src/preprocessor.lua +++ b/src/preprocessor.lua @@ -3,7 +3,7 @@ local fmt, split = string.format, string.split local var = "[%w%.%[%]\"\'_]" -local modpath = core.get_modpath"i3" +local modpath = core.get_modpath"i4" local _,_, fs_elements = dofile(modpath .. "/src/styles.lua") local operators = { @@ -42,7 +42,7 @@ local operators = { local function compile(data) data = data:gsub("IMPORT%((.-)%)", function(a) - return "local " .. a:gsub("\"", "") .. " = i3.get(" .. a .. ")" + return "local " .. a:gsub("\"", "") .. " = i4.get(" .. a .. ")" end) data = data:gsub("([%w_]+)%(", function(a) diff --git a/src/progressive.lua b/src/progressive.lua index 3b15292..b66b921 100644 --- a/src/progressive.lua +++ b/src/progressive.lua @@ -1,14 +1,14 @@ -local set_fs = i3.set_fs -local hud_notif = i3.hud_notif +local set_fs = i4.set_fs +local hud_notif = i4.hud_notif local POLL_FREQ = 0.25 IMPORT("reg_items", "reg_nodes", "fmt", "table_merge", "array_diff") IMPORT("is_group", "extract_groups", "item_has_groups", "apply_recipe_filters", "sort_by_category") -i3.remove_minitab"nodes" -i3.remove_minitab"items" +i4.remove_minitab"nodes" +i4.remove_minitab"items" -i3.new_minitab("unlocked", { +i4.new_minitab("unlocked", { description = "Unlocked", sorter = function(item, data) @@ -19,10 +19,10 @@ i3.new_minitab("unlocked", { local function get_filtered_items(player, data) local items, known = {}, 0 - for i = 1, #i3.init_items do - local item = i3.init_items[i] - local recipes = i3.recipes_cache[item] - local usages = i3.usages_cache[item] + for i = 1, #i4.init_items do + local item = i4.init_items[i] + local recipes = i4.recipes_cache[item] + local usages = i4.usages_cache[item] recipes = #apply_recipe_filters(recipes or {}, player) usages = #apply_recipe_filters(usages or {}, player) @@ -43,7 +43,7 @@ local function item_in_inv(item, inv_items) if is_group(item) then local groupname = item:sub(7) - local group_cache = i3.groups[groupname] + local group_cache = i4.groups[groupname] local groups = group_cache and group_cache.groups or extract_groups(item) for i = 1, inv_items_size do @@ -78,7 +78,7 @@ local function progressive_filter(recipes, player) end local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] if #data.inv_items == 0 then return {} @@ -148,7 +148,7 @@ local function poll_new_items(player, data, join) if reg_nodes[last_discovered] then local id = core.get_content_id(last_discovered) - img = i3.cubes[id] or img + img = i4.cubes[id] or img end hud_notif(data.player_name, msg, img) @@ -163,11 +163,11 @@ local function poll_new_items(player, data, join) core.after(POLL_FREQ, poll_new_items, player, data) end -i3.add_recipe_filter("Default progressive filter", progressive_filter) +i4.add_recipe_filter("Default progressive filter", progressive_filter) core.register_on_joinplayer(function(player) local name = player:get_player_name() - local data = i3.data[name] + local data = i4.data[name] if not data then return end data.inv_items = data.inv_items or {} diff --git a/src/styles.lua b/src/styles.lua index 4318c21..31fb6c0 100644 --- a/src/styles.lua +++ b/src/styles.lua @@ -25,7 +25,7 @@ local PNG = { book = "i3_book.png", sign = "i3_sign.png", cancel = "i3_cancel.png", - crafting = "i3_crafting.png", + crafting = "i4_crafting.png", slot = "i3_slot.png^\\[resize:128x128", pagenum_hover = "i3_slot.png^\\[resize:128x128^\\[opacity:130", tab = "i3_tab.png", @@ -59,7 +59,7 @@ local PNG = { cancel_hover = "i3_cancel.png^\\[brighten", search_hover = "i3_search.png^\\[brighten", - crafting_hover = "i3_crafting.png^\\[brighten", + crafting_hover = "i4_crafting.png^\\[brighten", trash_hover = "i3_trash.png^\\[brighten^\\[colorize:#f00:100", compress_hover = "i3_compress.png^\\[brighten", sort_hover = "i3_sort.png^\\[brighten", diff --git a/textures/i3_crafting.png b/textures/i4_crafting.png similarity index 100% rename from textures/i3_crafting.png rename to textures/i4_crafting.png