Add mods: technic, moreores, paintings, Nyancat (Pbj_pup). Small fix: sandwiches

This commit is contained in:
N-Nachtigal 2025-06-05 16:15:56 +02:00
parent 15e8e696a2
commit fb09deddc1
1404 changed files with 156555 additions and 211 deletions

View file

@ -0,0 +1,203 @@
Technic CNC
-----------------
Provides CNC machines that allow cutting nodes to selected shapes.
[![luacheck](https://github.com/mt-mods/technic/actions/workflows/luacheck.yml/badge.svg)](https://github.com/mt-mods/technic/actions/workflows/luacheck.yml?query=branch%3Amaster)
[![mineunit](https://github.com/mt-mods/technic/actions/workflows/mineunit.yml/badge.svg)](https://github.com/mt-mods/technic/actions/workflows/mineunit.yml?query=branch%3Amaster)
[![mineunit](https://byob.yarr.is/mt-mods/technic/coverage-cnc)](https://github.com/mt-mods/technic/actions/workflows/mineunit.yml?query=branch%3Amaster+is%3Asuccess)
# Machines
### LV CNC Machine (technic:cnc)
* Manufactures different shapes from provided raw materials.
* Manufactures products over time if technic is enabled.
* Manufactures products immediately when selecting program if technic is not enabled.
* 1 inventory slot for input materials, 4 inventory slots for products.
### LV CNC Machine Mk2 (technic:cnc_mk2)
* All features provided by technic:cnc
* Only available if technic, digilines or pipeworks is available.
* Has digiline API for programming, enabling, disabling, getting status and getting programs.
* Can use technic upgrades for energy saving (RE battery), auto eject (CLU), and public use (chest).
* Has support for pipeworks tubes for receiving raw materials or taking products using filter injectors.
# Configuration (minetest.conf)
| Configuration key | Default | Description
|-----------------------------|-------------|--------------------------------------------------------------------------|
| technic_cnc_use_technic | true | Use technic power networks and upgrades, machines require LV network |
| technic_cnc_use_digilines | true | Use digilines to allow configuring machines using digiline messages |
| technic_cnc_use_pipeworks | true | Use pipeworks for tube and injector support |
# Digilines (technic:cnc_mk2)
### Simple commands, type: string
| Command | Description
|-------------------|--------------------------------------------------------------------------------------------------|
| enable | Enables machines, machine will attempt manufacturing products if materials are available |
| disable | Disables machines, machine will stop manufacturing and will not consume power |
| programs | Machine will send table containing all possible programs as keys and product count as values |
| status | Machine will send table with following keys: enabled, time, size, program, user, material |
Example reply for `programs` command:
```lua
{
element_end = 2,
slope_inner_edge = 1,
twocurvededge = 1,
cylinder = 2,
stick = 8,
spike = 1,
element_cross = 1,
slope_edge_upsdown = 1,
cylinder_horizontal = 2,
element_edge = 2,
oblate_spheroid = 1,
slope = 2,
slope_lying = 2,
slope_inner_edge_upsdown = 1,
sphere = 1,
element_straight = 2,
slope_upsdown = 2,
pyramid = 2,
element_t = 1,
onecurvededge = 1,
slope_edge = 1
}
```
Example reply for `status` command:
```lua
{
enabled = true,
time = 2,
user = "SX",
material = {
count = 98,
name = "default:desert_sandstone",
},
program = "sphere",
size = 2
}
```
### Complex commands, type: table
Command can contain any combination of keys and will affect only relevant parts of functionality.
Example with all possible keys set:
```lua
{
program = "sphere",
size = 2,
enabled = true
}
```
Value for `program` should be one of keys returned by simple command `programs`, it will change CNC program.
Value for `size` should be number `1` or `2`, other numbers or types are not acceppted. Sets size of programs that can
produce both half and full sized nodes. `2` is for half size and `1` for full size products.
Value for `ènabled` should be `true` or `false`. Functions similar to simple string commands `enable` and `disable`.
Invalid values or value types are simply skipped and not used, check your value types
and keys for typos if it seems that machine accepts commands only partially.
# Technic CNC API for extensions
API is incomplete, feel free to give suggestions for functionality or other feedback about CNC API.
### CNC material, program and product extension API:
*Currently undetermined / to be determined.*
### CNC machine control and manufacturing API:
```lua
-- Get product item string with count for given program, material and size
-- Return value example: default:desert_sandstone_technic_cnc_stick 8
function technic_cnc.get_product(program, material, size)
-- Set program for cnc machine with optional size, size is not changed if size is nil
function technic_cnc.set_program(meta, program, size)
-- Returns true if CNC machine is enabled and false if machine is disabled
function technic_cnc.is_enabled(meta) -- return true|false
-- Enables CNC machine
function technic_cnc.enable(meta)
-- Disables CNC machine
function technic_cnc.disable(meta)
-- Finds first input stack with items
function technic_cnc.get_material(inventory)
-- Manufacture product based on current program.
-- Updates src and dst inventories taking required amount from src inventory and placing products into dst inventory
function technic_cnc.produce(meta, inventory)
```
### Register new CNC machine defined by your mod:
```lua
-- Textures for machine
local tiles = {
"my_mod_my_cnc_machine_top.png",
"my_mod_my_cnc_machine_bottom.png",
"my_mod_my_cnc_machine_right.png",
"my_mod_my_cnc_machine_left.png",
"my_mod_my_cnc_machine_back.png",
"my_mod_my_cnc_machine_front.png"
}
local tiles_active = {
"my_mod_my_cnc_machine_top_active.png",
"my_mod_my_cnc_machine_bottom_active.png",
"my_mod_my_cnc_machine_right_active.png",
"my_mod_my_cnc_machine_left_active.png",
"my_mod_my_cnc_machine_back_active.png",
"my_mod_my_cnc_machine_front_active.png"
}
--
-- Add pipeworks tube connection with overlay textures if pipeworks is available for CNC machines
--
local tube_def = nil
if technic_cnc.pipeworks then
tiles = technic_cnc.pipeworks.tube_entry_overlay(tiles)
tiles_active = technic_cnc.pipeworks.tube_entry_overlay(tiles_active)
tube_def = technic_cnc.pipeworks.new_tube()
end
--
-- Default values provided with example machine registration below.
--
-- Required definition keys that do not have default value:
-- description, programs, demand
-- Optional definition keys that do not have default value:
-- recipe, upgrade, digilines, tube
--
technic_cnc.register_cnc_machine("my_mod_name:my_cnc_machine", {
description = "My Mod - My CNC Machine",
input_size = 1,
output_size = 4,
digilines = technic_cnc.digilines,
upgrade = true,
tube = tube_def,
programs = { "sphere", "spike", "stick", "slope" },
demand = 539,
get_formspec = technic_cnc.formspec.get_formspec,
on_receive_fields = technic_cnc.formspec.on_receive_fields,
recipe = {
{'default:glass', 'default:glass', 'default:glass'},
{'default:steelblock', 'default:diamond', 'default:steelblock'},
{'default:steelblock', '', 'default:steelblock'},
},
tiles = tiles,
tiles_active = tiles_active,
})
```

View file

@ -0,0 +1,459 @@
-- API for the technic CNC machine
-- Again code is adapted from the NonCubic Blocks MOD v1.4 by yves_de_beck
local S = technic_cnc.getter
local ALPHA_CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or true
-- Generic function for registering all the different node types
function technic_cnc.register_program(recipeitem, suffix, model, groups, images, description, cbox, sbox)
local dtype
local nodeboxdef
local meshdef
if type(model) ~= "string" then -- assume a nodebox if it's a table or function call
dtype = "nodebox"
nodeboxdef = {
type = "fixed",
fixed = model
}
else
dtype = "mesh"
meshdef = model
end
if cbox and not sbox then sbox = cbox end
minetest.register_node(":"..recipeitem.."_"..suffix, {
description = description,
drawtype = dtype,
node_box = nodeboxdef,
mesh = meshdef,
tiles = images,
paramtype = "light",
paramtype2 = "facedir",
use_texture_alpha = ALPHA_CLIP,
walkable = true,
groups = groups,
is_ground_content = false,
selection_box = sbox,
collision_box = cbox
})
end
-- function to iterate over all the programs the CNC machine knows
function technic_cnc.register_all(recipeitem, groups, images, description)
for _, data in ipairs(technic_cnc.programs) do
-- Disable node creation for disabled node types for some material
local do_register = true
if technic_cnc.programs_disable[recipeitem] ~= nil then
for __, disable in ipairs(technic_cnc.programs_disable[recipeitem]) do
if disable == data.suffix then
do_register = false
end
end
end
-- Create the node if it passes the test
if do_register then
technic_cnc.register_program(recipeitem, data.suffix, data.model,
groups, images, description.." "..data.desc, data.cbox, data.sbox)
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)
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)
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)
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
-- CNC MACHINE API
------------------------------------------------------------------------------------------------------------
function technic_cnc.get_product(program, material, size)
-- Get and return product item string with stack size or nil if product not available
local multiplier = technic_cnc.products[program]
if multiplier then
size = math.max(1, math.min(2, size))
local twosize = technic_cnc.twosize_products[program]
local double = size == 1 and twosize and "_double" or ""
local product = ("%s_technic_cnc_%s%s"):format(material, program, double)
if minetest.registered_nodes[product] then
return ("%s %d"):format(product, multiplier * (twosize and size or 1))
end
end
end
function technic_cnc.set_program(meta, program, size)
if technic_cnc.products[program] then
if size then
meta:set_int("size", math.max(1, math.min(2, size)))
end
meta:set_string("program", program)
return true
end
return false
end
function technic_cnc.is_enabled(meta)
return meta:get("disable") == nil
end
function technic_cnc.enable(meta)
meta:set_string("disable", "")
end
function technic_cnc.disable(meta)
meta:set_string("disable", "1")
meta:set_string("LV_EU_demand", "")
end
function technic_cnc.get_material(inventory)
local srclist = inventory:get_list("src")
for index, stack in ipairs(srclist) do
if not stack:is_empty() then
return index, stack
end
end
end
function technic_cnc.produce(meta, inventory)
-- Get and check program
local program = meta:get("program")
if program then
-- Get material stack
local index, materialstack = technic_cnc.get_material(inventory)
if index and materialstack then
-- Get product and produce items if output has enough space
local size = meta:get_int("size")
local product = technic_cnc.get_product(program, materialstack:get_name(), size)
if product and inventory:room_for_item("dst", product) then
-- Remove materials from input inventory
materialstack:take_item()
inventory:set_stack("src", index, materialstack)
-- Add results to output inventory of machine
inventory:add_item("dst", product)
return true
end
end
end
return false
end
-- REGISTER MACHINES
------------------------------------------------------------------------------------------------------------
function technic_cnc.register_cnc_machine(nodename, def)
-- Basic sanity check for registration, prefer failing early
assert(type(nodename) == "string" and #nodename > 0, "nodename should be non empty string")
assert(type(def.description) == "string", "description field should be string")
assert(({["nil"]=1,number=1})[type(def.input_size)], "input_size field should be number if set")
assert(({["nil"]=1,number=1})[type(def.output_size)], "output_size field should be number if set")
assert(({["nil"]=1,["function"]=1})[type(def.get_formspec)], "get_formspec should be function if set")
assert(({["nil"]=1,["function"]=1})[type(def.on_receive_fields)], "on_receive_fields should be function if set")
assert(({["nil"]=1,["function"]=1})[type(def.technic_run)], "technic_run should be function if set")
assert(({["nil"]=1,table=1})[type(def.tube)], "tube field should be table if set")
-- Register recipe if recipe given
if def.recipe then
minetest.register_craft({
output = nodename,
recipe = def.recipe,
})
end
-- Collect / generate basic variables for CNC machine
local nodename_active = nodename .. "_active"
local idle_infotext = S("@1 Idle", def.description)
local active_infotext = S("@1 Active", def.description)
local unpowered_infotext = S("@1 Unpowered", def.description)
local groups = { cracky = 2, technic_machine = 1, technic_lv = 1 }
-- It is possible to override these using def fields
local on_receive_fields = def.on_receive_fields or technic_cnc.formspec.on_receive_fields
local get_formspec = def.get_formspec or technic_cnc.formspec.get_formspec
local input_size = def.input_size or 1
local output_size = def.output_size or 4
local technic_run
local after_dig_node
local allow_metadata_inventory_put
local allow_metadata_inventory_take
local allow_metadata_inventory_move
local can_dig
-- Update few variables in definition table to make some things easier
def.get_formspec = get_formspec
def.input_size = input_size
def.output_size = output_size
-- UPGRADE OLD CNC MACHINES
local function upgrade_machine(meta)
local oldmeta = meta:get("technic_power_machine")
if oldmeta then
local product = meta:get("cnc_product")
-- Remove old metadata fields
meta:set_string("cnc_product", "")
meta:set_string("cnc_multiplier", "")
meta:set_string("technic_power_machine", "")
if product then
-- Only executed for active machines, old inactive machines do not have cnc_product set
local program_raw = product:match("[%w_]+:[%w_]+_technic_cnc_([%w_]+)")
if program_raw then
local double = "_double"
local size = program_raw:sub(-#double) == double and 1 or 2
local program = size == 1 and program_raw:sub(1, #program_raw - #double) or program_raw
meta:set_string("program", program)
meta:set_int("size", size)
end
meta:set_string("formspec", get_formspec(nodename, def, meta))
end
end
end
if technic_cnc.use_technic and not def.technic_run then
-- Check and get EU demand for Technic CNC machine
assert(type(def.demand) == "number", "demand field must be set for Technic CNC")
-- Update machine state if needed
local function update_machine(pos, meta, oldname, newname, infotext, demand)
if demand then
meta:set_int("LV_EU_demand", demand)
end
meta:set_string("infotext", infotext)
technic.swap_node(pos, newname)
end
-- Technic action code performing the transformation, use form handler for when not using technic
technic_run = function(pos, node)
local meta = minetest.get_meta(pos)
upgrade_machine(meta)
local demand = def.demand
if def.upgrade then
local EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
if EU_upgrade and EU_upgrade > 0 then
demand = math.max(0, demand - EU_upgrade * demand * 0.2)
end
technic.handle_machine_pipeworks(pos, tube_upgrade)
end
if not technic_cnc.is_enabled(meta) or not meta:get("program") then
update_machine(pos, meta, node.name, nodename, idle_infotext, 0)
return
end
-- Get and check material stack
local inv = meta:get_inventory()
if inv:is_empty("src") then
update_machine(pos, meta, node.name, nodename, idle_infotext, 0)
return
end
local eu_input = meta:get_int("LV_EU_input")
if eu_input < demand then
update_machine(pos, meta, node.name, nodename, unpowered_infotext, demand)
return
end
local src_time = meta:get_int("src_time")
if src_time >= 3 then
-- Cycle counter expired, reset counter and attempt to produce items
if technic_cnc.produce(meta, inv) then
-- Production succeed, reset cycle counter
meta:set_int("src_time", 0)
else
-- Production failed, set machine status to unpowered and try again after one cycle
meta:set_int("src_time", 2)
update_machine(pos, meta, node.name, nodename, unpowered_infotext, 0)
return
end
else
-- Increment cycle counter
meta:set_int("src_time", src_time + 1)
end
update_machine(pos, meta, node.name, nodename_active, active_infotext, demand)
end
end
if technic_cnc.use_technic then
allow_metadata_inventory_put = technic.machine_inventory_put
allow_metadata_inventory_take = technic.machine_inventory_take
allow_metadata_inventory_move = technic.machine_inventory_move
can_dig = technic.machine_can_dig
after_dig_node = def.upgrade and technic.machine_after_dig_node or nil
else
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) then
return 0
end
return stack:get_count()
end
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) then
return 0
end
return stack:get_count()
end
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
if minetest.is_protected(pos, player:get_player_name()) then
return 0
end
return count
end
can_dig = function(pos, player)
if player and minetest.is_protected(pos, player:get_player_name()) then
return false
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv:is_empty("dst") and inv:is_empty("src") and default.can_interact_with_node(player, pos)
end
end
-- Formspec handlers with / without pipeworks
do
local wrapped_on_receive_fields = on_receive_fields
local function update_formspec(meta)
meta:set_string("formspec", get_formspec(nodename, def, meta))
end
if technic_cnc.pipeworks and def.tube then
local pipeworks_on_receive_fields = technic_cnc.pipeworks.on_receive_fields
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
if not wrapped_on_receive_fields(pos, meta, fields, sender, update_formspec) and not fields.quit then
-- Custom pipeworks form handler to skip unnecessary protection messages
pipeworks_on_receive_fields(pos, meta, fields, sender, update_formspec)
end
upgrade_machine(meta)
end
else
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
wrapped_on_receive_fields(pos, meta, fields, sender, update_formspec)
upgrade_machine(meta)
end
end
end
-- Groups for pipeworks
if technic_cnc.pipeworks and def.tube then
groups.tubedevice = 1
groups.tubedevice_receiver = 1
end
-- Only do logging when technic is enabled to avoid duplicating code
local on_metadata_inventory_move = technic_cnc.use_technic and technic.machine_on_inventory_move or nil
local on_metadata_inventory_put = technic_cnc.use_technic and technic.machine_on_inventory_put or nil
local on_metadata_inventory_take = technic_cnc.use_technic and technic.machine_on_inventory_take or nil
-- Inactive state CNC machine
minetest.register_node(":" .. nodename, {
description = def.description,
tiles = def.tiles,
groups = groups,
connect_sides = {"bottom", "back", "left", "right"},
paramtype2 = "facedir",
legacy_facedir_simple = true,
is_ground_content = false,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", def.description)
meta:set_string("formspec", get_formspec(nodename, def, meta))
local inv = meta:get_inventory()
inv:set_size("src", def.input_size)
inv:set_size("dst", def.output_size)
if def.upgrade then
inv:set_size("upgrade1", 1)
inv:set_size("upgrade2", 1)
end
end,
after_place = def.tube and pipeworks.after_place,
after_dig_node = def.after_dig_node or after_dig_node,
tube = def.tube,
digilines = def.digilines,
can_dig = def.can_dig or can_dig,
allow_metadata_inventory_put = def.allow_metadata_inventory_put or allow_metadata_inventory_put,
allow_metadata_inventory_take = def.allow_metadata_inventory_take or allow_metadata_inventory_take,
allow_metadata_inventory_move = def.allow_metadata_inventory_move or allow_metadata_inventory_move,
on_metadata_inventory_move = on_metadata_inventory_move,
on_metadata_inventory_put = on_metadata_inventory_put,
on_metadata_inventory_take = on_metadata_inventory_take,
on_receive_fields = on_receive_fields,
technic_run = def.technic_run or technic_run,
})
-- Active state CNC machine
if technic_cnc.use_technic then
local groups_active = table.copy(groups)
groups_active.not_in_creative_inventory = 1
minetest.register_node(":" .. nodename_active, {
description = def.description,
tiles = def.tiles_active,
groups = groups_active,
connect_sides = {"bottom", "back", "left", "right"},
paramtype2 = "facedir",
drop = nodename,
legacy_facedir_simple = true,
is_ground_content = false,
after_dig_node = def.after_dig_node or after_dig_node,
tube = def.tube,
digilines = def.digilines,
can_dig = def.can_dig or can_dig,
allow_metadata_inventory_put = def.allow_metadata_inventory_put or allow_metadata_inventory_put,
allow_metadata_inventory_take = def.allow_metadata_inventory_take or allow_metadata_inventory_take,
allow_metadata_inventory_move = def.allow_metadata_inventory_move or allow_metadata_inventory_move,
on_metadata_inventory_move = on_metadata_inventory_move,
on_metadata_inventory_put = on_metadata_inventory_put,
on_metadata_inventory_take = on_metadata_inventory_take,
on_receive_fields = on_receive_fields,
technic_run = def.technic_run or technic_run,
technic_disabled_machine_name = nodename,
})
technic.register_machine("LV", nodename, technic.receiver)
technic.register_machine("LV", nodename_active, technic.receiver)
else
minetest.register_alias(nodename_active, nodename)
end
end

View file

@ -0,0 +1,74 @@
-- Technic CNC v2.0 by SX
-- Based on Technic CNC v1.0 by kpoppel
-- Based on the NonCubic Blocks MOD v1.4 by yves_de_beck
local S = technic_cnc.getter
-- This should handle both onesize_products and twosize_products, currently
-- twosize_products are hardcoded for formspec definitions.
local programs = {}
for key,_ in pairs(technic_cnc.onesize_products) do table.insert(programs, key) end
table.sort(programs)
--
-- Register technic:cnc machine
--
do
technic_cnc.register_cnc_machine("technic:cnc", {
description = technic_cnc.use_technic and S("LV CNC Machine") or S("CNC Machine"),
output_size = 4,
programs = programs,
demand = 450,
recipe = technic_cnc.use_technic and ({
{'default:glass', 'technic:diamond_drill_head', 'default:glass'},
{'technic:control_logic_unit', 'technic:machine_casing', 'basic_materials:motor'},
{'technic:carbon_steel_ingot', 'technic:lv_cable', 'technic:carbon_steel_ingot'},
}) or ({
{'default:glass', 'default:diamond', 'default:glass'},
{'basic_materials:ic', 'default:steelblock', 'basic_materials:motor'},
{'default:steel_ingot', 'default:mese', 'default:steel_ingot'},
}),
tiles = {
"technic_cnc_top.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
"technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front.png"
},
tiles_active = {
"technic_cnc_top_active.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
"technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front_active.png"
},
})
end
--
-- Register technic:cnc_mk2 machine
--
if technic_cnc.use_technic or technic_cnc.pipeworks or technic_cnc.digilines then
local tiles = {
"technic_cnc_mk2_top.png", "technic_cnc_bottom.png", "technic_cnc_mk2_side.png",
"technic_cnc_mk2_side.png", "technic_cnc_mk2_side.png", "technic_cnc_mk2_front.png"
}
local tiles_active = {
"technic_cnc_mk2_top_active.png", "technic_cnc_bottom.png", "technic_cnc_mk2_side.png",
"technic_cnc_mk2_side.png", "technic_cnc_mk2_side.png", "technic_cnc_mk2_front_active.png"
}
if technic_cnc.pipeworks then
tiles = technic_cnc.pipeworks.tube_entry_overlay(tiles)
tiles_active = technic_cnc.pipeworks.tube_entry_overlay(tiles_active)
end
technic_cnc.register_cnc_machine("technic:cnc_mk2", {
description = S("LV CNC Machine") .. " Mk2",
output_size = 4,
digilines = technic_cnc.digilines,
upgrade = true,
tube = technic_cnc.pipeworks and technic_cnc.pipeworks.new_tube() or nil,
programs = programs,
demand = 900,
recipe = {
{'basic_materials:ic', 'technic:cnc', 'basic_materials:ic'},
{'pipeworks:tube_1', 'technic:machine_casing', 'pipeworks:tube_1'},
{'technic:cnc', 'digilines:wire_std_00000000', 'technic:cnc'},
},
tiles = tiles,
tiles_active = tiles_active,
})
end

View file

@ -0,0 +1,91 @@
local rules = technic_cnc.use_technic and technic.digilines.rules or digilines.rules.default
local def = {
receptor = {
rules = rules,
},
effector = {
rules = rules,
},
}
local function check_message(meta, channel, msg)
-- Digiline channel check
if channel ~= meta:get_string("channel") then
return false
end
-- Message type check
if type(msg) == "string" then
-- String is is always valid, get out skipping all table checks
return true
elseif type(msg) ~= "table" then
return false
end
-- Verify that size is either nil or number between 1-2
if msg.size ~= nil and (type(msg.size) ~= "number" or msg.size < 1 or msg.size > 2) then
msg.size = nil
end
-- Verify program if provided
if msg.program ~= nil then
-- If program is set it must be string and available
if type(msg.program) ~= "string" or not technic_cnc.products[msg.program] then
msg.program = nil
end
end
-- Message is valid (but not necessarily useful)
return true
end
function def.effector.action(pos, node, channel, msg)
-- Validate message contents,
local meta = minetest.get_meta(pos)
if not check_message(meta, channel, msg) then
return
end
-- Process message and execute required actions
if type(msg) == "string" then
msg = msg:lower()
if msg == "programs" then
digilines.receptor_send(pos, rules, channel, technic_cnc.products)
elseif msg == "status" then
local inv = meta:get_inventory()
local srcstack = inv:get_stack("src", 1)
local status = {
enabled = technic_cnc.is_enabled(meta),
time = meta:get_int("src_time"),
size = meta:get_int("size"),
program = meta:get_string("program"),
user = meta:get_string("cnc_user"),
material = {
name = srcstack:get_name(),
count = srcstack:get_count(),
}
}
digilines.receptor_send(pos, rules, channel, status)
elseif msg == "enable" then
technic_cnc.enable(meta)
elseif msg == "disable" then
technic_cnc.disable(meta)
end
else
-- Configure milling programs
if msg.program then
technic_cnc.set_program(meta, msg.program, msg.size)
elseif msg.size then
meta:set_int("size", msg.size)
end
-- Enable / disable CNC machine
if msg.enabled == true then
technic_cnc.enable(meta)
elseif msg.enabled == false then
technic_cnc.disable(meta)
end
end
end
return def

View file

@ -0,0 +1,183 @@
local S = technic_cnc.getter
-- Margin is hardcoded for some elements...
local margin = 0.5
local padding = 0.2
local grid_size = 1 + padding
local fs_prefix = "formspec_version[4]size[%d,%d]style_type[list;size=1,1;spacing=0.2,0.2]label[0.5,0.5;%s]"
local fs_slimhalf = "label[0.5,3.6;"..S("Slim Elements half / normal height:").."]"..
"image_button[0.5,4;1,0.49;technic_cnc_full%s.png;full; ]"..
"image_button[0.5,4.51;1,0.49;technic_cnc_half%s.png;half; ]"
-- TODO: These should be defined in programs.lua and provide API to register more
local slimhalf_buttons = {
"element_straight",
"element_end",
"element_cross",
"element_t",
"element_edge"
}
-- Create button grid that returns paging information (leftover button count).
-- WIP: Starting index could be easily added if needed to provide full paging.
local function image_button_grid(x_start, y_start, width, height, items, selected)
local result = ""
local count = 0
local row = 0
local column = 0
local max_row = math.floor(height / grid_size + 0.1)
local max_column = math.floor(math.min(#items, math.floor(width / grid_size) * max_row) / max_row + 0.1)
for _,name in ipairs(items) do
local x = x_start + column * grid_size
local y = y_start + row * grid_size
local modifier = selected == name and "^[invert:b" or ""
result = result .. ("image_button[%0.1f,%0.1f;1,1;technic_cnc_%s.png%s;%s;]"):format(x, y, name, modifier, name)
count = count + 1
if column + 1 < max_column then
column = column + 1
else
column = 0
row = row + 1
if row >= max_row then
return result, #items - count
end
end
end
return result, #items - count
end
local function label(x, y, text)
return ("label[%0.1f,%0.1f;%s]"):format(x, y, text)
end
local function list(name, x, y, w, h, text)
return (text and label(x, y - 0.5, text) or "") ..
("list[context;%s;%0.1f,%0.1f;%d,%d;]"):format(name, x, y, w, h) ..
("listring[current_player;main]listring[context;%s]"):format(name)
end
local function get_formspec(nodename, def, meta)
local width = grid_size * 11 + margin * 2
local height = 13
local fs = fs_prefix:format(width, height, S("Choose Milling Program:"))
local p = meta:get("program")
-- Programming buttons
local x = margin
local y = 1
local buttons1, leftover1 = image_button_grid(x, y, width - margin * 2, grid_size * 2, def.programs, p)
-- Slim / half / normal
x = margin + grid_size
y = 4
local buttons2, leftover2 = image_button_grid(x, y, width - grid_size - margin * 2, grid_size, slimhalf_buttons, p)
local half = meta:get("size") == "2"
fs = fs .. buttons1 .. fs_slimhalf:format(half and "" or "_active", half and "_active" or "") .. buttons2
-- Program paging controls
if leftover1 > 0 or leftover2 > 0 then
x = width - margin - grid_size * 2
fs = fs .. ("button[%0.1f,%0.1f;%0.1f,%0.1f;paging_prev;Previous]"):format(x, padding, grid_size, 0.6)
.. ("button[%0.1f,%0.1f;%0.1f,%0.1f;paging_next;Next]"):format(x + grid_size, padding, grid_size, 0.6)
end
-- Some filler for empty unused space
y = height - (grid_size * 4) - margin + padding
--fs = fs .. ("model[10,%0.1f;3,3;;node.obj;%s;0.1,0.1;true;false]"):format(y, table.concat(def.tiles, ","))
--fs = fs .. ("image[10,%0.1f;3,3;%s]"):format(y, def.tiles[6])
local size = grid_size * 3
fs = fs .. ("item_image[%0.1f,%0.1f;%0.1f,%0.1f;%s]"):format(grid_size * 8 + margin, y, size, size, nodename)
-- Player inventory
fs = fs .. ("list[current_player;main;%0.1f,%0.1f;8,4;]"):format(margin, y)
-- Input / output inventories
x = grid_size * def.input_size + grid_size + margin
y = 6
fs = fs .. list("src", margin, y, def.input_size, 1, S("In:")) .. list("dst", x, y, def.output_size, 1, S("Out:"))
x = grid_size * 8 + margin
-- Upgrades
if def.upgrade then
fs = fs .. list("upgrade1", x, y, 1, 1, S("Upgrade Slots")) .. list("upgrade2", x + grid_size, y, 1, 1)
end
-- Stack splitting toggle
if meta and def.tube and technic_cnc.pipeworks then
y = height - margin - grid_size * 4.5
fs = fs .. technic_cnc.pipeworks.cycling_button(meta, "splitstacks", margin, y)
end
-- Digilines channel field
if def.digilines then
y = height - grid_size - margin + padding + 0.3
local w = width - x - margin - grid_size
fs = fs .. ("field[%0.1f,%0.1f;%0.1f,%0.1f;channel;Channel;${channel}]"):format(x + padding, y, w, 0.7)
fs = fs .. ("button[%0.1f,%0.1f;%0.1f,%0.1f;setchannel;Set]"):format(x + w + padding, y, 1, 0.7)
end
return fs
end
local function on_receive_fields(pos, meta, fields, sender, update_formspec)
local name = sender:get_player_name()
if fields.quit or (meta:get_int("public") == 0 and minetest.is_protected(pos, name)) then
return true
end
-- Program for half/full size
if fields.full then
meta:set_int("size", 1)
update_formspec(meta)
return true
elseif fields.half then
meta:set_int("size", 2)
update_formspec(meta)
return true
elseif fields.paging_next or fields.paging_prev then
-- TODO: Page index should be capped between 0 and max based on button count
local page = meta:get_int("page")
meta:set_int("page", page + (fields.paging_next and 1 or -1))
return
end
-- Resolve the node name and the number of items to make
local program_selected
local products = technic_cnc.products
for program, _ in pairs(fields) do
if products[program] then
local update = meta:get("program") ~= program
technic_cnc.set_program(meta, program, meta:get_int("size"))
technic_cnc.enable(meta)
meta:set_string("cnc_user", name)
program_selected = true
if update then
update_formspec(meta)
end
break
end
end
if program_selected and not technic_cnc.use_technic then
local inv = meta:get_inventory()
technic_cnc.produce(meta, inv)
return true
end
local setchannel = fields.setchannel or (fields.key_enter and fields.key_enter_field == "channel")
if setchannel and not minetest.is_protected(pos, name) then
meta:set_string("channel", fields.channel)
return true
end
return program_selected
end
return {
get_formspec = get_formspec,
on_receive_fields = on_receive_fields,
}

View file

@ -0,0 +1,20 @@
local technic_modpath = minetest.get_modpath("technic")
local digilines_modpath = minetest.get_modpath("digilines")
local pipeworks_modpath = minetest.get_modpath("pipeworks")
technic_cnc = {}
technic_cnc.modpath = minetest.get_modpath("technic_cnc")
technic_cnc.use_technic = technic_modpath and minetest.settings:get_bool("technic_cnc_use_technic", true)
local use_digilines = digilines_modpath and minetest.settings:get_bool("technic_cnc_use_digilines", true)
local use_pipeworks = pipeworks_modpath and minetest.settings:get_bool("technic_cnc_use_pipeworks", true)
technic_cnc.getter = minetest.get_translator(minetest.get_current_modname())
if use_digilines then technic_cnc.digilines = dofile(technic_cnc.modpath.."/digilines.lua") end
if use_pipeworks then technic_cnc.pipeworks = dofile(technic_cnc.modpath.."/pipeworks.lua") end
technic_cnc.formspec = dofile(technic_cnc.modpath .. "/formspec.lua")
dofile(technic_cnc.modpath .. "/programs.lua")
dofile(technic_cnc.modpath .. "/api.lua")
dofile(technic_cnc.modpath .. "/materials/init.lua")
dofile(technic_cnc.modpath .. "/cnc.lua")

View file

@ -0,0 +1,109 @@
# textdomain: technic_cnc
## CNC
CNC Machine=CNC-Maschine
@1 CNC Machine=@1 CNC-Maschine
Cylinder=Zylinder
Element Cross=Halbes Kreuzelement
Element Cross Double=Kreuzelement
Element Edge=Halbes Eckelement
Element Edge Double=Eckelement
Element End=Halbes Endelement
Element End Double=Endelement
Element Straight=Halbes aufrechtes Element
Element Straight Double=Aufrechtes Element
Element T=Halbes T-Element
Element T Double=T-Element
Horizontal Cylinder=Liegender Zylinder
One Curved Edge Block=Block mit einer abgerundeten Kante
Pyramid=Pyramide
Slope=Schraege
Slope Edge=Schraege mit Ecke
Slope Inner Edge=Schraege mit Innenecke
Slope Lying=Liegende Schraege
Slope Upside Down=Umgedrehte Schraege
Slope Upside Down Edge=Umgedrehte Schraege mit Ecke
Slope Upside Down Inner Edge=Umgedrehte Schraege mit Innenecke
Sphere=Kugel
Spike=Spitze
Stick=Stange
Two Curved Edge Block=Block mit zwei abgerundeten Kanten
Brick=Ziegel:
Cobble=Pflasterstein:
Dirt=Erde:
Leaves=Laub:
Sandstone=Sandstein:
Stone=Stein:
Tree=Baumstamm:
Wooden=Holz:
Oblate spheroid=
Two Curved Edge/Corner Block=
Slope Upside Down Inner Edge/Corner=
Slope Upside Down Outer Edge/Corner=
Slope Inner Edge/Corner=
Slope Outer Edge/Corner=
Allow splitting incoming stacks from tubes=
LV CNC Machine=
@1 Idle=
@1 Active=
@1 Unpowered=
Slim Elements half / normal height:=
Choose Milling Program:=
In:=
Out:=
Upgrade Slots=
Zinc=
Cast Iron=
Stainless Steel=
Marble=
Granite=
Blast-resistant concrete=
Glo Stone=
Crystal=
Banana Wood=
Birch Wood=
Frost Wood=
Palm Wood=
Willow Wood=
Healing Tree Wood=
Redwood=
Grassy dirt=
Junglewood=
Pine=
Acacia=
Aspen=
Stone Brick=
Stone Block=
Desert Stone=
Desert Stone Brick=
Desert Stone Block=
Mossy Cobblestone=
Desert Cobble=
Sandstone Brick=
Sandstone Block=
Desert Sandstone=
Desert Sandstone Brick=
Desert Sandstone Block=
Silver Sandstone=
Silver Sandstone Brick=
Silver Sandstone Block=
Ice=
Obsidian=
Bronze=
Copper=
Tin=
Gold=
Wrought Iron=
Red Clay=
Orange Clay=
Grey Clay=
Stone Tile=
Split Stone Tile=
Checker Stone Tile=
Cactus Checker=
Cactus Brick=
Grey Bricks=
Copper Patina=
Concrete=
Cement=
Brass block=

View file

@ -0,0 +1,109 @@
# textdomain: technic_cnc
## CNC
CNC Machine=Maquina CNC
@1 CNC Machine=Maquina CNC @1
Element Edge=Elemento Borde
Tree=Arbol
Element Cross Double=Elemento Cruz Doble
Spike=Pica
Element Edge Double=Elemento Borde Doble
Two Curved Edge Block=Dos Bloques de Borde Curvados
Pyramid=Piramide
Slope Upside Down Inner Edge=Borde Interno de Rampa Al Reves
Slope Upside Down Edge=Borde de Rampa Al Reves
Element Straight Double=Elemento Doble Recto
Sphere=Esfera
Element End Double=Doble Fin de Elemento
Element Straight=Recta de Elemento
Horizontal Cylinder=Cilindro Horizontal
Slope Inner Edge=Borde Interno de Rampa
One Curved Edge Block=Un Bloque de Borde Curvado
Element Cross=Cruce de Elementos
Stick=Varita
Element End=Fin de Elemento
Slope Lying=Rampa en Reposo
Slope Upside Down=Rampa Al Reves
Slope Edge=Borde de Rampa
Slope=Rampa
Element T=Elemento T
Cylinder=Cilindro
Cobble=Adoquines
Stone=Piedra
Brick=Ladrillo
Dirt=Tierra
Sandstone=Arenisca
Wooden=Madera
Leaves=Hojas
Element T Double=
Oblate spheroid=
Two Curved Edge/Corner Block=
Slope Upside Down Inner Edge/Corner=
Slope Upside Down Outer Edge/Corner=
Slope Inner Edge/Corner=
Slope Outer Edge/Corner=
Allow splitting incoming stacks from tubes=
LV CNC Machine=
@1 Idle=
@1 Active=
@1 Unpowered=
Slim Elements half / normal height:=
Choose Milling Program:=
In:=
Out:=
Upgrade Slots=
Zinc=
Cast Iron=
Stainless Steel=
Marble=
Granite=
Blast-resistant concrete=
Glo Stone=
Crystal=
Banana Wood=
Birch Wood=
Frost Wood=
Palm Wood=
Willow Wood=
Healing Tree Wood=
Redwood=
Grassy dirt=
Junglewood=
Pine=
Acacia=
Aspen=
Stone Brick=
Stone Block=
Desert Stone=
Desert Stone Brick=
Desert Stone Block=
Mossy Cobblestone=
Desert Cobble=
Sandstone Brick=
Sandstone Block=
Desert Sandstone=
Desert Sandstone Brick=
Desert Sandstone Block=
Silver Sandstone=
Silver Sandstone Brick=
Silver Sandstone Block=
Ice=
Obsidian=
Bronze=
Copper=
Tin=
Gold=
Wrought Iron=
Red Clay=
Orange Clay=
Grey Clay=
Stone Tile=
Split Stone Tile=
Checker Stone Tile=
Cactus Checker=
Cactus Brick=
Grey Bricks=
Copper Patina=
Concrete=
Cement=
Brass block=

View file

@ -0,0 +1,109 @@
# textdomain: technic_cnc
## CNC
CNC Machine=Tornio CNC
@1 CNC Machine=Tornio CNC @1
Cylinder=Cilindro
Element Cross=Elemento a croce
Element Cross Double=Elemento a croce doppio
Element Edge=Elemento bordo
Element Edge Double=Elemento bordo doppio
Element End=Elemento finale
Element End Double=Elemento finale doppio
Element Straight=Elemento dritto
Element Straight Double=Elemento dritto doppio
Element T=Elemento a T
Element T Double=Elemento a T doppio
Horizontal Cylinder=Cilindro orizzontale
One Curved Edge Block=Blocco con bordo curvo
Pyramid=Piramide
Slope=Inclinato
Slope Edge=Bordo inclinato
Slope Inner Edge=Bordo interno inclinato
Slope Lying=Pendenza bugiarda
Slope Upside Down=Pendenza capovolta
Slope Upside Down Edge=Bordo inclinato capovolto
Slope Upside Down Inner Edge=Bordo interno inclinato capovolto
Sphere=Sfera
Spike=Spuntone
Stick=Bastone
Two Curved Edge Block=Blocco con bordo a doppia curva
Brick=Mattone
Cobble=Ciottolato
Dirt=Terra
Leaves=Foglie
Sandstone=Arenaria
Stone=Pietra
Tree=Albero
Wooden=Legno
Oblate spheroid=
Two Curved Edge/Corner Block=
Slope Upside Down Inner Edge/Corner=
Slope Upside Down Outer Edge/Corner=
Slope Inner Edge/Corner=
Slope Outer Edge/Corner=
Allow splitting incoming stacks from tubes=
LV CNC Machine=
@1 Idle=
@1 Active=
@1 Unpowered=
Slim Elements half / normal height:=
Choose Milling Program:=
In:=
Out:=
Upgrade Slots=
Zinc=
Cast Iron=
Stainless Steel=
Marble=
Granite=
Blast-resistant concrete=
Glo Stone=
Crystal=
Banana Wood=
Birch Wood=
Frost Wood=
Palm Wood=
Willow Wood=
Healing Tree Wood=
Redwood=
Grassy dirt=
Junglewood=
Pine=
Acacia=
Aspen=
Stone Brick=
Stone Block=
Desert Stone=
Desert Stone Brick=
Desert Stone Block=
Mossy Cobblestone=
Desert Cobble=
Sandstone Brick=
Sandstone Block=
Desert Sandstone=
Desert Sandstone Brick=
Desert Sandstone Block=
Silver Sandstone=
Silver Sandstone Brick=
Silver Sandstone Block=
Ice=
Obsidian=
Bronze=
Copper=
Tin=
Gold=
Wrought Iron=
Red Clay=
Orange Clay=
Grey Clay=
Stone Tile=
Split Stone Tile=
Checker Stone Tile=
Cactus Checker=
Cactus Brick=
Grey Bricks=
Copper Patina=
Concrete=
Cement=
Brass block=

View file

@ -0,0 +1,109 @@
# textdomain: technic_cnc
## CNC
CNC Machine=Obrabiarka CNC
@1 CNC Machine=@1 Obrabiarka CNC
Cylinder=Walec
Element Cross=Część krzyżowa
Element Cross Double=Podwójna część krzyżowa
Element Edge=Krawędź części
Element Edge Double=Podwójna krawędź części
Element End=Końcowa część
Element End Double=Podwójna końcowa część
Element Straight=Prosta część
Element Straight Double=Podwójna prosta część
Element T=Część T
Element T Double=Podwójna część T
Horizontal Cylinder=Poziomy walec
One Curved Edge Block=Blok z zagiętą krawędzią
Pyramid=Ostrosłup
Slope=Spad
Slope Edge=Krawędź spadu
Slope Inner Edge=Wewnętrzna krawędź spadu
Slope Lying=Leżący spad
Slope Upside Down=Odwrócony spad
Slope Upside Down Edge=Krawędź odwróconego spadu
Slope Upside Down Inner Edge=Wewnętrzna krawędz odwróconego spadu
Sphere=Kula
Spike=Kolec
Stick=Patyk
Two Curved Edge Block=Blok z dwoma zagiętymi krawędziami
Brick=Cegła
Cobble=Bruk
Dirt=Ziemia
Leaves=Liście
Sandstone=Piaskowiec
Stone=Kamień
Tree=Drzewo
Wooden=Drewniany
Oblate spheroid=
Two Curved Edge/Corner Block=
Slope Upside Down Inner Edge/Corner=
Slope Upside Down Outer Edge/Corner=
Slope Inner Edge/Corner=
Slope Outer Edge/Corner=
Allow splitting incoming stacks from tubes=
LV CNC Machine=
@1 Idle=
@1 Active=
@1 Unpowered=
Slim Elements half / normal height:=
Choose Milling Program:=
In:=
Out:=
Upgrade Slots=
Zinc=
Cast Iron=
Stainless Steel=
Marble=
Granite=
Blast-resistant concrete=
Glo Stone=
Crystal=
Banana Wood=
Birch Wood=
Frost Wood=
Palm Wood=
Willow Wood=
Healing Tree Wood=
Redwood=
Grassy dirt=
Junglewood=
Pine=
Acacia=
Aspen=
Stone Brick=
Stone Block=
Desert Stone=
Desert Stone Brick=
Desert Stone Block=
Mossy Cobblestone=
Desert Cobble=
Sandstone Brick=
Sandstone Block=
Desert Sandstone=
Desert Sandstone Brick=
Desert Sandstone Block=
Silver Sandstone=
Silver Sandstone Brick=
Silver Sandstone Block=
Ice=
Obsidian=
Bronze=
Copper=
Tin=
Gold=
Wrought Iron=
Red Clay=
Orange Clay=
Grey Clay=
Stone Tile=
Split Stone Tile=
Checker Stone Tile=
Cactus Checker=
Cactus Brick=
Grey Bricks=
Copper Patina=
Concrete=
Cement=
Brass block=

View file

@ -0,0 +1,108 @@
# textdomain: technic_cnc
CNC Machine=数控机床
@1 CNC Machine=@1数控机床
Cylinder=圆柱
Element Cross=元素交叉
Element Cross Double=元素交叉双精度
Element Edge=元素边缘
Element Edge Double=元素边缘双
Element End=元素结束
Element End Double=双端元件
Element Straight=直线元素
Element Straight Double=元素直线双精度
Element T=元素T
Element T Double=元素T双
Horizontal Cylinder=卧式圆筒
One Curved Edge Block=一个曲边块
Pyramid=金字塔
Slope=坡度
Slope Edge=斜坡边缘
Slope Inner Edge=斜坡内边缘
Slope Lying=斜坡式
Slope Upside Down=倒坡
Slope Upside Down Edge=斜坡倒棱
Slope Upside Down Inner Edge=斜坡上下内缘
Sphere=球体
Spike=尖峰
Stick=棍子
Two Curved Edge Block=双弯边块
Brick=砖
Cobble=卵石
Dirt=泥土
Leaves=树叶
Sandstone=砂岩
Stone=石头
Tree=树
Wooden=木制
Oblate spheroid=
Two Curved Edge/Corner Block=
Slope Upside Down Inner Edge/Corner=
Slope Upside Down Outer Edge/Corner=
Slope Inner Edge/Corner=
Slope Outer Edge/Corner=
Allow splitting incoming stacks from tubes=
LV CNC Machine=
@1 Idle=
@1 Active=
@1 Unpowered=
Slim Elements half / normal height:=
Choose Milling Program:=
In:=
Out:=
Upgrade Slots=
Zinc=
Cast Iron=
Stainless Steel=
Marble=
Granite=
Blast-resistant concrete=
Glo Stone=
Crystal=
Banana Wood=
Birch Wood=
Frost Wood=
Palm Wood=
Willow Wood=
Healing Tree Wood=
Redwood=
Grassy dirt=
Junglewood=
Pine=
Acacia=
Aspen=
Stone Brick=
Stone Block=
Desert Stone=
Desert Stone Brick=
Desert Stone Block=
Mossy Cobblestone=
Desert Cobble=
Sandstone Brick=
Sandstone Block=
Desert Sandstone=
Desert Sandstone Brick=
Desert Sandstone Block=
Silver Sandstone=
Silver Sandstone Brick=
Silver Sandstone Block=
Ice=
Obsidian=
Bronze=
Copper=
Tin=
Gold=
Wrought Iron=
Red Clay=
Orange Clay=
Grey Clay=
Stone Tile=
Split Stone Tile=
Checker Stone Tile=
Cactus Checker=
Cactus Brick=
Grey Bricks=
Copper Patina=
Concrete=
Cement=
Brass block=

View file

@ -0,0 +1,109 @@
# textdomain: technic_cnc
## CNC
CNC Machine=
@1 CNC Machine=
Cylinder=
Element Cross=
Element Cross Double=
Element Edge=
Element Edge Double=
Element End=
Element End Double=
Element Straight=
Element Straight Double=
Element T=
Element T Double=
Horizontal Cylinder=
One Curved Edge Block=
Pyramid=
Slope=
Slope Edge=
Slope Inner Edge=
Slope Lying=
Slope Upside Down=
Slope Upside Down Edge=
Slope Upside Down Inner Edge=
Sphere=
Spike=
Stick=
Two Curved Edge Block=
Brick=
Cobble=
Dirt=
Leaves=
Sandstone=
Stone=
Tree=
Wooden=
Oblate spheroid=
Two Curved Edge/Corner Block=
Slope Upside Down Inner Edge/Corner=
Slope Upside Down Outer Edge/Corner=
Slope Inner Edge/Corner=
Slope Outer Edge/Corner=
Allow splitting incoming stacks from tubes=
LV CNC Machine=
@1 Idle=
@1 Active=
@1 Unpowered=
Slim Elements half / normal height:=
Choose Milling Program:=
In:=
Out:=
Upgrade Slots=
Zinc=
Cast Iron=
Stainless Steel=
Marble=
Granite=
Blast-resistant concrete=
Glo Stone=
Crystal=
Banana Wood=
Birch Wood=
Frost Wood=
Palm Wood=
Willow Wood=
Healing Tree Wood=
Redwood=
Grassy dirt=
Junglewood=
Pine=
Acacia=
Aspen=
Stone Brick=
Stone Block=
Desert Stone=
Desert Stone Brick=
Desert Stone Block=
Mossy Cobblestone=
Desert Cobble=
Sandstone Brick=
Sandstone Block=
Desert Sandstone=
Desert Sandstone Brick=
Desert Sandstone Block=
Silver Sandstone=
Silver Sandstone Brick=
Silver Sandstone Block=
Ice=
Obsidian=
Bronze=
Copper=
Tin=
Gold=
Wrought Iron=
Red Clay=
Orange Clay=
Grey Clay=
Stone Tile=
Split Stone Tile=
Checker Stone Tile=
Cactus Checker=
Cactus Brick=
Grey Bricks=
Copper Patina=
Concrete=
Cement=
Brass block=

View file

@ -0,0 +1,23 @@
local S = technic_cnc.getter
technic_cnc.register_all(
"bakedclay:red",
{cracky = 3, not_in_creative_inventory = 1},
{"baked_clay_red.png"},
S("Red Clay")
)
technic_cnc.register_all(
"bakedclay:orange",
{cracky = 3, not_in_creative_inventory = 1},
{"baked_clay_orange.png"},
S("Orange Clay")
)
technic_cnc.register_all(
"bakedclay:grey",
{cracky = 3, not_in_creative_inventory = 1},
{"baked_clay_grey.png"},
S("Grey Clay")
)

View file

@ -0,0 +1,23 @@
local S = technic_cnc.getter
technic_cnc.register_all(
"basic_materials:concrete_block",
{cracky = 2, level = 2, not_in_creative_inventory = 1},
{"basic_materials_concrete_block.png"},
S("Concrete")
)
technic_cnc.register_all(
"basic_materials:cement_block",
{cracky = 2, level = 2, not_in_creative_inventory = 1},
{"basic_materials_cement_block.png"},
S("Cement")
)
technic_cnc.register_all(
"basic_materials:brass_block",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"basic_materials_brass_block.png"},
S("Brass block")
)

View file

@ -0,0 +1,256 @@
local S = technic_cnc.getter
technic_cnc.register_all(
"default:dirt",
{snappy = 2,choppy = 2,oddly_breakable_by_hand = 3,not_in_creative_inventory = 1},
{"default_dirt.png"},
S("Dirt")
)
technic_cnc.register_all(
"default:dirt_with_grass",
{snappy = 2,choppy = 2,oddly_breakable_by_hand = 3,not_in_creative_inventory = 1},
{"default_grass.png"},
S("Grassy dirt")
)
technic_cnc.register_all(
"default:wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"default_wood.png"},
S("Wooden")
)
technic_cnc.register_all(
"default:junglewood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"default_junglewood.png"},
S("Junglewood")
)
technic_cnc.register_all(
"default:pine_wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"default_pine_wood.png"},
S("Pine")
)
technic_cnc.register_all(
"default:acacia_wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"default_acacia_wood.png"},
S("Acacia")
)
technic_cnc.register_all(
"default:aspen_wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"default_aspen_wood.png"},
S("Aspen")
)
technic_cnc.register_all(
"default:stone",
{cracky = 3, stone = 1, not_in_creative_inventory = 1},
{"default_stone.png"},
S("Stone")
)
technic_cnc.register_all(
"default:stonebrick",
{crumbly = 2, cracky = 3, stone = 1, not_in_creative_inventory = 1},
{"default_stone_brick.png"},
S("Stone Brick")
)
technic_cnc.register_all(
"default:stone_block",
{crumbly = 2, cracky = 3, stone = 1, not_in_creative_inventory = 1},
{"default_stone_block.png"},
S("Stone Block")
)
technic_cnc.register_all(
"default:desert_stone",
{cracky = 3, stone = 1, not_in_creative_inventory = 1},
{"default_desert_stone.png"},
S("Desert Stone")
)
technic_cnc.register_all(
"default:desert_stonebrick",
{crumbly = 2, cracky = 3, stone = 1, not_in_creative_inventory = 1},
{"default_desert_stone_brick.png"},
S("Desert Stone Brick")
)
technic_cnc.register_all(
"default:desert_stone_block",
{crumbly = 2, cracky = 3, stone = 1, not_in_creative_inventory = 1},
{"default_desert_stone_block.png"},
S("Desert Stone Block")
)
technic_cnc.register_all(
"default:cobble",
{cracky = 3, stone = 1, not_in_creative_inventory = 1},
{"default_cobble.png"},
S("Cobble")
)
technic_cnc.register_all(
"default:mossycobble",
{cracky = 3, stone = 1, not_in_creative_inventory = 1},
{"default_mossycobble.png"},
S("Mossy Cobblestone")
)
technic_cnc.register_all(
"default:desert_cobble",
{cracky = 3, stone = 1, not_in_creative_inventory = 1},
{"default_desert_cobble.png"},
S("Desert Cobble")
)
technic_cnc.register_all(
"default:brick",
{cracky = 3, not_in_creative_inventory = 1},
{"default_brick.png"},
S("Brick")
)
technic_cnc.register_all(
"default:sandstone",
{crumbly = 2, cracky = 3, not_in_creative_inventory = 1},
{"default_sandstone.png"},
S("Sandstone")
)
technic_cnc.register_all(
"default:sandstonebrick",
{crumbly = 2, cracky = 3, not_in_creative_inventory = 1},
{"default_sandstone_brick.png"},
S("Sandstone Brick")
)
technic_cnc.register_all(
"default:sandstone_block",
{crumbly = 2, cracky = 3, not_in_creative_inventory = 1},
{"default_sandstone_block.png"},
S("Sandstone Block")
)
technic_cnc.register_all(
"default:desert_sandstone",
{crumbly = 2, cracky = 3, not_in_creative_inventory = 1},
{"default_desert_sandstone.png"},
S("Desert Sandstone")
)
technic_cnc.register_all(
"default:desert_sandstone_brick",
{crumbly = 2, cracky = 3, not_in_creative_inventory = 1},
{"default_desert_sandstone_brick.png"},
S("Desert Sandstone Brick")
)
technic_cnc.register_all(
"default:desert_sandstone_block",
{crumbly = 2, cracky = 3, not_in_creative_inventory = 1},
{"default_desert_sandstone_block.png"},
S("Desert Sandstone Block")
)
technic_cnc.register_all(
"default:silver_sandstone",
{crumbly = 2, cracky = 3, not_in_creative_inventory = 1},
{"default_silver_sandstone.png"},
S("Silver Sandstone")
)
technic_cnc.register_all(
"default:silver_sandstone_brick",
{crumbly = 2, cracky = 3, not_in_creative_inventory = 1},
{"default_silver_sandstone_brick.png"},
S("Silver Sandstone Brick")
)
technic_cnc.register_all(
"default:silver_sandstone_block",
{crumbly = 2, cracky = 3, not_in_creative_inventory = 1},
{"default_silver_sandstone_block.png"},
S("Silver Sandstone Block")
)
technic_cnc.register_all(
"default:leaves",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1},
{"default_leaves.png"},
S("Leaves")
)
technic_cnc.register_all(
"default:tree",
{snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1, not_in_creative_inventory = 1},
{"default_tree.png"},
S("Tree")
)
technic_cnc.register_all(
"default:ice",
{cracky = 3, puts_out_fire = 1, cools_lava = 1, not_in_creative_inventory = 1},
{"default_ice.png"},
S("Ice")
)
technic_cnc.register_all(
"default:obsidian_block",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"default_obsidian_block.png"},
S("Obsidian")
)
technic_cnc.register_all(
"default:bronzeblock",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"default_bronze_block.png"},
S("Bronze")
)
technic_cnc.register_all(
"default:copperblock",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"default_copper_block.png"},
S("Copper")
)
technic_cnc.register_all(
"default:tinblock",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"default_tin_block.png"},
S("Tin")
)
technic_cnc.register_all(
"default:goldblock",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"default_gold_block.png"},
S("Gold")
)
if minetest.get_modpath("technic_worldgen") then
technic_cnc.register_all(
"default:steelblock",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"technic_wrought_iron_block.png"},
S("Wrought Iron")
)
else
technic_cnc.register_all(
"default:steelblock",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"default_steel_block.png"},
S("Steel")
)
end

