Compare commits

...

10 Commits

Author SHA1 Message Date
SmallJoker
3bece9cec5 Fix incorrect recipe registration for craftguide and i3
Some checks failed
Check & Release / lint (push) Has been cancelled
2024-12-16 20:46:14 +01:00
SmallJoker
59643c45d4 Chainsaw: Chat message for 'aborted by safe cut'
This provides a feedback to the player.
2024-12-07 22:15:43 +01:00
Tóth Kornél
b268e3d526
Fix machines connected to multiple networks (#655)
Machines sometimes were be a part of multiple networks and generated power for each. This is fixed by checking if the machine is already part of an other network before assigning it to the current network.
2024-11-29 18:58:51 +01:00
Tóth Kornél
87e512ff24
Fix power monitor instability (#654)
This fixes the power monitor instability where it was switching between having and not having network infotext. The cause was that the power monitor is LV MV and HV machine at the same time, and each tier has a countdown. If any of these countdowns were 0 it treated the machine as having no network. This was changed so that it only treats a machine as having no network if it is timed out in all tiers that it is a part of.
2024-11-22 21:19:49 +01:00
DustyBagel
18df2813a0
Comment print statements in battery_box.lua (#650) 2024-09-06 19:10:04 +02:00
SmallJoker
221fc1376e
technic_cnc: use programs definition to generate formspec (#647)
This deprecates the variables onesize_products and twosize_products by using a shared definition table.
With these changes, it should be easier to add new programs in the future.

New feature: Tooltips are added to all programs. (only applies to newly placed nodes)
2024-08-10 10:50:51 +02:00
SmallJoker
9f373d6528 technic_cnc: Add group 'cracky'
Fixes a regression from ba2bdf836 where stone-like nodes could no longer be dug.
New sanity check to avoid such issues in the future.
2024-08-03 08:25:13 +02:00
Gábriel
6731db14e5
Add compressor recipes for nether racks (#644) 2024-07-07 18:53:15 +02:00
OgelGames
a9079c49e0
Expose technic.get/set_charge functions (#645) 2024-07-07 18:45:03 +02:00
SmallJoker
f80372a0f8 Frames: Fix error in node placement callback execution 2024-05-18 18:05:44 +02:00
14 changed files with 332 additions and 251 deletions

View File

@ -160,6 +160,11 @@ Unsorted functions:
* If `technic.power_tools[itemstack:get_name()]` is `nil` (or `false`), this * If `technic.power_tools[itemstack:get_name()]` is `nil` (or `false`), this
function does nothing, else that value is the maximum charge. function does nothing, else that value is the maximum charge.
* The itemstack metadata is changed to contain the charge. * The itemstack metadata is changed to contain the charge.
* `technic.get_charge(itemstack)`
* Returns the charge and max charge of the given itemstack.
* If the itemstack is not an RE chargeable item, both return values will be zero.
* `technic.set_charge(itemstack, charge)`
* Modifies the charge of the given itemstack.
### Node-specific ### Node-specific
* `technic.get_or_load_node(pos)` * `technic.get_or_load_node(pos)`

View File

@ -324,6 +324,7 @@ for zp = 0, 1 do
on_rightclick = function(pos, node, placer, itemstack, pointed_thing) on_rightclick = function(pos, node, placer, itemstack, pointed_thing)
if is_supported_node(itemstack:get_name()) then if is_supported_node(itemstack:get_name()) then
-- Stripped down version of "core.item_place_node"
if minetest.is_protected(pos, placer:get_player_name()) then if minetest.is_protected(pos, placer:get_player_name()) then
minetest.log("action", placer:get_player_name() minetest.log("action", placer:get_player_name()
.. " tried to place " .. itemstack:get_name() .. " tried to place " .. itemstack:get_name()
@ -347,8 +348,7 @@ for zp = 0, 1 do
end end
-- Run script hook -- Run script hook
local callback = nil for _, callback in ipairs(minetest.registered_on_placenodes) do
for _, _ in ipairs(minetest.registered_on_placenodes) do
-- Copy pos and node because callback can modify them -- Copy pos and node because callback can modify them
local pos_copy = { x = pos.x, y = pos.y, z = pos.z } local pos_copy = { x = pos.x, y = pos.y, z = pos.z }
local newnode_copy = { name = def.name, param1 = 0, param2 = 0 } local newnode_copy = { name = def.name, param1 = 0, param2 = 0 }

View File

@ -92,7 +92,7 @@ local dirtab = {
local tube = { local tube = {
insert_object = function(pos, node, stack, direction) insert_object = function(pos, node, stack, direction)
print(minetest.pos_to_string(direction), dirtab[direction.x+2+(direction.z+2)*2], node.param2) --print(minetest.pos_to_string(direction), dirtab[direction.x+2+(direction.z+2)*2], node.param2)
if direction.y == 1 if direction.y == 1
or (direction.y == 0 and dirtab[direction.x+2+(direction.z+2)*2] == node.param2) then or (direction.y == 0 and dirtab[direction.x+2+(direction.z+2)*2] == node.param2) then
return stack return stack
@ -106,7 +106,7 @@ local tube = {
end end
end, end,
can_insert = function(pos, node, stack, direction) can_insert = function(pos, node, stack, direction)
print(minetest.pos_to_string(direction), dirtab[direction.x+2+(direction.z+2)*2], node.param2) --print(minetest.pos_to_string(direction), dirtab[direction.x+2+(direction.z+2)*2], node.param2)
if direction.y == 1 if direction.y == 1
or (direction.y == 0 and dirtab[direction.x+2+(direction.z+2)*2] == node.param2) then or (direction.y == 0 and dirtab[direction.x+2+(direction.z+2)*2] == node.param2) then
return false return false
@ -409,7 +409,7 @@ minetest.register_on_player_receive_fields(
end end
) )
local function default_get_charge(itemstack) function technic.get_charge(itemstack)
-- check if is chargable -- check if is chargable
local tool_name = itemstack:get_name() local tool_name = itemstack:get_name()
if not technic.power_tools[tool_name] then if not technic.power_tools[tool_name] then
@ -419,7 +419,7 @@ local function default_get_charge(itemstack)
return item_meta:get_int("technic:charge"), technic.power_tools[tool_name] return item_meta:get_int("technic:charge"), technic.power_tools[tool_name]
end end
local function default_set_charge(itemstack, charge) function technic.set_charge(itemstack, charge)
local tool_name = itemstack:get_name() local tool_name = itemstack:get_name()
if technic.power_tools[tool_name] then if technic.power_tools[tool_name] then
technic.set_RE_wear(itemstack, charge, technic.power_tools[tool_name]) technic.set_RE_wear(itemstack, charge, technic.power_tools[tool_name])
@ -437,8 +437,8 @@ function technic.charge_tools(meta, batt_charge, charge_step)
-- get callbacks -- get callbacks
local src_def = src_stack:get_definition() local src_def = src_stack:get_definition()
local technic_get_charge = src_def.technic_get_charge or default_get_charge local technic_get_charge = src_def.technic_get_charge or technic.get_charge
local technic_set_charge = src_def.technic_set_charge or default_set_charge local technic_set_charge = src_def.technic_set_charge or technic.set_charge
-- get tool charge -- get tool charge
local tool_charge, item_max_charge = technic_get_charge(src_stack) local tool_charge, item_max_charge = technic_get_charge(src_stack)
@ -471,8 +471,8 @@ function technic.discharge_tools(meta, batt_charge, charge_step, max_charge)
-- get callbacks -- get callbacks
local src_def = src_stack:get_definition() local src_def = src_stack:get_definition()
local technic_get_charge = src_def.technic_get_charge or default_get_charge local technic_get_charge = src_def.technic_get_charge or technic.get_charge
local technic_set_charge = src_def.technic_set_charge or default_set_charge local technic_set_charge = src_def.technic_set_charge or technic.set_charge
-- get tool charge -- get tool charge
local tool_charge, item_max_charge = technic_get_charge(src_stack) local tool_charge, item_max_charge = technic_get_charge(src_stack)

View File

@ -43,84 +43,106 @@ local function check_connections(pos)
return connections return connections
end end
local function clear_networks(pos) local clear_networks
local function clear_network(network_id)
if not network_id then
return
end
for _,v in pairs(technic.networks[network_id].all_nodes) do
local pos1 = minetest.hash_node_position(v)
technic.cables[pos1] = nil
end
local network_bckup = technic.networks[network_id]
technic.networks[network_id] = nil
for _,n_pos in pairs(network_bckup.PR_nodes) do
clear_networks(n_pos)
end
for _,n_pos in pairs(network_bckup.RE_nodes) do
clear_networks(n_pos)
end
for _,n_pos in pairs(network_bckup.BA_nodes) do
clear_networks(n_pos)
end
end
clear_networks = function(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local placed = node.name ~= "air" local placed = node.name ~= "air"
local positions = check_connections(pos) local positions = check_connections(pos)
if #positions < 1 then return end if #positions < 1 then return end
local dead_end = #positions == 1
for _,connected_pos in pairs(positions) do
local net = technic.cables[minetest.hash_node_position(connected_pos)]
if net and technic.networks[net] then
if dead_end and placed then
-- Dead end placed, add it to the network
-- Get the network
local network_id = technic.cables[minetest.hash_node_position(positions[1])]
if not network_id then
-- We're evidently not on a network, nothing to add ourselves to
return
end
local sw_pos = minetest.get_position_from_hash(network_id)
sw_pos.y = sw_pos.y + 1
local network = technic.networks[network_id]
local tier = network.tier
-- Actually add it to the (cached) network if #positions == 1 then
-- !! IMPORTANT: ../switching_station.lua -> check_node_subp() must be kept in sync if placed then
-- Dead end placed, add it to the network
-- Get the network
local network_id = technic.cables[minetest.hash_node_position(positions[1])]
if not network_id then
-- We're evidently not on a network, nothing to add ourselves to
return
end
local network = technic.networks[network_id]
local tier = network.tier
-- Actually add it to the (cached) network
-- !! IMPORTANT: ../switching_station.lua -> check_node_subp() must be kept in sync
if technic.is_tier_cable(node.name, tier) then
technic.cables[minetest.hash_node_position(pos)] = network_id technic.cables[minetest.hash_node_position(pos)] = network_id
pos.visited = 1 table.insert(network.all_nodes,pos)
if technic.is_tier_cable(node.name, tier) then elseif technic.machines[tier][node.name] then
-- Found a cable -- Found a machine
table.insert(network.all_nodes,pos) local eu_type = technic.machines[tier][node.name]
elseif technic.machines[tier][node.name] then meta:set_string(tier.."_network", string.format("%.20g", network_id))
-- Found a machine meta:set_int(tier.."_EU_timeout", 2)
local eu_type = technic.machines[tier][node.name] if eu_type == technic.producer then
meta:set_string(tier.."_network", string.format("%.20g", network_id)) table.insert(network.PR_nodes, pos)
if eu_type == technic.producer then elseif eu_type == technic.receiver then
table.insert(network.PR_nodes, pos) table.insert(network.RE_nodes, pos)
elseif eu_type == technic.receiver then elseif eu_type == technic.producer_receiver then
table.insert(network.RE_nodes, pos) table.insert(network.PR_nodes, pos)
elseif eu_type == technic.producer_receiver then table.insert(network.RE_nodes, pos)
table.insert(network.PR_nodes, pos) elseif eu_type == technic.battery then
table.insert(network.RE_nodes, pos) table.insert(network.BA_nodes, pos)
elseif eu_type == technic.battery then
table.insert(network.BA_nodes, pos)
end
-- Note: SPECIAL (i.e. switching station) is not traversed!
end end
elseif dead_end and not placed then -- Note: SPECIAL (i.e. switching station) is not traversed!
-- Dead end removed, remove it from the network end
-- Get the network else
local network_id = technic.cables[minetest.hash_node_position(positions[1])] -- Dead end removed, remove it from the network
if not network_id then -- Get the network
-- We're evidently not on a network, nothing to add ourselves to local network_id = technic.cables[minetest.hash_node_position(positions[1])]
return if not network_id then
end -- We're evidently not on a network, nothing to add ourselves to
local network = technic.networks[network_id] return
end
local network = technic.networks[network_id]
-- Search for and remove machine -- Search for and remove machine
technic.cables[minetest.hash_node_position(pos)] = nil technic.cables[minetest.hash_node_position(pos)] = nil
for tblname,table in pairs(network) do for tblname,table in pairs(network) do
if tblname ~= "tier" then if tblname ~= "tier" then
for machinenum,machine in pairs(table) do for machinenum,machine in pairs(table) do
if machine.x == pos.x if machine.x == pos.x
and machine.y == pos.y and machine.y == pos.y
and machine.z == pos.z then and machine.z == pos.z then
table[machinenum] = nil table[machinenum] = nil
end
end end
end end
end end
else
-- Not a dead end, so the whole network needs to be recalculated
for _,v in pairs(technic.networks[net].all_nodes) do
local pos1 = minetest.hash_node_position(v)
technic.cables[pos1] = nil
end
technic.networks[net] = nil
end end
end end
return
end
clear_network(technic.cables[minetest.hash_node_position(pos)])
for _,connected_pos in pairs(positions) do
local network_id = technic.cables[minetest.hash_node_position(connected_pos)]
-- Not a dead end, so the whole network needs to be recalculated
clear_network(network_id)
end end
end end
@ -170,7 +192,7 @@ function technic.register_cable(tier, size)
connects_to = {"group:technic_"..ltier.."_cable", connects_to = {"group:technic_"..ltier.."_cable",
"group:technic_"..ltier, "group:technic_all_tiers"}, "group:technic_"..ltier, "group:technic_all_tiers"},
on_construct = clear_networks, on_construct = clear_networks,
on_destruct = clear_networks, after_destruct = clear_networks,
}) })
local xyz = { local xyz = {
@ -210,7 +232,7 @@ function technic.register_cable(tier, size)
connects_to = {"group:technic_"..ltier.."_cable", connects_to = {"group:technic_"..ltier.."_cable",
"group:technic_"..ltier, "group:technic_all_tiers"}, "group:technic_"..ltier, "group:technic_all_tiers"},
on_construct = clear_networks, on_construct = clear_networks,
on_destruct = clear_networks, after_destruct = clear_networks,
} }
def.node_box.fixed = { def.node_box.fixed = {
{-size, -size, -size, size, size, size}, {-size, -size, -size, size, size, size},

View File

@ -30,6 +30,8 @@ local dependent_crafts_to_clear = {
nether = { nether = {
"nether:brick", "nether:brick",
"nether:brick_compressed", "nether:brick_compressed",
"nether:rack",
"nether:rack_deep",
}, },
} }
@ -45,17 +47,16 @@ end
-- Clear recipes -- Clear recipes
for _, craft_name in ipairs(crafts_to_clear) do for _, craft_name in ipairs(crafts_to_clear) do
local is_regular = string.sub(craft_name, 1, 7) ~= "nether:" -- Regular bricks are 2x2 shaped, nether bricks are 3x3 shaped (irregular)
local is_regular = string.sub(craft_name, 1, 12) ~= "nether:brick"
local shaped_recipe local shaped_recipe
if is_regular then if is_regular then
-- Regular compression recipes use 2x2 shape.
shaped_recipe = { shaped_recipe = {
{craft_name, craft_name}, {craft_name, craft_name},
{craft_name, craft_name}, {craft_name, craft_name},
} }
else else
-- Nether's compression recipes use 3x3 shape.
shaped_recipe = { shaped_recipe = {
{craft_name, craft_name, craft_name}, {craft_name, craft_name, craft_name},
{craft_name, craft_name, craft_name}, {craft_name, craft_name, craft_name},
@ -99,6 +100,8 @@ local dependent_recipes = {
nether = { nether = {
{"nether:brick 9", "nether:brick_compressed"}, {"nether:brick 9", "nether:brick_compressed"},
{"nether:brick_compressed 9", "nether:nether_lump"}, {"nether:brick_compressed 9", "nether:nether_lump"},
{"nether:rack", "nether:brick",},
{"nether:rack_deep", "nether:brick_deep"},
}, },
} }

View File

@ -32,7 +32,10 @@ function technic.register_recipe_type(typename, origdata)
end end
local function get_recipe_index(items) local function get_recipe_index(items)
if not items or type(items) ~= "table" then return false end if type(items) ~= "table" then
return false
end
local l = {} local l = {}
for i, stack in ipairs(items) do for i, stack in ipairs(items) do
l[i] = ItemStack(stack):get_name() l[i] = ItemStack(stack):get_name()
@ -75,22 +78,21 @@ local function register_recipe(typename, data)
end end
if (have_cg or have_i3) and technic.recipes[typename].output_size == 1 then if (have_cg or have_i3) and technic.recipes[typename].output_size == 1 then
local result = data.output local result = data.output
if (type(result)=="table") then if type(result) == "table" then
result = result[1] result = result[1]
end end
local items = table.concat(data.input, ", ")
if have_cg and craftguide.register_craft then if have_cg and craftguide.register_craft then
craftguide.register_craft({ craftguide.register_craft({
type = typename, type = typename,
result = result, result = result,
items = {items}, items = data.input,
}) })
end end
if have_i3 then if have_i3 then
i3.register_craft({ i3.register_craft({
type = typename, type = typename,
result = result, result = result,
items = {items}, items = data.input,
}) })
end end
end end

View File

@ -97,12 +97,14 @@ local function flatten(map)
return list return list
end end
-- Add a wire node to the LV/MV/HV network -- Add a node to the LV/MV/HV network
-- Returns: indicator whether the cable is new in the network -- Returns: indicator whether the node is new in the network
local hash_node_position = minetest.hash_node_position local hash_node_position = minetest.hash_node_position
local function add_network_node(nodes, pos, network_id) local function add_network_node(nodes, pos, network_id)
local node_id = hash_node_position(pos) local node_id = hash_node_position(pos)
technic.cables[node_id] = network_id if network_id then
technic.cables[node_id] = network_id
end
if nodes[node_id] then if nodes[node_id] then
return false return false
end end
@ -136,21 +138,31 @@ local check_node_subp = function(network, pos, machines, sw_pos, from_below, net
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
-- Normal tostring() does not have enough precision, neither does meta:set_int() -- Normal tostring() does not have enough precision, neither does meta:set_int()
-- Lua 5.1 bug: Cannot use hexadecimal notation for compression (see LuaJIT #911) -- Lua 5.1 bug: Cannot use hexadecimal notation for compression (see LuaJIT #911)
meta:set_string(network.tier.."_network", string.format("%.20g", network_id)) local network_str = string.format("%.20g", network_id)
local network_key = network.tier.."_network"
local m_network_str = meta:get_string(network_key)
if m_network_str == "" then
meta:set_string(network_key, network_str)
else
if m_network_str ~= network_str then
return
end
end
if eu_type == technic.producer then if eu_type == technic.producer then
add_network_node(network.PR_nodes, pos, network_id) add_network_node(network.PR_nodes, pos)
elseif eu_type == technic.receiver then elseif eu_type == technic.receiver then
add_network_node(network.RE_nodes, pos, network_id) add_network_node(network.RE_nodes, pos)
elseif eu_type == technic.producer_receiver then elseif eu_type == technic.producer_receiver then
add_network_node(network.PR_nodes, pos, network_id) add_network_node(network.PR_nodes, pos)
add_network_node(network.RE_nodes, pos, network_id) add_network_node(network.RE_nodes, pos)
elseif eu_type == technic.battery then elseif eu_type == technic.battery then
add_network_node(network.BA_nodes, pos, network_id) add_network_node(network.BA_nodes, pos)
elseif eu_type == "SPECIAL" and from_below and elseif eu_type == "SPECIAL" and from_below and
not vector.equals(pos, sw_pos) then not vector.equals(pos, sw_pos) then
-- Another switching station -> disable it -- Another switching station -> disable it
add_network_node(network.SP_nodes, pos, network_id) add_network_node(network.SP_nodes, pos)
meta:set_int("active", 0) meta:set_int("active", 0)
end end
@ -193,7 +205,6 @@ local get_network = function(sw_pos, cable_pos, tier)
end end
return cached.PR_nodes, cached.BA_nodes, cached.RE_nodes return cached.PR_nodes, cached.BA_nodes, cached.RE_nodes
end end
local machines = technic.machines[tier] local machines = technic.machines[tier]
local network = { local network = {
tier = tier, tier = tier,
@ -455,6 +466,7 @@ local function switching_station_timeout_count(pos, tier)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local timeout = meta:get_int(tier.."_EU_timeout") local timeout = meta:get_int(tier.."_EU_timeout")
if timeout <= 0 then if timeout <= 0 then
meta:set_string(tier.."_network", "")
meta:set_int(tier.."_EU_input", 0) -- Not needed anymore <-- actually, it is for supply converter meta:set_int(tier.."_EU_input", 0) -- Not needed anymore <-- actually, it is for supply converter
return true return true
else else
@ -468,22 +480,29 @@ minetest.register_abm({
interval = 1, interval = 1,
chance = 1, chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider) action = function(pos, node, active_object_count, active_object_count_wider)
local has_network = false
local technic_machine = false
for tier, machines in pairs(technic.machines) do for tier, machines in pairs(technic.machines) do
if machines[node.name] and switching_station_timeout_count(pos, tier) then if machines[node.name] then
local nodedef = minetest.registered_nodes[node.name] technic_machine = true
if nodedef then if not switching_station_timeout_count(pos, tier) then
local meta = minetest.get_meta(pos) has_network = true
meta:set_string("infotext", S("%s Has No Network"):format(nodedef.description))
end
if nodedef and nodedef.technic_disabled_machine_name then
node.name = nodedef.technic_disabled_machine_name
minetest.swap_node(pos, node)
end
if nodedef and nodedef.technic_on_disable then
nodedef.technic_on_disable(pos, node)
end end
end end
end end
if technic_machine and not has_network then
local nodedef = minetest.registered_nodes[node.name]
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("%s Has No Network"):format(nodedef.description))
if nodedef.technic_disabled_machine_name then
node.name = nodedef.technic_disabled_machine_name
minetest.swap_node(pos, node)
end
if nodedef.technic_on_disable then
nodedef.technic_on_disable(pos, node)
end
end
end, end,
}) })

View File

@ -128,6 +128,7 @@ local function dig_recursive(x, y, z)
if safe_cut and cutter.param2[i] ~= 0 then if safe_cut and cutter.param2[i] ~= 0 then
-- Do not dig manually placed nodes -- Do not dig manually placed nodes
-- Problem: moretrees' generated jungle trees use param2 = 2 -- Problem: moretrees' generated jungle trees use param2 = 2
cutter.stopped_by_safe_cut = true
return return
end end
@ -201,6 +202,11 @@ local function chainsaw_dig(player, pos, remaining_charge)
return return
end end
if cutter.stopped_by_safe_cut then
minetest.chat_send_player(player_name, S("The chainsaw could not dig all nodes" ..
" because the safety mechanism was activated."))
end
minetest.sound_play("chainsaw", { minetest.sound_play("chainsaw", {
pos = pos, pos = pos,
gain = 1.0, gain = 1.0,

View File

@ -72,74 +72,68 @@ else
end end
end end
local onesize_products = { local function add_buttons(do_variants, t, x, y)
slope = 2, local X_OFFSET = 1
slope_edge = 1, local BUTTONS_PER_ROW = 7
slope_inner_edge = 1,
pyramid = 2,
spike = 1,
cylinder = 2,
oblate_spheroid = 1,
sphere = 1,
stick = 8,
slope_upsdown = 2,
slope_edge_upsdown = 1,
slope_inner_edge_upsdown = 1,
cylinder_horizontal = 2,
slope_lying = 2,
onecurvededge = 1,
twocurvededge = 1,
}
local twosize_products = {
element_straight = 2,
element_end = 2,
element_cross = 1,
element_t = 1,
element_edge = 2,
}
local cnc_formspec = -- ipairs: only iterate over continuous integers
"size[9,11;]".. for _, data in ipairs(technic_cnc.programs) do
"label[1,0;"..S("Choose Milling Program:").."]".. -- Never add full variants. Only add half variants when asked
"image_button[1,0.5;1,1;technic_cnc_slope.png;slope; ]".. if not data.half_counterpart and (do_variants == (data.full_counterpart ~= nil)) then
"image_button[2,0.5;1,1;technic_cnc_slope_edge.png;slope_edge; ]".. --print("add", data.suffix)
"image_button[3,0.5;1,1;technic_cnc_slope_inner_edge.png;slope_inner_edge; ]".. t[#t + 1] = ("image_button[%g,%g;1,1;%s.png;%s; ]"):format(
"image_button[4,0.5;1,1;technic_cnc_pyramid.png;pyramid; ]".. x + X_OFFSET, y, data.suffix, data.short_name
"image_button[5,0.5;1,1;technic_cnc_spike.png;spike; ]".. )
"image_button[6,0.5;1,1;technic_cnc_cylinder.png;cylinder; ]".. t[#t + 1] = ("tooltip[%s;%s]"):format(
"image_button[7,0.5;1,1;technic_cnc_oblate_spheroid.png;oblate_spheroid; ]".. data.short_name, minetest.formspec_escape(data.desc .. " (* " .. data.output .. ")")
"image_button[8,0.5;1,1;technic_cnc_stick.png;stick; ]".. )
"image_button[1,1.5;1,1;technic_cnc_slope_upsdwn.png;slope_upsdown; ]".. x = x + 1
"image_button[2,1.5;1,1;technic_cnc_slope_edge_upsdwn.png;slope_edge_upsdown; ]".. if x == BUTTONS_PER_ROW then
"image_button[3,1.5;1,1;technic_cnc_slope_inner_edge_upsdwn.png;slope_inner_edge_upsdown; ]".. x = 0
"image_button[4,1.5;1,1;technic_cnc_cylinder_horizontal.png;cylinder_horizontal; ]".. y = y + 1
"image_button[5,1.5;1,1;technic_cnc_sphere.png;sphere; ]".. end
end
end
end
"image_button[1,2.5;1,1;technic_cnc_slope_lying.png;slope_lying; ]".. local function make_formspec()
"image_button[2,2.5;1,1;technic_cnc_onecurvededge.png;onecurvededge; ]".. local t = {
"image_button[3,2.5;1,1;technic_cnc_twocurvededge.png;twocurvededge; ]".. "size[9,11;]",
"label[1,0;"..S("Choose Milling Program:").."]",
}
add_buttons(false, t, 0, 0.5)
"label[1,3.5;"..S("Slim Elements half / normal height:").."]".. t[#t + 1] = (
"label[1,3.5;"..S("Slim Elements half / normal height:").."]"..
"image_button[1,4;1,0.5;technic_cnc_full.png;full; ]"..
"image_button[1,4.5;1,0.5;technic_cnc_half.png;half; ]"
)
add_buttons(true, t, 1, 4)
"image_button[1,4;1,0.5;technic_cnc_full.png;full; ]".. t[#t + 1] = (
"image_button[1,4.5;1,0.5;technic_cnc_half.png;half; ]".. "label[0, 5;"..S("In:").."]"..
"image_button[2,4;1,1;technic_cnc_element_straight.png;element_straight; ]".. "list[current_name;src;0.5,5.5;1,1;]"..
"image_button[3,4;1,1;technic_cnc_element_end.png;element_end; ]".. "label[4, 5;"..S("Out:").."]"..
"image_button[4,4;1,1;technic_cnc_element_cross.png;element_cross; ]".. "list[current_name;dst;5,5.5;4,1;]"..
"image_button[5,4;1,1;technic_cnc_element_t.png;element_t; ]"..
"image_button[6,4;1,1;technic_cnc_element_edge.png;element_edge; ]"..
"label[0, 5;"..S("In:").."]".. "list[current_player;main;0,7;8,4;]"..
"list[current_name;src;0.5,5.5;1,1;]".. "listring[current_name;dst]"..
"label[4, 5;"..S("Out:").."]".. "listring[current_player;main]"..
"list[current_name;dst;5,5.5;4,1;]".. "listring[current_name;src]"..
"listring[current_player;main]"
)
return table.concat(t)
end
local cnc_formspec = nil
minetest.register_on_mods_loaded(function()
technic_cnc._populate_shortcuts()
cnc_formspec = make_formspec()
end)
"list[current_player;main;0,7;8,4;]"..
"listring[current_name;dst]"..
"listring[current_player;main]"..
"listring[current_name;src]"..
"listring[current_player;main]"
-- The form handler is declared here because we need it in both the inactive and active modes -- The form handler is declared here because we need it in both the inactive and active modes
-- in order to be able to change programs wile it is running. -- in order to be able to change programs wile it is running.
@ -168,27 +162,28 @@ local function form_handler(pos, formname, fields, sender)
for k, _ in pairs(fields) do for k, _ in pairs(fields) do
-- Set a multipier for the half/full size capable blocks -- Set a multipier for the half/full size capable blocks
local multiplier local program = technic_cnc.programs["technic_cnc_" .. k]
if twosize_products[k] ~= nil then if size == 1 and program and program.full_counterpart then
multiplier = size * twosize_products[k] program = technic_cnc.programs["technic_cnc_" .. k .. "_double"]
else
multiplier = onesize_products[k]
end end
if program then
local multiplier = program.output
local product = inputname .. "_" .. program.suffix
if onesize_products[k] ~= nil or twosize_products[k] ~= nil then
meta:set_float( "cnc_multiplier", multiplier) meta:set_float( "cnc_multiplier", multiplier)
meta:set_string("cnc_user", sender:get_player_name()) meta:set_string("cnc_user", sender:get_player_name())
end
if onesize_products[k] ~= nil or (twosize_products[k] ~= nil and size==2) then if program.half_counterpart then -- is full
meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k) if size == 1 then
--print(inputname .. "_technic_cnc_" .. k) meta:set_string("cnc_product", product)
break --print(product, multiplier)
end end
break -- no larger sizes allowed
end
if twosize_products[k] ~= nil and size==1 then -- half for normal
meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k .. "_double") meta:set_string("cnc_product", product)
--print(inputname .. "_technic_cnc_" .. k .. "_double") --print(product, multiplier)
break break
end end
end end
@ -236,7 +231,7 @@ local run = function(pos, node)
meta:set_int("src_time", meta:get_int("src_time") + 1) meta:set_int("src_time", meta:get_int("src_time") + 1)
if meta:get_int("src_time") >= 3 then -- 3 ticks per output if meta:get_int("src_time") >= 3 then -- 3 ticks per output
meta:set_int("src_time", 0) meta:set_int("src_time", 0)
srcstack = inv:get_stack("src", 1) local srcstack = inv:get_stack("src", 1)
srcstack:take_item() srcstack:take_item()
inv:set_stack("src", 1, srcstack) inv:set_stack("src", 1, srcstack)
inv:add_item("dst", result.." "..meta:get_int("cnc_multiplier")) inv:add_item("dst", result.." "..meta:get_int("cnc_multiplier"))

View File

@ -8,16 +8,27 @@ local ALPHA_CLIP = minetest.features.use_texture_alpha_string_modes and "clip" o
------------------------------------------------------ ------------------------------------------------------
-- Define slope boxes for the various nodes -- Define slope boxes for the various nodes
--[[
Additional keys after registration:
programs[program.suffix] = program
Additional fields after registration:
program.short_name = (trimmed suffix)
program.full_counterpart = suffix (optional, for full/half variants)
program.half_counterpart = suffix (optional, for full/half variants)
]]
------------------------------------------- -------------------------------------------
technic_cnc.programs = { technic_cnc.programs = {
{ suffix = "technic_cnc_stick", { suffix = "technic_cnc_stick",
model = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}, model = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
desc = S("Stick") desc = S("Stick"),
output = 8
}, },
{ suffix = "technic_cnc_element_end_double", { suffix = "technic_cnc_element_end_double",
model = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5}, model = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
desc = S("Element End Double") desc = S("Element End Double"),
output = 2
}, },
{ suffix = "technic_cnc_element_cross_double", { suffix = "technic_cnc_element_cross_double",
@ -25,7 +36,8 @@ technic_cnc.programs = {
{0.3, -0.5, -0.3, 0.5, 0.5, 0.3}, {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
{-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
{-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}}, {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
desc = S("Element Cross Double") desc = S("Element Cross Double"),
output = 1
}, },
{ suffix = "technic_cnc_element_t_double", { suffix = "technic_cnc_element_t_double",
@ -33,24 +45,28 @@ technic_cnc.programs = {
{-0.3, -0.5, -0.5, 0.3, 0.5, 0.3}, {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
{-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}, {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
{0.3, -0.5, -0.3, 0.5, 0.5, 0.3}}, {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}},
desc = S("Element T Double") desc = S("Element T Double"),
output = 1
}, },
{ suffix = "technic_cnc_element_edge_double", { suffix = "technic_cnc_element_edge_double",
model = { model = {
{-0.3, -0.5, -0.5, 0.3, 0.5, 0.3}, {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
{-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}}, {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
desc = S("Element Edge Double") desc = S("Element Edge Double"),
output = 2
}, },
{ suffix = "technic_cnc_element_straight_double", { suffix = "technic_cnc_element_straight_double",
model = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, model = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
desc = S("Element Straight Double") desc = S("Element Straight Double"),
output = 2
}, },
{ suffix = "technic_cnc_element_end", { suffix = "technic_cnc_element_end",
model = {-0.3, -0.5, -0.3, 0.3, 0, 0.5}, model = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
desc = S("Element End") desc = S("Element End"),
output = nil -- calculated
}, },
{ suffix = "technic_cnc_element_cross", { suffix = "technic_cnc_element_cross",
@ -58,7 +74,8 @@ technic_cnc.programs = {
{0.3, -0.5, -0.3, 0.5, 0, 0.3}, {0.3, -0.5, -0.3, 0.5, 0, 0.3},
{-0.3, -0.5, -0.5, 0.3, 0, 0.5}, {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
{-0.5, -0.5, -0.3, -0.3, 0, 0.3}}, {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
desc = S("Element Cross") desc = S("Element Cross"),
output = nil -- calculated
}, },
{ suffix = "technic_cnc_element_t", { suffix = "technic_cnc_element_t",
@ -66,19 +83,22 @@ technic_cnc.programs = {
{-0.3, -0.5, -0.5, 0.3, 0, 0.3}, {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
{-0.5, -0.5, -0.3, -0.3, 0, 0.3}, {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
{0.3, -0.5, -0.3, 0.5, 0, 0.3}}, {0.3, -0.5, -0.3, 0.5, 0, 0.3}},
desc = S("Element T") desc = S("Element T"),
output = nil -- calculated
}, },
{ suffix = "technic_cnc_element_edge", { suffix = "technic_cnc_element_edge",
model = { model = {
{-0.3, -0.5, -0.5, 0.3, 0, 0.3}, {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
{-0.5, -0.5, -0.3, -0.3, 0, 0.3}}, {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
desc = S("Element Edge") desc = S("Element Edge"),
output = nil -- calculated
}, },
{ suffix = "technic_cnc_element_straight", { suffix = "technic_cnc_element_straight",
model = {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, model = {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
desc = S("Element Straight") desc = S("Element Straight"),
output = nil -- calculated
}, },
{ suffix = "technic_cnc_oblate_spheroid", { suffix = "technic_cnc_oblate_spheroid",
@ -91,32 +111,38 @@ technic_cnc.programs = {
{ -8/16, -4/16, -8/16, 8/16, 4/16, 8/16 }, { -8/16, -4/16, -8/16, 8/16, 4/16, 8/16 },
{ -6/16, -8/16, -6/16, 6/16, -4/16, 6/16 } { -6/16, -8/16, -6/16, 6/16, -4/16, 6/16 }
} }
} },
output = 1
}, },
{ suffix = "technic_cnc_sphere", { suffix = "technic_cnc_sphere",
model = "technic_cnc_sphere.obj", model = "technic_cnc_sphere.obj",
desc = S("Sphere") desc = S("Sphere"),
output = 1
}, },
{ suffix = "technic_cnc_cylinder_horizontal", { suffix = "technic_cnc_cylinder_horizontal",
model = "technic_cnc_cylinder_horizontal.obj", model = "technic_cnc_cylinder_horizontal.obj",
desc = S("Horizontal Cylinder") desc = S("Horizontal Cylinder"),
output = 2
}, },
{ suffix = "technic_cnc_cylinder", { suffix = "technic_cnc_cylinder",
model = "technic_cnc_cylinder.obj", model = "technic_cnc_cylinder.obj",
desc = S("Cylinder") desc = S("Cylinder"),
output = 2
}, },
{ suffix = "technic_cnc_twocurvededge", { suffix = "technic_cnc_twocurvededge",
model = "technic_cnc_two_curved_edge.obj", model = "technic_cnc_two_curved_edge.obj",
desc = S("Two Curved Edge/Corner Block") desc = S("Two Curved Edge/Corner Block"),
output = 1
}, },
{ suffix = "technic_cnc_onecurvededge", { suffix = "technic_cnc_onecurvededge",
model = "technic_cnc_one_curved_edge.obj", model = "technic_cnc_one_curved_edge.obj",
desc = S("One Curved Edge Block") desc = S("One Curved Edge Block"),
output = 1
}, },
{ suffix = "technic_cnc_spike", { suffix = "technic_cnc_spike",
@ -130,7 +156,8 @@ technic_cnc.programs = {
{ -6/16, -4/16, -6/16, 6/16, 0, 6/16 }, { -6/16, -4/16, -6/16, 6/16, 0, 6/16 },
{ -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 } { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
} }
} },
output = 1
}, },
{ suffix = "technic_cnc_pyramid", { suffix = "technic_cnc_pyramid",
@ -144,7 +171,8 @@ technic_cnc.programs = {
{ -6/16, -6/16, -6/16, 6/16, -4/16, 6/16 }, { -6/16, -6/16, -6/16, 6/16, -4/16, 6/16 },
{ -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 } { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }
} }
} },
output = 2
}, },
{ suffix = "technic_cnc_slope_inner_edge_upsdown", { suffix = "technic_cnc_slope_inner_edge_upsdown",
@ -165,7 +193,8 @@ technic_cnc.programs = {
{ -0.5, 0.25, -0.25, 0.5, 0, 0.5 }, { -0.5, 0.25, -0.25, 0.5, 0, 0.5 },
{ -0.5, 0.5, -0.5, 0.5, 0.25, 0.5 } { -0.5, 0.5, -0.5, 0.5, 0.25, 0.5 }
} }
} },
output = 1
}, },
{ suffix = "technic_cnc_slope_edge_upsdown", { suffix = "technic_cnc_slope_edge_upsdown",
@ -179,7 +208,8 @@ technic_cnc.programs = {
{ 0, 0, 0, 8/16, -4/16, 8/16 }, { 0, 0, 0, 8/16, -4/16, 8/16 },
{ 4/16, -4/16, 4/16, 8/16, -8/16, 8/16 } { 4/16, -4/16, 4/16, 8/16, -8/16, 8/16 }
} }
} },
output = 1
}, },
{ suffix = "technic_cnc_slope_inner_edge", { suffix = "technic_cnc_slope_inner_edge",
@ -200,7 +230,8 @@ technic_cnc.programs = {
{ -0.5, 0.25, 0.25, 0.5, 0.5, 0.5 }, { -0.5, 0.25, 0.25, 0.5, 0.5, 0.5 },
{ 0.25, 0.25, -0.5, 0.5, 0.5, 0.5 } { 0.25, 0.25, -0.5, 0.5, 0.5, 0.5 }
} }
} },
output = 1
}, },
{ suffix = "technic_cnc_slope_edge", { suffix = "technic_cnc_slope_edge",
@ -214,7 +245,8 @@ technic_cnc.programs = {
{ -4/16, -4/16, -4/16, 8/16, 0, 8/16 }, { -4/16, -4/16, -4/16, 8/16, 0, 8/16 },
{ -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 } { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
} }
} },
output = 1
}, },
{ suffix = "technic_cnc_slope_upsdown", { suffix = "technic_cnc_slope_upsdown",
@ -228,7 +260,8 @@ technic_cnc.programs = {
{ -8/16, 0, 0, 8/16, -4/16, 8/16 }, { -8/16, 0, 0, 8/16, -4/16, 8/16 },
{ -8/16, -4/16, 4/16, 8/16, -8/16, 8/16 } { -8/16, -4/16, 4/16, 8/16, -8/16, 8/16 }
} }
} },
output = 1
}, },
{ suffix = "technic_cnc_slope_lying", { suffix = "technic_cnc_slope_lying",
@ -242,7 +275,8 @@ technic_cnc.programs = {
{ -4/16, -8/16, -4/16, 0, 8/16, 8/16 }, { -4/16, -8/16, -4/16, 0, 8/16, 8/16 },
{ -8/16, -8/16, -8/16, -4/16, 8/16, 8/16 } { -8/16, -8/16, -8/16, -4/16, 8/16, 8/16 }
} }
} },
output = 2
}, },
{ suffix = "technic_cnc_slope", { suffix = "technic_cnc_slope",
@ -256,11 +290,40 @@ technic_cnc.programs = {
{ -8/16, -4/16, -4/16, 8/16, 0, 8/16 }, { -8/16, -4/16, -4/16, 8/16, 0, 8/16 },
{ -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 } { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
} }
} },
output = 2
}, },
} }
technic_cnc._populate_shortcuts = function()
-- Program quick access by string key
for _, data in ipairs(technic_cnc.programs) do
technic_cnc.programs[data.suffix] = data
data.short_name = assert(data.suffix:match("technic_cnc_(%S+)"))
end
-- Detect half/full counterparts
for k, data in pairs(technic_cnc.programs) do
if type(k) == "string" then
local full = technic_cnc.programs[k .. "_double"]
if full then
full.half_counterpart = k
data.full_counterpart = k .. "_double"
data.output = full.output * 2
--print("populate", k)
end
end
end
-- Final checks
for _, data in ipairs(technic_cnc.programs) do
assert(type(data.output) == "number", data.suffix)
assert(type(data.short_name) == "string", data.suffix)
end
end
-- Allow disabling certain programs for some node. Default is allowing all types for all nodes -- Allow disabling certain programs for some node. Default is allowing all types for all nodes
technic_cnc.programs_disable = { technic_cnc.programs_disable = {
-- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick -- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick
@ -327,44 +390,3 @@ function technic_cnc.register_all(recipeitem, groups, images, description)
end end
end end
-- REGISTER NEW TECHNIC_CNC_API's PART 2: technic_cnc..register_element_end(subname, recipeitem, groups, images, desc_element_xyz)
-----------------------------------------------------------------------------------------------------------------------
function technic_cnc.register_slope_edge_etc(recipeitem, groups, images, desc_slope, desc_slope_lying, desc_slope_upsdown, desc_slope_edge, desc_slope_inner_edge, desc_slope_upsdwn_edge, desc_slope_upsdwn_inner_edge, desc_pyramid, desc_spike, desc_onecurvededge, desc_twocurvededge, desc_cylinder, desc_cylinder_horizontal, desc_spheroid, desc_element_straight, desc_element_edge, desc_element_t, desc_element_cross, desc_element_end)
-- TODO: Remove this evil sorcery
technic_cnc.register_slope(recipeitem, groups, images, desc_slope)
technic_cnc.register_slope_lying(recipeitem, groups, images, desc_slope_lying)
technic_cnc.register_slope_upsdown(recipeitem, groups, images, desc_slope_upsdown)
technic_cnc.register_slope_edge(recipeitem, groups, images, desc_slope_edge)
technic_cnc.register_slope_inner_edge(recipeitem, groups, images, desc_slope_inner_edge)
technic_cnc.register_slope_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_edge)
technic_cnc.register_slope_inner_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_inner_edge)
technic_cnc.register_pyramid(recipeitem, groups, images, desc_pyramid)
technic_cnc.register_spike(recipeitem, groups, images, desc_spike)
technic_cnc.register_onecurvededge(recipeitem, groups, images, desc_onecurvededge)
technic_cnc.register_twocurvededge(recipeitem, groups, images, desc_twocurvededge)
technic_cnc.register_cylinder(recipeitem, groups, images, desc_cylinder)
technic_cnc.register_cylinder_horizontal(recipeitem, groups, images, desc_cylinder_horizontal)
technic_cnc.register_spheroid(recipeitem, groups, images, desc_spheroid)
technic_cnc.register_element_straight(recipeitem, groups, images, desc_element_straight)
technic_cnc.register_element_edge(recipeitem, groups, images, desc_element_edge)
technic_cnc.register_element_t(recipeitem, groups, images, desc_element_t)
technic_cnc.register_element_cross(recipeitem, groups, images, desc_element_cross)
technic_cnc.register_element_end(recipeitem, groups, images, desc_element_end)
end
-- REGISTER STICKS: noncubic.register_xyz(recipeitem, groups, images, desc_element_xyz)
------------------------------------------------------------------------------------------------------------
function technic_cnc.register_stick_etc(recipeitem, groups, images, desc_stick)
-- TODO: Remove this evil sorcery
technic_cnc.register_stick(recipeitem, groups, images, desc_stick)
end
function technic_cnc.register_elements(recipeitem, groups, images, desc_element_straight_double, desc_element_edge_double, desc_element_t_double, desc_element_cross_double, desc_element_end_double)
-- TODO: Remove this evil sorcery
technic_cnc.register_element_straight_double(recipeitem, groups, images, desc_element_straight_double)
technic_cnc.register_element_edge_double(recipeitem, groups, images, desc_element_edge_double)
technic_cnc.register_element_t_double(recipeitem, groups, images, desc_element_t_double)
technic_cnc.register_element_cross_double(recipeitem, groups, images, desc_element_cross_double)
technic_cnc.register_element_end_double(recipeitem, groups, images, desc_element_end_double)
end

View File

@ -10,6 +10,7 @@ local function register_material(nodename, tiles_override, descr_override)
end end
local groups = { local groups = {
cracky = ndef.groups.cracky,
crumbly = ndef.groups.crumbly, crumbly = ndef.groups.crumbly,
choppy = ndef.groups.choppy, choppy = ndef.groups.choppy,
flammable = ndef.groups.flammable, flammable = ndef.groups.flammable,
@ -19,6 +20,12 @@ local function register_material(nodename, tiles_override, descr_override)
oddly_breakable_by_hand = ndef.groups.oddly_breakable_by_hand, oddly_breakable_by_hand = ndef.groups.oddly_breakable_by_hand,
not_in_creative_inventory = 1, not_in_creative_inventory = 1,
} }
local count = 0
for _ in pairs(groups) do
count = count + 1
end
assert(count >= 2, "Too few groups. node name=" .. nodename)
local tiles = tiles_override or { ndef.tiles[#ndef.tiles] } local tiles = tiles_override or { ndef.tiles[#ndef.tiles] }
assert(tiles and #tiles == 1, "Unknown tile format in node name=" .. nodename) assert(tiles and #tiles == 1, "Unknown tile format in node name=" .. nodename)

View File

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB