cnc_api.lua 12 KB

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