mirror of
https://github.com/minetest-mods/i3.git
synced 2025-07-03 09:00:23 +02:00
Compare commits
22 Commits
Author | SHA1 | Date | |
---|---|---|---|
675349bd40 | |||
e17f4e4c29 | |||
3b1d569118 | |||
d55994c535 | |||
b6b97aa284 | |||
b4482f0acf | |||
e918942439 | |||
889259ac5e | |||
187b0339bd | |||
74e88acadf | |||
9e1f608846 | |||
8289d290a3 | |||
d833199628 | |||
ac7a1fb746 | |||
b95b179a5a | |||
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",
|
||||||
|
125
API.md
125
API.md
@ -1,6 +1,19 @@
|
|||||||
## API
|
# API :screwdriver:
|
||||||
|
|
||||||
### Custom tabs
|
### Table of Contents
|
||||||
|
1. [**Tabs**](https://github.com/minetest-mods/i3/blob/main/API.md#tabs)
|
||||||
|
2. [**Recipes**](https://github.com/minetest-mods/i3/blob/main/API.md#recipes)
|
||||||
|
3. [**Minitabs**](https://github.com/minetest-mods/i3/blob/main/API.md#minitabs)
|
||||||
|
4. [**Recipe filters**](https://github.com/minetest-mods/i3/blob/main/API.md#recipe-filters)
|
||||||
|
5. [**Search filters**](https://github.com/minetest-mods/i3/blob/main/API.md#search-filters)
|
||||||
|
6. [**Sorting methods**](https://github.com/minetest-mods/i3/blob/main/API.md#sorting-methods)
|
||||||
|
7. [**Item list compression**](https://github.com/minetest-mods/i3/blob/main/API.md#item-list-compression)
|
||||||
|
8. [**Waypoints**](https://github.com/minetest-mods/i3/blob/main/API.md#waypoints)
|
||||||
|
9. [**Miscellaneous**](https://github.com/minetest-mods/i3/blob/main/API.md#miscellaneous)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Tabs
|
||||||
|
|
||||||
#### `i3.new_tab(name, def)`
|
#### `i3.new_tab(name, def)`
|
||||||
|
|
||||||
@ -12,23 +25,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
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
@ -64,7 +85,7 @@ A list of registered tabs.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Custom recipes
|
### Recipes
|
||||||
|
|
||||||
Custom recipes are nonconventional crafts outside the main crafting grid.
|
Custom recipes are nonconventional crafts outside the main crafting grid.
|
||||||
They can be registered in-game dynamically and have a size beyond 3x3 items.
|
They can be registered in-game dynamically and have a size beyond 3x3 items.
|
||||||
@ -156,6 +177,53 @@ i3.register_craft {
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### Minitabs
|
||||||
|
|
||||||
|
Manage the tabs on the right panel of the inventory.
|
||||||
|
Allow to make a sensible list sorted by specific groups of items.
|
||||||
|
|
||||||
|
#### `i3.new_minitab(name, def)`
|
||||||
|
|
||||||
|
Add a new minitab (limited to 6).
|
||||||
|
|
||||||
|
- `name` is the tab name.
|
||||||
|
- `def` is the definition table.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```Lua
|
||||||
|
i3.new_minitab("test", {
|
||||||
|
description = "Test",
|
||||||
|
|
||||||
|
-- Whether this tab is visible or not. Optional.
|
||||||
|
access = function(player, data)
|
||||||
|
return player:get_player_name() == "singleplayer"
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- Whether a specific item is shown in the list or not.
|
||||||
|
sorter = function(item, data)
|
||||||
|
return item:find"wood"
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
- `player` is an `ObjectRef` to the user.
|
||||||
|
- `data` are the user data.
|
||||||
|
- `item` is an item name string.
|
||||||
|
|
||||||
|
#### `i3.remove_minitab(name)`
|
||||||
|
|
||||||
|
Remove a minitab by name.
|
||||||
|
|
||||||
|
- `name` is the name of the tab to remove.
|
||||||
|
|
||||||
|
#### `i3.minimap`
|
||||||
|
|
||||||
|
A list of registered minitabs.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### Recipe filters
|
### Recipe filters
|
||||||
|
|
||||||
Recipe filters can be used to filter the recipes shown to players. Progressive
|
Recipe filters can be used to filter the recipes shown to players. Progressive
|
||||||
@ -301,6 +369,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])`
|
||||||
|
10
LICENSE
10
LICENSE
@ -3,7 +3,7 @@ License of source code
|
|||||||
|
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2020-2021 Jean-Patrick Guerrero and contributors.
|
Copyright (c) 2020-2023 Jean-Patrick Guerrero and contributors.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -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.
|
||||||
|
|
||||||
|
6
init.lua
6
init.lua
@ -20,7 +20,7 @@ local function lf(path)
|
|||||||
end
|
end
|
||||||
|
|
||||||
i3 = {
|
i3 = {
|
||||||
version = 1121,
|
version = 114,
|
||||||
data = core.deserialize(storage:get_string"data") or {},
|
data = core.deserialize(storage:get_string"data") or {},
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
@ -34,7 +34,7 @@ i3 = {
|
|||||||
save_interval = 600, -- Player data save interval (in seconds)
|
save_interval = 600, -- Player data save interval (in seconds)
|
||||||
|
|
||||||
hud_speed = 1,
|
hud_speed = 1,
|
||||||
hud_timer_max = 1.5,
|
hud_timer_max = 3,
|
||||||
|
|
||||||
damage_enabled = core.settings:get_bool"enable_damage",
|
damage_enabled = core.settings:get_bool"enable_damage",
|
||||||
progressive_mode = core.settings:get_bool"i3_progressive_mode",
|
progressive_mode = core.settings:get_bool"i3_progressive_mode",
|
||||||
@ -101,6 +101,7 @@ i3 = {
|
|||||||
groups = {},
|
groups = {},
|
||||||
plants = {},
|
plants = {},
|
||||||
modules = {},
|
modules = {},
|
||||||
|
minitabs = {},
|
||||||
craft_types = {},
|
craft_types = {},
|
||||||
|
|
||||||
recipe_filters = {},
|
recipe_filters = {},
|
||||||
@ -121,6 +122,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.
136
src/api.lua
136
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,128 @@ 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
|
||||||
|
|
||||||
|
function i3.new_minitab(name, def)
|
||||||
|
if #i3.minitabs == 6 then
|
||||||
|
return err "i3.new_minitab: limit reached (6)"
|
||||||
|
elseif not true_str(name) then
|
||||||
|
return err "i3.new_minitab: name missing"
|
||||||
|
elseif not true_table(def) then
|
||||||
|
return err "i3.new_minitab: definition missing"
|
||||||
|
end
|
||||||
|
|
||||||
|
def.name = name
|
||||||
|
insert(i3.minitabs, def)
|
||||||
|
end
|
||||||
|
|
||||||
|
function i3.remove_minitab(name)
|
||||||
|
if not true_str(name) then
|
||||||
|
return err "i3.remove_minitab: name missing"
|
||||||
|
elseif name == "all" then
|
||||||
|
return err "i3.remove_minitab: removing the 'All' tab is not allowed"
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = #i3.minitabs, 1, -1 do
|
||||||
|
local v = i3.minitabs[i]
|
||||||
|
if v and v.name == name then
|
||||||
|
remove(i3.minitabs, i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
i3.new_minitab("all", {
|
||||||
|
description = "All",
|
||||||
|
|
||||||
|
sorter = function()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
i3.new_minitab("nodes", {
|
||||||
|
description = "Nodes",
|
||||||
|
|
||||||
|
sorter = function(item)
|
||||||
|
return core.registered_nodes[item]
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
i3.new_minitab("items", {
|
||||||
|
description = "Items",
|
||||||
|
|
||||||
|
sorter = function(item)
|
||||||
|
return core.registered_craftitems[item] or core.registered_tools[item]
|
||||||
|
end
|
||||||
|
})
|
||||||
|
@ -178,13 +178,9 @@ local function cache_recipes(item)
|
|||||||
_recipes[#recipes + 1 - k] = v
|
_recipes[#recipes + 1 - k] = v
|
||||||
end
|
end
|
||||||
|
|
||||||
local shift = 0
|
|
||||||
local size_rpl = maxn(replacements[item])
|
local size_rpl = maxn(replacements[item])
|
||||||
local size_rcp = #_recipes
|
local size_rcp = #_recipes
|
||||||
|
local shift = size_rcp - size_rpl
|
||||||
if size_rpl > size_rcp then
|
|
||||||
shift = size_rcp - size_rpl
|
|
||||||
end
|
|
||||||
|
|
||||||
for k, v in pairs(replacements[item]) do
|
for k, v in pairs(replacements[item]) do
|
||||||
k += shift
|
k += shift
|
||||||
|
@ -360,13 +360,8 @@ local function sort_by_category(data)
|
|||||||
|
|
||||||
for i = 1, #items do
|
for i = 1, #items do
|
||||||
local item = items[i]
|
local item = items[i]
|
||||||
local to_add = true
|
local tab = i3.minitabs[data.itab]
|
||||||
|
local to_add = tab.sorter(item, data)
|
||||||
if data.itab == 2 then
|
|
||||||
to_add = core.registered_nodes[item]
|
|
||||||
elseif data.itab == 3 then
|
|
||||||
to_add = core.registered_craftitems[item] or core.registered_tools[item]
|
|
||||||
end
|
|
||||||
|
|
||||||
if to_add then
|
if to_add then
|
||||||
insert(new, item)
|
insert(new, item)
|
||||||
@ -413,6 +408,11 @@ local function get_stack(player, stack)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function get_group_items(name)
|
||||||
|
local groups = extract_groups(name)
|
||||||
|
return i3.groups[name:sub(7)].items or groups_to_items(groups)
|
||||||
|
end
|
||||||
|
|
||||||
local function craft_stack(player, data, craft_rcp)
|
local function craft_stack(player, data, craft_rcp)
|
||||||
local inv = player:get_inventory()
|
local inv = player:get_inventory()
|
||||||
local rcp_usg = craft_rcp and "recipe" or "usage"
|
local rcp_usg = craft_rcp and "recipe" or "usage"
|
||||||
@ -427,32 +427,42 @@ local function craft_stack(player, data, craft_rcp)
|
|||||||
|
|
||||||
if is_group(name) then
|
if is_group(name) then
|
||||||
items = {}
|
items = {}
|
||||||
local groups = extract_groups(name)
|
local item_groups = get_group_items(name)
|
||||||
local groupname = name:sub(7)
|
|
||||||
local item_groups = i3.groups[groupname].items or groups_to_items(groups)
|
|
||||||
local remaining = count
|
local remaining = count
|
||||||
|
|
||||||
for _, item in ipairs(item_groups) do
|
for _, item in ipairs(item_groups) do
|
||||||
for _name, _count in pairs(data.crafting_counts[rcp_usg].inv) do
|
for _name, _count in pairs(data.crafting_counts[rcp_usg].inv) do
|
||||||
if item == _name and remaining > 0 then
|
if item == _name and remaining > 0 then
|
||||||
local c = min(remaining, _count)
|
local c = min(remaining, _count)
|
||||||
items[item] = c
|
items[item] = c
|
||||||
remaining -= c
|
remaining -= c
|
||||||
|
end
|
||||||
|
|
||||||
|
if remaining == 0 then break end
|
||||||
end
|
end
|
||||||
|
|
||||||
if remaining == 0 then break end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for k, v in pairs(items) do
|
for item, v in pairs(items) do
|
||||||
inv:remove_item("main", fmt("%s %s", k, v * scrbar_val))
|
for _ = 1, v * scrbar_val do
|
||||||
end
|
inv:remove_item("main", item)
|
||||||
end
|
|
||||||
|
|
||||||
if rcp_def.replacements then
|
for _, pair in ipairs(rcp_def.replacements or {}) do
|
||||||
for _, pair in ipairs(rcp_def.replacements) do
|
local old_name, new_name = unpack(pair)
|
||||||
get_stack(player, ItemStack(pair[2]))
|
|
||||||
|
if is_group(old_name) then
|
||||||
|
local item_groups = get_group_items(old_name)
|
||||||
|
|
||||||
|
for _, it in ipairs(item_groups) do
|
||||||
|
if item == it then
|
||||||
|
get_stack(player, ItemStack(new_name))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif item == old_name then
|
||||||
|
get_stack(player, ItemStack(new_name))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -600,8 +610,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 +623,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
|
||||||
|
91
src/gui.lua
91
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
|
||||||
|
|
||||||
@ -945,6 +946,10 @@ local function get_output_fs(fs, data, rcp, is_recipe, is_usage, shapeless, righ
|
|||||||
local itemstr = ESC(item:to_string())
|
local itemstr = ESC(item:to_string())
|
||||||
item_image_button(X + 0.11, Y, BTN_SIZE, BTN_SIZE, itemstr, _name, "")
|
item_image_button(X + 0.11, Y, BTN_SIZE, BTN_SIZE, itemstr, _name, "")
|
||||||
|
|
||||||
|
if item:get_stack_max() < count then
|
||||||
|
label(X + 1.05, Y + 1, count)
|
||||||
|
end
|
||||||
|
|
||||||
local def = reg_items[name]
|
local def = reg_items[name]
|
||||||
local unknown = not def or nil
|
local unknown = not def or nil
|
||||||
local desc = def and def.description
|
local desc = def and def.description
|
||||||
@ -1043,11 +1048,9 @@ local function get_grid_fs(fs, data, rcp, is_recipe, is_usage)
|
|||||||
local label = groups and "\nG" or ""
|
local label = groups and "\nG" or ""
|
||||||
local replace
|
local replace
|
||||||
|
|
||||||
for j = 1, #(rcp.replacements or {}) do
|
for _, replacement in ipairs(rcp.replacements or {}) do
|
||||||
local replacement = rcp.replacements[j]
|
|
||||||
if replacement[1] == name then
|
if replacement[1] == name then
|
||||||
replace = replace or {type = rcp.type, items = {}}
|
replace = replace or {type = rcp.type, items = {}}
|
||||||
|
|
||||||
local added
|
local added
|
||||||
|
|
||||||
for _, v in ipairs(replace.items) do
|
for _, v in ipairs(replace.items) do
|
||||||
@ -1058,12 +1061,17 @@ local function get_grid_fs(fs, data, rcp, is_recipe, is_usage)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if not added then
|
if not added then
|
||||||
label = fmt("%s%s\nR", label ~= "" and "\n" or "", label)
|
label = fmt("%s\nR", label)
|
||||||
insert(replace.items, replacement[2])
|
insert(replace.items, replacement[2])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local _, count_sub = label:gsub("\n", "")
|
||||||
|
if count_sub == 2 then
|
||||||
|
label = label:sub(2)
|
||||||
|
end
|
||||||
|
|
||||||
if not large_recipe then
|
if not large_recipe then
|
||||||
slot(X, Y, btn_size, btn_size)
|
slot(X, Y, btn_size, btn_size)
|
||||||
end
|
end
|
||||||
@ -1086,7 +1094,12 @@ local function get_grid_fs(fs, data, rcp, is_recipe, is_usage)
|
|||||||
item:set_name(name)
|
item:set_name(name)
|
||||||
item:set_count(count)
|
item:set_count(count)
|
||||||
local itemstr = ESC(item:to_string())
|
local itemstr = ESC(item:to_string())
|
||||||
|
|
||||||
item_image_button(X, Y, btn_size, btn_size, itemstr, btn_name, label)
|
item_image_button(X, Y, btn_size, btn_size, itemstr, btn_name, label)
|
||||||
|
|
||||||
|
if item:get_stack_max() < count then
|
||||||
|
label(X + 0.95, Y + 0.95, count)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local def = reg_items[name]
|
local def = reg_items[name]
|
||||||
@ -1390,7 +1403,20 @@ local function get_header_items_fs(fs, data)
|
|||||||
end
|
end
|
||||||
|
|
||||||
box(X + 1, 0.2, 0.01, 0.5, "#bababa50")
|
box(X + 1, 0.2, 0.01, 0.5, "#bababa50")
|
||||||
local cat = {{"all", "all items"}, {"node", "nodes only"}, {"item", "items only"}}
|
|
||||||
|
local cat = {{"all", "all items"}}
|
||||||
|
|
||||||
|
if not recipe_filter_set() then
|
||||||
|
for _, v in ipairs(i3.minitabs) do
|
||||||
|
if v.name == "Nodes" then
|
||||||
|
insert(cat, {"node", "nodes only"})
|
||||||
|
end
|
||||||
|
|
||||||
|
if v.name == "Items" then
|
||||||
|
insert(cat, {"item", "items only"})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
for i in ipairs(cat) do
|
for i in ipairs(cat) do
|
||||||
local name, desc = unpack(cat[i])
|
local name, desc = unpack(cat[i])
|
||||||
@ -1451,22 +1477,37 @@ local function get_header_items_fs(fs, data)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_minitabs(fs, data, full_height)
|
local function get_minitabs(fs, data, player, full_height)
|
||||||
local _tabs = {"All", "Nodes", "Items"}
|
local minitabs = {}
|
||||||
local tab_len, tab_hgh = 1.8, 0.5
|
|
||||||
|
|
||||||
for i, title in ipairs(_tabs) do
|
for i, v in ipairs(i3.minitabs) do
|
||||||
local selected = i == data.itab
|
local access = v.access
|
||||||
|
|
||||||
|
if access == nil or access(player, data) then
|
||||||
|
minitabs[i] = v.description
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local tab_len, tab_hgh, i = 1.8, 0.5, 0
|
||||||
|
|
||||||
|
for id, title in pairs(minitabs) do
|
||||||
|
i++
|
||||||
|
local top = i > 3
|
||||||
|
local X = top and i - 3 or i
|
||||||
|
local selected = id == data.itab
|
||||||
local hover_texture = selected and PNG.tab_small_hover or PNG.tab_small
|
local hover_texture = selected and PNG.tab_small_hover or PNG.tab_small
|
||||||
|
local flip = top and "^[transformFY" or ""
|
||||||
|
|
||||||
fs([[ style_type[image_button;bgimg=%s;bgimg_hovered=%s;
|
fs([[ style_type[image_button;bgimg=%s%s;bgimg_hovered=%s%s;
|
||||||
bgimg_middle=14,0,-14,-14;padding=-14,0,14,14] ]], hover_texture, PNG.tab_small_hover)
|
bgimg_middle=14,0,-14,-14;padding=-14,0,14,14] ]],
|
||||||
|
hover_texture, flip, PNG.tab_small_hover, flip)
|
||||||
|
|
||||||
fs([[ style_type[image_button;noclip=true;font=bold;font_size=16;
|
fs([[ style_type[image_button;noclip=true;font=bold;font_size=16;
|
||||||
textcolor=%s;content_offset=0;sound=i3_tab] ]], selected and "#fff" or "#bbb")
|
textcolor=%s;content_offset=0;sound=i3_tab] ]], selected and "#fff" or "#bbb")
|
||||||
fs"style_type[image_button:hovered;textcolor=#fff]"
|
fs"style_type[image_button:hovered;textcolor=#fff]"
|
||||||
image_button((data.inv_width - 0.65) + (i * (tab_len + 0.1)),
|
|
||||||
full_height, tab_len, tab_hgh, "", fmt("itab_%u", i), title)
|
image_button((data.inv_width - 0.65) + (X * (tab_len + 0.1)),
|
||||||
|
top and -tab_hgh or full_height, tab_len, tab_hgh, "", fmt("itab_%u", id), title)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1514,7 +1555,7 @@ local function get_items_fs(fs, data, player, full_height)
|
|||||||
|
|
||||||
local item_btn = fmt("item_image_button", X, Y, size, size, name, item, "")
|
local item_btn = fmt("item_image_button", X, Y, size, size, name, item, "")
|
||||||
|
|
||||||
if recipe_filter_set() then
|
if recipe_filter_set() and data.itab == 1 then
|
||||||
if data.items_progress[item] then
|
if data.items_progress[item] then
|
||||||
insert(fs, item_btn)
|
insert(fs, item_btn)
|
||||||
else
|
else
|
||||||
@ -1695,7 +1736,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
|
||||||
|
|
||||||
@ -1705,7 +1746,7 @@ local function make_fs(player, data)
|
|||||||
get_items_fs(fs, data, player, full_height)
|
get_items_fs(fs, data, player, full_height)
|
||||||
|
|
||||||
if not data.hide_tabs then
|
if not data.hide_tabs then
|
||||||
get_minitabs(fs, data, full_height)
|
get_minitabs(fs, data, player, full_height)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
63
src/hud.lua
63
src/hud.lua
@ -15,16 +15,18 @@ local function init_hud(player)
|
|||||||
data.hud = {
|
data.hud = {
|
||||||
bg = player:hud_add {
|
bg = player:hud_add {
|
||||||
hud_elem_type = "image",
|
hud_elem_type = "image",
|
||||||
position = {x = 0.78, y = 1},
|
position = {x = 1, y = 1},
|
||||||
|
offset = {x = -320, y = 0},
|
||||||
alignment = {x = 1, y = 1},
|
alignment = {x = 1, y = 1},
|
||||||
scale = {x = 370, y = 112},
|
scale = {x = 300, y = 105},
|
||||||
text = "i3_bg.png",
|
text = "i3_bg.png",
|
||||||
z_index = 0xDEAD,
|
z_index = 0xDEAD,
|
||||||
},
|
},
|
||||||
|
|
||||||
img = player:hud_add {
|
img = player:hud_add {
|
||||||
hud_elem_type = "image",
|
hud_elem_type = "image",
|
||||||
position = {x = 0.79, y = 1.02},
|
position = {x = 1, y = 1},
|
||||||
|
offset = {x = -310, y = 20},
|
||||||
alignment = {x = 1, y = 1},
|
alignment = {x = 1, y = 1},
|
||||||
scale = {x = 1, y = 1},
|
scale = {x = 1, y = 1},
|
||||||
text = "",
|
text = "",
|
||||||
@ -33,7 +35,8 @@ local function init_hud(player)
|
|||||||
|
|
||||||
text = player:hud_add {
|
text = player:hud_add {
|
||||||
hud_elem_type = "text",
|
hud_elem_type = "text",
|
||||||
position = {x = 0.84, y = 1.04},
|
position = {x = 1, y = 1},
|
||||||
|
offset = {x = -235, y = 40},
|
||||||
alignment = {x = 1, y = 1},
|
alignment = {x = 1, y = 1},
|
||||||
number = 0xffffff,
|
number = 0xffffff,
|
||||||
text = "",
|
text = "",
|
||||||
@ -55,13 +58,12 @@ local function init_hud(player)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function show_hud(player, data)
|
local function show_hud(player, data)
|
||||||
-- It would better to have an engine function `hud_move` to only need
|
|
||||||
-- 2 calls for the notification's back and forth.
|
|
||||||
|
|
||||||
local hud_info_bg = player:hud_get(data.hud.bg)
|
local hud_info_bg = player:hud_get(data.hud.bg)
|
||||||
local dt = 0.025
|
local dt = 0.016
|
||||||
|
local offset_y = hud_info_bg.offset.y
|
||||||
|
local speed = 5 * i3.settings.hud_speed
|
||||||
|
|
||||||
if hud_info_bg.position.y <= 0.9 then
|
if offset_y < -100 then
|
||||||
data.show_hud = false
|
data.show_hud = false
|
||||||
data.hud_timer = (data.hud_timer or 0) + dt
|
data.hud_timer = (data.hud_timer or 0) + dt
|
||||||
end
|
end
|
||||||
@ -73,31 +75,34 @@ local function show_hud(player, data)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if data.show_hud then
|
if data.show_hud then
|
||||||
for _, def in pairs(data.hud) do
|
for name, def in pairs(data.hud) do
|
||||||
local hud_info = player:hud_get(def)
|
if name ~= "wielditem" then
|
||||||
|
|
||||||
player:hud_change(def, "position", {
|
|
||||||
x = hud_info.position.x,
|
|
||||||
y = hud_info.position.y - ((dt / 5) * i3.settings.hud_speed)
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
elseif data.show_hud == false then
|
|
||||||
if data.hud_timer >= i3.settings.hud_timer_max then
|
|
||||||
for _, def in pairs(data.hud) do
|
|
||||||
local hud_info = player:hud_get(def)
|
local hud_info = player:hud_get(def)
|
||||||
|
|
||||||
player:hud_change(def, "position", {
|
player:hud_change(def, "offset", {
|
||||||
x = hud_info.position.x,
|
x = hud_info.offset.x,
|
||||||
y = hud_info.position.y + ((dt / 5) * i3.settings.hud_speed)
|
y = hud_info.offset.y - speed
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
elseif data.show_hud == false then
|
||||||
|
if data.hud_timer >= i3.settings.hud_timer_max then
|
||||||
|
for name, def in pairs(data.hud) do
|
||||||
|
if name ~= "wielditem" then
|
||||||
|
local hud_info = player:hud_get(def)
|
||||||
|
|
||||||
if hud_info_bg.position.y >= 1 then
|
player:hud_change(def, "offset", {
|
||||||
data.show_hud = nil
|
x = hud_info.offset.x,
|
||||||
|
y = hud_info.offset.y + speed
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if offset_y > 0 then
|
||||||
|
data.show_hud = nil
|
||||||
data.hud_timer = nil
|
data.hud_timer = nil
|
||||||
data.hud_msg = nil
|
data.hud_msg = nil
|
||||||
data.hud_img = nil
|
data.hud_img = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -165,7 +170,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
|
||||||
|
@ -2,9 +2,19 @@ local set_fs = i3.set_fs
|
|||||||
local hud_notif = i3.hud_notif
|
local hud_notif = i3.hud_notif
|
||||||
local POLL_FREQ = 0.25
|
local POLL_FREQ = 0.25
|
||||||
|
|
||||||
IMPORT("reg_items", "reg_nodes")
|
IMPORT("reg_items", "reg_nodes", "fmt", "table_merge", "array_diff")
|
||||||
IMPORT("fmt", "search", "table_merge", "array_diff")
|
IMPORT("is_group", "extract_groups", "item_has_groups", "apply_recipe_filters", "sort_by_category")
|
||||||
IMPORT("is_group", "extract_groups", "item_has_groups", "apply_recipe_filters")
|
|
||||||
|
i3.remove_minitab"nodes"
|
||||||
|
i3.remove_minitab"items"
|
||||||
|
|
||||||
|
i3.new_minitab("unlocked", {
|
||||||
|
description = "Unlocked",
|
||||||
|
|
||||||
|
sorter = function(item, data)
|
||||||
|
return data.items_progress[item]
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
local function get_filtered_items(player, data)
|
local function get_filtered_items(player, data)
|
||||||
local items, known = {}, 0
|
local items, known = {}, 0
|
||||||
@ -145,9 +155,8 @@ local function poll_new_items(player, data, join)
|
|||||||
end
|
end
|
||||||
|
|
||||||
data.items_progress = items
|
data.items_progress = items
|
||||||
data.itab = 1
|
|
||||||
|
|
||||||
search(data)
|
sort_by_category(data)
|
||||||
set_fs(player)
|
set_fs(player)
|
||||||
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