diff --git a/src/api.lua b/src/api.lua index 8e84077..eba7ab4 100644 --- a/src/api.lua +++ b/src/api.lua @@ -280,6 +280,8 @@ function i3.compress(item, def) return err "i3.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)) end local t = {} @@ -302,8 +304,6 @@ function i3.add_sorting_method(def) return err "i3.add_sorting_method: name missing" elseif not is_func(def.func) then return err "i3.add_sorting_method: function missing" - elseif i3.compressed[def.name] then - return err(fmt("i3.add_sorting_method: item '%s' is already compressed", def.name)) end insert(i3.sorting_methods, def) diff --git a/src/common.lua b/src/common.lua index 022f44c..5dfdde1 100644 --- a/src/common.lua +++ b/src/common.lua @@ -1,8 +1,15 @@ -local translate = core.get_translated_string -local fmt, find, gmatch, match, sub, split, lower = - string.format, string.find, string.gmatch, string.match, string.sub, string.split, string.lower -local reg_items, reg_nodes, reg_craftitems, reg_tools = - core.registered_items, core.registered_nodes, core.registered_craftitems, core.registered_tools +local fmt, find, match, gmatch, sub, split, lower = + string.format, string.find, string.match, string.gmatch, string.sub, string.split, string.lower + +local old_is_creative_enabled = core.is_creative_enabled + +function core.is_creative_enabled(name) + if name == "" then + return old_is_creative_enabled(name) + end + + return core.check_player_privs(name, {creative = true}) or old_is_creative_enabled(name) +end local S = core.get_translator "i3" local ES = function(...) return core.formspec_escape(S(...)) end @@ -36,6 +43,19 @@ local function reset_compression(data) data.expand = "" end +local function msg(name, str) + return core.chat_send_player(name, fmt("[i3] %s", str)) +end + +local function err(str) + return core.log("error", str) +end + +local function round(num, decimal) + local mul = 10 ^ decimal + return math.floor(num * mul + 0.5) / mul +end + local function search(data) reset_compression(data) @@ -60,7 +80,7 @@ local function search(data) for i = 1, #data.items_raw do local item = data.items_raw[i] local def = core.registered_items[item] - local desc = lower(translate(data.lang_code, def and def.description)) or "" + local desc = lower(core.get_translated_string(data.lang_code, def and def.description)) or "" local search_in = fmt("%s %s", item, desc) local temp, j, to_add = {}, 1 @@ -174,6 +194,14 @@ local function rcp_eq(rcp, rcp2) return true end +local function clean_name(item) + if sub(item, 1, 1) == ":" or sub(item, 1, 1) == " " or sub(item, 1, 1) == "_" then + item = sub(item, 2) + end + + return item +end + local function is_group(item) return sub(item, 1, 6) == "group:" end @@ -202,7 +230,7 @@ local function groups_to_items(groups, get_all) if not get_all and #groups == 1 then local group = groups[1] local stereotype = i3.group_stereotypes[group] - local def = reg_items[stereotype] + local def = core.registered_items[stereotype] if show_item(def) then return stereotype @@ -211,7 +239,7 @@ local function groups_to_items(groups, get_all) local names = {} - for name, def in pairs(reg_items) do + for name, def in pairs(core.registered_items) do if show_item(def) and item_has_groups(def.groups, groups) then if get_all then names[#names + 1] = name @@ -240,27 +268,6 @@ local function compressible(item, data) return compression_active(data) and i3.compress_groups[item] end -local function clean_name(item) - if sub(item, 1, 1) == ":" or sub(item, 1, 1) == " " or sub(item, 1, 1) == "_" then - item = sub(item, 2) - end - - return item -end - -local function msg(name, str) - return core.chat_send_player(name, fmt("[i3] %s", str)) -end - -local function err(str) - return core.log("error", str) -end - -local function round(num, decimal) - local mul = 10 ^ decimal - return math.floor(num * mul + 0.5) / mul -end - local function is_fav(favs, query_item) local fav, i for j = 1, #favs do @@ -290,9 +297,9 @@ local function sort_by_category(data) local to_add = true if data.itab == 2 then - to_add = reg_nodes[item] + to_add = core.registered_nodes[item] elseif data.itab == 3 then - to_add = reg_craftitems[item] or reg_tools[item] + to_add = core.registered_craftitems[item] or core.registered_tools[item] end if to_add then @@ -312,6 +319,42 @@ local function spawn_item(player, stack) core.add_item(look_at, stack) end +local function get_recipes(player, item) + local clean_item = core.registered_aliases[item] or item + local recipes = i3.recipes_cache[clean_item] + local usages = i3.usages_cache[clean_item] + + if recipes then + recipes = apply_recipe_filters(recipes, player) + end + + local no_recipes = not recipes or #recipes == 0 + if no_recipes and not usages then return end + usages = apply_recipe_filters(usages, player) + + local no_usages = not usages or #usages == 0 + + return not no_recipes and recipes or nil, + not no_usages and usages or nil +end + +local function get_stack(player, stack) + local inv = player:get_inventory() + + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + spawn_item(player, stack) + end +end + +local function safe_teleport(player, pos) + pos.y = pos.y + 0.5 + local vel = player:get_velocity() + player:add_velocity(vector.multiply(vel, -1)) + player:set_pos(pos) +end + local function get_sorting_idx(name) local idx = 1 @@ -442,23 +485,30 @@ local _ = { -- Sorting search = search, sorter = sorter, + get_recipes = get_recipes, sort_inventory = sort_inventory, get_sorting_idx = get_sorting_idx, sort_by_category = sort_by_category, apply_recipe_filters = apply_recipe_filters, - -- Misc. functions - err = err, - msg = msg, + -- Type checks is_fav = is_fav, is_str = is_str, is_num = is_num, is_func = is_func, - show_item = show_item, - spawn_item = spawn_item, true_str = true_str, true_table = true_table, + + -- Console + err = err, + msg = msg, + + -- Misc. functions + get_stack = get_stack, + show_item = show_item, + spawn_item = spawn_item, clean_name = clean_name, + safe_teleport = safe_teleport, -- Core functions clr = core.colorize, @@ -517,7 +567,6 @@ local _ = { vec_add = vector.add, vec_round = vector.round, vec_eq = vector.equals, - vec_mul = vector.multiply, } function i3.get(...) diff --git a/src/inventory.lua b/src/inventory.lua index 0826a08..1f20a0b 100644 --- a/src/inventory.lua +++ b/src/inventory.lua @@ -4,26 +4,16 @@ local S, clr = i3.get("S", "clr") local min, ceil, random = i3.get("min", "ceil", "random") local reg_items, reg_aliases = i3.get("reg_items", "reg_aliases") local fmt, find, match, sub, lower = i3.get("fmt", "find", "match", "sub", "lower") -local vec_new, vec_mul, vec_eq, vec_round = i3.get("vec_new", "vec_mul", "vec_eq", "vec_round") +local vec_new, vec_eq, vec_round = i3.get("vec_new", "vec_eq", "vec_round") local sort, copy, insert, remove, indexof = i3.get("sort", "copy", "insert", "remove", "indexof") local msg, is_fav = i3.get("msg", "is_fav") local is_group, extract_groups, groups_to_items = i3.get("is_group", "extract_groups", "groups_to_items") -local search, get_sorting_idx, sort_inventory, sort_by_category, apply_recipe_filters = - i3.get("search", "get_sorting_idx", "sort_inventory", "sort_by_category", "apply_recipe_filters") -local show_item, spawn_item, clean_name, compressible, check_privs = - i3.get("show_item", "spawn_item", "clean_name", "compressible", "check_privs") - -local old_is_creative_enabled = core.is_creative_enabled - -function core.is_creative_enabled(name) - if name == "" then - return old_is_creative_enabled(name) - end - - return check_privs(name, {creative = true}) or old_is_creative_enabled(name) -end +local search, get_sorting_idx, sort_inventory, sort_by_category, get_recipes = + i3.get("search", "get_sorting_idx", "sort_inventory", "sort_by_category", "get_recipes") +local show_item, get_stack, clean_name, compressible, check_privs, safe_teleport = + i3.get("show_item", "get_stack", "clean_name", "compressible", "check_privs", "safe_teleport") local function reset_data(data) data.filter = "" @@ -49,42 +39,6 @@ local function reset_data(data) end end -local function get_recipes(player, item) - local clean_item = reg_aliases[item] or item - local recipes = i3.recipes_cache[clean_item] - local usages = i3.usages_cache[clean_item] - - if recipes then - recipes = apply_recipe_filters(recipes, player) - end - - local no_recipes = not recipes or #recipes == 0 - if no_recipes and not usages then return end - usages = apply_recipe_filters(usages, player) - - local no_usages = not usages or #usages == 0 - - return not no_recipes and recipes or nil, - not no_usages and usages or nil -end - -local function get_stack(player, stack) - local inv = player:get_inventory() - - if inv:room_for_item("main", stack) then - inv:add_item("main", stack) - else - spawn_item(player, stack) - end -end - -local function safe_teleport(player, pos) - pos.y = pos.y + 0.5 - local vel = player:get_velocity() - player:add_velocity(vec_mul(vel, -1)) - player:set_pos(pos) -end - i3.new_tab { name = "inventory", description = S"Inventory",