mirror of
https://github.com/minetest-mods/i3.git
synced 2025-07-04 01:20: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_custom_recipes.lua",
|
||||||
"tests/test_operators.lua",
|
"tests/test_operators.lua",
|
||||||
"tests/test_tabs.lua",
|
"tests/test_tabs.lua",
|
||||||
|
"tests/test_waypoints.lua",
|
||||||
|
|
||||||
".install",
|
".install",
|
||||||
".luarocks",
|
".luarocks",
|
||||||
|
59
API.md
59
API.md
@ -12,23 +12,31 @@ Custom tabs can be added to the `i3` inventory as follow (example):
|
|||||||
```Lua
|
```Lua
|
||||||
i3.new_tab("stuff", {
|
i3.new_tab("stuff", {
|
||||||
description = "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)
|
access = function(player, data)
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
return name == "singleplayer"
|
return name == "singleplayer"
|
||||||
end,
|
end,
|
||||||
|
|
||||||
formspec = function(player, data, fs)
|
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,
|
end,
|
||||||
|
|
||||||
-- Events handling happens here
|
-- Events handling happens here
|
||||||
fields = function(player, data, fields)
|
fields = function(player, data, fields)
|
||||||
if fields.mybutton then
|
if fields.mybutton then
|
||||||
do_things()
|
-- Do things
|
||||||
end
|
end
|
||||||
|
|
||||||
|
i3.set_fs(player) -- Update the formspec, mandatory
|
||||||
end,
|
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
|
### Miscellaneous
|
||||||
|
|
||||||
#### `i3.hud_notif(name, msg[, img])`
|
#### `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
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
THE SOFTWARE.
|
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)
|
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.
|
#### **`i3`** is a next-generation inventory for Minetest.
|
||||||
|
|
||||||
|
3
init.lua
3
init.lua
@ -20,7 +20,7 @@ local function lf(path)
|
|||||||
end
|
end
|
||||||
|
|
||||||
i3 = {
|
i3 = {
|
||||||
version = 1121,
|
version = 1131,
|
||||||
data = core.deserialize(storage:get_string"data") or {},
|
data = core.deserialize(storage:get_string"data") or {},
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
@ -121,6 +121,7 @@ end
|
|||||||
|
|
||||||
if i3.settings.debug_mode then
|
if i3.settings.debug_mode then
|
||||||
lf("/tests/test_tabs.lua")()
|
lf("/tests/test_tabs.lua")()
|
||||||
|
lf("/tests/test_waypoints.lua")()
|
||||||
-- lf("/tests/test_operators.lua")()
|
-- lf("/tests/test_operators.lua")()
|
||||||
lf("/tests/test_compression.lua")()
|
lf("/tests/test_compression.lua")()
|
||||||
lf("/tests/test_custom_recipes.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 http = ...
|
||||||
local make_fs, get_inventory_fs = i3.files.gui()
|
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("sorter", "sort_inventory", "play_sound")
|
||||||
|
IMPORT("get_player_by_name", "add_hud_waypoint")
|
||||||
IMPORT("sort", "concat", "copy", "insert", "remove")
|
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")
|
IMPORT("true_str", "true_table", "is_str", "is_func", "is_table", "clean_name")
|
||||||
|
|
||||||
function i3.register_craft_type(name, def)
|
function i3.register_craft_type(name, def)
|
||||||
@ -204,10 +204,10 @@ function i3.remove_tab(name)
|
|||||||
return err "i3.remove_tab: tab name missing"
|
return err "i3.remove_tab: tab name missing"
|
||||||
end
|
end
|
||||||
|
|
||||||
for i, def in ipairs(i3.tabs) do
|
for i = #i3.tabs, 1, -1 do
|
||||||
if name == def.name then
|
local def = i3.tabs[i]
|
||||||
|
if def and name == def.name then
|
||||||
remove(i3.tabs, i)
|
remove(i3.tabs, i)
|
||||||
break
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -315,7 +315,6 @@ function i3.hud_notif(name, msg, img)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local data = i3.data[name]
|
local data = i3.data[name]
|
||||||
|
|
||||||
if not data then
|
if not data then
|
||||||
return err "i3.hud_notif: no player data initialized"
|
return err "i3.hud_notif: no player data initialized"
|
||||||
end
|
end
|
||||||
@ -358,3 +357,76 @@ i3.add_sorting_method("numerical", {
|
|||||||
return list
|
return list
|
||||||
end,
|
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
|
||||||
|
@ -613,13 +613,15 @@ local function reset_data(data)
|
|||||||
end
|
end
|
||||||
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 {
|
return player:hud_add {
|
||||||
hud_elem_type = "waypoint",
|
hud_elem_type = image and "image_waypoint" or "waypoint",
|
||||||
name = name,
|
name = name,
|
||||||
text = "m",
|
text = image or "m",
|
||||||
|
scale = {x = 5, y = 5},
|
||||||
world_pos = pos,
|
world_pos = pos,
|
||||||
number = color,
|
number = color,
|
||||||
|
image = image,
|
||||||
z_index = -300,
|
z_index = -300,
|
||||||
}
|
}
|
||||||
end
|
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]"
|
fs"style_type[label;font=normal;font_size=16;textcolor=#fff]"
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_bag_fs(fs, data, name, esc_name, bag_size, yextra)
|
local function get_bag_fs(fs, data, bag_size, yextra)
|
||||||
fs("list[detached:i3_bag_%s;main;0,%f;1,1;]", esc_name, yextra + 0.7)
|
fs("list[detached:i3_bag_%s;main;0,%f;1,1;]", data.player_name, yextra + 0.7)
|
||||||
local bag = get_detached_inv("bag", name)
|
local bag = get_detached_inv("bag", data.player_name)
|
||||||
if bag:is_empty"main" then return end
|
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}}
|
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
|
end
|
||||||
|
|
||||||
fs("style_type[list;size=%f;spacing=%f]", size, spacing)
|
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]"
|
fs"style_type[list;size=1;spacing=0.15]"
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_container(fs, data, player, yoffset, ctn_len, award_list, awards_unlocked, award_list_nb, bag_size)
|
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)
|
local esc_name = ESC(name)
|
||||||
|
|
||||||
add_subtitle(fs, "player_name", 0, ctn_len, 22, true, 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
|
end
|
||||||
|
|
||||||
if data.subcat == 1 then
|
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
|
elseif data.subcat == 2 then
|
||||||
if not i3.modules.armor then
|
if not i3.modules.armor then
|
||||||
return not_installed "3d_armor"
|
return not_installed "3d_armor"
|
||||||
end
|
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")
|
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)
|
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"
|
return not_installed "skinsdb"
|
||||||
end
|
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 skin_name = skins.get_player_skin(player).name
|
||||||
local spp, add_y = 24, 0
|
local spp, add_y = 24, 0
|
||||||
|
|
||||||
@ -1695,7 +1696,7 @@ local function make_fs(player, data)
|
|||||||
|
|
||||||
local tab = i3.tabs[data.tab]
|
local tab = i3.tabs[data.tab]
|
||||||
|
|
||||||
if tab then
|
if tab and tab.formspec then
|
||||||
tab.formspec(player, data, fs)
|
tab.formspec(player, data, fs)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ local function init_waypoints(player)
|
|||||||
|
|
||||||
for _, v in ipairs(data.waypoints) do
|
for _, v in ipairs(data.waypoints) do
|
||||||
if not v.hide then
|
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
|
v.id = id
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -3,7 +3,8 @@ i3.new_tab("test1", {
|
|||||||
image = "i3_heart.png",
|
image = "i3_heart.png",
|
||||||
|
|
||||||
formspec = function(player, data, fs)
|
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,
|
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