View file

@ -0,0 +1,65 @@
local S = technic_cnc.getter
technic_cnc.register_all(
"ethereal:glostone",
{cracky = 1, not_in_creative_inventory = 1, light_source = 13},
{"ethereal_glostone.png"},
S("Glo Stone")
)
technic_cnc.register_all(
"ethereal:crystal_block",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"ethereal_crystal_block.png"},
S("Crystal")
)
technic_cnc.register_all(
"ethereal:banana_wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"ethereal_banana_wood.png"},
S("Banana Wood")
)
technic_cnc.register_all(
"ethereal:birch_wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"moretrees_birch_wood.png"},
S("Birch Wood")
)
technic_cnc.register_all(
"ethereal:frost_wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"ethereal_frost_wood.png"},
S("Frost Wood")
)
technic_cnc.register_all(
"ethereal:palm_wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"moretrees_palm_wood.png"},
S("Palm Wood")
)
technic_cnc.register_all(
"ethereal:willow_wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"ethereal_willow_wood.png"},
S("Willow Wood")
)
technic_cnc.register_all(
"ethereal:yellow_wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"ethereal_yellow_wood.png"},
S("Healing Tree Wood")
)
technic_cnc.register_all(
"ethereal:redwood_wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
{"ethereal_redwood_wood.png"},
S("Redwood")
)

