SmallJoker
2023-01-11 86e083c40973d7c4d450546659571f964b4bfefa
commit | author | age
ee0765 1 -- API for the technic CNC machine
S 2 -- Again code is adapted from the NonCubic Blocks MOD v1.4 by yves_de_beck
3
d40946 4 local S = technic_cnc.getter
349676 5 local ALPHA_CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or true
ee0765 6
S 7 -- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES:
8 ------------------------------------------------------
9
10 -- Define slope boxes for the various nodes
11 -------------------------------------------
d40946 12 technic_cnc.programs = {
ec73a8 13     { suffix  = "technic_cnc_stick",
VE 14         model = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
15         desc  = S("Stick")
16     },
ee0765 17
ec73a8 18     { suffix  = "technic_cnc_element_end_double",
VE 19         model = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
20         desc  = S("Element End Double")
21     },
ee0765 22
ec73a8 23     { suffix  = "technic_cnc_element_cross_double",
VE 24         model = {
25             {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
26             {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
27             {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
28         desc  = S("Element Cross Double")
29     },
ee0765 30
ec73a8 31     { suffix  = "technic_cnc_element_t_double",
VE 32         model = {
33             {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
34             {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
35             {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}},
36         desc  = S("Element T Double")
37     },
ee0765 38
ec73a8 39     { suffix  = "technic_cnc_element_edge_double",
VE 40         model = {
41             {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
42             {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
43         desc  = S("Element Edge Double")
44     },
ee0765 45
ec73a8 46     { suffix  = "technic_cnc_element_straight_double",
VE 47         model = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
48         desc  = S("Element Straight Double")
49     },
ee0765 50
ec73a8 51     { suffix  = "technic_cnc_element_end",
VE 52         model = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
53         desc  = S("Element End")
54     },
ee0765 55
ec73a8 56     { suffix  = "technic_cnc_element_cross",
VE 57         model = {
58             {0.3, -0.5, -0.3, 0.5, 0, 0.3},
59             {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
60             {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
61         desc  = S("Element Cross")
62     },
ee0765 63
ec73a8 64     { suffix  = "technic_cnc_element_t",
VE 65         model = {
66             {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
67             {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
68             {0.3, -0.5, -0.3, 0.5, 0, 0.3}},
69         desc  = S("Element T")
70     },
ee0765 71
ec73a8 72     { suffix  = "technic_cnc_element_edge",
VE 73         model = {
74             {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
75             {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
76         desc  = S("Element Edge")
77     },
ee0765 78
ec73a8 79     { suffix  = "technic_cnc_element_straight",
VE 80         model = {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
81         desc  = S("Element Straight")
82     },
ee0765 83
cf7591 84     { suffix  = "technic_cnc_oblate_spheroid",
dc0689 85         model = "technic_cnc_oblate_spheroid.obj",
cf7591 86         desc  = S("Oblate spheroid"),
ec73a8 87         cbox  = {
VE 88             type = "fixed",
89             fixed = {
90                 { -6/16,  4/16, -6/16, 6/16,  8/16, 6/16 },
91                 { -8/16, -4/16, -8/16, 8/16,  4/16, 8/16 },
92                 { -6/16, -8/16, -6/16, 6/16, -4/16, 6/16 }
93             }
94         }
cf7591 95     },
VE 96
97     { suffix  = "technic_cnc_sphere",
dc0689 98         model = "technic_cnc_sphere.obj",
cf7591 99         desc  = S("Sphere")
ec73a8 100     },
ee0765 101
ec73a8 102     { suffix  = "technic_cnc_cylinder_horizontal",
dc0689 103         model = "technic_cnc_cylinder_horizontal.obj",
ec73a8 104         desc  = S("Horizontal Cylinder")
VE 105     },
ee0765 106
ec73a8 107     { suffix  = "technic_cnc_cylinder",
dc0689 108         model = "technic_cnc_cylinder.obj",
ec73a8 109         desc  = S("Cylinder")
VE 110     },
ee0765 111
ec73a8 112     { suffix  = "technic_cnc_twocurvededge",
dc0689 113         model = "technic_cnc_two_curved_edge.obj",
ec73a8 114         desc  = S("Two Curved Edge/Corner Block")
VE 115     },
ee0765 116
ec73a8 117     { suffix  = "technic_cnc_onecurvededge",
dc0689 118         model = "technic_cnc_one_curved_edge.obj",
ec73a8 119         desc  = S("One Curved Edge Block")
VE 120     },
ee0765 121
ec73a8 122     { suffix  = "technic_cnc_spike",
dc0689 123         model = "technic_cnc_pyramid_spike.obj",
ec73a8 124         desc  = S("Spike"),
VE 125         cbox    = {
126             type = "fixed",
127             fixed = {
128                 { -2/16,  4/16, -2/16, 2/16,  8/16, 2/16 },
129                 { -4/16,     0, -4/16, 4/16,  4/16, 4/16 },
130                 { -6/16, -4/16, -6/16, 6/16,     0, 6/16 },
131                 { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
132             }
133         }
134     },
ee0765 135
ec73a8 136     { suffix  = "technic_cnc_pyramid",
dc0689 137         model = "technic_cnc_pyramid.obj",
ec73a8 138         desc  = S("Pyramid"),
VE 139         cbox  = {
140             type = "fixed",
141             fixed = {
142                 { -2/16, -2/16, -2/16, 2/16,     0, 2/16 },
143                 { -4/16, -4/16, -4/16, 4/16, -2/16, 4/16 },
144                 { -6/16, -6/16, -6/16, 6/16, -4/16, 6/16 },
145                 { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }
146             }
147         }
148     },
ee0765 149
ec73a8 150     { suffix  = "technic_cnc_slope_inner_edge_upsdown",
dc0689 151         model = "technic_cnc_innercorner_upsdown.obj",
ec73a8 152         desc  = S("Slope Upside Down Inner Edge/Corner"),
VE 153         sbox  = {
154             type = "fixed",
155             fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
156         },
157         cbox  = {
158             type = "fixed",
159             fixed = {
160                 {  0.25, -0.25, -0.5,  0.5, -0.5,   0.5  },
161                 { -0.5,  -0.25,  0.25, 0.5, -0.5,   0.5  },
162                 {  0,     0,    -0.5,  0.5, -0.25,  0.5  },
163                 { -0.5,   0,     0,    0.5, -0.25,  0.5  },
164                 { -0.25,  0.25, -0.5,  0.5,  0,    -0.25 },
165                 { -0.5,   0.25, -0.25, 0.5,  0,     0.5  },
166                 { -0.5,   0.5,  -0.5,  0.5,  0.25,  0.5  }
167             }
168         }
169     },
ee0765 170
ec73a8 171     { suffix  = "technic_cnc_slope_edge_upsdown",
dc0689 172         model = "technic_cnc_outercorner_upsdown.obj",
ec73a8 173         desc  = S("Slope Upside Down Outer Edge/Corner"),
VE 174         cbox  = {
175             type = "fixed",
176             fixed = {
177                 { -8/16,  8/16, -8/16, 8/16,  4/16, 8/16 },
178                 { -4/16,  4/16, -4/16, 8/16,     0, 8/16 },
179                 {     0,     0,     0, 8/16, -4/16, 8/16 },
180                 {  4/16, -4/16,  4/16, 8/16, -8/16, 8/16 }
181             }
182         }
183     },
ee0765 184
ec73a8 185     { suffix  = "technic_cnc_slope_inner_edge",
dc0689 186         model = "technic_cnc_innercorner.obj",
ec73a8 187         desc  = S("Slope Inner Edge/Corner"),
VE 188         sbox  = {
189             type = "fixed",
190             fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
191         },
192         cbox  = {
193             type = "fixed",
194             fixed = {
195                 { -0.5,  -0.5,  -0.5,  0.5, -0.25,  0.5  },
196                 { -0.5,  -0.25, -0.25, 0.5,  0,     0.5  },
197                 { -0.25, -0.25, -0.5,  0.5,  0,    -0.25 },
198                 { -0.5,   0,     0,    0.5,  0.25,  0.5  },
199                 {  0,     0,    -0.5,  0.5,  0.25,  0.5  },
200                 { -0.5,   0.25,  0.25, 0.5,  0.5,   0.5  },
201                 {  0.25,  0.25, -0.5,  0.5,  0.5,   0.5  }
202             }
203         }
204     },
ee0765 205
ec73a8 206     { suffix  = "technic_cnc_slope_edge",
dc0689 207         model = "technic_cnc_outercorner.obj",
ec73a8 208         desc  = S("Slope Outer Edge/Corner"),
VE 209         cbox  = {
210             type = "fixed",
211             fixed = {
212                 {  4/16,  4/16,  4/16, 8/16,  8/16, 8/16 },
213                 {     0,     0,     0, 8/16,  4/16, 8/16 },
214                 { -4/16, -4/16, -4/16, 8/16,     0, 8/16 },
215                 { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
216             }
217         }
218     },
ee0765 219
ec73a8 220     { suffix  = "technic_cnc_slope_upsdown",
dc0689 221         model = "technic_cnc_slope_upsdown.obj",
ec73a8 222         desc  = S("Slope Upside Down"),
VE 223         cbox  = {
224             type = "fixed",
225             fixed = {
226                 { -8/16,  8/16, -8/16, 8/16,  4/16, 8/16 },
227                 { -8/16,  4/16, -4/16, 8/16,     0, 8/16 },
228                 { -8/16,     0,     0, 8/16, -4/16, 8/16 },
229                 { -8/16, -4/16,  4/16, 8/16, -8/16, 8/16 }
230             }
231         }
232     },
ee0765 233
ec73a8 234     { suffix  = "technic_cnc_slope_lying",
dc0689 235         model = "technic_cnc_slope_horizontal.obj",
ec73a8 236         desc  = S("Slope Lying"),
VE 237         cbox  = {
238             type = "fixed",
239             fixed = {
240                 {  4/16, -8/16,  4/16,  8/16, 8/16, 8/16 },
a8daa4 241                 {     0, -8/16,     0,  4/16, 8/16, 8/16 },
ec73a8 242                 { -4/16, -8/16, -4/16,     0, 8/16, 8/16 },
VE 243                 { -8/16, -8/16, -8/16, -4/16, 8/16, 8/16 }
244             }
245         }
246     },
ee0765 247
ec73a8 248     { suffix  = "technic_cnc_slope",
dc0689 249         model = "technic_cnc_slope.obj",
ec73a8 250         desc  = S("Slope"),
VE 251         cbox  = {
252             type = "fixed",
253             fixed = {
254                 { -8/16,  4/16,  4/16, 8/16,  8/16, 8/16 },
255                 { -8/16,     0,     0, 8/16,  4/16, 8/16 },
256                 { -8/16, -4/16, -4/16, 8/16,     0, 8/16 },
257                 { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
258             }
259         }
260     },
a8daa4 261
ee0765 262 }
S 263
264 -- Allow disabling certain programs for some node. Default is allowing all types for all nodes
d40946 265 technic_cnc.programs_disable = {
ee0765 266     -- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick
S 267     -- ...
cf7591 268     ["default:dirt"] = {"technic_cnc_oblate_spheroid", "technic_cnc_slope_upsdown", "technic_cnc_edge",
ee0765 269                         "technic_cnc_inner_edge", "technic_cnc_slope_edge_upsdown",
S 270                         "technic_cnc_slope_inner_edge_upsdown", "technic_cnc_stick",
271                         "technic_cnc_cylinder_horizontal"}
272 }
273
274 -- Generic function for registering all the different node types
d40946 275 function technic_cnc.register_program(recipeitem, suffix, model, groups, images, description, cbox, sbox)
80cb6a 276
VE 277     local dtype
278     local nodeboxdef
279     local meshdef
280
281     if type(model) ~= "string" then -- assume a nodebox if it's a table or function call
282         dtype = "nodebox"
283         nodeboxdef = {
284             type  = "fixed",
285             fixed = model
286         }
287     else
288         dtype = "mesh"
289         meshdef = model
290     end
291
ec73a8 292     if cbox and not sbox then sbox = cbox end
VE 293
ee0765 294     minetest.register_node(":"..recipeitem.."_"..suffix, {
S 295         description   = description,
80cb6a 296         drawtype      = dtype,
VE 297         node_box      = nodeboxdef,
298         mesh          = meshdef,
ee0765 299         tiles         = images,
S 300         paramtype     = "light",
301         paramtype2    = "facedir",
349676 302         use_texture_alpha = ALPHA_CLIP,
ee0765 303         walkable      = true,
S 304         groups        = groups,
ec73a8 305         selection_box = sbox,
VE 306         collision_box = cbox
ee0765 307     })
S 308 end
309
310 -- function to iterate over all the programs the CNC machine knows
d40946 311 function technic_cnc.register_all(recipeitem, groups, images, description)
VD 312     for _, data in ipairs(technic_cnc.programs) do
ee0765 313         -- Disable node creation for disabled node types for some material
S 314         local do_register = true
d40946 315         if technic_cnc.programs_disable[recipeitem] ~= nil then
VD 316             for __, disable in ipairs(technic_cnc.programs_disable[recipeitem]) do
ee0765 317                 if disable == data.suffix then
S 318                     do_register = false
319                 end
320             end
321         end
322         -- Create the node if it passes the test
323         if do_register then
d40946 324             technic_cnc.register_program(recipeitem, data.suffix, data.model,
ec73a8 325                 groups, images, description.." "..data.desc, data.cbox, data.sbox)
ee0765 326         end
S 327     end
328 end
329
d40946 330 -- REGISTER NEW TECHNIC_CNC_API's PART 2: technic_cnc..register_element_end(subname, recipeitem, groups, images, desc_element_xyz)
ee0765 331 -----------------------------------------------------------------------------------------------------------------------
d40946 332 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)
0f6bdb 333         -- TODO: Remove this evil sorcery
d40946 334          technic_cnc.register_slope(recipeitem, groups, images, desc_slope)
VD 335          technic_cnc.register_slope_lying(recipeitem, groups, images, desc_slope_lying)
336          technic_cnc.register_slope_upsdown(recipeitem, groups, images, desc_slope_upsdown)
337          technic_cnc.register_slope_edge(recipeitem, groups, images, desc_slope_edge)
338          technic_cnc.register_slope_inner_edge(recipeitem, groups, images, desc_slope_inner_edge)
339          technic_cnc.register_slope_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_edge)
340          technic_cnc.register_slope_inner_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_inner_edge)
341          technic_cnc.register_pyramid(recipeitem, groups, images, desc_pyramid)
342          technic_cnc.register_spike(recipeitem, groups, images, desc_spike)
343          technic_cnc.register_onecurvededge(recipeitem, groups, images, desc_onecurvededge)
344          technic_cnc.register_twocurvededge(recipeitem, groups, images, desc_twocurvededge)
345          technic_cnc.register_cylinder(recipeitem, groups, images, desc_cylinder)
346          technic_cnc.register_cylinder_horizontal(recipeitem, groups, images, desc_cylinder_horizontal)
347          technic_cnc.register_spheroid(recipeitem, groups, images, desc_spheroid)
348          technic_cnc.register_element_straight(recipeitem, groups, images, desc_element_straight)
349          technic_cnc.register_element_edge(recipeitem, groups, images, desc_element_edge)
350          technic_cnc.register_element_t(recipeitem, groups, images, desc_element_t)
351          technic_cnc.register_element_cross(recipeitem, groups, images, desc_element_cross)
352          technic_cnc.register_element_end(recipeitem, groups, images, desc_element_end)
ee0765 353 end
S 354
355 -- REGISTER STICKS: noncubic.register_xyz(recipeitem, groups, images, desc_element_xyz)
356 ------------------------------------------------------------------------------------------------------------
d40946 357 function technic_cnc.register_stick_etc(recipeitem, groups, images, desc_stick)
0f6bdb 358         -- TODO: Remove this evil sorcery
d40946 359          technic_cnc.register_stick(recipeitem, groups, images, desc_stick)
ee0765 360 end
S 361
d40946 362 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)
0f6bdb 363         -- TODO: Remove this evil sorcery
d40946 364          technic_cnc.register_element_straight_double(recipeitem, groups, images, desc_element_straight_double)
VD 365          technic_cnc.register_element_edge_double(recipeitem, groups, images, desc_element_edge_double)
366          technic_cnc.register_element_t_double(recipeitem, groups, images, desc_element_t_double)
367          technic_cnc.register_element_cross_double(recipeitem, groups, images, desc_element_cross_double)
368          technic_cnc.register_element_end_double(recipeitem, groups, images, desc_element_end_double)
ee0765 369 end
S 370