8 Commits

8 changed files with 159 additions and 24 deletions

View File

@ -31,4 +31,5 @@ read_globals = {
"HasOwner", "HasOwner",
"getLastOwner", "getLastOwner",
"GetNodeOwnerName", "GetNodeOwnerName",
"place_rotated",
} }

View File

@ -20,6 +20,9 @@ circular_saw.known_stairs = setmetatable({}, {
-- This is populated by stairsplus:register_all: -- This is populated by stairsplus:register_all:
circular_saw.known_nodes = {} circular_saw.known_nodes = {}
-- This is populated by stairsplus:register_micro:
circular_saw.microblocks = {}
-- How many microblocks does this shape at the output inventory cost: -- How many microblocks does this shape at the output inventory cost:
-- It may cause slight loss, but no gain. -- It may cause slight loss, but no gain.
circular_saw.cost_in_microblocks = { circular_saw.cost_in_microblocks = {
@ -137,10 +140,13 @@ function circular_saw:reset(pos)
inv:set_list("input", {}) inv:set_list("input", {})
inv:set_list("micro", {}) inv:set_list("micro", {})
inv:set_list("output", {})
meta:set_int("anz", 0) local microblockcount = inv:get_stack("micro",1):get_count()
meta:set_int("anz", microblockcount)
if microblockcount == 0 then
meta:set_string("infotext", S("Circular Saw is empty") .. owned_by) meta:set_string("infotext", S("Circular Saw is empty") .. owned_by)
inv:set_list("output", {})
end
end end
@ -161,19 +167,21 @@ function circular_saw:update_inventory(pos, amount)
end end
local stack = inv:get_stack("input", 1) local stack = inv:get_stack("input", 1)
-- At least one "normal" block is necessary to see what kind of stairs are requested. local microstack = inv:get_stack("micro",1)
if stack:is_empty() then
-- Any microblocks not taken out yet are now lost. -- At least one (micro)block is necessary to see what kind of stairs are requested.
-- (covers material loss in the machine) if stack:is_empty() and microstack:is_empty() then
self:reset(pos) self:reset(pos)
return return
end end
local node_name = stack:get_name() or ""
local node_name = circular_saw.microblocks[microstack:get_name()] or stack:get_name() or ""
local node_def = stack:get_definition() local node_def = stack:get_definition()
local name_parts = circular_saw.known_nodes[node_name] or "" local name_parts = circular_saw.known_nodes[node_name] or ""
local modname = name_parts[1] or "" local modname = name_parts[1]
local material = name_parts[2] or "" local material = name_parts[2]
local owned_by = meta:get_string("owner") local owned_by = meta:get_string("owner")
if owned_by and owned_by ~= "" then if owned_by and owned_by ~= "" then
@ -197,6 +205,7 @@ function circular_saw:update_inventory(pos, amount)
inv:set_list("micro", { inv:set_list("micro", {
modname .. ":micro_" .. material .. " " .. (amount % 8) modname .. ":micro_" .. material .. " " .. (amount % 8)
}) })
-- Display: -- Display:
inv:set_list("output", inv:set_list("output",
self:get_output_inv(modname, material, amount, self:get_output_inv(modname, material, amount,
@ -233,11 +242,11 @@ function circular_saw.allow_metadata_inventory_move(
end end
-- Only input- and recycle-slot are intended as input slots: -- Only input- and recycle-slot (and microblock slot when empty) are intended as input slots:
function circular_saw.allow_metadata_inventory_put( function circular_saw.allow_metadata_inventory_put(
pos, listname, index, stack, player) pos, listname, index, stack, player)
-- The player is not allowed to put something in there: -- The player is not allowed to put something in there:
if listname == "output" or listname == "micro" then if listname == "output" then
return 0 return 0
end end
@ -285,6 +294,16 @@ function circular_saw.allow_metadata_inventory_put(
end end
return 0 return 0
end end
if listname == "micro" then
if not (inv:is_empty("input") and inv:is_empty("micro")) then return 0 end
for name, t in pairs(circular_saw.microblocks) do
if name == stackname and inv:room_for_item("input", stack) then
return count
end
end
return 0
end
end end
-- Taking is allowed from all slots (even the internal microblock slot). -- Taking is allowed from all slots (even the internal microblock slot).
@ -304,6 +323,8 @@ function circular_saw.on_metadata_inventory_put(
if listname == "input" then if listname == "input" then
-- Each new block is worth 8 microblocks: -- Each new block is worth 8 microblocks:
circular_saw:update_inventory(pos, 8 * count) circular_saw:update_inventory(pos, 8 * count)
elseif listname == "micro" then
circular_saw:update_inventory(pos, count)
elseif listname == "recycle" then elseif listname == "recycle" then
-- Lets look which shape this represents: -- Lets look which shape this represents:
local cost = circular_saw:get_cost(inv, stackname) local cost = circular_saw:get_cost(inv, stackname)
@ -354,7 +375,6 @@ function circular_saw.on_metadata_inventory_take(
-- We do know how much each block at each position costs: -- We do know how much each block at each position costs:
local cost = circular_saw.cost_in_microblocks[index] local cost = circular_saw.cost_in_microblocks[index]
* stack:get_count() * stack:get_count()
circular_saw:update_inventory(pos, -cost) circular_saw:update_inventory(pos, -cost)
elseif listname == "micro" then elseif listname == "micro" then
-- Each microblock costs 1 microblock: -- Each microblock costs 1 microblock:

92
locale/moreblocks.uk.tr Normal file
View File

@ -0,0 +1,92 @@
# textdomain: moreblocks
More Blocks=Більше Блоків
Adds various miscellaneous blocks to the game.=Додає різноманітні нові блоки до гри.
Adds various miscellaneous blocks.=Додає різноманітні нові блоки до гри.
#: circular_saw.lua
Circular Saw=Циркулярна пила
Input material=Вхідний@nматеріал
Left-over=Залишки
Max=Кільк.
Recycle output=Пере-@nобробка
Set=Гаразд
owned by @1=належить @1
Circular Saw is empty=Циркулярна пила пуста
Circular Saw is working on @1=Циркулярна пила працює над @1
#: init.lua
[MOD] moreblocks loaded.=[MOD] moreblocks завантажено.
#: nodes.lua
Deprecated=застарілий
All-faces Acacia Tree=Всебічна колода акації
All-faces Aspen Tree=Всебічна колода осики
All-faces Jungle Tree=Всебічна джунглева колода
All-faces Pine Tree=Всебічна колода сосни
All-faces Tree=Всебічна колода яблуні
Cactus Brick=Кактусова цегла
Cactus Checker=Кактусова мозаїка
Centered Wooden Tile=Дерев'яна мозаїка (центр)
Checker Stone Tile=Кам'яна мозаїка
Circle Stone Bricks=Кільцевий камінь
Clean Glass=Чисте скло
Coal Checker=Вугілляна мозаїка
Coal Glass=Вугілляне скло
Clean Super Glow Glass=Чисте супер-сяюче скло
Trap Clean Super Glow Glass=Trap чисте супер-сяюче скло
Trap Clean Glass=Trap чисте скло
Clean Glow Glass=Чисте сяюче скло
Trap Clean Glow Glass=Trap чисте сяюче скло
Coal Stone=Вугілляний камінь
Coal Stone Bricks=Вуглекам'яна цегла
Compressed Cobblestone=Пресований кругляк
Compressed Desert Cobblestone=Пресований пустельний кругляк
Compressed Dirt=Пресований ґрунт
Copper Patina Block=Блок мідного патину
Empty Shelf=Пусті полиці
Full Wooden Tile=Дерев'яна мозаїка
Glow Glass=Сяюче скло
Iron Checker=Сталева мозаїка
Iron Glass=Металізоване скло
Iron Stone=Залізний камінь
Iron Stone Bricks=Залізокам'яна цегла
Plankstone=Деревокам'яна мозаїка
Rope=Мотузка
Split Stone Tile=Кам'яна мозаїка
Stone Bricks=Кам'яна цегла
Stone Tile=Кам'яна плитка
Super Glow Glass=Супер-сяюче скло
Sweeper=Підмітальник
Tar=Смола
Trap Desert Stone=Уявний пустельний камінь
Trap Glass=Уявне скло
Trap Glow Glass=Уявне сяюче скло
Trap Obsidian=Уявний обсидіан
Trap Obsidian Glass=Уявне обсидіанове скло
Trap Sandstone=Уявний пісковик
Trap Stone=Уявний камінь
Trap Super Glow Glass=Уявне супер-сяюче скло
Wooden Tile=Дерев'яна мозаїка
Offset Wooden Tile=Дерев'яна мозаїка (зверзу)
# @deprecated
Downwards Wooden Tile=Дерев'яна мозаїка (знизу)
# @deprecated
Leftwards Wooden Tile=Дерев'яна мозаїка (ліворуч)
# @deprecated
Rightwards Wooden Tile=Дерев'яна мозаїка (праворуч)
#: ownership.lua
Sorry, @1 owns that spot.=Вибачте, це належить @1.
someone=комусь
#: stairsplus/common.lua
@1 Microblock=@1 (мікроблок)
@1 Slab=@1 (плита)
@1 Slope=@1 (схил)
@1 Panel=@1 (панель)
@1 Stairs=@1 (сходи)

View File

@ -1,4 +1,4 @@
name = moreblocks name = moreblocks
description = Adds various miscellaneous blocks to the game. description = Adds various miscellaneous blocks to the game.
optional_depends = default,stairs,farming,wool,basic_materials optional_depends = default,stairs,farming,wool,basic_materials,place_rotated
min_minetest_version = 5.0.0 min_minetest_version = 5.0.0

View File

@ -496,20 +496,33 @@ local nodes = {
for name, def in pairs(nodes) do for name, def in pairs(nodes) do
def.is_ground_content = def.is_ground_content == true def.is_ground_content = def.is_ground_content == true
def.tiles = def.tiles or {"moreblocks_" ..name.. ".png"} def.tiles = def.tiles or {"moreblocks_" ..name.. ".png"}
local burntime = def.furnace_burntime
def.furnace_burntime = nil -- deprecated node def field
minetest.register_node("moreblocks:" ..name, def) minetest.register_node("moreblocks:" ..name, def)
minetest.register_alias(name, "moreblocks:" ..name) minetest.register_alias(name, "moreblocks:" ..name)
def_copy = table.copy(def) -- Optional: register the node as fuel
if burntime then
core.register_craft({
type = "fuel",
recipe = "moreblocks:" .. name,
burntime = burntime,
})
end
local tiles = def.tiles
-- Use the primary tile for all sides of cut glasslike nodes. -- Use the primary tile for all sides of cut glasslike nodes.
-- This makes them easier to see -- This makes them easier to see
if if
#def_copy.tiles > 1 and #tiles > 1 and
def_copy.drawtype and def.drawtype and
def_copy.drawtype == "glasslike_framed" or def.drawtype == "glasslike_framed" or
def_copy.drawtype == "glasslike_framed_optional" def.drawtype == "glasslike_framed_optional"
then then
def.tiles = {def_copy.tiles[1]} tiles = {def.tiles[1]}
end end
@ -519,7 +532,7 @@ for name, def in pairs(nodes) do
stairsplus:register_all("moreblocks", name, "moreblocks:" ..name, { stairsplus:register_all("moreblocks", name, "moreblocks:" ..name, {
description = def.description, description = def.description,
groups = groups, groups = groups,
tiles = def.tiles, tiles = tiles,
sunlight_propagates = def.sunlight_propagates, sunlight_propagates = def.sunlight_propagates,
light_source = def.light_source, light_source = def.light_source,
sounds = def.sounds, sounds = def.sounds,

View File

@ -66,7 +66,10 @@ stairsplus.rotate_node_aux = function(itemstack, placer, pointed_thing)
local wallmounted = minetest.dir_to_wallmounted(vector.subtract(pointed_thing.above, under)) local wallmounted = minetest.dir_to_wallmounted(vector.subtract(pointed_thing.above, under))
if same_cat and not aux then if same_cat and not aux then
p2 = under_node.param2 -- param2 can be in the range [0, 31]. We assume that the stair nodes use the
-- drawtype "facedir". Wrap the value like done in Luanti `src/mapnode.cpp`.
p2 = under_node.param2 % 24
-- flip if placing above or below an upright or upside-down node -- flip if placing above or below an upright or upside-down node
-- TODO should we also flip when placing next to a side-mounted node? -- TODO should we also flip when placing next to a side-mounted node?
if wallmounted < 2 then if wallmounted < 2 then
@ -146,11 +149,14 @@ stairsplus.register_single = function(category, alternate, info, modname, subnam
-- Darken light sources slightly to make up for their smaller visual size -- Darken light sources slightly to make up for their smaller visual size
def.light_source = math.max(0, (def.light_source or 0) - 1) def.light_source = math.max(0, (def.light_source or 0) - 1)
def.on_place = stairsplus.rotate_node_aux
def.groups = stairsplus:prepare_groups(fields.groups) def.groups = stairsplus:prepare_groups(fields.groups)
if category == "slab" then if category == "slab" then
if minetest.global_exists("place_rotated") then
def.on_place = place_rotated.slab
else
def.on_place = stairsplus.rotate_node_aux
end
if type(info) ~= "table" then if type(info) ~= "table" then
def.node_box = { def.node_box = {
type = "fixed", type = "fixed",
@ -165,6 +171,7 @@ stairsplus.register_single = function(category, alternate, info, modname, subnam
def.description = desc_base .. alternate:gsub("_", " "):gsub("(%a)(%S*)", function(a, b) return a:upper() .. b end) def.description = desc_base .. alternate:gsub("_", " "):gsub("(%a)(%S*)", function(a, b) return a:upper() .. b end)
end end
else else
def.on_place = stairsplus.rotate_node_aux
def.description = desc_base def.description = desc_base
if category == "slope" then if category == "slope" then
def.drawtype = "mesh" def.drawtype = "mesh"

View File

@ -94,4 +94,5 @@ function stairsplus:register_custom_subset(subset, modname, subname, recipeitem,
end end
circular_saw.known_nodes[recipeitem] = {modname, subname} circular_saw.known_nodes[recipeitem] = {modname, subname}
circular_saw.microblocks[modname.. ":micro_" .. subname] = recipeitem
end end

View File

@ -40,4 +40,5 @@ function stairsplus:register_micro(modname, subname, recipeitem, fields)
end end
circular_saw.known_nodes[recipeitem] = {modname, subname} circular_saw.known_nodes[recipeitem] = {modname, subname}
circular_saw.microblocks[modname.. ":micro_" .. subname] = recipeitem
end end