View file

@ -0,0 +1,26 @@
local path = technic_cnc.modpath .. "/materials/"
dofile(path .. "default.lua")
dofile(path .. "basic_materials.lua")
local optional_mods = {
"bakedclay",
"ethereal",
"moreblocks",
"technic_worldgen",
}
for _, mod in pairs(optional_mods) do
if minetest.get_modpath(mod) then
dofile(path .. mod .. ".lua")
end
end
local function alias(old, new)
for _,shape in pairs(technic_cnc.programs) do
minetest.register_alias(old .. "_" .. shape.suffix, new .. "_" .. shape.suffix)
end
end
alias("technic:brass_block", "basic_materials:brass_block")

View file

@ -0,0 +1,50 @@
local S = technic_cnc.getter
technic_cnc.register_all(
"moreblocks:stone_tile",
{stone = 1, cracky = 3, not_in_creative_inventory = 1},
{"moreblocks_stone_tile.png"},
S("Stone Tile"))
technic_cnc.register_all(
"moreblocks:split_stone_tile",
{stone = 1, cracky = 3, not_in_creative_inventory = 1},
{"moreblocks_split_stone_tile.png"},
S("Split Stone Tile")
)
technic_cnc.register_all(
"moreblocks:checker_stone_tile",
{stone = 1, cracky = 3, not_in_creative_inventory = 1},
{"moreblocks_checker_stone_tile.png"},
S("Checker Stone Tile")
)
technic_cnc.register_all(
"moreblocks:cactus_checker",
{stone = 1, cracky = 3, not_in_creative_inventory = 1},
{"moreblocks_cactus_checker.png"},
S("Cactus Checker")
)
technic_cnc.register_all(
"moreblocks:cactus_brick",
{cracky = 3, not_in_creative_inventory = 1},
{"moreblocks_cactus_brick.png"},
S("Cactus Brick")
)
technic_cnc.register_all(
"moreblocks:grey_bricks",
{cracky = 3, not_in_creative_inventory = 1},
{"moreblocks_grey_bricks.png"},
S("Grey Bricks")
)
technic_cnc.register_all(
"moreblocks:copperpatina",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"moreblocks_copperpatina.png"},
S("Copper Patina")
)

