This commit is contained in:
flux 2022-06-19 15:26:05 -07:00
parent 31f7d56a33
commit 5990d7c6a4
20 changed files with 617 additions and 144 deletions

View File

@ -31,8 +31,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- maybe: [world aligned textures](https://github.com/minetest-mods/moreblocks/issues/179)
- maybe: [Make microblocks work for nodes with layered textures](https://github.com/minetest-mods/moreblocks/issues/178)
- [Make variants of nodes that can burn also burnable](https://github.com/minetest-mods/moreblocks/issues/177)
- \* [Add screenshot in README.md](https://github.com/minetest-mods/moreblocks/issues/151)
- \* [Slab back to full block](https://github.com/minetest-mods/moreblocks/issues/112)
- [Add screenshot in README.md](https://github.com/minetest-mods/moreblocks/issues/151)
- [Slab back to full block](https://github.com/minetest-mods/moreblocks/issues/112)
- [Conserve left-over microblocks](https://github.com/minetest-mods/moreblocks/pull/108)
- maybe some of the other bugs/PRS, but they mostly either seem to be fixed or unfixable

View File

@ -13,7 +13,7 @@ world block sandbox game.
[Source repo](https://github.com/minetest-mods/moreblocks/)
## Version compatibility
## Minetest Version compatibility
More Blocks is currently primarily tested with Minetest 5.5.0+.
It may or may not work with newer or older versions. Issues arising in older
@ -25,28 +25,53 @@ The 3.0.0 release of moreblocks introduces a "legacy" mode, which is on by defau
allow new servers to not commit to creating as many nodes as older versions, while not breaking anything
on existing servers. See `settingtypes.txt` for available settings.
## Mods in the pack
# Mods in the pack
### moreblocks
## moreblocks
Defines a bunch of new kinds of nodes. Provides an API for creating variants of some nodes.
### stairsplus
## stairsplus
Allows the creation of 49 new shapes for registered nodes.
### stairsplus_legacy
## stairsplus_legacy
Stairs+ registrations for various mods which were formerly done automatically as part of moreblocks.
## License
## invsaw
# Documentation
## for plaers
## for admins
## for mod makers
see moreblocks/API.md and stairsplus/API.md
# License
## moreblocks, stairsplus, stairsplus legacy
Copyright © 2011-2022 Hugo Locurcio and contributors
- More Blocks code is licensed under the zlib license, see
[`LICENSE.md`](LICENSE.md) for details.
- This is an altered version of the code which is not distributed by Hugo Locurcio.
- Unless otherwise specified, More Blocks textures are licensed under
[CC BY-SA 3.0 Unported](https://creativecommons.org/licenses/by-sa/3.0/).
- `moreblocks_copperpatina.png` was created by pithydon, and is licensed under
[CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/).
- `stairsplus_saw_button.png` CC BY-SA 3.0 Unported
## invsaw
Copyright © ?-2022 cheapie and contributors
- invsaw code is licensed under the zlib license, see
[`LICENSE.md`](LICENSE.md) for details.
- This is an altered version of the code which is not distributed by cheapie.

13
TODO.md
View File

@ -1,17 +1,8 @@
please don't accept a PR with this file, this is meant to be a checklist of things that i think need to be done before
\[wip] status can be removed
### ag TODO
```
stairsplus/API.md
3:TODO: write new API docs
```
### other things
* finish updating documentation, for both users and API
* update translations (i18n, locale)
* finish updating documentation, for both admins and mod makers
* update translations (i18n)
* finish testing (and creating) legacy support
* ? create a way to analyze and reduce node_count

30
invsaw/.luacheckrc Normal file
View File

@ -0,0 +1,30 @@
std = "lua51+luajit+minetest+invsaw"
unused_args = false
max_line_length = 120
stds.minetest = {
read_globals = {
"DIR_DELIM",
"minetest",
"core",
"dump",
"vector",
"nodeupdate",
"VoxelManip",
"VoxelArea",
"PseudoRandom",
"ItemStack",
"default",
"table",
}
}
stds.moreblocks = {
globals = {
"invsaw",
},
read_globals = {
"stairsplus",
"unified_inventory",
},
}

12
invsaw/README.md Normal file
View File

@ -0,0 +1,12 @@
invsaw
======
This mod adds a button in unified_inventory that opens a formspec that works exactly like the
moreblocks circular saw. It requires that either the server is in creative mode, you have the
"creative" priv, or you have one or more circular saws (moreblocks:circular_saw) in your inventory.
Dependencies: moreblocks, unified_inventory
Contains large amounts of code based on Calinou's moreblocks mod, and a texture based on some textures
from the same mod.

34
invsaw/api.lua Normal file
View File

@ -0,0 +1,34 @@
local station = stairsplus.api.station
function invsaw.has_saw_in_inventory(player)
local inv = player:get_inventory()
return inv:contains_item("main", invsaw.settings.saw_item)
end
function invsaw.can_use_saw(player)
return (
minetest.check_player_privs(player, invsaw.settings.creative_priv) or
minetest.check_player_privs(player, invsaw.settings.priv)
)
end
function invsaw.allow_use_saw(player)
return (
minetest.check_player_privs(player, invsaw.settings.creative_priv) or
(minetest.check_player_privs(player, invsaw.settings.priv) and invsaw.has_saw_in_inventory(player))
)
end
function invsaw.on_join(player)
local meta = player:get_meta()
local inv = player:get_inventory()
if invsaw.can_use_saw(player) then
station.initialize_metadata(meta, inv, {"legacy"})
station.initialize_inventory(inv)
else
invsaw.drop_inventory(player)
end
end
minetest.register_on_joinplayer(invsaw.on_join)

80
invsaw/formspec.lua Normal file
View File

@ -0,0 +1,80 @@
local ui = unified_inventory
local get_location_string = stairsplus.util.get_location_string
local station = stairsplus.api.station
local circular_saw = stairsplus.api.circular_saw
local S = stairsplus.S
local F = minetest.formspec_escape
invsaw.formspec = [[
formspec_version[4]
size[16,15]
background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]
listcolors[#00000000;#FFFFFF80;#00000000]
label[0.75,1.3;%s]
%s
list[%s;stairsplus:input;3,1;1,1;]
label[0.75,3;%s]
%s
list[%s;stairsplus:micro;3,2.5;1,1;]
label[0.75,4.3;%s]
%s
list[%s;stairsplus:recycle;3,4;1,1;]
field[0.75,6;1,1;max_offered;%s:;%i]
button[2,6;1,1;Set;%s]
%s
list[%s;stairsplus:output;5,1;8,6;]
%s
%s
list[current_player;main;4,9.5;8,4;]
]]
function invsaw.build_formspec(meta, inv)
local inv_location = get_location_string(inv)
return invsaw.formspec:format(
F(S("Nodes")),
ui.single_slot(1.88, 0.88, true),
inv_location,
F(S("Microblocks")),
ui.single_slot(1.88, 2.38),
inv_location,
F(S("Input")),
ui.single_slot(1.88, 3.88),
inv_location,
F(S("Max")),
meta:get_int("stairsplus:max_offered"),
F(S("Set")),
ui.make_inv_img_grid(3.88, 0.88, 8, 6),
inv_location,
ui.make_inv_img_grid(3.88, 9.38, 8, 1, true),
ui.make_inv_img_grid(3.88, 10.63, 8, 3)
)
end
function invsaw.show_formspec(player)
local name = player:get_player_name()
local meta = player:get_meta()
local inv = player:get_inventory()
minetest.show_formspec(name, "invsaw", circular_saw.build_formspec(meta, inv))
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
local meta = player:get_meta()
local inv = player:get_inventory()
if fields.saw then
if invsaw.allow_use_saw(player) then
invsaw.show_formspec(player)
end
return true
elseif station.on_receive_fields(meta, inv, formname, fields, player) then
if invsaw.allow_use_saw(player) then
invsaw.show_formspec(player)
end
return true
end
end)

30
invsaw/init.lua Normal file
View File

@ -0,0 +1,30 @@
local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname)
local S = minetest.get_translator(modname)
invsaw = {
version = {3, 0, 0},
fork = "minetest_mods",
modname = modname,
modpath = modpath,
S = S,
log = function(level, messagefmt, ...)
return minetest.log(level, ("[%s] %s"):format(modname, messagefmt:format(...)))
end,
dofile = function(...)
return dofile(table.concat({modpath, ...}, DIR_DELIM) .. ".lua")
end,
}
invsaw.users = {}
invsaw.dofile("settings")
invsaw.dofile("privs")
invsaw.dofile("api")
invsaw.dofile("inventory")
invsaw.dofile("formspec")
invsaw.dofile("unified_inventory")

76
invsaw/inventory.lua Normal file
View File

@ -0,0 +1,76 @@
local station = stairsplus.api.station
function invsaw.drop_inventory(player)
local pos = player:get_pos()
local inv = player:get_inventory()
for _, listname in ipairs({"stairsplus:input", "stairsplus:micro", "stairsplus:recycle"}) do
for i = 1, inv:get_size(listname) do
local item = inv:get_stack(listname, i)
if not item:is_empty() then
minetest.add_item(pos, item)
end
end
inv:set_size(listname, 0)
end
inv:set_size("stairsplus:output", 0)
end
local function is_stairsplus_inventory(listname)
return (
listname == "stairsplus:input" or
listname == "stairsplus:micro" or
listname == "stairsplus:recycle" or
listname == "stairsplus:output"
)
end
local get_location_string = stairsplus.util.get_location_string
minetest.register_allow_player_inventory_action(function(player, action, inv, info)
local meta = player:get_meta()
if action == "move" and is_stairsplus_inventory(info.from_list) and is_stairsplus_inventory(info.to_list) then
return station.allow_inventory_move(
meta, inv, info.from_list, info.from_index, info.to_list, info.to_index, info.count, player
)
elseif action == "move" and is_stairsplus_inventory(info.to_list) then
local stack = inv:get_stack(info.from_list, info.from_index)
return station.allow_inventory_put(
meta, inv, info.to_list, info.to_index, stack, player
)
elseif action == "put" and is_stairsplus_inventory(info.listname) then
return station.allow_inventory_put(
meta, inv, info.listname, info.index, info.stack, player
)
end
end)
minetest.register_on_player_inventory_action(function(player, action, inv, info)
local meta = player:get_meta()
if action == "move" and is_stairsplus_inventory(info.from_list) and is_stairsplus_inventory(info.to_list) then
elseif action == "move" and is_stairsplus_inventory(info.from_list) then
local stack = inv:get_stack(info.to_list, info.to_index)
stack:set_count(info.count)
station.on_inventory_take(
meta, inv, info.from_list, info.from_index, stack, player
)
elseif action == "move" and is_stairsplus_inventory(info.to_list) then
local stack = inv:get_stack(info.from_list, info.from_index)
station.on_inventory_put(
meta, inv, info.to_list, info.to_index, stack, player
)
elseif action == "put" and is_stairsplus_inventory(info.listname) then
station.on_inventory_put(
meta, inv, info.listname, info.index, info.stack, player
)
elseif action == "take" and is_stairsplus_inventory(info.listname) then
station.on_inventory_take(
meta, inv, info.listname, info.index, info.stack, player
)
end
end)

3
invsaw/mod.conf Normal file
View File

@ -0,0 +1,3 @@
name = invsaw
description = "circular saw in the unified inventory"
depends = stairsplus, unified_inventory

61
invsaw/privs.lua Normal file
View File

@ -0,0 +1,61 @@
local creative_priv = invsaw.settings.creative_priv
local priv = invsaw.settings.priv
local function on_priv_change(name)
local player = minetest.get_player_by_name(name)
if player then
invsaw.on_join(player)
end
end
if minetest.registered_privileges[priv] then
local def = minetest.registered_privileges[priv]
local old_on_grant = def.on_grant
local old_on_revoke = def.on_revoke
def.on_grant = function(name, cause)
on_priv_change(name)
if old_on_grant then
old_on_grant(name, cause)
end
end
def.on_revoke = function(name, cause)
on_priv_change(name)
if old_on_revoke then
old_on_revoke(name, cause)
end
end
else
minetest.register_privilege(priv, {
description = "Allow use of the circular saw in inventory",
give_to_singleplayer = true,
give_to_admin = false,
on_grant = on_priv_change,
on_revoke = on_priv_change,
})
end
if minetest.registered_privileges[creative_priv] then
local def = minetest.registered_privileges[creative_priv]
local old_on_grant = def.on_grant
local old_on_revoke = def.on_revoke
def.on_grant = function(name, cause)
on_priv_change(name)
if old_on_grant then
old_on_grant(name, cause)
end
end
def.on_revoke = function(name, cause)
on_priv_change(name)
if old_on_revoke then
old_on_revoke(name, cause)
end
end
else
minetest.register_privilege(creative_priv, {
description = "Allow use of the inventory saw creatively",
give_to_singleplayer = true,
give_to_admin = false,
on_grant = on_priv_change,
on_revoke = on_priv_change,
})
end

7
invsaw/settings.lua Normal file
View File

@ -0,0 +1,7 @@
local s = minetest.settings
invsaw.settings = {
priv = s:get("invsaw.priv") or "interact",
creative_priv = s:get("invsaw.creative_priv") or "creative",
saw_item = s:get("invsaw.saw_item") or "stairsplus:circular_saw"
}

View File

@ -0,0 +1,40 @@
local ui = unified_inventory
ui.register_button("saw", {
type = "image",
image = "stairsplus_saw_button.png",
tooltip = "Circular Saw",
condition = function(player)
return invsaw.allow_use_saw(player)
end,
})
-- this takes over 3 seconds on my machine O_O
--local old_get_formspec = ui.get_formspec
--
--function ui.get_formspec(player, page)
-- local fs = old_get_formspec(player, page)
-- if invsaw.can_use_saw(player) then
-- return fs
-- end
--
-- local start = minetest.get_us_time()
-- -- excise the button
-- local pre, post = fs:match(
-- "(.*)image_button%[%-?%d+%.?%d*,%-?%d+%.?%d*;%-?%d+%.?%d*,%-?%d+%.?%d*;stairsplus_saw_button.png[^%]]*](.*)"
-- )
--
-- if not pre and post then
-- pre, post = fs:match(
-- "(.*)image%[%-?%d+%.?%d*,%-?%d+%.?%d*;%-?%d+%.?%d*,%-?%d+%.?%d*;stairsplus_saw_button.png[^%]]*](.*)"
-- )
-- end
--
-- if pre and post then
-- fs = pre .. post
-- end
--
-- minetest.chat_send_player(player:get_player_name(), ("took %s"):format((minetest.get_us_time() - start) / 1000000))
--
-- return fs
--end

View File

@ -1,3 +1,13 @@
# will be created if it doesn't already exist
invsaw.priv (Priv to use the inventory saw) string interact
# will be created if it doesn't already exist
invsaw.creative_priv (Priv to use the inventory saw w/out a saw item) string creative
# The item that a normal player has to have to use the saw in inventory
invsaw.saw_item (Saw item) string stairsplus:circular_saw
#
stairsplus.circular_saw_crafting (Allow crafting the circular saw) bool true
# Defaults to true if creative_mode is enabled.

View File

@ -6,18 +6,6 @@ local default_stack_max = tonumber(minetest.settings:get("default_stack_max")) o
local station = {}
function station.update_infotext(pos)
local node = minetest.get_node(pos)
local def = minetest.registered_nodes[node.name]
return def.update_infotext(pos)
end
function station.build_formspec(pos)
local node = minetest.get_node(pos)
local def = minetest.registered_nodes[node.name]
return def.build_formspec(pos)
end
function station.get_cost(shaped_node)
if shaped_node == "" then
return 0
@ -32,59 +20,58 @@ function station.get_cost(shaped_node)
return shape_def and shape_def.eighths
end
function station.get_current_node(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local input_stack = inv:get_stack("input", 1)
function station.get_current_node(inv)
local input_stack = inv:get_stack("stairsplus:input", 1)
if not input_stack:is_empty() then
return input_stack:get_name()
end
local micro_stack = inv:get_stack("micro", 1)
local micro_stack = inv:get_stack("stairsplus:micro", 1)
if not micro_stack:is_empty() then
return api.get_node_of_shaped_node(micro_stack:get_name())
end
local recycle_stack = inv:get_stack("recycle", 1)
local recycle_stack = inv:get_stack("stairsplus:recycle", 1)
if not recycle_stack:is_empty() then
return api.get_node_of_shaped_node(recycle_stack:get_name())
end
end
function station.can_dig(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv:is_empty("input") and inv:is_empty("micro")
function station.can_dig(meta, inv)
return inv:is_empty("stairsplus:input") and inv:is_empty("stairsplus:micro")
end
function station.on_receive_fields(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
function station.on_receive_fields(meta, inv, formname, fields, sender, build_formspec, update_infotext)
local max = tonumber(fields.max_offered)
if max and max > 0 then
meta:set_int("max_offered", max)
meta:set_int("stairsplus:max_offered", max)
-- Update to show the correct number of items:
station.update_inventory(pos)
station.update_infotext(pos)
station.update_inventory(meta, inv)
if update_infotext then
update_infotext(meta, inv)
end
if build_formspec then
meta:set_string("formspec", build_formspec(meta, inv))
end
end
return not not fields.max_offered
end
function station.update_inventory(pos, taken_stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local node = station.get_current_node(pos)
function station.update_inventory(meta, inv, taken_stack)
local node = station.get_current_node(inv)
if not node then
for i = 1, inv:get_size("output") do
inv:set_stack("output", i, ItemStack())
for i = 1, inv:get_size("stairsplus:output") do
inv:set_stack("stairsplus:output", i, ItemStack())
end
return
end
local input_stack = inv:get_stack("input", 1)
local micro_stack = inv:get_stack("micro", 1)
local recycle_stack = inv:get_stack("recycle", 1)
local input_stack = inv:get_stack("stairsplus:input", 1)
local micro_stack = inv:get_stack("stairsplus:micro", 1)
local recycle_stack = inv:get_stack("stairsplus:recycle", 1)
local current_value = 8 * input_stack:get_count() + micro_stack:get_count()
local new_value = current_value + station.get_cost(recycle_stack:get_name()) * recycle_stack:get_count()
@ -94,21 +81,20 @@ function station.update_inventory(pos, taken_stack)
local new_micros = new_value % 8
local new_blocks = math.floor(new_value / 8)
inv:set_stack("input", 1, ItemStack({name = node, count = new_blocks}))
inv:set_stack("micro", 1, ItemStack({name = api.get_micronode(node), count = new_micros}))
inv:set_stack("recycle", 1, ItemStack())
inv:set_stack("stairsplus:input", 1, ItemStack({name = node, count = new_blocks}))
inv:set_stack("stairsplus:micro", 1, ItemStack({name = api.get_micronode(node), count = new_micros}))
inv:set_stack("stairsplus:recycle", 1, ItemStack())
if new_value == 0 then
for i = 1, inv:get_size("output") do
inv:set_stack("output", i, "")
for i = 1, inv:get_size("stairsplus:output") do
inv:set_stack("stairsplus:output", i, "")
end
return
end
local valid_shapes = api.shapes_by_node[node]
local shape_groups = minetest.registered_nodes[minetest.get_node(pos).name]._stairsplus_shape_groups
local max_offered = meta:get_int("max_offered")
local max_offered = meta:get_int("stairsplus:max_offered")
local shape_groups = minetest.parse_json(meta:get_string("stairsplus:shape_groups"))
local i = 1
for _, group in ipairs(shape_groups) do
@ -124,41 +110,45 @@ function station.update_inventory(pos, taken_stack)
else
stack = ""
end
inv:set_stack("output", i, stack)
inv:set_stack("stairsplus:output", i, stack)
i = i + 1
end
end
end
for j = i, inv:get_size("output") do
inv:set_stack("output", j, "")
for j = i, inv:get_size("stairsplus:output") do
inv:set_stack("stairsplus:output", j, "")
end
end
function station.on_metadata_inventory_put(pos, listname, index, stack, player)
station.update_inventory(pos)
station.update_infotext(pos)
function station.on_inventory_put(meta, inv, listname, index, stack, player, update_infotext)
station.update_inventory(meta, inv)
if update_infotext then
update_infotext(meta, inv)
end
end
function station.on_metadata_inventory_take(pos, listname, index, stack, player)
if listname == "output" then
station.update_inventory(pos, stack)
function station.on_inventory_take(meta, inv, listname, index, stack, player, update_infotext)
if listname == "stairsplus:output" then
station.update_inventory(meta, inv, stack)
else
station.update_inventory(pos)
station.update_inventory(meta, inv)
end
station.update_infotext(pos)
if update_infotext then
update_infotext(meta, inv)
end
end
-- Moving the inventory of the station around is not allowed because it
-- is a fictional inventory. Moving inventory around would be rather
-- impractical and make things more difficult to calculate:
function station.allow_metadata_inventory_move()
function station.allow_inventory_move()
return 0
end
function station.allow_metadata_inventory_put(pos, listname, index, stack, player)
if listname ~= "recycle" then
function station.allow_inventory_put(meta, inv, listname, index, stack, player)
if listname ~= "stairsplus:recycle" then
return 0
end
@ -170,9 +160,7 @@ function station.allow_metadata_inventory_put(pos, listname, index, stack, playe
return 0
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local current_node = station.get_current_node(pos)
local current_node = station.get_current_node(inv)
if current_node and node ~= current_node then
return 0
@ -181,8 +169,8 @@ function station.allow_metadata_inventory_put(pos, listname, index, stack, playe
local count = stack:get_count()
local cost = station.get_cost(shaped_node)
local input_stack = inv:get_stack("input", 1)
local micro_stack = inv:get_stack("micro", 1)
local input_stack = inv:get_stack("stairsplus:input", 1)
local micro_stack = inv:get_stack("stairsplus:micro", 1)
local current_value = 8 * input_stack:get_count() + micro_stack:get_count()
local max_value = 8 * ItemStack(node):get_stack_max() + 7
@ -193,20 +181,34 @@ function station.allow_metadata_inventory_put(pos, listname, index, stack, playe
return math.min(count, available_count)
end
function station.on_construct(pos)
function station.initialize_metadata(meta, inv, shape_groups, build_formspec, update_infotext)
meta:set_string("stairsplus:shape_groups", minetest.write_json(shape_groups))
if meta:get_int("stairsplus:max_offered") == 0 then
meta:set_int("stairsplus:max_offered", default_stack_max)
end
if build_formspec then
meta:set_string("formspec", build_formspec(meta, inv))
end
if update_infotext then
update_infotext(meta, inv)
end
end
function station.initialize_inventory(inv)
inv:set_size("stairsplus:input", 1)
inv:set_size("stairsplus:micro", 1)
inv:set_size("stairsplus:recycle", 1)
inv:set_size("stairsplus:output", 6 * 9)
end
function station.on_construct(pos, shape_groups, build_formspec, update_infotext)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", station.build_formspec(pos))
meta:set_string("max_offered", default_stack_max) -- How many items of this kind are offered by default?
local inv = meta:get_inventory()
inv:set_size("input", 1) -- Input slot for full blocks of material x.
inv:set_size("micro", 1) -- Storage for 1-7 surplus microblocks.
inv:set_size("recycle", 1) -- Surplus partial blocks can be placed here.
inv:set_size("output", 6 * 9) -- 6x9 versions of stair-parts of material x.
station.update_infotext(pos)
station.initialize_inventory(inv)
station.initialize_metadata(meta, inv, shape_groups, build_formspec, update_infotext)
end
function station.after_place_node(pos, placer)
@ -218,14 +220,55 @@ end
function api.register_station(name, shape_groups, def)
def.after_place_node = def.after_place_node or station.after_place_node
def.on_construct = def.on_construct or station.on_construct
def.can_dig = def.can_dig or station.can_dig
def.on_receive_fields = def.on_receive_fields or station.on_receive_fields
def.allow_metadata_inventory_move = def.allow_metadata_inventory_move or station.allow_metadata_inventory_move
def.allow_metadata_inventory_put = def.allow_metadata_inventory_put or station.allow_metadata_inventory_put
def.allow_metadata_inventory_take = def.allow_metadata_inventory_take or station.allow_metadata_inventory_take
def.on_metadata_inventory_put = def.on_metadata_inventory_put or station.on_metadata_inventory_put
def.on_metadata_inventory_take = def.on_metadata_inventory_take or station.on_metadata_inventory_take
def.on_construct = def.on_construct or
function(pos)
return station.on_construct(pos, shape_groups, def.build_formspec, def.update_infotext)
end
def.can_dig = def.can_dig or
function(pos, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return station.can_dig(meta, inv, player)
end
def.on_receive_fields = def.on_receive_fields or
function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return station.on_receive_fields(
meta, inv, formname, fields, sender, def.build_formspec, def.update_infotext
)
end
def.allow_metadata_inventory_move = def.allow_metadata_inventory_move or
function(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return station.allow_inventory_move(meta, inv, from_list, from_index, to_list, to_index, count, player)
end
def.allow_metadata_inventory_put = def.allow_metadata_inventory_put or
function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return station.allow_inventory_put(meta, inv, listname, index, stack, player)
end
def.on_metadata_inventory_put = def.on_metadata_inventory_put or
function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return station.on_inventory_put(meta, inv, listname, index, stack, player, def.update_infotext)
end
def.on_metadata_inventory_take = def.on_metadata_inventory_take or
function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return station.on_inventory_take(meta, inv, listname, index, stack, player, def.update_infotext)
end
def._stairsplus_shape_groups = shape_groups
minetest.register_node(name, def)

View File

@ -1,57 +1,75 @@
stairsplus.api.circular_saw = {}
local circular_saw = stairsplus.api.circular_saw
local api = stairsplus.api
local station = api.station
local get_location_string = stairsplus.util.get_location_string
local S = stairsplus.S
local F = minetest.formspec_escape
local formspec_style = stairsplus.resources.formspec_style
local function update_infotext(pos)
local meta = minetest.get_meta(pos)
function circular_saw.build_formspec(meta, inv)
local inv_location = get_location_string(inv)
return ([[
size[12,10]
%s
label[0,0;%s]
list[%s;stairsplus:input;1.7,0;1,1;]
label[0,1;%s]
list[%s;stairsplus:micro;1.7,1;1,1;]
label[0,2;%s]
list[%s;stairsplus:recycle;1.7,2;1,1;]
field[0.3,3.5;1,1;max_offered;%s:;%i]
button[1,3.2;1.7,1;Set;%s]
list[%s;stairsplus:output;2.8,0;9,6;]
list[current_player;main;1.5,6.25;8,4;]
listring[%s;stairsplus:output]
listring[current_player;main]
listring[%s;stairsplus:recycle]
listring[%s;stairsplus:micro]
listring[current_player;main]
listring[%s;stairsplus:input]
listring[current_player;main]
]]):format(
formspec_style,
F(S("Nodes")),
inv_location,
F(S("Microblocks")),
inv_location,
F(S("Input")),
inv_location,
F(S("Max")),
meta:get_int("stairsplus:max_offered"),
F(S("Set")),
inv_location,
inv_location,
inv_location,
inv_location,
inv_location
)
end
function circular_saw.update_infotext(meta, inv)
local parts = {}
if station.can_dig(pos) then
if station.can_dig(meta, inv) then
table.insert(parts, S("Circular Saw is empty"))
end
local owner = meta:get_string("owner")
if owner ~= "" then
table.insert(parts, S("(owned by @1)", meta:get_string("owner")))
table.insert(parts, S("(owned by @1)", owner))
end
meta:set_string("infotext", table.concat(parts, " "))
end
local function build_formspec()
return ([[
size[12,10]
%s
label[0,0;%s]
list[current_name;input;1.7,0;1,1;]
label[0,1;%s]
list[current_name;micro;1.7,1;1,1;]
label[0,2;%s]
list[current_name;recycle;1.7,2;1,1;]
field[0.3,3.5;1,1;max_offered;%s:;${max_offered}]
button[1,3.2;1.7,1;Set;%s]
list[current_name;output;2.8,0;9,6;]
list[current_player;main;1.5,6.25;8,4;]
listring[current_name;output]
listring[current_player;main]
listring[current_name;recycle]
listring[current_name;micro]
listring[current_player;main]
listring[current_name;input]
listring[current_player;main]
]]):format(
formspec_style, S("Nodes"), F(S("Microblocks")), F(S("Input")), F(S("Max")), F(S("Set"))
)
end
api.register_station("stairsplus:circular_saw", {"legacy"}, {
description = S("Circular Saw"),
drawtype = "nodebox",
@ -79,8 +97,8 @@ api.register_station("stairsplus:circular_saw", {"legacy"}, {
groups = {choppy = 2, oddly_breakable_by_hand = 2},
sounds = stairsplus.resources.sounds.wood,
build_formspec = build_formspec,
update_infotext = update_infotext,
build_formspec = circular_saw.build_formspec,
update_infotext = circular_saw.update_infotext,
})
local cm = stairsplus.resources.craft_materials

View File

@ -8,12 +8,12 @@ local api = stairsplus.api
i3.register_craft_type("stairsplus:craft_schema", {
description = "Stairs+ craft schema",
icon = "stairsplus_circular_saw_top.png",
icon = "stairsplus_saw_button.png",
})
i3.register_craft_type("stairsplus:craft_schema", {
description = "Stairs+ circular saw",
icon = "stairsplus_circular_saw_top.png",
icon = "stairsplus_saw_button.png",
})
local function convert_schema_recipe_item(item)

View File

@ -10,7 +10,7 @@ unified_inventory.register_craft_type("stairsplus:craft_schema", {
-- ^ Unique identifier for `register_craft`
description = "Stairs+ craft schema",
-- ^ Text shown below the crafting arrow
icon = "stairsplus_circular_saw_top.png",
icon = "stairsplus_saw_button.png",
-- ^ Image shown above the crafting arrow
width = 3,
height = 3,
@ -22,7 +22,7 @@ unified_inventory.register_craft_type("stairsplus:circular_saw", {
-- ^ Unique identifier for `register_craft`
description = "Stairs+ circular saw",
-- ^ Text shown below the crafting arrow
icon = "stairsplus_circular_saw_top.png",
icon = "stairsplus_saw_button.png",
-- ^ Image shown above the crafting arrow
width = 1,
height = 1,

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -67,5 +67,18 @@ stairsplus.util = {
end
end
return f
end
end,
get_location_string = function(inv)
local location = inv:get_location()
if location.type == "node" then
return ("nodemeta:%i,%i,%i"):format(location.pos.x, location.pos.y, location.pos.z)
elseif location.type == "player" then
return ("player:%s"):format(location.name)
elseif location.type == "detached" then
return ("detached:%s"):format(location.name)
else
error(("unexpected location? %s"):format(dump(location)))
end
end,
}