Compare commits

...

6 Commits

Author SHA1 Message Date
da91223c4d Bump version 2022-09-18 14:24:45 +02:00
408267754c API.md: rewrite some parts 2022-09-15 12:28:23 +02:00
b4de48370a HUD: small tweak 2022-09-14 15:37:29 +02:00
477efe56d3 Bump version 2022-09-04 19:17:42 +02:00
8afb51dae8 Some cleaning 2022-09-04 19:12:57 +02:00
734b09b69f Minor cleaning 2022-08-29 11:29:09 +02:00
7 changed files with 105 additions and 96 deletions

38
API.md
View File

@ -21,31 +21,33 @@ i3.new_tab("stuff", {
end,
formspec = function(player, data, fs)
fs("label[3,1;This is just a test]")
fs"label[3,1;This is just a test]"
end,
-- Events handling happens here
fields = function(player, data, fields)
if fields.mybutton then
do_things()
end
end,
})
```
- `player` is an `ObjectRef` to the user.
- `data` are the user data.
- `fs` is the formspec table which is callable with a metamethod. Each call adds a new entry.
- `fs` is the formspec table which is callable with a metamethod. Every call adds a new entry.
#### `i3.set_fs(player)`
Updates the current formspec.
Update the current formspec.
#### `i3.remove_tab(tabname)`
Deletes a tab by name.
Delete a tab by name.
#### `i3.get_current_tab(player)`
Returns the current player tab. `player` is an `ObjectRef` to the user.
Return the current player tab. `player` is an `ObjectRef` to the user.
#### `i3.set_tab(player[, tabname])`
@ -54,7 +56,7 @@ Sets the current tab by name. `player` is an `ObjectRef` to the user.
#### `i3.override_tab(tabname, def)`
Overrides a tab by name. `def` is the tab definition like seen in `i3.set_tab`.
Override a tab by name. `def` is the tab definition like seen in `i3.set_tab`
#### `i3.tabs`
@ -68,9 +70,11 @@ Custom recipes are nonconventional crafts outside the main crafting grid.
They can be registered in-game dynamically and have a size beyond 3x3 items.
**Note:** the registration format differs from the default registration format in everything.
The width is automatically calculated depending where you place the commas. Look at the examples attentively.
The width is automatically calculated depending where you place the commas.
#### Registering a custom crafting type (example)
Examples:
#### Registering a custom crafting type
```Lua
i3.register_craft_type("digging", {
@ -79,7 +83,7 @@ i3.register_craft_type("digging", {
})
```
#### Registering a custom crafting recipe (examples)
#### Registering a custom crafting recipe
```Lua
i3.register_craft {
@ -159,7 +163,7 @@ mode is implemented as a recipe filter.
#### `i3.add_recipe_filter(name, function(recipes, player))`
Adds a recipe filter with the given `name`. The filter function returns the
Add a recipe filter with the given `name`. The filter function returns the
recipes to be displayed, given the available recipes and an `ObjectRef` to the
user. Each recipe is a table of the form returned by
`minetest.get_craft_recipe`.
@ -181,7 +185,7 @@ end)
#### `i3.set_recipe_filter(name, function(recipe, player))`
Removes all recipe filters and adds a new one.
Remove all recipe filters and add a new one.
#### `i3.recipe_filters`
@ -207,7 +211,7 @@ Notes:
#### `i3.add_search_filter(name, function(item, values))`
Adds a search filter.
Add a search filter.
The search function must return a boolean value (whether the given item should be listed or not).
- `name` is the filter name.
@ -241,7 +245,7 @@ Sorting methods are used to filter the player's main inventory.
#### `i3.add_sorting_method(name, def)`
Adds a player inventory sorting method.
Add a player inventory sorting method.
- `name` is the method name.
- `def` is the method definition.
@ -276,7 +280,7 @@ A table containing all sorting methods.
#### `i3.compress(item, def)`
Adds a new group of items to compress.
Add a new group of items to compress.
- `item` is the item which represent the group of compressed items.
- `def` is a table specifying the substring replace patterns to be used.
@ -301,7 +305,7 @@ A map of all compressed item groups, indexed by stereotypes.
#### `i3.hud_notif(name, msg[, img])`
Shows a Steam-like HUD notification on the bottom-right corner of the screen (experimental).
Show a Steam-like HUD notification on the bottom-right corner of the screen (experimental).
- `name` is the player name.
- `msg` is the HUD message to show.
@ -309,7 +313,7 @@ Shows a Steam-like HUD notification on the bottom-right corner of the screen (ex
#### `i3.get_recipes(item)`
Returns a table of recipes and usages of `item`.
Return a table of recipes and usages of `item`.
#### `i3.export_url`

View File

@ -20,7 +20,7 @@ local function lf(path)
end
i3 = {
version = 1113,
version = 1115,
data = core.deserialize(storage:get_string"data") or {},
settings = {

View File

@ -2,7 +2,7 @@ local replacements = {fuel = {}}
local http = ...
IMPORT("maxn", "copy", "insert", "sort", "match", "sub")
IMPORT("true_str", "is_table", "valid_item", "table_merge", "table_replace", "rcp_eq")
IMPORT("true_str", "is_table", "valid_item", "table_merge", "table_replace", "table_eq")
IMPORT("fmt", "reg_items", "reg_aliases", "reg_nodes", "is_cube", "get_cube", "ItemStack")
IMPORT("is_group", "extract_groups", "item_has_groups", "groups_to_items", "get_group_stereotype")
@ -248,11 +248,7 @@ local old_clear_craft = core.clear_craft
core.clear_craft = function(def)
old_clear_craft(def)
if true_str(def) then
return -- TODO
elseif is_table(def) then
return -- TODO
end
-- TODO: hide in crafting guide
end
local function resolve_aliases(hash)
@ -274,7 +270,7 @@ local function resolve_aliases(hash)
local rcp_new = copy(i3.recipes_cache[newname][j])
rcp_new.output = oldname
if rcp_eq(rcp_old, rcp_new) then
if table_eq(rcp_old, rcp_new) then
similar = true
break
end

View File

@ -148,10 +148,6 @@ if core.global_exists"skins" then
i3.modules.skins = true
end
if core.global_exists"hb" then
i3.modules.hudbars = true
end
if core.global_exists"awards" then
i3.modules.awards = true

View File

@ -216,18 +216,22 @@ local function array_diff(t1, t2)
return diff
end
local function rcp_eq(rcp, rcp2)
if rcp.type ~= rcp2.type then return end
if rcp.width ~= rcp2.width then return end
if #rcp.items ~= #rcp2.items then return end
if rcp.output ~= rcp2.output then return end
local function table_eq(t1, t2)
local ty1, ty2 = type(t1), type(t2)
if ty1 ~= ty2 then return end
for i, item in pairs(rcp.items) do
if item ~= rcp2.items[i] then return end
if ty1 ~= "table" and ty2 ~= "table" then
return t1 == t2
end
for i, item in pairs(rcp2.items) do
if item ~= rcp.items[i] then return end
for k, v in pairs(t1) do
local v2 = t2[k]
if v2 == nil or not table_eq(v, v2) then return end
end
for k, v in pairs(t2) do
local v1 = t1[k]
if v1 == nil or not table_eq(v1, v) then return end
end
return true
@ -764,7 +768,7 @@ local _ = {
is_table = is_table,
table_merge = table_merge,
table_replace = table_replace,
rcp_eq = rcp_eq,
table_eq = table_eq,
array_diff = array_diff,
-- Math

View File

@ -4,6 +4,14 @@ local function init_hud(player)
local name = player:get_player_name()
local data = i3.data[name]
local wdesc_y = -90
if core.global_exists"hb" then
wdesc_y -= ceil(hb.hudbars_count / 2) * 5
elseif not i3.settings.damage_enabled then
wdesc_y += 15
end
data.hud = {
bg = player:hud_add {
hud_elem_type = "image",
@ -36,7 +44,7 @@ local function init_hud(player)
wielditem = player:hud_add {
hud_elem_type = "text",
position = {x = 0.5, y = 1},
offset = {x = 0, y = -65 - (i3.modules.hudbars and (ceil(hb.hudbars_count / 2) * 25) or 25)},
offset = {x = 0, y = wdesc_y},
alignment = {x = 0, y = -1},
number = 0xffffff,
text = "",
@ -105,28 +113,22 @@ core.register_globalstep(function(dt)
local data = i3.data[name]
if not data then return end
local function reset()
player:hud_change(data.hud.wielditem, "text", "")
data.timer = 0
end
if not data.wielditem_hud then
return reset()
player:hud_change(data.hud.wielditem, "text", "")
return
end
data.timer = (data.timer or 0) + dt
local wieldidx = player:get_wield_index()
if wieldidx == data.old_wieldidx then
if data.timer >= i3.settings.wielditem_fade_after then
return reset()
player:hud_change(data.hud.wielditem, "text", "")
end
return
else
data.timer = 0
end
data.timer = 0
data.old_wieldidx = wieldidx
local wielditem = player:get_wielded_item()

View File

@ -11,32 +11,39 @@ mt3:get_meta():set_string("description", "Worn Pick")
mt3:get_meta():set_string("color", "yellow")
mt3:set_wear(10000)
minetest.register_craft({
minetest.register_craft {
output = mt:to_string(),
type = "shapeless",
recipe = {
"default:wood",
mt2:to_string(),
},
})
}
minetest.register_craft({
minetest.register_craft {
output = mt3:to_string(),
type = "shapeless",
recipe = {
"default:pick_mese",
"default:diamond",
},
})
}
minetest.clear_craft {
recipe = {
{"default:sand", "default:sand"},
{"default:sand", "default:sand"},
},
}
i3.register_craft {
url = "https://raw.githubusercontent.com/minetest-mods/i3/main/tests/test_online_recipe.json"
}
i3.register_craft({
i3.register_craft {
result = "default:ladder_wood 2",
items = {"default:copper_ingot 7, default:tin_ingot, default:steel_ingot 2"},
})
}
i3.register_craft {
result = "default:tree",
@ -56,7 +63,7 @@ i3.register_craft {
}
}
i3.register_craft({
i3.register_craft {
grid = {
"X",
"#",
@ -68,9 +75,9 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X",
"#X",
@ -82,9 +89,9 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X",
},
@ -93,10 +100,10 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X#",
},
@ -105,9 +112,9 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X#X",
},
@ -116,9 +123,9 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X#XX",
},
@ -127,9 +134,9 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X#XX",
"X#X",
@ -139,9 +146,9 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X#XX",
"X#X",
@ -152,9 +159,9 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X##XX",
},
@ -163,9 +170,9 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X##X#X",
},
@ -174,9 +181,9 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X##X#X",
"",
@ -187,9 +194,9 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X #",
" ## ",
@ -201,9 +208,9 @@ i3.register_craft({
['X'] = "default:glass 2",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X #",
" ## ",
@ -215,9 +222,9 @@ i3.register_craft({
['X'] = "default:glass",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X #",
" ## ",
@ -230,9 +237,9 @@ i3.register_craft({
['X'] = "default:glass",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X #",
" ## ",
@ -245,10 +252,10 @@ i3.register_craft({
['X'] = "default:glass",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X #",
" ## ",
@ -262,9 +269,9 @@ i3.register_craft({
['X'] = "default:glass",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X #",
" ## ",
@ -278,9 +285,9 @@ i3.register_craft({
['X'] = "default:glass",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X #",
" ## ",
@ -294,9 +301,9 @@ i3.register_craft({
['X'] = "default:glass",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X #",
" ## ",
@ -310,9 +317,9 @@ i3.register_craft({
['X'] = "default:glass",
},
result = "default:mese 3",
})
}
i3.register_craft({
i3.register_craft {
grid = {
"X #",
" ## ",
@ -328,4 +335,4 @@ i3.register_craft({
['X'] = "default:glass",
},
result = "default:mese 3",
})
}