View file

@ -0,0 +1,44 @@
local S = technic_cnc.getter
technic_cnc.register_all(
"technic:zinc_block",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"technic_zinc_block.png"},
S("Zinc")
)
technic_cnc.register_all(
"technic:cast_iron_block",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"technic_cast_iron_block.png"},
S("Cast Iron")
)
technic_cnc.register_all(
"technic:stainless_steel_block",
{cracky = 1, level = 2, not_in_creative_inventory = 1},
{"technic_stainless_steel_block.png"},
S("Stainless Steel")
)
technic_cnc.register_all(
"technic:marble",
{cracky = 3, not_in_creative_inventory = 1},
{"technic_marble.png"},
S("Marble")
)
technic_cnc.register_all(
"technic:granite",
{cracky = 1, not_in_creative_inventory = 1},
{"technic_granite.png"},
S("Granite")
)
technic_cnc.register_all(
"technic:blast_resistant_concrete",
{cracky = 2, level = 2, not_in_creative_inventory = 1},
{"technic_blast_resistant_concrete_block.png"},
S("Blast-resistant concrete")
)

View file

@ -0,0 +1,3 @@
name = technic_cnc
depends = default, basic_materials
optional_depends = technic

View file

@ -0,0 +1,205 @@
v 0 -0.5 -0.5
v 0 0.5 -0.5
v 0.097545 0.5 -0.490393
v 0.097545 -0.5 -0.490393
v 0.191342 0.5 -0.46194
v 0.191342 -0.5 -0.46194
v 0.277785 0.5 -0.415735
v 0.277785 -0.5 -0.415735
v 0.353553 0.5 -0.353554
v 0.353553 -0.5 -0.353554
v 0.415735 0.5 -0.277785
v 0.415735 -0.5 -0.277785
v 0.46194 0.5 -0.191342
v 0.46194 -0.5 -0.191342
v 0.490393 0.5 -0.097545
v 0.490393 -0.5 -0.097545
v 0.5 0.5 0
v 0.5 -0.5 0
v 0.490393 0.5 0.097545
v 0.490393 -0.5 0.097545
v 0.46194 0.5 0.191341
v 0.46194 -0.5 0.191341
v 0.415735 0.5 0.277785
v 0.415735 -0.5 0.277785
v 0.353553 0.5 0.353553
v 0.353553 -0.5 0.353553
v 0.277785 0.5 0.415735
v 0.277785 -0.5 0.415735
v 0.191342 0.5 0.46194
v 0.191342 -0.5 0.46194
v 0.097545 0.5 0.490392
v 0.097545 -0.5 0.490392
v 0 0.5 0.5
v 0 -0.5 0.5
v -0.097545 0.5 0.490392
v -0.097545 -0.5 0.490392
v -0.191342 0.5 0.461939
v -0.191342 -0.5 0.461939
v -0.277785 0.5 0.415734
v -0.277785 -0.5 0.415734
v -0.353554 0.5 0.353553
v -0.353554 -0.5 0.353553
v -0.415735 0.5 0.277785
v -0.415735 -0.5 0.277785
v -0.46194 0.5 0.191341
v -0.46194 -0.5 0.191341
v -0.490393 0.5 0.097545
v -0.490393 -0.5 0.097545
v -0.5 0.5 -0.000001
v -0.5 -0.5 -0.000001
v -0.490393 0.5 -0.097546
v -0.490393 -0.5 -0.097546
v -0.46194 0.5 -0.191342
v -0.46194 -0.5 -0.191342
v -0.415734 0.5 -0.277786
v -0.415734 -0.5 -0.277786
v -0.353553 0.5 -0.353554
v -0.353553 -0.5 -0.353554
v -0.277785 0.5 -0.415735
v -0.277785 -0.5 -0.415735
v -0.191341 0.5 -0.46194
v -0.191341 -0.5 -0.46194
v -0.097544 0.5 -0.490393
v -0.097544 -0.5 -0.490393
vn 0 0 -1
vn 0.1951 0 -0.9808
vn 0.3827 0 -0.9239
vn 0.5556 0 -0.8315
vn 0.7071 0 -0.7071
vn 0.8315 0 -0.5556
vn 0.9239 0 -0.3827
vn 0.9808 0 -0.1951
vn 1 0 0
vn 0.9808 0 0.1951
vn 0.9239 0 0.3827
vn 0.8315 0 0.5556
vn 0.7071 0 0.7071
vn 0.5556 0 0.8315
vn 0.3827 0 0.9239
vn 0.1951 0 0.9808
vn 0 0 1
vn -0.1951 0 0.9808
vn -0.3827 0 0.9239
vn -0.5556 0 0.8315
vn -0.7071 0 0.7071
vn -0.8315 0 0.5556
vn -0.9239 0 0.3827
vn -0.9808 0 0.1951
vn -1 0 0
vn -0.9808 0 -0.1951
vn -0.9239 0 -0.3827
vn -0.8315 0 -0.5556
vn -0.7071 0 -0.7071
vn -0.5556 0 -0.8315
vn -0.3827 0 -0.9239
vn 0 1 0
vn -0.1951 0 -0.9808
vn 0 -1 0
vt 0.500003 0.000001
vt 0.500004 0.999993
vt 0.437504 0.999994
vt 0.437503 0.000001
vt 0.375004 0.999995
vt 0.375002 0.000001
vt 0.312503 0.999996
vt 0.312502 0
vt 0.250002 0.999997
vt 0.250002 0
vt 0.187502 0.999997
vt 0.187502 0
vt 0.125002 0.999998
vt 0.125002 0
vt 0.062501 0.999998
vt 0.062501 0
vt 0.000001 0.999998
vt 0.000001 0
vt 0.999994 0.000001
vt 0.999998 0.999974
vt 0.937499 0.999975
vt 0.937494 0.000002
vt 0.875 0.999977
vt 0.874995 0.000002
vt 0.812501 0.999978
vt 0.812496 0.000003
vt 0.750002 0.99998
vt 0.749996 0.000004
vt 0.687502 0.999981
vt 0.687497 0.000004
vt 0.625002 0.999983
vt 0.624997 0.000005
vt 0.562503 0.999984
vt 0.562498 0.000005
vt 0.9904 0.402488
vt 0.999996 0.499996
vt 0.990387 0.597577
vt 0.961929 0.691372
vt 0.915719 0.777812
vt 0.853532 0.853577
vt 0.777759 0.915754
vt 0.691312 0.961954
vt 0.597514 0.9904
vt 0.402424 0.990387
vt 0.308631 0.961929
vt 0.22219 0.915718
vt 0.146426 0.853532
vt 0.084248 0.777759
vt 0.038049 0.691313
vt 0.009603 0.597515
vt 0.000004 0.499997
vt 0.009615 0.402425
vt 0.038073 0.308631
vt 0.084284 0.222189
vt 0.14647 0.146425
vt 0.222242 0.084249
vt 0.308688 0.03805
vt 0.402486 0.009603
vt 0.597576 0.009615
vt 0.691371 0.038074
vt 0.777812 0.084284
vt 0.853577 0.146471
vt 0.915753 0.222244
vt 0.961953 0.30869
vt 0.500073 0
vt 0.915774 0.222274
vt 1 0.500072
vt 0.777723 0.915775
vt 0.499926 0.999999
vt 0.084223 0.77772
vt 0 0.499922
vt 0.222276 0.084224
s 1
f 1/1/1 2/2/1 3/3/2 4/4/2
f 4/4/2 3/3/2 5/5/3 6/6/3
f 6/6/3 5/5/3 7/7/4 8/8/4
f 8/8/4 7/7/4 9/9/5 10/10/5
f 10/10/5 9/9/5 11/11/6 12/12/6
f 12/12/6 11/11/6 13/13/7 14/14/7
f 14/14/7 13/13/7 15/15/8 16/16/8
f 16/16/8 15/15/8 17/17/9 18/18/9
f 18/19/9 17/20/9 19/21/10 20/22/10
f 20/22/10 19/21/10 21/23/11 22/24/11
f 22/24/11 21/23/11 23/25/12 24/26/12
f 24/26/12 23/25/12 25/27/13 26/28/13
f 26/28/13 25/27/13 27/29/14 28/30/14
f 28/30/14 27/29/14 29/31/15 30/32/15
f 30/32/15 29/31/15 31/33/16 32/34/16
f 32/34/16 31/33/16 33/2/17 34/1/17
f 34/1/17 33/2/17 35/3/18 36/4/18
f 36/4/18 35/3/18 37/5/19 38/6/19
f 38/6/19 37/5/19 39/7/20 40/8/20
f 40/8/20 39/7/20 41/9/21 42/10/21
f 42/10/21 41/9/21 43/11/22 44/12/22
f 44/12/22 43/11/22 45/13/23 46/14/23
f 46/14/23 45/13/23 47/15/24 48/16/24
f 48/16/24 47/15/24 49/17/25 50/18/25
f 50/19/25 49/20/25 51/21/26 52/22/26
f 52/22/26 51/21/26 53/23/27 54/24/27
f 54/24/27 53/23/27 55/25/28 56/26/28
f 56/26/28 55/25/28 57/27/29 58/28/29
f 58/28/29 57/27/29 59/29/30 60/30/30
f 60/30/30 59/29/30 61/31/31 62/32/31
f 3/35/32 2/36/32 63/37/32 61/38/32 59/39/32 57/40/32 55/41/32 53/42/32 51/43/32 49/2/32 47/44/32 45/45/32 43/46/32 41/47/32 39/48/32 37/49/32 35/50/32 33/51/32 31/52/32 29/53/32 27/54/32 25/55/32 23/56/32 21/57/32 19/58/32 17/1/32 15/59/32 13/60/32 11/61/32 9/62/32 7/63/32 5/64/32
f 64/34/33 63/33/33 2/2/1 1/1/1
f 62/32/31 61/31/31 63/33/33 64/34/33
f 1/65/34 4/59/34 6/60/34 8/61/34 10/62/34 12/66/34 14/64/34 16/35/34 18/67/34 20/37/34 22/38/34 24/39/34 26/40/34 28/68/34 30/42/34 32/43/34 34/69/34 36/44/34 38/45/34 40/46/34 42/47/34 44/70/34 46/49/34 48/50/34 50/71/34 52/52/34 54/53/34 56/54/34 58/55/34 60/72/34 62/57/34 64/58/34

