mirror of
https://github.com/minetest-mods/i3.git
synced 2025-07-03 09:00:23 +02:00
Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
38f1d7c960 | |||
5d4f9b4709 | |||
a0a3394e18 | |||
d9a16bf39d | |||
2a2837dd0c | |||
080579b2a4 | |||
b711f8f195 |
@ -31,6 +31,7 @@ exclude_files = {
|
||||
"tests/test_custom_recipes.lua",
|
||||
"tests/test_operators.lua",
|
||||
"tests/test_tabs.lua",
|
||||
"tests/test_waypoints.lua",
|
||||
|
||||
".install",
|
||||
".luarocks",
|
||||
|
59
API.md
59
API.md
@ -12,23 +12,31 @@ Custom tabs can be added to the `i3` inventory as follow (example):
|
||||
```Lua
|
||||
i3.new_tab("stuff", {
|
||||
description = "Stuff",
|
||||
image = "image.png", -- Optional, adds an image next to the tab description
|
||||
image = "image.png", -- Optional, add an image next to the tab description
|
||||
|
||||
-- Determine if the tab is visible by a player, `false` or `nil` hide the tab
|
||||
--
|
||||
-- The functions below are all optional
|
||||
--
|
||||
|
||||
-- Determine if the tab is visible by a player, return false to hide the tab
|
||||
access = function(player, data)
|
||||
local name = player:get_player_name()
|
||||
return name == "singleplayer"
|
||||
end,
|
||||
|
||||
formspec = function(player, data, fs)
|
||||
fs"label[3,1;This is just a test]"
|
||||
fs("label", 3, 1, "Just a test")
|
||||
fs"label[3,2;Lorem Ipsum]"
|
||||
-- No need to return anything
|
||||
end,
|
||||
|
||||
-- Events handling happens here
|
||||
fields = function(player, data, fields)
|
||||
if fields.mybutton then
|
||||
do_things()
|
||||
-- Do things
|
||||
end
|
||||
|
||||
i3.set_fs(player) -- Update the formspec, mandatory
|
||||
end,
|
||||
})
|
||||
```
|
||||
@ -301,6 +309,49 @@ A map of all compressed item groups, indexed by stereotypes.
|
||||
|
||||
---
|
||||
|
||||
### Waypoints
|
||||
|
||||
`i3` allows you to manage the waypoints of a specific player.
|
||||
|
||||
#### `i3.add_waypoint(player_name, def)`
|
||||
|
||||
Add a waypoint to specific player.
|
||||
|
||||
- `player_name` is the player name.
|
||||
- `def` is the waypoint definition table.
|
||||
|
||||
Example:
|
||||
|
||||
```Lua
|
||||
i3.add_waypoint("Test", {
|
||||
player = "singleplayer",
|
||||
pos = {x = 0, y = 2, z = 0},
|
||||
color = 0xffff00,
|
||||
-- image = "heart.png" (optional)
|
||||
})
|
||||
```
|
||||
|
||||
#### `i3.remove_waypoint(player_name, waypoint_name)`
|
||||
|
||||
Remove a waypoint for specific player.
|
||||
|
||||
- `player_name` is the player name.
|
||||
- `waypoint_name` is the waypoint name.
|
||||
|
||||
Example:
|
||||
|
||||
```Lua
|
||||
i3.remove_waypoint("singleplayer", "Test")
|
||||
```
|
||||
|
||||
#### `i3.get_waypoints(player_name)`
|
||||
|
||||
Return a table of all waypoints of a specific player.
|
||||
|
||||
- `player_name` is the player name.
|
||||
|
||||
---
|
||||
|
||||
### Miscellaneous
|
||||
|
||||
#### `i3.hud_notif(name, msg[, img])`
|
||||
|
8
LICENSE
8
LICENSE
@ -23,6 +23,14 @@ 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.
|
||||
|
||||
Licenses of media (sounds)
|
||||
--------------------------
|
||||
|
||||
Lone_Wolf (CC0):
|
||||
i3_tab.ogg
|
||||
i3_craft.ogg
|
||||
i3_click.ogg
|
||||
i3_cannot.ogg
|
||||
|
||||
Licenses of media (textures)
|
||||
----------------------------
|
||||
|
@ -1,6 +1,6 @@
|
||||

|
||||
|
||||
[](https://github.com/tterb/atomic-design-ui/blob/master/LICENSEs) []()  [](https://content.minetest.net/packages/jp/i3/) [](https://www.paypal.me/jpg84240)
|
||||
[]()  [](https://content.minetest.net/packages/jp/i3/) [](https://www.paypal.me/jpg84240)
|
||||
|
||||
#### **`i3`** is a next-generation inventory for Minetest.
|
||||
|
||||
|
3
init.lua
3
init.lua
@ -20,7 +20,7 @@ local function lf(path)
|
||||
end
|
||||
|
||||
i3 = {
|
||||
version = 1121,
|
||||
version = 1131,
|
||||
data = core.deserialize(storage:get_string"data") or {},
|
||||
|
||||
settings = {
|
||||
@ -121,6 +121,7 @@ end
|
||||
|
||||
if i3.settings.debug_mode then
|
||||
lf("/tests/test_tabs.lua")()
|
||||
lf("/tests/test_waypoints.lua")()
|
||||
-- lf("/tests/test_operators.lua")()
|
||||
lf("/tests/test_compression.lua")()
|
||||
lf("/tests/test_custom_recipes.lua")()
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
84
src/api.lua
84
src/api.lua
@ -1,10 +1,10 @@
|
||||
local http = ...
|
||||
local make_fs, get_inventory_fs = i3.files.gui()
|
||||
|
||||
IMPORT("gmatch", "split")
|
||||
IMPORT("S", "err", "fmt", "reg_items")
|
||||
IMPORT("sorter", "sort_inventory", "play_sound")
|
||||
IMPORT("get_player_by_name", "add_hud_waypoint")
|
||||
IMPORT("sort", "concat", "copy", "insert", "remove")
|
||||
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)
|
||||
@ -204,10 +204,10 @@ function i3.remove_tab(name)
|
||||
return err "i3.remove_tab: tab name missing"
|
||||
end
|
||||
|
||||
for i, def in ipairs(i3.tabs) do
|
||||
if name == def.name then
|
||||
for i = #i3.tabs, 1, -1 do
|
||||
local def = i3.tabs[i]
|
||||
if def and name == def.name then
|
||||
remove(i3.tabs, i)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -315,7 +315,6 @@ function i3.hud_notif(name, msg, img)
|
||||
end
|
||||
|
||||
local data = i3.data[name]
|
||||
|
||||
if not data then
|
||||
return err "i3.hud_notif: no player data initialized"
|
||||
end
|
||||
@ -358,3 +357,76 @@ i3.add_sorting_method("numerical", {
|
||||
return list
|
||||
end,
|
||||
})
|
||||
|
||||
function i3.add_waypoint(name, def)
|
||||
if not true_str(name) then
|
||||
return err "i3.add_waypoint: name missing"
|
||||
elseif not true_table(def) then
|
||||
return err "i3.add_waypoint: definition missing"
|
||||
elseif not true_str(def.player) then
|
||||
return err "i3.add_waypoint: player name missing"
|
||||
end
|
||||
|
||||
local data = i3.data[def.player]
|
||||
if not data then
|
||||
return err "i3.add_waypoint: no player data initialized"
|
||||
end
|
||||
|
||||
local player = get_player_by_name(def.player)
|
||||
local id = player and add_hud_waypoint(player, name, def.pos, def.color, def.image) or nil
|
||||
|
||||
insert(data.waypoints, {
|
||||
name = name,
|
||||
pos = pos_to_str(def.pos, 1),
|
||||
color = def.color,
|
||||
image = def.image,
|
||||
id = id,
|
||||
})
|
||||
|
||||
if data.subcat == 5 then
|
||||
data.scrbar_inv += 1000
|
||||
end
|
||||
|
||||
i3.set_fs(player)
|
||||
end
|
||||
|
||||
function i3.remove_waypoint(player_name, name)
|
||||
if not true_str(player_name) then
|
||||
return err "i3.remove_waypoint: player name missing"
|
||||
elseif not true_str(name) then
|
||||
return err "i3.remove_waypoint: waypoint name missing"
|
||||
end
|
||||
|
||||
local data = i3.data[player_name]
|
||||
if not data then
|
||||
return err "i3.remove_waypoint: no player data initialized"
|
||||
end
|
||||
|
||||
local player = get_player_by_name(player_name)
|
||||
|
||||
for i = #data.waypoints, 1, -1 do
|
||||
local waypoint = data.waypoints[i]
|
||||
if waypoint and name == waypoint.name then
|
||||
if player then
|
||||
player:hud_remove(waypoint.id)
|
||||
end
|
||||
|
||||
remove(data.waypoints, i)
|
||||
end
|
||||
end
|
||||
|
||||
i3.set_fs(player)
|
||||
end
|
||||
|
||||
function i3.get_waypoints(player_name)
|
||||
if not true_str(player_name) then
|
||||
return err "i3.get_waypoints: player name missing"
|
||||
end
|
||||
|
||||
local data = i3.data[player_name]
|
||||
if not data then
|
||||
return err "i3.get_waypoints: no player data initialized"
|
||||
end
|
||||
|
||||
return data.waypoints
|
||||
end
|
||||
|
@ -600,8 +600,8 @@ local function reset_data(data)
|
||||
data.goto_page = nil
|
||||
data.recipes = nil
|
||||
data.usages = nil
|
||||
data.crafting_rcp = nil
|
||||
data.crafting_usg = nil
|
||||
data.crafting_rcp = nil
|
||||
data.crafting_usg = nil
|
||||
data.alt_items = nil
|
||||
data.confirm_trash = nil
|
||||
data.show_settings = nil
|
||||
@ -613,13 +613,15 @@ local function reset_data(data)
|
||||
end
|
||||
end
|
||||
|
||||
local function add_hud_waypoint(player, name, pos, color)
|
||||
local function add_hud_waypoint(player, name, pos, color, image)
|
||||
return player:hud_add {
|
||||
hud_elem_type = "waypoint",
|
||||
hud_elem_type = image and "image_waypoint" or "waypoint",
|
||||
name = name,
|
||||
text = "m",
|
||||
text = image or "m",
|
||||
scale = {x = 5, y = 5},
|
||||
world_pos = pos,
|
||||
number = color,
|
||||
image = image,
|
||||
z_index = -300,
|
||||
}
|
||||
end
|
||||
|
19
src/gui.lua
19
src/gui.lua
@ -380,9 +380,9 @@ local function get_waypoint_fs(fs, data, player, yextra, ctn_len)
|
||||
fs"style_type[label;font=normal;font_size=16;textcolor=#fff]"
|
||||
end
|
||||
|
||||
local function get_bag_fs(fs, data, name, esc_name, bag_size, yextra)
|
||||
fs("list[detached:i3_bag_%s;main;0,%f;1,1;]", esc_name, yextra + 0.7)
|
||||
local bag = get_detached_inv("bag", name)
|
||||
local function get_bag_fs(fs, data, bag_size, yextra)
|
||||
fs("list[detached:i3_bag_%s;main;0,%f;1,1;]", data.player_name, yextra + 0.7)
|
||||
local bag = get_detached_inv("bag", data.player_name)
|
||||
if bag:is_empty"main" then return end
|
||||
|
||||
local v = {{1.9, 2, 0.12}, {3.05, 5, 0.06}, {4.2, 10}, {4.75, 10}}
|
||||
@ -416,12 +416,13 @@ local function get_bag_fs(fs, data, name, esc_name, bag_size, yextra)
|
||||
end
|
||||
|
||||
fs("style_type[list;size=%f;spacing=%f]", size, spacing)
|
||||
fs("list[detached:i3_bag_content_%s;main;%f,%f;4,%u;]", esc_name, x, yextra + 1.3, bag_size)
|
||||
fs("list[detached:i3_bag_content_%s;main;%f,%f;4,%u;]", data.player_name, x, yextra + 1.3, bag_size)
|
||||
fs"style_type[list;size=1;spacing=0.15]"
|
||||
end
|
||||
|
||||
local function get_container(fs, data, player, yoffset, ctn_len, award_list, awards_unlocked, award_list_nb, bag_size)
|
||||
local name = data.player_name
|
||||
local nametag = player:get_nametag_attributes()
|
||||
local name = true_str(nametag.text) and nametag.text or data.player_name
|
||||
local esc_name = ESC(name)
|
||||
|
||||
add_subtitle(fs, "player_name", 0, ctn_len, 22, true, esc_name)
|
||||
@ -474,14 +475,14 @@ local function get_container(fs, data, player, yoffset, ctn_len, award_list, awa
|
||||
end
|
||||
|
||||
if data.subcat == 1 then
|
||||
get_bag_fs(fs, data, name, esc_name, bag_size, yextra)
|
||||
get_bag_fs(fs, data, bag_size, yextra)
|
||||
|
||||
elseif data.subcat == 2 then
|
||||
if not i3.modules.armor then
|
||||
return not_installed "3d_armor"
|
||||
end
|
||||
|
||||
local armor_def = armor.def[name]
|
||||
local armor_def = armor.def[data.player_name]
|
||||
local _, armor_inv = armor:get_valid_player(player, "3d_armor")
|
||||
|
||||
fs("list[detached:%s_armor;armor;0,%f;5,1;]", esc_name, yextra + 0.7)
|
||||
@ -522,7 +523,7 @@ local function get_container(fs, data, player, yoffset, ctn_len, award_list, awa
|
||||
return not_installed "skinsdb"
|
||||
end
|
||||
|
||||
local _skins = skins.get_skinlist_for_player(name)
|
||||
local _skins = skins.get_skinlist_for_player(data.player_name)
|
||||
local skin_name = skins.get_player_skin(player).name
|
||||
local spp, add_y = 24, 0
|
||||
|
||||
@ -1695,7 +1696,7 @@ local function make_fs(player, data)
|
||||
|
||||
local tab = i3.tabs[data.tab]
|
||||
|
||||
if tab then
|
||||
if tab and tab.formspec then
|
||||
tab.formspec(player, data, fs)
|
||||
end
|
||||
|
||||
|
@ -165,7 +165,7 @@ local function init_waypoints(player)
|
||||
|
||||
for _, v in ipairs(data.waypoints) do
|
||||
if not v.hide then
|
||||
local id = add_hud_waypoint(player, v.name, str_to_pos(v.pos), v.color)
|
||||
local id = add_hud_waypoint(player, v.name, str_to_pos(v.pos), v.color, v.image)
|
||||
v.id = id
|
||||
end
|
||||
end
|
||||
|
@ -3,7 +3,8 @@ i3.new_tab("test1", {
|
||||
image = "i3_heart.png",
|
||||
|
||||
formspec = function(player, data, fs)
|
||||
fs("label[3,1;Test 1]")
|
||||
fs("label", 3, 1, "Just a test")
|
||||
fs"label[3,2;Lorem Ipsum]"
|
||||
end,
|
||||
})
|
||||
|
||||
|
12
tests/test_waypoints.lua
Normal file
12
tests/test_waypoints.lua
Normal file
@ -0,0 +1,12 @@
|
||||
core.after(5, function()
|
||||
i3.add_waypoint("Test", {
|
||||
player = "singleplayer",
|
||||
pos = {x = 0, y = 2, z = 0},
|
||||
color = 0xffff00,
|
||||
-- image = "heart.png",
|
||||
})
|
||||
|
||||
core.after(5, function()
|
||||
i3.remove_waypoint("singleplayer", "Test")
|
||||
end)
|
||||
end)
|
Reference in New Issue
Block a user