diff --git a/README.md b/README.md index 63f93b0..7ca9452 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,10 @@ These mods have menus built-into i4: ## Configuration -There is currently only one [`minetest.conf`](https://wiki.minetest.net/Minetest.conf) setting used by i4: +There is currently two [`minetest.conf`](https://wiki.minetest.net/Minetest.conf) settings used by i4: * `i4_progressive_mode = false` — A discovery-based system, where the crafting guide only displays recipes whose components you have held before. +* `i4_inventory_size = 32` — Players’ inventory-size. Defaults to 32 (or 36, if i3 was previously in use). Only accepted values are 32 and 36. ## Notes diff --git a/i3/init.lua b/i3/init.lua index 3f5e310..a6c4931 100644 --- a/i3/init.lua +++ b/i3/init.lua @@ -1,11 +1,21 @@ --- This is a placeholder mod, to mimic i3’s presence for mods that test for mods --- that test for it using modpath or some other mechanism. --- i4 is compatible with i3, mods can use the global tables i3 or i4. +-- This is a placeholder mod, to mimic i3’s presence for mods that test for it. +-- It also migrates data from i3 to i4. local storage = core.get_mod_storage("i3") local data = core.deserialize(storage:get_string"data") or {} if data and not i4.imported then + -- i3 stores all user-data in a mod-data table; we copy it verbatim to i4. i4.data = data + + -- By default, i4’s inventory-size is 32; i3’s, however, is 36. i4 will + -- default to 36 at init-time if data was imported from i3. But since we’re + -- only importing now (and i4 has already been initialized), we need to do + -- it ourselves this time. + if not i4.settings.inventory_size then + i4.settings.inventory_size = 36 + end + + -- Mark data as imported, so we don’t go through this song-and-dance again. i4.imported = true end diff --git a/i4/init.lua b/i4/init.lua index 671279c..d7378bc 100644 --- a/i4/init.lua +++ b/i4/init.lua @@ -27,6 +27,7 @@ i4 = { damage_enabled = core.settings:get_bool"enable_damage", progressive_mode = core.settings:get_bool"i4_progressive_mode" or core.settings:get_bool"i3_progressive_mode", + inventory_size = tonumber(core.settings:get"i4_inventory_size") or (storage:get_int"imported_from_i3" and 36), }, categories = { @@ -52,7 +53,7 @@ i4 = { wielditem_hud = true, ignore_hotbar = true, reverse_sorting = true, - legacy_inventory = true, + hotbar_len = true, }, default_data = { @@ -60,6 +61,7 @@ i4 = { font_size = 0, collapse = true, inv_compress = true, + hotbar_len = 8, }, files = { diff --git a/i4/src/callbacks.lua b/i4/src/callbacks.lua index 7bbdc66..45e65a7 100644 --- a/i4/src/callbacks.lua +++ b/i4/src/callbacks.lua @@ -228,7 +228,7 @@ local function init_data(player, info) data.lang_code = get_lang_code(info) data.fs_version = info.formspec_version - update_inv_size(player, data) + update_inv_size(player, data, i4.settings.inventory_size) core.after(0, set_fs, player) end @@ -237,17 +237,19 @@ local function save_data(player_name) local _data = copy(i4.data) for name, v in pairs(_data) do - for dat in pairs(v) do - if not i4.saves[dat] then - _data[name][dat] = nil + for dat in pairs(v) do + if not i4.saves[dat] then + _data[name][dat] = nil - if player_name and i4.data[player_name] then - i4.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 - end + -- This seems like as good a point as any to save whether or not we + -- imported data from i3. storage:set_string("data", slz(_data)) if i4.imported then storage:set_int("imported_from_i3", 1) @@ -262,6 +264,7 @@ insert(core.registered_on_joinplayers, 1, function(player) return outdated(name) end + init_data(player, info) init_bags(player) init_hud(player) diff --git a/i4/src/common.lua b/i4/src/common.lua index 17cbb7d..a790ae4 100644 --- a/i4/src/common.lua +++ b/i4/src/common.lua @@ -674,27 +674,27 @@ local function get_detached_inv(name, player_name) } end -local function update_inv_size(player, data) - data.hotbar_len = data.legacy_inventory and 8 or 9 - data.inv_size = 4 * data.hotbar_len - +-- Change a player’s inventory-size to new_size. +local function update_inv_size(player, data, new_size) + data.hotbar_len = new_size / 4 local inv = player:get_inventory() local inv_size = inv:get_size("main") -- Drop items that can’t fit in new inventory size. - if inv_size > data.inv_size then + if inv_size > new_size then sort_inventory(player, data) - for i = data.inv_size + 1, inv_size, 1 do + for i = new_size + 1, inv_size, 1 do minetest.item_drop(inv:get_stack("main", i), player, player:get_pos()) end end - inv:set_size("main", data.inv_size) + inv:set_size("main", new_size) player:hud_set_hotbar_itemcount(data.hotbar_len) core.after(0, function() - player:hud_set_hotbar_image(data.legacy_inventory and "gui_hotbar.png" or "i3_hotbar.png") + local hotbar_img = data.hotbar_len == 8 and "gui_hotbar.png" or data.hotbar_len == 9 and "i3_hotbar.png" + player:hud_set_hotbar_image(hotbar_img) end) end diff --git a/i4/src/fields.lua b/i4/src/fields.lua index 4532873..77c5dcd 100644 --- a/i4/src/fields.lua +++ b/i4/src/fields.lua @@ -40,9 +40,7 @@ local function inv_fields(player, data, fields) data[str] = true end - if str == "legacy_inventory" then - update_inv_size(player, data) - elseif str == "collapse" then + if str == "collapse" then search(data) end diff --git a/i4/src/gui.lua b/i4/src/gui.lua index b48dc68..1c9b705 100644 --- a/i4/src/gui.lua +++ b/i4/src/gui.lua @@ -636,7 +636,6 @@ local function settings_footer_fs(player, data, fs) elseif show_style then checkbox(2.6, 9.95, "cb_hide_tabs", "Hide tabs", tostring(data.hide_tabs)) - checkbox(2.6, 10.4, "cb_legacy_inventory", "Legacy inventory", tostring(data.legacy_inventory)) checkbox(2.6, 10.85, "cb_wielditem_hud", "HUD description", tostring(data.wielditem_hud)) if not recipe_filter_set() then @@ -652,8 +651,6 @@ local function settings_footer_fs(player, data, fs) fs("tooltip[cb_hide_tabs;%s;#32333899;#fff]", ES"Enable this option to change the style of the right panel") - fs("tooltip[cb_legacy_inventory;%s;#32333899;#fff]", - ES"Enable this option to set the classic inventory size in Minetest") fs("tooltip[cb_wielditem_hud;%s;#32333899;#fff]", ES"Enable this option to show the wielded item description in your HUD") fs("tooltip[cb_collapse;%s;#32333899;#fff]", @@ -720,11 +717,11 @@ local function get_footer(fs, data, player) end local function get_slots(fs, data, player) - local legacy_inventory = data.legacy_inventory + local inv_size = player:get_inventory():get_size("main") local hotbar_len = data.hotbar_len - local inv_x = legacy_inventory and 0.23 or 0.22 - local inv_y = legacy_inventory and 6.7 or 6.9 - local spacing = legacy_inventory and 0.25 or 0.1 + local inv_x = (inv_size == 32 and 0.23) or (inv_size == 36 and 0.22) + local inv_y = (inv_size == 32 and 6.7) or (inv_size == 36 and 6.9) + local spacing = (inv_size == 32 and 0.25) or (inv_size == 36 and 0.1) local size = 1 fs"style_type[box;colors=#77777710,#77777710,#777,#777]" @@ -736,10 +733,12 @@ local function get_slots(fs, data, player) fs("style_type[list;size=%f;spacing=%f]", size, spacing) fs("list[current_player;main;%f,%f;%u,1;]", inv_x, inv_y, hotbar_len) - fs("style_type[list;size=%f;spacing=%f,%f]", size, spacing, legacy_inventory and 0.15 or spacing) + fs("style_type[list;size=%f;spacing=%f,%f]", size, spacing, + (inv_size == 32 and 0.15) or (inv_size == 36 and spacing)) - fs("list[current_player;main;%f,%f;%u,%u;%u]", inv_x, inv_y + (legacy_inventory and 1.25 or 1.15), - hotbar_len, data.inv_size / hotbar_len, hotbar_len) + fs("list[current_player;main;%f,%f;%u,%u;%u]", inv_x, inv_y + + ((inv_size == 32 and 1.25) or (inv_size == 36 and 1.15)), + hotbar_len, inv_size / hotbar_len, hotbar_len) fs"listring[current_player;craft]listring[current_player;main]" @@ -748,8 +747,9 @@ end local function get_inventory_fs(player, data, fs) local props = player:get_properties() + local inv_size = player:get_inventory():get_size("main") local ctn_len = 5.7 - local ctn_hgt = data.legacy_inventory and 6.1 or 6.3 + local ctn_hgt = (inv_size == 32 and 6.1) or (inv_size == 36 and 6.3) local yoffset = 0 if props.mesh ~= "" then diff --git a/settingtypes.txt b/settingtypes.txt index 6f9fae5..e44ee89 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -1,2 +1,7 @@ # The progressive mode shows recipes you can craft from items you ever had in your inventory. i4_progressive_mode (Learn crafting recipes progressively) bool false + +# This sets users’ inventory-size. For now, the only accepted values are 32 and 36. +# If this is value is lowered, any players that might lose items will have their items +# dropped on the ground. +i4_inventory_size (Change the size of players’ inventory) int 32