View file

@ -0,0 +1,205 @@
v 0.5 0 -0.5
v -0.5 0 -0.5
v 0.5 0.097545 -0.490393
v -0.5 0.097545 -0.490393
v 0.5 0.191342 -0.46194
v -0.5 0.191342 -0.46194
v 0.5 0.277785 -0.415735
v -0.5 0.277785 -0.415735
v 0.5 0.353553 -0.353553
v -0.5 0.353553 -0.353554
v 0.5 0.415735 -0.277785
v -0.5 0.415735 -0.277785
v 0.5 0.46194 -0.191342
v -0.5 0.46194 -0.191342
v 0.5 0.490393 -0.097545
v -0.5 0.490393 -0.097545
v 0.5 0.5 0
v -0.5 0.5 0
v 0.5 0.490393 0.097545
v -0.5 0.490393 0.097545
v 0.5 0.46194 0.191342
v -0.5 0.46194 0.191341
v 0.5 0.415735 0.277785
v -0.5 0.415735 0.277785
v 0.5 0.353553 0.353553
v -0.5 0.353553 0.353553
v 0.5 0.277785 0.415735
v -0.5 0.277785 0.415735
v 0.5 0.191342 0.46194
v -0.5 0.191342 0.46194
v 0.5 0.097545 0.490393
v -0.5 0.097545 0.490392
v 0.5 0 0.5
v -0.5 0 0.5
v 0.5 -0.097546 0.490392
v -0.5 -0.097545 0.490392
v 0.5 -0.191342 0.46194
v -0.5 -0.191342 0.461939
v 0.5 -0.277785 0.415734
v -0.5 -0.277785 0.415734
v 0.5 -0.353554 0.353553
v -0.5 -0.353554 0.353553
v 0.5 -0.415735 0.277785
v -0.5 -0.415735 0.277785
v 0.5 -0.46194 0.191341
v -0.5 -0.46194 0.191341
v 0.5 -0.490393 0.097545
v -0.5 -0.490393 0.097544
v 0.5 -0.5 -0.000001
v -0.5 -0.5 -0.000001
v 0.5 -0.490393 -0.097546
v -0.5 -0.490393 -0.097546
v 0.5 -0.46194 -0.191342
v -0.5 -0.46194 -0.191343
v 0.5 -0.415734 -0.277786
v -0.5 -0.415734 -0.277786
v 0.5 -0.353553 -0.353554
v -0.5 -0.353553 -0.353554
v 0.5 -0.277785 -0.415735
v -0.5 -0.277784 -0.415735
v 0.5 -0.191341 -0.46194
v -0.5 -0.191341 -0.46194
v 0.5 -0.097544 -0.490393
v -0.5 -0.097544 -0.490393
vn 0 0 -1
vn 0 0.1951 -0.9808
vn 0 0.3827 -0.9239
vn 0 0.5556 -0.8315
vn 0 0.7071 -0.7071
vn 0 0.8315 -0.5556
vn 0 0.9239 -0.3827
vn 0 0.9808 -0.1951
vn 0 1 0
vn 0 0.9808 0.1951
vn 0 0.9239 0.3827
vn 0 0.8315 0.5556
vn 0 0.7071 0.7071
vn 0 0.5556 0.8315
vn 0 0.3827 0.9239
vn 0 0.1951 0.9808
vn 0 0 1
vn 0 -0.1951 0.9808
vn 0 -0.3827 0.9239
vn 0 -0.5556 0.8315
vn 0 -0.7071 0.7071
vn 0 -0.8315 0.5556
vn 0 -0.9239 0.3827
vn 0 -0.9808 0.1951
vn 0 -1 0
vn 0 -0.9808 -0.1951
vn 0 -0.9239 -0.3827
vn 0 -0.8315 -0.5556
vn 0 -0.7071 -0.7071
vn 0 -0.5556 -0.8315
vn 0 -0.3827 -0.9239
vn -1 0 0
vn 0 -0.1951 -0.9808
vn 1 0 0
vt 0.000003 0.499996
vt 0.999995 0.499995
vt 0.999996 0.562495
vt 0.000002 0.562496
vt 0.999997 0.624995
vt 0.000003 0.624996
vt 0.999998 0.687496
vt 0.000002 0.687496
vt 0.999999 0.749997
vt 0.000002 0.749996
vt 0.999999 0.812497
vt 0.000002 0.812497
vt 1 0.874997
vt 0.000001 0.874997
vt 1 0.937498
vt 0.000001 0.937497
vt 1 0.999998
vt 0.000001 0.999998
vt 0.000003 0.000005
vt 0.999976 0.000001
vt 0.999977 0.0625
vt 0.000003 0.062505
vt 0.999978 0.124999
vt 0.000004 0.125004
vt 0.99998 0.187498
vt 0.000005 0.187503
vt 0.999982 0.249997
vt 0.000005 0.250003
vt 0.999983 0.312497
vt 0.000006 0.312502
vt 0.999985 0.374997
vt 0.000007 0.375001
vt 0.999986 0.437496
vt 0.000007 0.437501
vt 0.009601 0.597512
vt 0.009614 0.402424
vt 0.038072 0.308628
vt 0.084283 0.222189
vt 0.146469 0.146424
vt 0.222242 0.084247
vt 0.308689 0.038047
vt 0.402487 0.009601
vt 0.500033 0
vt 0.597577 0.009613
vt 0.691371 0.038072
vt 0.777811 0.084283
vt 0.853575 0.146469
vt 0.915753 0.222242
vt 0.961952 0.308688
vt 0.990398 0.402486
vt 0.990386 0.597576
vt 0.961928 0.69137
vt 0.915717 0.777812
vt 0.853531 0.853576
vt 0.777759 0.915752
vt 0.691313 0.961951
vt 0.597515 0.990398
vt 0.49997 1
vt 0.402425 0.990386
vt 0.30863 0.961927
vt 0.222189 0.915717
vt 0.146424 0.85353
vt 0.084248 0.777757
vt 0.038048 0.691311
vt 0.999999 0.500073
vt 0.777724 0.915774
vt 0.499927 0.999999
vt 0.084224 0.777723
vt 0 0.499925
vt 0.222279 0.084223
vt 0.500078 0
vt 0.915775 0.222276
s 1
f 1/1/1 2/2/1 4/3/2 3/4/2
f 3/4/2 4/3/2 6/5/3 5/6/3
f 5/6/3 6/5/3 8/7/4 7/8/4
f 7/8/4 8/7/4 10/9/5 9/10/5
f 9/10/5 10/9/5 12/11/6 11/12/6
f 11/12/6 12/11/6 14/13/7 13/14/7
f 13/14/7 14/13/7 16/15/8 15/16/8
f 15/16/8 16/15/8 18/17/9 17/18/9
f 17/19/9 18/20/9 20/21/10 19/22/10
f 19/22/10 20/21/10 22/23/11 21/24/11
f 21/24/11 22/23/11 24/25/12 23/26/12
f 23/26/12 24/25/12 26/27/13 25/28/13
f 25/28/13 26/27/13 28/29/14 27/30/14
f 27/30/14 28/29/14 30/31/15 29/32/15
f 29/32/15 30/31/15 32/33/16 31/34/16
f 31/34/16 32/33/16 34/2/17 33/1/17
f 33/1/17 34/2/17 36/3/18 35/4/18
f 35/4/18 36/3/18 38/5/19 37/6/19
f 37/6/19 38/5/19 40/7/20 39/8/20
f 39/8/20 40/7/20 42/9/21 41/10/21
f 41/10/21 42/9/21 44/11/22 43/12/22
f 43/12/22 44/11/22 46/13/23 45/14/23
f 45/14/23 46/13/23 48/15/24 47/16/24
f 47/16/24 48/15/24 50/17/25 49/18/25
f 49/19/25 50/20/25 52/21/26 51/22/26
f 51/22/26 52/21/26 54/23/27 53/24/27
f 53/24/27 54/23/27 56/25/28 55/26/28
f 55/26/28 56/25/28 58/27/29 57/28/29
f 57/28/29 58/27/29 60/29/30 59/30/30
f 59/30/30 60/29/30 62/31/31 61/32/31
f 4/35/32 2/1/32 64/36/32 62/37/32 60/38/32 58/39/32 56/40/32 54/41/32 52/42/32 50/43/32 48/44/32 46/45/32 44/46/32 42/47/32 40/48/32 38/49/32 36/50/32 34/2/32 32/51/32 30/52/32 28/53/32 26/54/32 24/55/32 22/56/32 20/57/32 18/58/32 16/59/32 14/60/32 12/61/32 10/62/32 8/63/32 6/64/32
f 63/34/33 64/33/33 2/2/1 1/1/1
f 61/32/31 62/31/31 64/33/33 63/34/33
f 1/65/34 3/51/34 5/52/34 7/53/34 9/54/34 11/66/34 13/56/34 15/57/34 17/67/34 19/59/34 21/60/34 23/61/34 25/62/34 27/68/34 29/64/34 31/35/34 33/69/34 35/36/34 37/37/34 39/38/34 41/39/34 43/70/34 45/41/34 47/42/34 49/71/34 51/44/34 53/45/34 55/46/34 57/47/34 59/72/34 61/49/34 63/50/34

