Add API to manage waypoints

This commit is contained in:
Jean-Patrick Guerrero 2023-01-07 12:28:07 +01:00
parent d9a16bf39d
commit a0a3394e18
8 changed files with 145 additions and 14 deletions

View File

@ -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",

43
API.md
View File

@ -309,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])`

View File

@ -1,6 +1,6 @@
![logo](https://user-images.githubusercontent.com/7883281/145490041-d91d6bd6-a654-438d-b208-4d5736845ab7.png) ![logo](https://user-images.githubusercontent.com/7883281/145490041-d91d6bd6-a654-438d-b208-4d5736845ab7.png)
[![MIT License](https://img.shields.io/apm/l/atomic-design-ui.svg?)](https://github.com/tterb/atomic-design-ui/blob/master/LICENSEs) [![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) [![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. #### **`i3`** is a next-generation inventory for Minetest.

View File

@ -20,7 +20,7 @@ local function lf(path)
end end
i3 = { i3 = {
version = 1123, version = 113,
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")()

View File

@ -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

View File

@ -600,8 +600,8 @@ local function reset_data(data)
data.goto_page = nil data.goto_page = nil
data.recipes = nil data.recipes = nil
data.usages = nil data.usages = nil
data.crafting_rcp = nil data.crafting_rcp = nil
data.crafting_usg = nil data.crafting_usg = nil
data.alt_items = nil data.alt_items = nil
data.confirm_trash = nil data.confirm_trash = nil
data.show_settings = nil data.show_settings = nil
@ -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

View File

@ -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

12
tests/test_waypoints.lua Normal file
View 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)