View file

@ -0,0 +1,28 @@
v -0.5 0.5 0.5
v -0.5 0.5 -0.5
v -0.5 -0.5 -0.5
v -0.5 -0.5 0.5
v 0.5 -0.5 -0.5
v 0.5 0.5 0.5
v -0.5 -0.5 0.5
v 0.5 -0.5 0.5
v 0.5 -0.5 -0.5
vn 0 0 1
vn 0 0 -1
vn 0.7071 0.7071 0
vn 1 0 0
vn 0 -1 0
vn -1 0 0
vn 0 0.7071 -0.7071
vt 1 1
vt 0 1
vt 0 0
vt 1 0
s 0
f 6/1/1 1/2/1 7/3/1 8/4/1
f 2/1/2 5/3/2 3/4/2
f 2/1/3 1/2/3 5/4/3
f 6/2/4 8/3/4 9/4/4
f 9/1/5 8/2/5 7/3/5 3/4/5
f 3/3/6 7/4/6 1/1/6 2/2/6
f 1/1/7 6/2/7 9/3/7

View file

@ -0,0 +1,28 @@
v -0.5 -0.5 0.5
v 0.5 -0.5 0.5
v 0.5 0.5 0.5
v -0.5 0.5 0.5
v 0.5 0.5 -0.5
v -0.5 -0.5 -0.5
v -0.5 0.5 0.5
v -0.5 0.5 -0.5
v 0.5 0.5 -0.5
vn -1 0 0
vn 1 0 0
vn 0 -0.7071 -0.7071
vn 0 0 -1
vn 0 1 0
vn 0 0 1
vn 0.7071 -0.7071 0
vt 0 0
vt 1 0
vt 1 1
vt 0 1
s 0
f 6/1/1 1/2/1 7/3/1 8/4/1
f 2/1/2 5/3/2 3/4/2
f 2/1/3 1/2/3 5/4/3
f 6/2/4 8/3/4 9/4/4
f 9/1/5 8/2/5 7/3/5 3/4/5
f 3/3/6 7/4/6 1/1/6 2/2/6
f 1/1/7 6/2/7 9/3/7

View file

@ -0,0 +1,300 @@
# Blender v2.73 (sub 0) OBJ File: 'slope_test_blob_onetexture.blend'
# www.blender.org
o Cube
v 0.213679 -0.450000 -0.213679
v -0.213679 -0.450000 0.213680
v 0.213680 -0.450000 0.213680
v -0.213679 -0.450000 -0.213679
v 0.213679 0.450000 -0.213679
v -0.213679 0.450000 -0.213679
v 0.213679 0.450000 0.213680
v 0.500000 -0.000003 0.500000
v 0.277785 -0.415735 0.277785
v -0.277785 -0.415735 0.277785
v 0.353553 -0.353554 0.353553
v -0.353553 -0.353554 0.353553
v -0.500000 -0.000002 0.500000
v 0.415735 -0.277786 0.415735
v -0.277785 0.415735 0.277785
v 0.277785 0.415735 0.277785
v -0.415735 -0.277785 0.415735
v 0.353554 0.353553 0.353554
v -0.500000 -0.000002 -0.499983
v 0.461940 -0.191342 0.461940
v -0.461940 -0.191342 0.461940
v -0.353553 0.353553 0.353554
v 0.490393 -0.097546 0.490393
v 0.500000 -0.000002 -0.500000
v 0.490393 0.097545 -0.490392
v 0.490393 0.097545 0.490393
v -0.490393 -0.097546 0.490393
v 0.490393 -0.097545 -0.490393
v 0.461940 0.191341 0.461940
v -0.461940 0.191341 0.461940
v 0.461940 0.191342 -0.461940
v -0.490393 0.097545 0.490393
v 0.415735 0.277785 0.415735
v -0.490393 0.097545 -0.490392
v -0.415735 0.277785 0.415735
v 0.461940 -0.191341 -0.461940
v 0.415735 0.277785 -0.415735
v -0.461940 0.191341 -0.461940
v -0.415735 0.277785 -0.415735
v 0.415735 -0.277785 -0.415735
v -0.490393 -0.097546 -0.490392
v 0.353553 0.353553 -0.353553
v -0.213679 0.450000 0.213680
v -0.353553 0.353553 -0.353553
v 0.277785 0.415735 -0.277785
v -0.461940 -0.191342 -0.461939
v 0.353554 -0.353553 -0.353554
v -0.277785 0.415735 -0.277785
v -0.415735 -0.277785 -0.415734
v 0.277786 -0.415735 -0.277785
v -0.353553 -0.353554 -0.353553
v -0.277785 -0.415735 -0.277784
vt 0.038487 0.679029
vt 0.010047 0.589789
vt 0.990397 0.589790
vt 0.915772 0.767073
vt 0.084671 0.767071
vt 0.961957 0.679029
vt 0.852473 0.146294
vt 0.914576 0.232749
vt 0.084146 0.232744
vt 0.712776 0.000003
vt 0.221926 0.061588
vt 0.285951 0.000000
vt 0.285945 0.999818
vt 0.221920 0.938229
vt 0.712771 0.999818
vt 0.009578 0.589789
vt 0.989138 0.589792
vt 0.960721 0.679031
vt 0.286638 0.000000
vt 0.777884 0.061589
vt 0.222561 0.061589
vt 0.777608 0.938229
vt 0.222164 0.938229
vt 0.146413 0.853527
vt 0.286255 0.999818
vt 0.713517 0.999818
vt 0.776800 0.061592
vt 0.146251 0.146290
vt 0.000000 0.499907
vt 0.989139 0.410032
vt 0.998734 0.499910
vt 0.853618 0.146291
vt 0.915772 0.232746
vt 0.146826 0.146290
vt 0.961957 0.320789
vt 0.084672 0.232745
vt 0.990397 0.410029
vt 0.038487 0.320789
vt 0.776796 0.938230
vt 0.777790 0.938229
vt 0.146467 0.853526
vt 0.853556 0.853527
vt 0.146825 0.853526
vt 1.000000 0.499907
vt 0.010047 0.410028
vt 0.146246 0.853527
vt 0.222559 0.938228
vt 0.777882 0.938230
vt 0.915737 0.767073
vt 0.084287 0.767072
vt 0.038083 0.679029
vt 0.961941 0.679029
vt 0.037995 0.679029
vt 0.960723 0.320792
vt 0.037998 0.320787
vt 0.009580 0.410028
vt 0.990167 0.589790
vt 0.999772 0.499909
vt 0.961721 0.679029
vt 0.084246 0.767072
vt 0.915526 0.767072
vt 0.853359 0.853527
vt 0.914573 0.767074
vt 0.084142 0.767072
vt 0.852470 0.853528
vt 0.777609 0.061590
vt 0.853360 0.146293
vt 0.222166 0.061589
vt 0.146414 0.146291
vt 0.915527 0.232748
vt 0.084247 0.232746
vt 0.961721 0.320791
vt 0.038052 0.320789
vt 0.990167 0.410031
vt 0.713686 0.999818
vt 0.749950 0.250050
vt 0.749950 0.749950
vt 0.250050 0.749950
vt 0.250050 0.250050
vt 0.713807 0.000000
vt 0.286258 0.000000
vt 0.713519 0.000001
vt 0.250050 0.250050
vt 0.749950 0.250050
vt 0.749950 0.749950
vt 0.286636 0.999817
vt 0.777791 0.061589
vt 0.146467 0.146291
vt 0.084287 0.232745
vt 0.915737 0.232746
vt 0.961941 0.320789
vt 0.000444 0.499907
vt 0.713687 0.000000
vt 0.713805 0.999818
vn -0.620400 0.479600 0.620400
vn -0.683900 0.254100 0.683900
vn 0.683900 0.254100 0.683900
vn 0.531000 0.660300 0.531000
vn -0.531000 0.660300 0.531000
vn 0.620400 0.479600 0.620400
vn -0.429700 -0.794100 0.429700
vn -0.531000 -0.660300 0.531000
vn -0.531000 -0.660300 -0.531000
vn -0.185700 -0.964900 0.185700
vn -0.325800 -0.887500 -0.325800
vn -0.185700 -0.964900 -0.185700
vn -0.185700 0.964900 -0.185700
vn -0.325800 0.887500 -0.325800
vn -0.185700 0.964900 0.185700
vn -0.683900 0.254000 -0.683900
vn 0.325800 -0.887500 0.325800
vn -0.325800 -0.887500 0.325800
vn 0.325800 0.887500 -0.325800
vn 0.429700 0.794100 -0.429700
vn 0.185700 0.964900 -0.185700
vn -0.429700 -0.794100 -0.429700
vn -0.707100 0.000000 -0.707100
vn -0.683900 -0.254100 0.683900
vn -0.707100 0.000000 0.707100
vn 0.429700 -0.794100 0.429700
vn 0.531000 -0.660300 0.531000
vn 0.620400 -0.479600 0.620400
vn 0.683900 -0.254100 0.683900
vn -0.620400 -0.479600 0.620400
vn -0.325800 0.887500 0.325800
vn 0.185700 0.964900 0.185700
vn 0.325800 0.887500 0.325800
vn 0.429700 0.794100 0.429700
vn -0.429700 0.794100 0.429700
vn 0.707100 0.000000 0.707100
vn -0.429700 0.794100 -0.429700
vn 0.531000 0.660300 -0.531000
vn 0.683900 0.254100 -0.683900
vn 0.707100 0.000000 -0.707100
vn 0.620400 0.479600 -0.620400
vn -0.620400 0.479600 -0.620400
vn -0.620400 -0.479600 -0.620400
vn -0.683900 -0.254000 -0.683900
vn 0.683900 -0.254100 -0.683900
vn -0.531000 0.660300 -0.531000
vn 0.325800 -0.887500 -0.325800
vn 0.429700 -0.794100 -0.429700
vn 0.531000 -0.660300 -0.531000
vn 0.620400 -0.479600 -0.620400
vn 0.185700 -0.964900 -0.185700
vn 0.185700 -0.964900 0.185700
s 1
f 30/1/1 32/2/2 26/3/3
f 33/4/4 35/5/5 29/6/6
f 12/7/7 17/8/8 49/9/9
f 2/10/10 52/11/11 4/12/12
f 6/13/13 48/14/14 43/15/15
f 34/16/16 32/17/2 30/18/1
f 2/19/10 9/20/17 10/21/18
f 48/22/14 45/23/19 42/24/20
f 5/25/21 45/23/19 6/26/13
f 10/27/18 12/7/7 51/28/22
f 19/29/23 27/30/24 13/31/25
f 9/20/17 11/32/26 10/21/18
f 11/32/26 14/33/27 12/34/7
f 14/33/27 20/35/28 17/36/8
f 20/35/28 23/37/29 21/38/30
f 43/15/15 48/14/14 15/39/31
f 7/25/32 16/23/33 45/40/19
f 18/41/34 42/42/20 45/40/19
f 29/6/6 30/1/1 26/3/3
f 22/43/35 33/4/4 18/42/34
f 26/3/3 32/2/2 8/44/36
f 8/44/36 27/45/24 23/37/29
f 11/32/26 12/34/7 10/21/18
f 14/33/27 17/36/8 12/34/7
f 20/35/28 21/38/30 17/36/8
f 23/37/29 27/45/24 21/38/30
f 10/27/18 52/11/11 2/10/10
f 15/39/31 48/14/14 44/46/37
f 22/43/35 35/5/5 33/4/4
f 15/47/31 22/43/35 16/48/33
f 37/49/38 42/42/20 18/41/34
f 33/50/4 29/51/6 37/49/38
f 8/29/36 25/3/39 26/16/3
f 24/44/40 25/3/39 8/29/36
f 29/51/6 26/16/3 31/52/41
f 26/16/3 25/3/39 31/52/41
f 29/51/6 31/52/41 37/49/38
f 38/53/42 34/16/16 30/18/1
f 19/29/23 32/17/2 34/16/16
f 13/31/25 32/17/2 19/29/23
f 17/8/8 21/54/30 46/55/43
f 21/54/30 27/30/24 41/56/44
f 8/29/36 28/37/45 24/44/40
f 34/57/16 25/16/39 19/58/23
f 38/59/42 31/51/41 34/57/16
f 31/51/41 25/16/39 34/57/16
f 37/60/38 38/59/42 39/61/46
f 37/60/38 31/51/41 38/59/42
f 44/62/37 42/24/20 37/60/38
f 38/53/42 30/18/1 35/63/5
f 39/64/46 35/63/5 22/65/35
f 52/66/11 51/67/22 50/68/47
f 51/67/22 47/69/48 50/68/47
f 51/67/22 49/70/9 47/69/48
f 49/70/9 40/71/49 47/69/48
f 49/70/9 46/72/43 40/71/49
f 46/72/43 36/73/50 40/71/49
f 19/58/23 28/56/45 41/74/44
f 46/72/43 41/74/44 36/73/50
f 41/74/44 28/56/45 36/73/50
f 22/43/35 18/42/34 16/48/33
f 5/75/21 7/25/32 45/40/19
f 2/76/10 4/77/12 1/78/51 3/79/52
f 44/62/37 48/22/14 42/24/20
f 35/5/5 30/1/1 29/6/6
f 3/80/52 9/20/17 2/19/10
f 45/23/19 48/22/14 6/26/13
f 1/81/51 52/66/11 50/68/47
f 39/61/46 44/62/37 37/60/38
f 52/66/11 1/81/51 4/82/12
f 24/29/40 28/56/45 19/58/23
f 7/78/32 5/83/21 6/84/13 43/85/15
f 24/29/40 19/58/23 25/16/39
f 15/47/31 16/48/33 43/86/15
f 22/65/35 44/46/37 39/64/46
f 39/64/46 38/53/42 35/63/5
f 41/56/44 27/30/24 19/29/23
f 46/55/43 21/54/30 41/56/44
f 49/9/9 17/8/8 46/55/43
f 51/28/22 12/7/7 49/9/9
f 52/11/11 10/27/18 51/28/22
f 9/68/17 50/87/47 11/88/26
f 50/87/47 47/32/48 11/88/26
f 11/88/26 47/32/48 14/89/27
f 47/32/48 40/90/49 14/89/27
f 14/89/27 40/90/49 20/73/28
f 40/90/49 36/91/50 20/73/28
f 23/56/29 28/37/45 8/29/36
f 20/73/28 36/91/50 23/56/29
f 36/91/50 28/37/45 23/56/29
f 13/92/25 8/44/36 32/2/2
f 50/87/47 9/68/17 1/93/51
f 13/92/25 27/45/24 8/44/36
f 16/23/33 18/41/34 45/40/19
f 22/65/35 15/39/31 44/46/37
f 9/68/17 3/81/52 1/93/51
f 33/50/4 37/49/38 18/41/34
f 43/86/15 16/48/33 7/94/32

View file

@ -0,0 +1,132 @@
# Blender v2.73 (sub 0) OBJ File: 'slope_test_quarter_round_onetexture.blend'
# www.blender.org
o Cylinder
v -0.500000 0.490393 -0.097545
v 0.500000 0.490393 -0.097545
v -0.500000 0.461940 -0.191342
v 0.500000 0.461940 -0.191342
v -0.500000 0.415735 -0.277785
v 0.500000 0.415735 -0.277785
v -0.500000 0.353553 -0.353553
v 0.500000 0.353553 -0.353553
v -0.500000 0.277785 -0.415735
v 0.500000 0.277785 -0.415735
v -0.500000 0.191342 -0.461940
v 0.500000 0.191342 -0.461940
v -0.500000 0.097545 -0.490393
v 0.500000 0.097545 -0.490393
v 0.500000 -0.000000 -0.500000
v 0.500000 0.490393 -0.097545
v -0.500000 -0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.000000 -0.500000
v -0.500000 0.500000 -0.000000
v 0.500000 0.500000 0.000000
v -0.500000 0.490393 -0.097545
v -0.500000 0.461940 -0.191342
v -0.500000 0.415735 -0.277785
v -0.500000 0.353553 -0.353553
v -0.500000 0.277785 -0.415735
v -0.500000 0.191342 -0.461940
v -0.500000 0.097545 -0.490393
v -0.500000 0.000000 0.000000
v -0.500000 -0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 0.500000 0.500000
v -0.500000 0.000000 -0.500000
v -0.500000 0.500000 -0.000000
v 0.500000 0.461940 -0.191342
v 0.500000 0.415735 -0.277785
v 0.500000 0.353553 -0.353553
v 0.500000 0.277785 -0.415735
v 0.500000 0.191342 -0.461940
v 0.500000 0.097545 -0.490393
v 0.500000 -0.000000 -0.500000
v 0.500000 -0.000000 -0.000000
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 0.500000 0.500000
v 0.500000 0.500000 0.000000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
vt 1.000000 0.000000
vt 1.000000 0.500000
vt 0.500001 0.500000
vt 0.500001 1.000000
vt 0.000003 1.000000
vt 0.000003 0.000000
vt 0.597546 0.990393
vt 0.691342 0.961940
vt 1.000000 1.000000
vt 0.990393 0.597545
vt 0.961940 0.691341
vt 0.777786 0.915735
vt 0.853554 0.853553
vt 0.915735 0.777785
vt 0.146446 0.853552
vt 0.084265 0.777783
vt 0.038060 0.691340
vt 0.308658 0.961938
vt 0.222214 0.915733
vt 0.000000 0.499999
vt 0.402454 0.990391
vt 0.009607 0.597544
vt 1.000000 0.375000
vt 0.000000 0.375000
vt 0.000000 0.250000
vt 1.000000 0.250000
vt 0.000000 0.125000
vt 1.000000 0.125000
vt 0.000000 0.875000
vt 1.000000 0.875000
vt 0.000000 0.750000
vt 1.000000 0.750000
vt 0.000000 0.625000
vt 1.000000 0.625000
vn 1.000000 -0.000000 0.000000
vn -0.000000 0.000000 1.000000
vn -0.000000 -1.000000 0.000000
vn -1.000000 0.000000 0.000000
vn 0.000000 0.980800 -0.195100
vn 0.000000 0.923900 -0.382700
vn -0.000000 0.831500 -0.555600
vn -0.000000 0.707100 -0.707100
vn -0.000000 0.555600 -0.831500
vn -0.000000 0.382700 -0.923900
vn -0.000000 0.195100 -0.980800
vn 0.000000 1.000000 -0.000000
vn 0.000000 0.998800 -0.049100
vn -0.000000 0.049100 -0.998800
vn -0.000000 0.000000 -1.000000
s off
f 46/1/1 44/2/1 45/3/1 49/4/1 48/5/1 47/6/1
f 16/7/1 49/4/1 45/3/1 38/8/1
f 55/5/2 53/6/2 54/1/2 56/9/2
f 43/10/1 42/11/1 45/3/1 44/2/1
f 39/12/1 38/8/1 45/3/1 40/13/1
f 41/14/1 40/13/1 45/3/1 42/11/1
f 50/9/3 51/5/3 52/6/3 17/1/3
f 28/15/4 29/16/4 30/17/4 32/3/4
f 26/18/4 27/19/4 28/15/4 32/3/4
f 35/9/4 37/4/4 32/3/4 36/20/4 34/6/4 33/1/4
f 37/4/4 25/21/4 26/18/4 32/3/4
f 30/17/4 31/22/4 36/20/4 32/3/4
s 1
f 1/23/5 2/24/5 4/25/6 3/26/6
f 3/26/6 4/25/6 6/27/7 5/28/7
f 5/28/7 6/27/7 8/6/8 7/1/8
f 7/9/8 8/5/8 10/29/9 9/30/9
f 9/30/9 10/29/9 12/31/10 11/32/10
f 11/32/10 12/31/10 14/33/11 13/34/11
f 21/5/12 24/20/13 23/2/13 20/9/12
f 13/34/11 14/33/11 15/20/14 22/2/14
f 23/2/13 24/20/13 2/24/5 1/23/5
f 18/1/15 22/2/14 15/20/14 19/6/15

View file

@ -0,0 +1,23 @@
# Blender v2.73 (sub 0) OBJ File: 'technic-ocorner.blend'
# www.blender.org
o Cube_Cube.002
v -0.500000 0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vn 0.000000 -1.000000 -0.000000
vn 0.000000 0.000000 1.000000
vn -1.000000 -0.000000 0.000000
vn -0.000000 0.707100 -0.707100
vn 0.707100 0.707100 -0.000000
s off
f 3/1/1 2/2/1 4/3/1 5/4/1
f 1/2/2 3/3/2 5/4/2
f 1/1/3 2/3/3 3/4/3
f 1/1/4 4/3/4 2/4/4
f 1/2/5 5/3/5 4/4/5

View file

@ -0,0 +1,23 @@
# Blender v2.73 (sub 0) OBJ File: 'slope_test_ocorner_onetexture.blend'
# www.blender.org
o Cube_Cube.002
v -0.500000 -0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 0.500000 -0.500000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.000000 1.000000 -0.000000
vn -1.000000 0.000000 -0.000000
vn 0.000000 0.000000 1.000000
vn 0.707100 -0.707100 0.000000
vn -0.000000 -0.707100 -0.707100
s off
f 3/1/1 2/2/1 4/3/1 5/4/1
f 1/2/2 3/3/2 5/4/2
f 1/1/3 2/3/3 3/4/3
f 1/1/4 4/3/4 2/4/4
f 1/2/5 5/3/5 4/4/5

View file

@ -0,0 +1,24 @@
# Blender v2.73 (sub 0) OBJ File: 'slope_test_pyramid_short_onetexture.blend'
# www.blender.org
o Cube
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 -0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v -0.000000 0.000000 -0.000000
vt 1.000000 0.500000
vt 0.000000 0.500000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.500000 0.500000
vn 0.000000 -1.000000 0.000000
vn -0.707100 0.707100 -0.000000
vn 0.000000 0.707100 -0.707100
vn 0.707100 0.707100 0.000000
vn -0.000000 0.707100 0.707100
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 3/4/2 5/5/2 4/3/2
f 5/5/3 1/3/3 4/4/3
f 1/4/4 5/5/4 2/3/4
f 2/4/5 5/5/5 3/3/5

View file

@ -0,0 +1,24 @@
# Blender v2.73 (sub 0) OBJ File: 'slope_test_pyramid_onetexture.blend'
# www.blender.org
o Cube
v 0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 -0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v -0.000000 0.500000 -0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.500000 1.000000
vn 0.000000 -1.000000 0.000000
vn -0.894400 0.447200 -0.000000
vn 0.000000 0.447200 -0.894400
vn 0.894400 0.447200 0.000000
vn -0.000000 0.447200 0.894400
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 3/4/2 5/5/2 4/3/2
f 5/5/3 1/3/3 4/4/3
f 1/4/4 5/5/4 2/3/4
f 2/4/5 5/5/5 3/3/5

View file

@ -0,0 +1,24 @@
# Blender v2.73 (sub 0) OBJ File: 'slope_test_slope_onetexture.blend'
# www.blender.org
o Cube_Cube.002
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 0.500000
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vn 0.000000 -0.000000 1.000000
vn 0.000000 -1.000000 -0.000000
vn -1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 0.000000 0.707100 -0.707100
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 4/3/2 3/4/2 5/1/2 6/2/2
f 2/1/3 5/3/3 3/4/3
f 1/2/4 4/3/4 6/4/4
f 2/1/5 1/2/5 6/3/5 5/4/5

View file

@ -0,0 +1,24 @@
# Blender v2.73 (sub 0) OBJ File: 'technic-slope-horizontal.blend'
# www.blender.org
o Cube_Cube.002
v -0.500000 0.500000 0.500000
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 0.500000 0.500000
v 0.500000 -0.500000 -0.500000
v 0.500000 0.500000 -0.500000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vn 0.000000 -0.000000 1.000000
vn 1.000000 -0.000000 -0.000000
vn -0.000000 -1.000000 0.000000
vn 0.000000 1.000000 -0.000000
vn -0.707100 0.000000 -0.707100
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 4/1/2 3/2/2 5/3/2 6/4/2
f 2/3/3 5/1/3 3/2/3
f 1/4/4 4/1/4 6/2/4
f 2/3/5 1/4/5 6/1/5 5/2/5

View file

@ -0,0 +1,24 @@
# Blender v2.73 (sub 0) OBJ File: 'slope_test_slope_onetexture.blend'
# www.blender.org
o Cube_Cube.002
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 0.500000 -0.500000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 1.000000 -0.000000
vn 1.000000 -0.000000 0.000000
vn -1.000000 0.000000 -0.000000
vn -0.000000 -0.707100 -0.707100
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 4/3/2 3/4/2 5/1/2 6/2/2
f 2/1/3 5/3/3 3/4/3
f 1/2/4 4/3/4 6/4/4
f 2/1/5 1/2/5 6/3/5 5/4/5

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,209 @@
v 0.415732 0.277783 0.499997
v 0.461936 0.19134 0.499997
v 0.415735 0.277783 -0.415732
v 0.46194 0.19134 -0.461937
v 0.490389 0.097544 0.499997
v 0.353551 0.353551 0.499997
v 0.353555 0.353551 -0.353551
v 0.499996 0 0.499997
v 0.277783 0.415732 0.499997
v 0.490393 0.097544 -0.490389
v 0.277787 0.415732 -0.277784
v 0.19134 0.461936 0.499997
v 0.191344 0.461937 -0.191341
v 0.097544 0.490389 0.499997
v 0.097547 0.490391 -0.097545
v 0 0.499996 0.499997
v -0.499997 0.499997 0.499997
v -0.499997 0.499997 -0.00003
v -0.499997 0.415735 -0.277785
v -0.499997 0.46194 -0.191342
v -0.499997 0.490393 -0.097545
v -0.5 -0.5 -0.5
v -0.499997 -0.499997 0.499997
v 0 0.499998 0
v -0.499998 0.000014 -0.499999
v -0.499997 0.353553 -0.353554
v -0.499998 0.097545 -0.490393
v -0.499997 0.277785 -0.415735
v -0.499998 0.191342 -0.46194
v 0.499997 0 -0.499996
v 0.5 -0.5 -0.5
v 0.499997 -0.499997 0.499997
v -0.499997 -0.499997 0.499997
v -0.499997 0.499997 0.499997
v -0.499997 0.499997 -0.00003
v -0.499997 0.415735 -0.277785
v -0.499997 0.46194 -0.191342
v -0.499997 0.490393 -0.097545
v -0.5 -0.5 -0.5
v -0.499998 0.000014 -0.499999
v -0.499997 0.353553 -0.353554
v -0.499998 0.097545 -0.490393
v -0.499997 0.277785 -0.415735
v -0.499998 0.191342 -0.46194
v -0.499998 -0.033351 0.033348
v -0.5 -0.5 -0.5
v 0.5 -0.5 -0.5
v 0.499997 -0.499997 0.499997
v 0.415732 0.277783 0.499997
v 0.461936 0.19134 0.499997
v 0.490389 0.097544 0.499997
v 0.353551 0.353551 0.499997
v 0.499996 0 0.499997
v 0.277783 0.415732 0.499997
v 0.19134 0.461936 0.499997
v -0.499997 -0.499997 0.499997
v 0.097544 0.490389 0.499997
v 0 0.499996 0.499997
v -0.499997 0.499997 0.499997
v -0.033351 -0.033351 0.499997
v 0.499997 -0.499997 0.499997
vn 0 0 1
vn 0 -1 0
vn -1 0 0
vn 0 0.8315 -0.5556
vn 0 0.8061 -0.5917
vn 0 0.6786 -0.7345
vn 0 0.7071 -0.7071
vn 0.8315 0.5556 0
vn 0.8493 0.528 0
vn 0.7345 0.6786 0
vn 0.7071 0.7071 0
vn 0 0.1951 -0.9808
vn 0 0.1827 -0.9832
vn 0 0.0475 -0.9989
vn 0 0.0491 -0.9988
vn 0.2427 0.9701 0
vn 0.098 0.9952 0
vn 0.1951 0.9808 0
vn 0 0.9808 -0.1951
vn 0 0.9952 -0.098
vn 0 0.9701 -0.2426
vn 0 0.528 -0.8493
vn 0 0.5556 -0.8315
vn 0.9832 0.1826 0
vn 0.9327 0.3605 0
vn 0.9239 0.3827 0
vn 0.9808 0.1951 0
vn 0.5917 0.8061 0
vn 0.4258 0.9048 0
vn 0.3827 0.9239 0
vn 0.5556 0.8315 0
vn 0 0.9048 -0.4258
vn 0 0.9239 -0.3827
vn 0 0.3605 -0.9327
vn 0 0.3827 -0.9239
vn 0.9988 0.0491 0
vn 0.9989 0.0475 0
vn 0 0 -1
vn 0 1 0
vn 1 0 0
vt 1 0.5001
vt 0.990395 0.597625
vt 0.466756 0.466756
vt 1 0.0002
vt 0.000201 0.000201
vt 0.597626 0.990394
vt 0.500101 1
vt 0.691404 0.961947
vt 0.77783 0.915751
vt 0.853583 0.853583
vt 0.915752 0.777829
vt 0.000201 1
vt 0.961948 0.691403
vt 0 0
vt 1 0
vt 1 1
vt 0 1
vt 0.533443 0.466757
vt 0.000202 0.500115
vt 0.402575 0.990397
vt 0.308797 0.961949
vt 0.222371 0.915753
vt 0.146617 0.853584
vt 0.084449 0.777831
vt 0.038253 0.691405
vt 0.009806 0.597626
vt 0.999996 0.125448
vt 0.222353 0.125462
vt 0.146597 0.000612
vt 0.999995 0.000594
vt 0.000178 0.874582
vt 0.915751 0.874577
vt 0.85358 0.999436
vt 0.000178 0.999439
vt 0.999808 0.625427
vt 0.009599 0.625446
vt -0.000005 0.500594
vt 0.999807 0.500594
vt 0.597441 0.374574
vt 0.499912 0.499435
vt 0 0.499434
vt 0 0.374576
vt 0.999999 0.375154
vt 1 0.499969
vt 0.500093 0.500015
vt 0.402562 0.375164
vt 0.999812 0.999983
vt 0.146415 1
vt 0.084244 0.875149
vt 0.999811 0.875131
vt 0.990396 0.624861
vt 0.961947 0.749719
vt 0.000178 0.749724
vt 0.000178 0.624866
vt 0.777649 0.124857
vt 0.691221 0.249715
vt 0.000001 0.249719
vt 0.000001 0.124861
vt 0.308782 0.250314
vt 0.999998 0.250301
vt 0.853403 0
vt 0.038047 0.750298
vt 0.999809 0.75028
vt 0.000177 0.500008
vt 0 0.5
vt 0.5 1
vt 0.5 0.5
s 1
f 53/1/1 51/2/1 60/3/1
f 61/4/1 53/1/1 60/3/1 56/5/1
f 57/6/1 58/7/1 60/3/1
f 55/8/1 57/6/1 60/3/1
f 54/9/1 55/8/1 60/3/1
f 52/10/1 54/9/1 60/3/1
f 49/11/1 52/10/1 60/3/1
f 59/12/1 56/5/1 60/3/1 58/7/1
f 50/13/1 49/11/1 60/3/1
f 48/14/2 23/15/2 46/16/2 47/17/2
f 39/5/3 33/4/3 45/18/3 40/19/3
f 35/7/3 38/20/3 45/18/3
f 38/20/3 37/21/3 45/18/3
f 37/21/3 36/22/3 45/18/3
f 36/22/3 41/23/3 45/18/3
f 41/23/3 43/24/3 45/18/3
f 43/24/3 44/25/3 45/18/3
f 44/25/3 42/26/3 45/18/3
f 42/26/3 40/19/3 45/18/3
f 34/16/3 35/7/3 45/18/3 33/4/3
f 51/2/1 50/13/1 60/3/1
f 19/27/4 11/28/5 7/29/6 26/30/7
f 1/31/8 3/32/9 7/33/10 6/34/11
f 27/35/12 10/36/13 30/37/14 25/38/15
f 15/39/16 24/40/17 16/41/17 14/42/18
f 21/43/19 18/44/20 24/45/20 15/46/21
f 26/47/7 7/48/6 3/49/22 28/50/23
f 10/51/24 4/52/25 2/53/26 5/54/27
f 11/55/28 13/56/29 12/57/30 9/58/31
f 21/43/19 15/46/21 13/59/32 20/60/33
f 20/60/33 13/59/32 11/28/5 19/27/4
f 9/58/31 6/14/11 7/61/10 11/55/28
f 4/52/25 3/32/9 1/31/8 2/53/26
f 3/49/22 4/62/34 29/63/35 28/50/23
f 10/51/24 5/54/27 8/64/36 30/44/37
f 29/63/35 4/62/34 10/36/13 27/35/12
f 25/44/15 30/65/14 31/14/38 22/15/38
f 16/66/39 24/67/39 18/44/39 17/16/39
f 8/65/36 32/14/40 31/15/40 30/44/37
f 12/57/30 13/56/29 15/39/16 14/42/18

View file

@ -0,0 +1,63 @@
local S = minetest.get_translator("pipeworks")
local tube_entry = "^pipeworks_tube_connection_metallic.png"
local button_base = "image_button[%0.1f,%0.1f;1,0.6"
local button_label = "label[%0.1f,%0.1f;" .. S("Allow splitting incoming stacks from tubes") .. "]"
local cycling_buttons = { pipeworks.button_off, pipeworks.button_on }
local fs_helpers = pipeworks.fs_helpers
local pipeworks_on_receive_fields = pipeworks.fs_helpers.on_receive_fields
local function new_tube()
return {
insert_object = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv:add_item("src", stack)
end,
can_insert = technic_cnc.use_technic and technic.default_can_insert or function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv:room_for_item("src", stack)
end,
connect_sides = {left=1, right=1, back=1, bottom=1},
input_inventory = {"dst"},
}
end
local function tube_entry_overlay(tiles)
assert(type(tiles) == "table" and #tiles == 6, "tube_entry_overlay requires table with 6 elements")
return {
tiles[1], tiles[2] .. tube_entry, tiles[3] .. tube_entry,
tiles[4] .. tube_entry, tiles[5] .. tube_entry, tiles[6],
}
end
local function cycling_button(meta, name, x, y)
local form_buttons = fs_helpers.cycling_button(meta, button_base:format(x, y), name, cycling_buttons)
return form_buttons .. button_label:format(x + 1.2, y + 0.31)
end
-- Pipeworks does not provide API to selectively silence protection messages.
-- This wrapper handles pipeworks cycling buttons without sending unnecessary protection messages.
local function on_receive_fields(pos, meta, fields, sender, update_formspec)
-- https://github.com/mt-mods/pipeworks/-/blob/master/common.lua#L115
for field,_ in pairs(fields) do
if field:match("^fs_helpers_cycling:") then
if pipeworks.may_configure(pos, sender) then
pipeworks_on_receive_fields(pos, fields)
update_formspec(meta)
end
-- Handled and protection message sent if necessary
return true
end
end
-- Not handled, caller may continue processing
return false
end
return {
new_tube = new_tube,
cycling_button = cycling_button,
on_receive_fields = on_receive_fields,
tube_entry_overlay = tube_entry_overlay,
}

View file

@ -0,0 +1,303 @@
local S = technic_cnc.getter
-- Define slope boxes for the various nodes
-------------------------------------------
technic_cnc.programs = {
{ suffix = "technic_cnc_stick",
model = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
desc = S("Stick")
},
{ suffix = "technic_cnc_element_end_double",
model = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
desc = S("Element End Double")
},
{ suffix = "technic_cnc_element_cross_double",
model = {
{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.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
desc = S("Element Cross Double")
},
{ suffix = "technic_cnc_element_t_double",
model = {
{-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.3, -0.5, -0.3, 0.5, 0.5, 0.3}},
desc = S("Element T Double")
},
{ suffix = "technic_cnc_element_edge_double",
model = {
{-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
{-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
desc = S("Element Edge Double")
},
{ suffix = "technic_cnc_element_straight_double",
model = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
desc = S("Element Straight Double")
},
{ suffix = "technic_cnc_element_end",
model = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
desc = S("Element End")
},
{ suffix = "technic_cnc_element_cross",
model = {
{0.3, -0.5, -0.3, 0.5, 0, 0.3},
{-0.3, -0.5, -0.5, 0.3, 0, 0.5},
{-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
desc = S("Element Cross")
},
{ suffix = "technic_cnc_element_t",
model = {
{-0.3, -0.5, -0.5, 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}},
desc = S("Element T")
},
{ suffix = "technic_cnc_element_edge",
model = {
{-0.3, -0.5, -0.5, 0.3, 0, 0.3},
{-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
desc = S("Element Edge")
},
{ suffix = "technic_cnc_element_straight",
model = {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
desc = S("Element Straight")
},
{ suffix = "technic_cnc_oblate_spheroid",
model = "technic_cnc_oblate_spheroid.obj",
desc = S("Oblate spheroid"),
cbox = {
type = "fixed",
fixed = {
{ -6/16, 4/16, -6/16, 6/16, 8/16, 6/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 }
}
}
},
{ suffix = "technic_cnc_sphere",
model = "technic_cnc_sphere.obj",
desc = S("Sphere")
},
{ suffix = "technic_cnc_cylinder_horizontal",
model = "technic_cnc_cylinder_horizontal.obj",
desc = S("Horizontal Cylinder")
},
{ suffix = "technic_cnc_cylinder",
model = "technic_cnc_cylinder.obj",
desc = S("Cylinder")
},
{ suffix = "technic_cnc_twocurvededge",
model = "technic_cnc_two_curved_edge.obj",
desc = S("Two Curved Edge/Corner Block")
},
{ suffix = "technic_cnc_onecurvededge",
model = "technic_cnc_one_curved_edge.obj",
desc = S("One Curved Edge Block")
},
{ suffix = "technic_cnc_spike",
model = "technic_cnc_pyramid_spike.obj",
desc = S("Spike"),
cbox = {
type = "fixed",
fixed = {
{ -2/16, 4/16, -2/16, 2/16, 8/16, 2/16 },
{ -4/16, 0, -4/16, 4/16, 4/16, 4/16 },
{ -6/16, -4/16, -6/16, 6/16, 0, 6/16 },
{ -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
}
}
},
{ suffix = "technic_cnc_pyramid",
model = "technic_cnc_pyramid.obj",
desc = S("Pyramid"),
cbox = {
type = "fixed",
fixed = {
{ -2/16, -2/16, -2/16, 2/16, 0, 2/16 },
{ -4/16, -4/16, -4/16, 4/16, -2/16, 4/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 }
}
}
},
{ suffix = "technic_cnc_slope_inner_edge_upsdown",
model = "technic_cnc_innercorner_upsdown.obj",
desc = S("Slope Upside Down Inner Edge/Corner"),
sbox = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
},
cbox = {
type = "fixed",
fixed = {
{ 0.25, -0.25, -0.5, 0.5, -0.5, 0.5 },
{ -0.5, -0.25, 0.25, 0.5, -0.5, 0.5 },
{ 0, 0, -0.5, 0.5, -0.25, 0.5 },
{ -0.5, 0, 0, 0.5, -0.25, 0.5 },
{ -0.25, 0.25, -0.5, 0.5, 0, -0.25 },
{ -0.5, 0.25, -0.25, 0.5, 0, 0.5 },
{ -0.5, 0.5, -0.5, 0.5, 0.25, 0.5 }
}
}
},
{ suffix = "technic_cnc_slope_edge_upsdown",
model = "technic_cnc_outercorner_upsdown.obj",
desc = S("Slope Upside Down Outer Edge/Corner"),
cbox = {
type = "fixed",
fixed = {
{ -8/16, 8/16, -8/16, 8/16, 4/16, 8/16 },
{ -4/16, 4/16, -4/16, 8/16, 0, 8/16 },
{ 0, 0, 0, 8/16, -4/16, 8/16 },
{ 4/16, -4/16, 4/16, 8/16, -8/16, 8/16 }
}
}
},
{ suffix = "technic_cnc_slope_inner_edge",
model = "technic_cnc_innercorner.obj",
desc = S("Slope Inner Edge/Corner"),
sbox = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
},
cbox = {
type = "fixed",
fixed = {
{ -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 },
{ -0.5, -0.25, -0.25, 0.5, 0, 0.5 },
{ -0.25, -0.25, -0.5, 0.5, 0, -0.25 },
{ -0.5, 0, 0, 0.5, 0.25, 0.5 },
{ 0, 0, -0.5, 0.5, 0.25, 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 }
}
}
},
{ suffix = "technic_cnc_slope_edge",
model = "technic_cnc_outercorner.obj",
desc = S("Slope Outer Edge/Corner"),
cbox = {
type = "fixed",
fixed = {
{ 4/16, 4/16, 4/16, 8/16, 8/16, 8/16 },
{ 0, 0, 0, 8/16, 4/16, 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 }
}
}
},
{ suffix = "technic_cnc_slope_upsdown",
model = "technic_cnc_slope_upsdown.obj",
desc = S("Slope Upside Down"),
cbox = {
type = "fixed",
fixed = {
{ -8/16, 8/16, -8/16, 8/16, 4/16, 8/16 },
{ -8/16, 4/16, -4/16, 8/16, 0, 8/16 },
{ -8/16, 0, 0, 8/16, -4/16, 8/16 },
{ -8/16, -4/16, 4/16, 8/16, -8/16, 8/16 }
}
}
},
{ suffix = "technic_cnc_slope_lying",
model = "technic_cnc_slope_horizontal.obj",
desc = S("Slope Lying"),
cbox = {
type = "fixed",
fixed = {
{ 4/16, -8/16, 4/16, 8/16, 8/16, 8/16 },
{ 0, -8/16, 0, 4/16, 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 }
}
}
},
{ suffix = "technic_cnc_slope",
model = "technic_cnc_slope.obj",
desc = S("Slope"),
cbox = {
type = "fixed",
fixed = {
{ -8/16, 4/16, 4/16, 8/16, 8/16, 8/16 },
{ -8/16, 0, 0, 8/16, 4/16, 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 }
}
}
},
}
-- Allow disabling certain programs for some node. Default is allowing all types for all nodes
technic_cnc.programs_disable = {
-- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick
["default:dirt"] = {
"technic_cnc_oblate_spheroid",
"technic_cnc_slope_upsdown",
"technic_cnc_edge", "technic_cnc_inner_edge",
"technic_cnc_slope_edge_upsdown",
"technic_cnc_slope_inner_edge_upsdown",
"technic_cnc_stick",
"technic_cnc_cylinder_horizontal"
}
}
-- TODO: These should be collected automatically through program registration function
-- Also technic_cnc.programs could be parsed and product lists created based on programs.
technic_cnc.onesize_products = {
cylinder = 2,
cylinder_horizontal = 2,
oblate_spheroid = 1,
onecurvededge = 1,
pyramid = 2,
slope = 2,
slope_edge = 1,
slope_edge_upsdown = 1,
slope_inner_edge = 1,
slope_inner_edge_upsdown = 1,
slope_lying = 2,
slope_upsdown = 2,
sphere = 1,
spike = 1,
stick = 8,
twocurvededge = 1,
}
technic_cnc.twosize_products = {
element_straight = 2,
element_end = 2,
element_cross = 1,
element_t = 1,
element_edge = 2,
}
-- Lookup tables for all available programs, main use is to verify that requested product is available
technic_cnc.products = {}
for key, size in pairs(technic_cnc.onesize_products) do technic_cnc.products[key] = size end
for key, size in pairs(technic_cnc.twosize_products) do technic_cnc.products[key] = size end

View file

@ -0,0 +1,9 @@
# Used to disable technic features
technic_cnc_use_technic (Use technic features) bool true
# Used to disable digilines features
technic_cnc_use_digilines (Use digilines features) bool true
# Used to disable pipeworks features
technic_cnc_use_pipeworks (Use pipeworks features) bool true

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 389 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB