You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1492 lines
49 KiB

9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
  1. cg_decor = {}
  2. local path = minetest.get_modpath("cg_decor")
  3. dofile(path.."/crafts.lua")
  4. dofile(path.."/decoration.lua")
  5. --------------------------------------------------------------------------------------------
  6. -- Mulch -----------------------------------------------------------------------------------
  7. --------------------------------------------------------------------------------------------
  8. --[[minetest.register_node("cg_decor:mulch", {
  9. description = "Dirt with Mulch",
  10. tiles = {"cg_decor_mulch.png", "default_dirt.png", "default_dirt.png"},
  11. is_ground_content = true,
  12. groups = {crumbly=3,soil=1},
  13. drop = 'cg_decor:mulch',--'default:dirt',
  14. sounds = default.node_sound_dirt_defaults({
  15. footstep = {name="default_grass_footstep", gain=0.25},
  16. }),
  17. })
  18. ]]
  19. --------------------------------------------------------------------------------------------
  20. -- Flowers ---------------------------------------------------------------------------------
  21. --------------------------------------------------------------------------------------------
  22. function cg_decor.register_flower(name, desc, texture, sel_box) --global flower register
  23. if not sel_box or sel_box == "" then
  24. sel_box = { -0.5, -0.5, -0.5, 0.5, -0.3, 0.5 }
  25. end
  26. minetest.register_node("cg_decor:"..name, {
  27. description = desc,
  28. drawtype = "mesh",
  29. mesh = "cg_decor_tree_leaves.obj",
  30. tiles = { texture },
  31. inventory_image = texture,
  32. wield_image = texture,
  33. sunlight_propagates = true,
  34. paramtype = "light",
  35. walkable = false,
  36. buildable_to = true,
  37. groups = {snappy=3,flammable=2,flower=1,attached_node=1},
  38. sounds = default.node_sound_leaves_defaults(),
  39. selection_box = {
  40. type = "fixed",
  41. fixed = sel_box,
  42. },
  43. })
  44. end
  45. cg_decor.register_flower("lilly_of_the_valley", "Lilly of the valley", "cg_decor_lotv.png")
  46. minetest.register_node("cg_decor:sunflower", {
  47. description = "Sunflower",
  48. drawtype = "mesh",
  49. mesh = "cg_decor_sunflower.obj",
  50. tiles = { "cg_decor_sunflower.png" },
  51. inventory_image = "cg_decor_sunflower_inv.png",
  52. wield_image = "cg_decor_sunflower_inv.png",
  53. sunlight_propagates = true,
  54. paramtype2 = "facedir",
  55. paramtype = "light",
  56. walkable = true,
  57. groups = {snappy=3,flammable=2,flower=1,attached_node=1},
  58. sounds = default.node_sound_leaves_defaults(),
  59. selection_box = {
  60. type = "fixed",
  61. fixed = { -0.1, -0.5, -0.1, 0.1, 1.6, 0.1 },
  62. },
  63. collision_box = {
  64. type = "fixed",
  65. fixed = { -0.1, -0.5, -0.1, 0.1, 1.6, 0.1 },
  66. },
  67. })
  68. minetest.register_node("cg_decor:window_sill", {
  69. description = "Window sill",
  70. tiles = {"cg_decor_siding_wall.png"},
  71. drawtype = "nodebox",
  72. paramtype = "light",
  73. paramtype2 = "facedir",
  74. node_box = {
  75. type = "fixed",
  76. fixed = {
  77. {-0.625, -0.625, -0.5625, 0.625, -0.4375, -0.5},
  78. {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
  79. {-0.625, -0.625, 0.5, 0.625, -0.4375, 0.5625},
  80. }
  81. },
  82. groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
  83. sounds = default.node_sound_wood_defaults(),
  84. })
  85. minetest.register_node("cg_decor:wall", {
  86. description = "Dryall",
  87. tiles = {"cg_decor_siding_wall.png"},
  88. groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
  89. sounds = default.node_sound_wood_defaults(),
  90. })
  91. --------------------------------------------------------------------------------------------
  92. -- Blocks ----------------------------------------------------------------------------------
  93. --------------------------------------------------------------------------------------------
  94. --[[if minetest.get_modpath("homedecor") then
  95. end
  96. local roof_list = {
  97. {"Red", "#900000:150"},
  98. {"Green", "#006500:200"},
  99. {"Dark_grey", "#202020:200"},
  100. {"Silver", "#b0b0b0:175"},
  101. {"Rusty", "#ffffff:150"},
  102. }
  103. for i in ipairs(roof_list) do
  104. local desc = roof_list[i][1]
  105. local color = desc:lower()
  106. local value = roof_list[i][2]
  107. local extra = ""
  108. if color == "rusty" then extra = "^cg_decor_metalroof_overlay_rusty.png" end
  109. minetest.register_node("cg_decor:metal_roof_"..color, {
  110. description = "Metal Roof ("..desc..")",
  111. drawtype = "mesh",
  112. mesh = "cg_decor_metalroof.obj",
  113. tiles = {"(cg_decor_bg.png^[colorize:"..value..")^cg_decor_metalroof_overlay.png"..extra},
  114. paramtype = "light",
  115. paramtype2 = "facedir",
  116. selection_box = {
  117. type = "fixed",
  118. fixed = {
  119. {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
  120. {-0.5, -0.25, -0.25, 0.5, 0, 0.5},
  121. {-0.5, 0, 0, 0.5, 0.25, 0.5},
  122. {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5}
  123. }
  124. },
  125. collision_box = {
  126. type = "fixed",
  127. fixed = {
  128. {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
  129. {-0.5, -0.25, -0.25, 0.5, 0, 0.5},
  130. {-0.5, 0, 0, 0.5, 0.25, 0.5},
  131. {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5}
  132. }
  133. },
  134. groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
  135. on_place = minetest.rotate_node,
  136. sounds = default.node_sound_wood_defaults()
  137. })
  138. minetest.register_node("cg_decor:metal_roof_"..color.."_corner", {
  139. description = "Metal Roof Corner ("..desc..")",
  140. drawtype = "mesh",
  141. mesh = "cg_decor_metalroof_corner.obj",
  142. tiles = {"(cg_decor_bg.png^[colorize:"..value..")^cg_decor_metalroof_overlay.png"..extra},
  143. paramtype = "light",
  144. paramtype2 = "facedir",
  145. selection_box = {
  146. type = "fixed",
  147. fixed = {
  148. {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
  149. {-0.5, -0.25, -0.25, 0.25, 0, 0.5},
  150. {-0.5, 0, 0, 0, 0.25, 0.5},
  151. {-0.5, 0.25, 0.25, -0.25, 0.5, 0.5}
  152. }
  153. },
  154. collision_box = {
  155. type = "fixed",
  156. fixed = {
  157. {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
  158. {-0.5, -0.25, -0.25, 0.25, 0, 0.5},
  159. {-0.5, 0, 0, 0, 0.25, 0.5},
  160. {-0.5, 0.25, 0.25, -0.25, 0.5, 0.5}
  161. }
  162. },
  163. groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
  164. on_place = minetest.rotate_node,
  165. sounds = default.node_sound_wood_defaults()
  166. })
  167. minetest.register_node("cg_decor:metal_roof_"..color.."_valley", {
  168. description = "Metal Roof Valley ("..desc..")",
  169. drawtype = "mesh",
  170. mesh = "cg_decor_metalroof_valley.obj",
  171. tiles = {"(cg_decor_bg.png^[colorize:"..value..")^cg_decor_metalroof_overlay.png"..extra},
  172. paramtype = "light",
  173. paramtype2 = "facedir",
  174. selection_box = {
  175. type = "fixed",
  176. fixed = {
  177. {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
  178. {-0.5, -0.5, -0.25, 0.5, 0, 0.5},
  179. {-0.5, -0.5, -0.5, 0.25, 0, 0.5},
  180. {-0.5, 0, -0.5, 0, 0.25, 0.5},
  181. {-0.5, 0, 0, 0.5, 0.25, 0.5},
  182. {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5},
  183. {-0.5, 0.25, -0.5, -0.25, 0.5, 0.5},
  184. }
  185. },
  186. collision_box = {
  187. type = "fixed",
  188. fixed = {
  189. {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
  190. {-0.5, -0.5, -0.25, 0.5, 0, 0.5},
  191. {-0.5, -0.5, -0.5, 0.25, 0, 0.5},
  192. {-0.5, 0, -0.5, 0, 0.25, 0.5},
  193. {-0.5, 0, 0, 0.5, 0.25, 0.5},
  194. {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5},
  195. {-0.5, 0.25, -0.5, -0.25, 0.5, 0.5},
  196. }
  197. },
  198. groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
  199. on_place = minetest.rotate_node,
  200. sounds = default.node_sound_wood_defaults()
  201. })
  202. minetest.register_node("cg_decor:metal_roof_"..color.."_flat", {
  203. description = "Metal Roof Flat ("..desc..")",
  204. drawtype = "mesh",
  205. mesh = "cg_decor_metalroof_flat.obj",
  206. tiles = {"(cg_decor_bg.png^[colorize:"..value..")^cg_decor_metalroof_overlay.png"..extra},
  207. paramtype = "light",
  208. paramtype2 = "facedir",
  209. selection_box = {
  210. type = "fixed",
  211. fixed = {
  212. {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5},
  213. }
  214. },
  215. collision_box = {
  216. type = "fixed",
  217. fixed = {
  218. {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5},
  219. }
  220. },
  221. groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
  222. on_place = minetest.rotate_node,
  223. sounds = default.node_sound_wood_defaults()
  224. })
  225. end
  226. ]]
  227. minetest.register_craft({
  228. output = 'cg_decor:floor_block_white 4',
  229. recipe = {
  230. {'default:clay', 'default:clay'},
  231. {'default:clay', 'default:clay'},
  232. }
  233. })
  234. minetest.register_craft({
  235. output = 'cg_decor:tile_white 4',
  236. recipe = {
  237. {'cg_decor:floor_block_white', 'cg_decor:floor_block_white'},
  238. {'cg_decor:floor_block_white', 'cg_decor:floor_block_white'},
  239. }
  240. })
  241. local color_list = {
  242. {"Red", "#900000:150"},
  243. {"Yellow", "#f0f000:150"},
  244. {"Green", "#005000:150"},
  245. {"Blue", "#001080:175"},
  246. {"Violet", "#500090:150"},
  247. {"Black", "#000000:200"},
  248. {"Dark_grey", "#202020:200"},
  249. {"Grey", "#b0b0b0:175"},
  250. {"White", "#ffffff:150"},
  251. {"Orange", "#a04000:185"},
  252. }
  253. local ore_list = {
  254. {"coal"},
  255. {"iron"},
  256. {"copper"},
  257. {"mese"},
  258. {"gold"},
  259. {"diamond"}
  260. }
  261. for i in ipairs(color_list) do
  262. local desc = color_list[i][1]
  263. local color = desc:lower()
  264. local value = color_list[i][2]
  265. stairs.register_stair("carpeted_wood_"..color, "cg_decor:carpetblock_wood_"..color,
  266. {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3},
  267. {"cg_decor_carpet.png^[colorize:"..value,
  268. "default_wood.png",
  269. "default_wood.png",
  270. "default_wood.png",
  271. "default_wood.png",
  272. "default_wood.png^(cg_decor_carpet_overlay.png^[colorize:"..value..")"},
  273. "Carpeted Wooden Stair",
  274. default.node_sound_defaults())
  275. stairs.register_slab("carpeted_wood_"..color, "cg_decor:carpetblock_wood_"..color,
  276. {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3},
  277. {"cg_decor_carpet.png^[colorize:"..value,
  278. "default_wood.png",
  279. "default_wood.png^(cg_decor_carpet_overlay.png^[colorize:"..value..")",
  280. "default_wood.png^(cg_decor_carpet_overlay.png^[colorize:"..value..")",
  281. "default_wood.png^(cg_decor_carpet_overlay.png^[colorize:"..value..")",
  282. "default_wood.png^(cg_decor_carpet_overlay.png^[colorize:"..value..")"},
  283. "Carpeted Wooden Slab",
  284. default.node_sound_defaults())
  285. stairs.register_stair("carpeted_junglewood_"..color, "cg_decor:carpetblock_junglewood_"..color,
  286. {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3},
  287. {"cg_decor_carpet.png^[colorize:"..value,
  288. "default_junglewood.png",
  289. "default_junglewood.png",
  290. "default_junglewood.png",
  291. "default_junglewood.png",
  292. "default_junglewood.png^(cg_decor_carpet_overlay.png^[colorize:"..value..")"},
  293. "Carpeted Wooden Stair",
  294. default.node_sound_defaults())
  295. stairs.register_slab("carpeted_junglewood_"..color, "cg_decor:carpetblock_junglewood_"..color,
  296. {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3},
  297. {"cg_decor_carpet.png^[colorize:"..value,
  298. "default_junglewood.png",
  299. "default_junglewood.png^(cg_decor_carpet_overlay.png^[colorize:"..value..")",
  300. "default_junglewood.png^(cg_decor_carpet_overlay.png^[colorize:"..value..")",
  301. "default_junglewood.png^(cg_decor_carpet_overlay.png^[colorize:"..value..")",
  302. "default_junglewood.png^(cg_decor_carpet_overlay.png^[colorize:"..value..")"},
  303. "Carpeted Wooden Slab",
  304. default.node_sound_defaults())
  305. minetest.register_node("cg_decor:carpet_"..color, {
  306. description = "Carpet layer ("..desc..")",
  307. tiles = {"cg_decor_carpet.png^[colorize:"..value },
  308. paramtype = "light",
  309. drawtype = "nodebox",
  310. paramtype2 = "facedir",
  311. node_box = {
  312. type = "fixed",
  313. fixed = {-0.5, -0.5, -0.5, 0.5, -0.4875, 0.5
  314. }},
  315. groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2},
  316. sounds = default.node_sound_wood_defaults(),
  317. })
  318. minetest.register_node("cg_decor:carpetblock_"..color, {
  319. description = "Carpet or drywall("..desc..")",
  320. tiles = {"cg_decor_carpet.png^[colorize:"..value, "cg_decor_siding_wall.png" },
  321. paramtype = "light",
  322. drawtype = "nodebox",
  323. node_box = {
  324. type = "fixed",
  325. fixed = {-0.5, -0.5, -0.5, 0.5, 0.5125, 0.5},
  326. },
  327. selection_box = {
  328. type = "fixed",
  329. fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
  330. },
  331. groups = {choppy=2,oddly_breakable_by_hand=1,flammable=2},
  332. sounds = default.node_sound_wood_defaults(),
  333. })
  334. minetest.register_node("cg_decor:carpetblock_wood_"..color, {
  335. description = "Carpet on Wood ("..desc..")",
  336. tiles = {"cg_decor_carpet.png^[colorize:"..value, "default_wood.png" },
  337. paramtype = "light",
  338. drawtype = "nodebox",
  339. node_box = {
  340. type = "fixed",
  341. fixed = {-0.5, -0.5, -0.5, 0.5, 0.5125, 0.5},
  342. },
  343. selection_box = {
  344. type = "fixed",
  345. fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
  346. },
  347. groups = {choppy=2,oddly_breakable_by_hand=1,flammable=2},
  348. sounds = default.node_sound_wood_defaults(),
  349. })
  350. minetest.register_node("cg_decor:carpetblock_junglewood_"..color, {
  351. description = "Carpet on Junglewood ("..desc..")",
  352. tiles = {"cg_decor_carpet.png^[colorize:"..value, "default_junglewood.png" },
  353. paramtype = "light",
  354. drawtype = "nodebox",
  355. node_box = {
  356. type = "fixed",
  357. fixed = {-0.5, -0.5, -0.5, 0.5, 0.5125, 0.5},
  358. },
  359. selection_box = {
  360. type = "fixed",
  361. fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
  362. },
  363. groups = {choppy=2,oddly_breakable_by_hand=1,flammable=2},
  364. sounds = default.node_sound_wood_defaults(),
  365. })
  366. minetest.register_node("cg_decor:siding_"..color, {
  367. description = "Siding "..desc,
  368. tiles = {"cg_decor_siding_top.png^[colorize:"..value, "cg_decor_siding_top.png^[colorize:"..value.."^[transformR180",
  369. "cg_decor_siding.png^[colorize:"..value, "cg_decor_siding.png^[colorize:"..value,
  370. "cg_decor_siding_wall.png", "cg_decor_siding.png^[colorize:"..value},
  371. paramtype = "light",
  372. paramtype2 = "facedir",
  373. drawtype = "nodebox",
  374. node_box = {
  375. type = "fixed",
  376. fixed = {{-0.5, -0.5, -0.375, 0.5, 0.5, 0.5},
  377. {-0.5, -0.459958, -0.4375, 0.5, -0.172287, -0.375},
  378. {-0.5, 0.203899, -0.4375, 0.5, 0.5, -0.375},
  379. {-0.5, -0.12803, -0.4375, 0.5, 0.165964, -0.375},
  380. }},
  381. selection_box = {
  382. type = "fixed",
  383. fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
  384. },
  385. groups = {choppy=2,oddly_breakable_by_hand=1,flammable=2},
  386. sounds = default.node_sound_wood_defaults(),
  387. })
  388. minetest.register_node("cg_decor:siding_"..color.."_insidecorner", {
  389. description = "Siding inside corner"..desc,
  390. tiles = {"cg_decor_siding.png^[colorize:"..value, "cg_decor_siding.png^[colorize:"..value,
  391. "cg_decor_siding_wall.png", "cg_decor_siding.png^[colorize:"..value.."^(cg_decor_corner_overlay.png^[transformR180)",
  392. "cg_decor_siding_wall.png", "cg_decor_siding.png^[colorize:"..value.."^cg_decor_corner_overlay.png"},
  393. paramtype = "light",
  394. paramtype2 = "facedir",
  395. groups = {choppy=2,oddly_breakable_by_hand=1,flammable=2},
  396. sounds = default.node_sound_wood_defaults(),
  397. })
  398. minetest.register_node("cg_decor:siding_"..color.."_corner", {
  399. description = "Siding corner "..desc,
  400. tiles = {"cg_decor_siding_corner_top.png^[colorize:"..value, "cg_decor_siding_corner_top.png^[colorize:"..value.."^[transformR270",
  401. "cg_decor_siding.png^[colorize:"..value.."^cg_decor_corner_overlay2.png", "cg_decor_siding.png^[colorize:"..value.."^(cg_decor_corner_overlay.png^[transformR180)",
  402. "cg_decor_siding.png^[colorize:"..value.."^(cg_decor_corner_overlay2.png^[transformR180)", "cg_decor_siding.png^[colorize:"..value.."^cg_decor_corner_overlay.png"},
  403. paramtype = "light",
  404. paramtype2 = "facedir",
  405. drawtype = "nodebox",
  406. node_box = {
  407. type = "fixed",
  408. fixed = {{-0.375, -0.5, -0.375, 0.5, 0.5, 0.5},
  409. {-0.375, -0.459958, -0.4375, 0.5, -0.172287, -0.375},
  410. {-0.375, 0.203899, -0.4375, 0.5, 0.5, -0.375},
  411. {-0.375, -0.12803, -0.4375, 0.5, 0.165964, -0.375},
  412. {-0.4375, 0.203899, -0.4375, -0.375, 0.5, 0.5},
  413. {-0.4375, -0.12803, -0.4375, -0.375, 0.165964, 0.5},
  414. {-0.4375, -0.456797, -0.4375, -0.375, -0.172287, 0.5},
  415. {-0.5, -0.5, -0.5, -0.3125, 0.5, -0.375},
  416. {-0.5, -0.5, -0.5, -0.375, 0.5, -0.3125},
  417. }},
  418. selection_box = {
  419. type = "fixed",
  420. fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
  421. },
  422. groups = {choppy=2,oddly_breakable_by_hand=1,flammable=2},
  423. sounds = default.node_sound_wood_defaults(),
  424. })
  425. minetest.register_craft( {
  426. type = "shapeless",
  427. output = 'cg_decor:floor_block_'..color,
  428. recipe = { 'cg_decor:floor_block_white', 'dye:'..color},
  429. })
  430. minetest.register_craft( {
  431. type = "shapeless",
  432. output = 'cg_decor:tile_'..color,
  433. recipe = { 'cg_decor:tile_white', 'dye:'..color},
  434. })
  435. minetest.register_craft({
  436. output = 'cg_decor:tile_'..color..' 4',
  437. recipe = {
  438. {'cg_decor:floor_block_'..color, 'cg_decor:floor_block_'..color},
  439. {'cg_decor:floor_block_'..color, 'cg_decor:floor_block_'..color},
  440. }
  441. })
  442. minetest.register_node("cg_decor:floor_block_"..color, {
  443. description = desc.." Decrotive floor block",
  444. tiles = {"cg_decor_floor_block.png^[colorize:"..value},
  445. groups = {cracky=3, stone=1},
  446. sounds = default.node_sound_stone_defaults(),
  447. })
  448. minetest.register_node("cg_decor:tile_"..color, {
  449. description = desc.." Decrotive tile",
  450. tiles = {"cg_decor_floor_tile.png^[colorize:"..value},
  451. groups = {cracky=3, stone=1},
  452. sounds = default.node_sound_stone_defaults(),
  453. })
  454. if minetest.get_modpath("stairs") then
  455. stairs.register_stair_and_slab("decor_block_"..color, "cg_decor:floor_block_"..color,
  456. {cracky=3},
  457. {"cg_decor_floor_block.png^[colorize:"..value},
  458. desc.." Decrotive floor block Stair",
  459. desc.." Decrotive floor block Slab",
  460. default.node_sound_stone_defaults())
  461. stairs.register_slab("decor_tile_"..color, "cg_decor:tile_"..color,
  462. {cracky=3},
  463. {"cg_decor_floor_tile.png^[colorize:"..value},
  464. desc.." Decrotive tile Slab",
  465. default.node_sound_stone_defaults())
  466. end
  467. for i in ipairs(ore_list) do
  468. local ore = ore_list[i][1]
  469. local craft_ore = ore.."_lump"
  470. if ore == "mese" then craft_ore = "mese_crystal" end
  471. minetest.register_node("cg_decor:tile_"..color.."_"..ore, {
  472. description = desc.." Decrotive "..ore.." tile",
  473. tiles = {"cg_decor_floor_tile.png^[colorize:"..value.."^default_mineral_"..ore..".png"},
  474. groups = {cracky=3, stone=1},
  475. sounds = default.node_sound_stone_defaults(),
  476. })
  477. if minetest.get_modpath("stairs") then
  478. stairs.register_slab("decor_tile_"..color.."_"..ore, "cg_decor:tile_"..color.."_"..ore,
  479. {cracky=3},
  480. {"cg_decor_floor_tile.png^[colorize:"..value.."^default_mineral_"..ore..".png"},
  481. desc.." Decrotive "..ore.." tile Slab",
  482. default.node_sound_stone_defaults())
  483. end
  484. minetest.register_craft( {
  485. type = "shapeless",
  486. output = 'cg_decor:tile_'..color..'_'..ore,
  487. recipe = {'cg_decor:tile_'..color, 'default:'..craft_ore},
  488. })
  489. end
  490. end
  491. --------------------------------------------------------------------------------------------
  492. -- Fences ----------------------------------------------------------------------------------
  493. --------------------------------------------------------------------------------------------
  494. local material_list = {
  495. {"Steel", "default_steel_block.png", "default:steelblock" },
  496. {"Copper", "default_copper_block.png", "default:copperblock" },
  497. {"Gold", "default_gold_block.png", "default:goldblock" },
  498. {"Diamond", "default_diamond_block.png", "default:diamondblock"},
  499. {"Mese", "default_mese_block.png", "default:mese" },
  500. {"Bronze", "default_bronze_block.png", "default:bronzeblock" },
  501. --{"Jungle_wood", "default_junglewood.png", "default:junglewood" },
  502. --{"Acacia_wood", "default_acacia_wood.png", "default:acaciawood" },
  503. {"Obsidian", "default_obsidian.png", "default:obsidian" },
  504. }
  505. for i in ipairs(material_list) do
  506. local desc = material_list[i][1]
  507. local material = desc:lower()
  508. local texture = material_list[i][2]
  509. local craft_material = material_list[i][3]
  510. minetest.register_node("cg_decor:fence_"..material, {
  511. description = desc.." Fence",
  512. drawtype = "fencelike",
  513. tiles = {texture},
  514. inventory_image = "default_fence_overlay.png^"..texture..
  515. "^default_fence_overlay.png^[makealpha:255,126,126^cg_decor_fence_overlay.png",
  516. wield_image = "default_fence_overlay.png^"..texture..
  517. "^default_fence_overlay.png^[makealpha:255,126,126^cg_decor_fence_overlay.png",
  518. paramtype = "light",
  519. is_ground_content = false,
  520. selection_box = {
  521. type = "fixed",
  522. fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
  523. },
  524. groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2},
  525. sounds = default.node_sound_wood_defaults(),
  526. })
  527. end
  528. if minetest.get_modpath("steel") then -- register rusted steel fence if "steel" mod is loaded
  529. minetest.register_node("cg_decor:fence_steel_rusted", {
  530. description = "Rusted Steel Fence",
  531. drawtype = "fencelike",
  532. tiles = {"steel_rusted.png"},
  533. inventory_image = "default_fence_overlay.png^steel_rusted.png"..
  534. "^default_fence_overlay.png^[makealpha:255,126,126^cg_decor_fence_overlay.png",
  535. wield_image = "default_fence_overlay.png^steel_rusted.png"..
  536. "^default_fence_overlay.png^[makealpha:255,126,126^cg_decor_fence_overlay.png",
  537. paramtype = "light",
  538. is_ground_content = false,
  539. selection_box = {
  540. type = "fixed",
  541. fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
  542. },
  543. groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2},
  544. sounds = default.node_sound_wood_defaults(),
  545. })
  546. end
  547. --------------------------------------------------------------------------------------------
  548. -- Trees and bushes ------------------------------------------------------------------------
  549. --------------------------------------------------------------------------------------------
  550. function cg_decor.register_tree(treename, tree_image, drop) --global tree register
  551. local drop_lg, drop_sm
  552. if drop and drop ~= "" then
  553. minetest.register_node("cg_decor:"..drop, {
  554. description = drop,
  555. drawtype = "plantlike",
  556. visual_scale = 0.8,
  557. tiles = {"cg_decor_"..drop..".png"},
  558. inventory_image = "cg_decor_"..drop..".png",
  559. paramtype = "light",
  560. sunlight_propagates = true,
  561. walkable = false,
  562. is_ground_content = true,
  563. groups = {fleshy=3,dig_immediate=3,flammable=2,attached_node=1,not_in_creative_inventory=1},
  564. on_use = minetest.item_eat(1),
  565. selection_box = {
  566. type = "fixed",
  567. fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
  568. },
  569. sounds = default.node_sound_leaves_defaults()
  570. })
  571. end
  572. if not drop then
  573. drop_sm = "cg_decor:"..treename.."_tree"
  574. drop_lg = "cg_decor:"..treename.."_tree_large"
  575. else
  576. drop_sm = "cg_decor:"..drop.." 2"
  577. drop_lg = "cg_decor:"..drop.." 4"
  578. end
  579. minetest.register_node("cg_decor:"..treename.."_tree", {
  580. description = treename.." tree",
  581. drawtype = "plantlike",
  582. visual_scale = 1.0,
  583. tiles = {tree_image},
  584. inventory_image = tree_image,
  585. wield_image = tree_image,
  586. paramtype = "light",
  587. walkable = false,
  588. is_ground_content = true,
  589. selection_box = {
  590. type = "fixed",
  591. fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
  592. },
  593. groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
  594. sounds = default.node_sound_leaves_defaults(),
  595. })
  596. minetest.register_node("cg_decor:"..treename.."_tree_large", {
  597. description = "Large "..treename.." tree",
  598. drawtype = "plantlike",
  599. visual_scale = 1.5,
  600. tiles = {tree_image},
  601. inventory_image = tree_image,
  602. wield_image = tree_image,
  603. paramtype = "light",
  604. walkable = false,
  605. is_ground_content = true,
  606. selection_box = {
  607. type = "fixed",
  608. fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
  609. },
  610. groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
  611. sounds = default.node_sound_leaves_defaults(),
  612. })
  613. minetest.register_node("cg_decor:"..treename.."_tree_extralarge", {
  614. description = "Extra large "..treename.." tree",
  615. drawtype = "plantlike",
  616. visual_scale = 1.9,
  617. tiles = {tree_image},
  618. inventory_image = tree_image,
  619. wield_image = tree_image,
  620. paramtype = "light",
  621. walkable = false,
  622. is_ground_content = true,
  623. selection_box = {
  624. type = "fixed",
  625. fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
  626. },
  627. groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
  628. sounds = default.node_sound_leaves_defaults(),
  629. })
  630. minetest.register_node("cg_decor:"..treename.."_leaves", {
  631. drawtype = "mesh",
  632. mesh = "cg_decor_tree_leaves.obj",
  633. waving = 1,
  634. visual_scale = 1.5,
  635. tiles = {"cg_decor_"..treename.."_leaves.png"},
  636. paramtype = "light",
  637. walkable = false,
  638. climbable = true,
  639. is_ground_content = false,
  640. collision_box = {
  641. type = "fixed",
  642. fixed = {-0.2, -0.2, -0.2, 0.2, 0.5, 0.2}
  643. },
  644. groups = {snappy=3, leafdecay=2, flammable=2, leaves=1},
  645. drop = {
  646. max_items = 3,
  647. items = {{items = {drop_sm},}}
  648. },
  649. sounds = default.node_sound_leaves_defaults(),
  650. })
  651. minetest.register_node("cg_decor:"..treename.."_leaves_large", {
  652. drawtype = "mesh",
  653. mesh = "cg_decor_tree_leaves.obj",
  654. waving = 1,
  655. visual_scale = 2.5,
  656. tiles = {"cg_decor_"..treename.."_leaves.png"},
  657. paramtype = "light",
  658. walkable = false,
  659. climbable = true,
  660. is_ground_content = false,
  661. groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
  662. drop = {
  663. max_items = 5,
  664. items = {{items = {drop_lg},}}
  665. },
  666. collision_box = {
  667. type = "fixed",
  668. fixed = {-0.2, -0.2, -0.2, 0.2, 1.2, 0.2}
  669. },
  670. selection_box = {
  671. type = "fixed",
  672. fixed = {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5}
  673. },
  674. sounds = default.node_sound_leaves_defaults(),
  675. })
  676. minetest.register_abm({
  677. nodenames = {"cg_decor:"..treename.."_tree"},
  678. interval = 1,
  679. chance = 1,
  680. action = function(pos, node)
  681. local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
  682. local node2 = minetest.get_node({x = pos.x, y = pos.y+1, z = pos.z})
  683. local node3 = minetest.get_node({x = pos.x, y = pos.y+2, z = pos.z})
  684. local node4 = minetest.get_node({x = pos.x, y = pos.y+3, z = pos.z})
  685. local is_soil = minetest.get_item_group(nu, "soil")
  686. if is_soil == 0 then
  687. minetest.remove_node(pos)
  688. minetest.spawn_item(pos, "cg_decor:"..treename.."_tree")
  689. return
  690. end
  691. if (node2.name == "air" or node2.name == "ignore") and (node3.name == "air" or node3.name == "ignore")
  692. and (node4.name == "air" or node4.name == "ignore") then
  693. minetest.add_node(pos, { name = "cg_decor:tree_trunk_base" })
  694. minetest.add_node({x = pos.x, y = pos.y+1, z = pos.z}, { name = "cg_decor:tree_trunk" })
  695. minetest.add_node({x = pos.x, y = pos.y+2, z = pos.z}, { name = "cg_decor:"..treename.."_leaves" })
  696. else
  697. minetest.remove_node(pos)
  698. minetest.spawn_item(pos, "cg_decor:"..treename.."_tree")
  699. return
  700. end
  701. end
  702. })
  703. minetest.register_abm({
  704. nodenames = {"cg_decor:"..treename.."_tree_large"},
  705. interval = 1,
  706. chance = 1,
  707. action = function(pos, node)
  708. local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
  709. local node2 = minetest.get_node({x = pos.x, y = pos.y+1, z = pos.z})
  710. local node3 = minetest.get_node({x = pos.x, y = pos.y+2, z = pos.z})
  711. local node4 = minetest.get_node({x = pos.x, y = pos.y+3, z = pos.z})
  712. local node5 = minetest.get_node({x = pos.x, y = pos.y+4, z = pos.z})
  713. local is_soil = minetest.get_item_group(nu, "soil")
  714. if is_soil == 0 then
  715. minetest.remove_node(pos)
  716. minetest.spawn_item(pos, "cg_decor:"..treename.."_tree_large")
  717. return
  718. end
  719. if (node2.name == "air" or node2.name == "ignore") and (node3.name == "air" or node3.name == "ignore")
  720. and (node4.name == "air" or node4.name == "ignore") and (node5.name == "air" or node5.name == "ignore") then
  721. minetest.add_node(pos, { name = "cg_decor:tree_trunk_base" })
  722. minetest.add_node({x = pos.x, y = pos.y+1, z = pos.z}, { name = "cg_decor:tree_trunk" })
  723. minetest.add_node({x = pos.x, y = pos.y+2, z = pos.z}, { name = "cg_decor:"..treename.."_leaves_large" })
  724. else
  725. minetest.remove_node(pos)
  726. minetest.spawn_item(pos, "cg_decor:"..treename.."_tree_large")
  727. return
  728. end
  729. end
  730. })
  731. minetest.register_abm({
  732. nodenames = {"cg_decor:"..treename.."_tree_extralarge"},
  733. interval = 1,
  734. chance = 1,
  735. action = function(pos, node)
  736. local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
  737. local node2 = minetest.get_node({x = pos.x, y = pos.y+1, z = pos.z})
  738. local node3 = minetest.get_node({x = pos.x, y = pos.y+2, z = pos.z})
  739. local node4 = minetest.get_node({x = pos.x, y = pos.y+3, z = pos.z})
  740. local node5 = minetest.get_node({x = pos.x, y = pos.y+4, z = pos.z})
  741. local node6 = minetest.get_node({x = pos.x, y = pos.y+5, z = pos.z})
  742. local is_soil = minetest.get_item_group(nu, "soil")
  743. if is_soil == 0 then
  744. minetest.remove_node(pos)
  745. minetest.spawn_item(pos, "cg_decor:"..treename.."_tree_extralarge")
  746. return
  747. end
  748. if (node2.name == "air" or node2.name == "ignore") and (node3.name == "air" or node3.name == "ignore")
  749. and (node4.name == "air" or node4.name == "ignore") and (node5.name == "air" or node5.name == "ignore")
  750. and (node6.name == "air" or node6.name == "ignore") then
  751. minetest.add_node(pos, { name = "cg_decor:tree_trunk_base" })
  752. minetest.add_node({x = pos.x, y = pos.y+1, z = pos.z}, { name = "cg_decor:tree_trunk" })
  753. minetest.add_node({x = pos.x, y = pos.y+2, z = pos.z}, { name = "cg_decor:tree_trunk" })
  754. minetest.add_node({x = pos.x, y = pos.y+3, z = pos.z}, { name = "cg_decor:"..treename.."_leaves_large" })
  755. else
  756. minetest.remove_node(pos)
  757. minetest.spawn_item(pos, "cg_decor:"..treename.."_tree_extralarge")
  758. return
  759. end
  760. end
  761. })
  762. end
  763. --------------------------------------------------------------------------------------------
  764. function cg_decor.register_bush(name, scale, drop) --global bush register
  765. if drop and drop ~= "" then
  766. minetest.register_node("cg_decor:"..drop, {
  767. description = drop,
  768. drawtype = "plantlike",
  769. visual_scale = 0.8,
  770. tiles = {"cg_decor_"..drop..".png"},
  771. inventory_image = "cg_decor_"..drop..".png",
  772. paramtype = "light",
  773. sunlight_propagates = true,
  774. walkable = false,
  775. is_ground_content = true,
  776. groups = {fleshy=3,dig_immediate=3,flammable=2,attached_node=1,not_in_creative_inventory=1},
  777. on_use = minetest.item_eat(1),
  778. selection_box = {
  779. type = "fixed",
  780. fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
  781. },
  782. sounds = default.node_sound_leaves_defaults()
  783. })
  784. end
  785. if not drop then
  786. drop = "cg_decor:"..name.."_bush"
  787. else
  788. drop = "cg_decor:"..drop.." 2"
  789. end
  790. minetest.register_node("cg_decor:"..name.."_bush", {
  791. description = "Large "..name.." Bush",
  792. drawtype = "mesh",
  793. mesh = "cg_decor_tree_leaves.obj",
  794. waving = 1,
  795. visual_scale = scale,
  796. tiles = {"cg_decor_"..name.."_leaves.png"},
  797. wield_image = "cg_decor_"..name.."_leaves.png",
  798. inventory_image = "cg_decor_"..name.."_leaves.png",
  799. paramtype = "light",
  800. is_ground_content = false,
  801. groups = {snappy=3, flammable=2},
  802. drop = {
  803. max_items = 2,
  804. items = {{items = {drop},}}
  805. },
  806. collision_box = {
  807. type = "fixed",
  808. fixed = {-0.2, -0.2, -0.2, 0.2, 0.5, 0.2}
  809. },
  810. sounds = default.node_sound_leaves_defaults(),
  811. })
  812. end
  813. --------------------------------------------------------------------------------------------
  814. cg_decor.register_tree("regular", "cg_decor_tree.png")
  815. cg_decor.register_tree("dogwood", "cg_decor_dogwood_tree.png")
  816. cg_decor.register_tree("japanese_maple", "cg_decor_jp_maple_tree.png")
  817. cg_decor.register_tree("cherry", "cg_decor_cherry_tree.png", "cherry")
  818. cg_decor.register_tree("crape_myrtle", "cg_decor_crape_myrtle_tree.png")
  819. cg_decor.register_tree("african_tulip", "cg_decor_african_tulip_tree.png")
  820. cg_decor.register_bush("regular", 1.5)
  821. cg_decor.register_bush("blackberry", 1.5, "blackberry")
  822. --------------------------------------------------------------------------------------------
  823. -- Hydrangeas ------------------------------------------------------------------------------
  824. local hydrangea_list = { --some colors are listed more than once to create a more realistic color pattern
  825. {"White", "#ffffff:150"},
  826. {"purple", "#5030a0:180"},
  827. {"Blue", "#3060c0:200"},
  828. {"light pink", "#f0a0a0:200"},
  829. {"White", "#ffffff:150"},
  830. {"pink", "#f06060:200"},
  831. {"light purple","#9070c0:150"},
  832. {"light blue", "#80a0ff:170"},
  833. {"light pink", "#f0a0a0:200"},
  834. {"light purple","#9070c0:150"},
  835. {"White", "#ffffff:150"},
  836. {"light blue", "#80a0ff:170"},
  837. {"dark purple", "#500090:200"},
  838. {"dark blue", "#001080:200"}
  839. }
  840. for i in ipairs(hydrangea_list) do
  841. local value = hydrangea_list[i][2]
  842. local desc,desc_sm
  843. if i == 1 then
  844. desc = "Hydrangea"
  845. desc_sm = "Hydrangea small"
  846. else
  847. desc = ""
  848. desc_sm = ""
  849. end
  850. minetest.register_node("cg_decor:hydrangea_bush"..i, {
  851. description = desc,
  852. drawtype = "mesh",
  853. mesh = "cg_decor_tree_leaves.obj",
  854. waving = 1,
  855. visual_scale = 1.5,
  856. tiles = {"cg_decor_leaves.png^(cg_decor_hydrangea.png^[colorize:"..value..")"},
  857. wield_image = "cg_decor_leaves.png^(cg_decor_hydrangea.png^[colorize:"..value..")",
  858. inventory_image = "cg_decor_leaves.png^(cg_decor_hydrangea.png^[colorize:"..value..")",
  859. paramtype = "light",
  860. is_ground_content = false,
  861. groups = {snappy=3, flammable=2},
  862. drop = {
  863. max_items = 2,
  864. items = {{items = {"cg_decor:hydrangea_bush1"},}}
  865. },
  866. collision_box = {
  867. type = "fixed",
  868. fixed = {-0.2, -0.2, -0.2, 0.2, 0.5, 0.2}
  869. },
  870. sounds = default.node_sound_leaves_defaults(),
  871. after_place_node = function(pos, placer, itemstack, pointed_thing)
  872. minetest.add_node(pos, { name = "cg_decor:hydrangea_bush"..math.random(1,14)})
  873. end,
  874. })
  875. minetest.register_node("cg_decor:hydrangea_bushsmall"..i, {
  876. description = desc_sm,
  877. drawtype = "mesh",
  878. mesh = "cg_decor_tree_leaves.obj",
  879. waving = 1,
  880. visual_scale = 0.8,
  881. tiles = {"cg_decor_leaves.png^(cg_decor_hydrangea.png^[colorize:"..value..")"},
  882. wield_image = "cg_decor_leaves.png^(cg_decor_hydrangea.png^[colorize:"..value..")",
  883. inventory_image = "cg_decor_leaves.png^(cg_decor_hydrangea.png^[colorize:"..value..")",
  884. paramtype = "light",
  885. is_ground_content = false,
  886. groups = {snappy=3, flammable=2},
  887. drop = {
  888. max_items = 2,
  889. items = {{items = {"cg_decor:hydrangea_bushsmall1"},}}
  890. },
  891. collision_box = {
  892. type = "fixed",
  893. fixed = {-0.2, -0.2, -0.2, 0.2, 0.5, 0.2}
  894. },
  895. sounds = default.node_sound_leaves_defaults(),
  896. after_place_node = function(pos, placer, itemstack, pointed_thing)
  897. minetest.add_node(pos, { name = "cg_decor:hydrangea_bushsmall"..math.random(1,14)})
  898. end,
  899. })
  900. end
  901. --------------------------------------------------------------------------------------------
  902. minetest.register_node("cg_decor:tree_medium", {
  903. description = "Medium tree",
  904. drawtype = "plantlike",
  905. visual_scale = 1.6,
  906. tiles = {"cg_decor_tree.png"},
  907. inventory_image = "cg_decor_tree.png",
  908. wield_image = "cg_decor_tree.png",
  909. paramtype = "light",
  910. walkable = true,
  911. is_ground_content = true,
  912. selection_box = {
  913. type = "fixed",
  914. fixed = {-0.1, -0.5, -0.1, 0.1, 1.0, 0.1}
  915. },
  916. collision_box = {
  917. type = "fixed",
  918. fixed = {-0.1, -0.5, -0.1, 0.1, 1.0, 0.1}
  919. },
  920. groups = {snappy=3,flammable=2,attached_node=1},
  921. sounds = default.node_sound_leaves_defaults(),
  922. })
  923. minetest.register_node("cg_decor:tree_small", {
  924. description = "Small tree",
  925. drawtype = "plantlike",
  926. visual_scale = 1.3,
  927. tiles = {"cg_decor_tree.png"},
  928. inventory_image = "cg_decor_tree.png",
  929. wield_image = "cg_decor_tree.png",
  930. paramtype = "light",
  931. walkable = true,
  932. is_ground_content = true,
  933. selection_box = {
  934. type = "fixed",
  935. fixed = {-0.1, -0.5, -0.1, 0.1, 0.7, 0.1}
  936. },
  937. collision_box = {
  938. type = "fixed",
  939. fixed = {-0.1, -0.5, -0.1, 0.1, 0.7, 0.1}
  940. },
  941. groups = {snappy=3,flammable=2,attached_node=1},
  942. sounds = default.node_sound_leaves_defaults(),
  943. })
  944. minetest.register_node("cg_decor:tree_xsmall", {
  945. description = "Extra small tree",
  946. drawtype = "plantlike",
  947. visual_scale = 1.0,
  948. tiles = {"cg_decor_tree.png"},
  949. inventory_image = "cg_decor_tree.png",
  950. wield_image = "cg_decor_tree.png",
  951. paramtype = "light",
  952. walkable = true,
  953. is_ground_content = true,
  954. selection_box = {
  955. type = "fixed",
  956. fixed = {-0.05, -0.5, -0.05, 0.05, 0.2, 0.05}
  957. },
  958. collision_box = {
  959. type = "fixed",
  960. fixed = {-0.05, -0.5, -0.05, 0.05, 0.2, 0.05}
  961. },
  962. groups = {snappy=3,flammable=2,attached_node=1},
  963. sounds = default.node_sound_leaves_defaults(),
  964. })
  965. --tree trunk nodes
  966. minetest.register_node("cg_decor:redwood_tree", {
  967. description = "Redwood Tree",
  968. tiles = {"cg_decor_redwood_tree_top.png", "cg_decor_redwood_tree_top.png", "cg_decor_redwood_tree.png"},
  969. paramtype = "light",
  970. paramtype2 = "facedir",
  971. is_ground_content = false,
  972. groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2,redwood=1},
  973. sounds = default.node_sound_wood_defaults(),
  974. })
  975. minetest.register_node("cg_decor:tree_trunk", {
  976. drawtype = "mesh",
  977. mesh = "cg_decor_small_tree.obj",
  978. tiles = {"cg_decor_tree_trunk.png"},
  979. paramtype = "light",
  980. is_ground_content = true,
  981. climbable = true,
  982. selection_box = {
  983. type = "fixed",
  984. fixed = { -0.125, -0.5, -0.125, 0.125, 0.5, 0.125 },
  985. },
  986. collision_box = {
  987. type = "fixed",
  988. fixed = { -0.125, -0.5, -0.125, 0.125, 0.5, 0.125 },
  989. },
  990. drop = {
  991. max_items = 1,
  992. items = {{items = {'default:stick 2'},}}
  993. },
  994. groups = {snappy=3,flammable=2,leafdecay=2},
  995. sounds = default.node_sound_leaves_defaults(),
  996. })
  997. minetest.register_node("cg_decor:tree_trunk_base", {
  998. drawtype = "mesh",
  999. mesh = "cg_decor_small_tree.obj",
  1000. tiles = {"cg_decor_tree_trunk.png"},
  1001. paramtype = "light",
  1002. is_ground_content = true,
  1003. climbable = true,
  1004. selection_box = {
  1005. type = "fixed",
  1006. fixed = { -0.125, -0.5, -0.125, 0.125, 0.5, 0.125 },
  1007. },
  1008. collision_box = {
  1009. type = "fixed",
  1010. fixed = { -0.125, -0.5, -0.125, 0.125, 0.5, 0.125 },
  1011. },
  1012. drop = {
  1013. max_items = 1,
  1014. items = {{items = {'default:stick 2'},}}
  1015. },
  1016. groups = {snappy=3,flammable=2,tree=1},
  1017. sounds = default.node_sound_leaves_defaults(),
  1018. })
  1019. minetest.register_node("cg_decor:jungleleaves", {
  1020. drawtype = "allfaces_optional",
  1021. use_texture_alpha = true,
  1022. waving = 1,
  1023. visual_scale = 1.3,
  1024. tiles = {"default_jungleleaves.png"},
  1025. paramtype = "light",
  1026. is_ground_content = false,
  1027. groups = {snappy=3, leafdecay=5, flammable=2, leaves=1},
  1028. drop = {
  1029. max_items = 1,
  1030. items = {
  1031. {
  1032. -- player will get leaves only if he get no saplings,
  1033. -- this is because max_items is 1
  1034. items = {'cg_decor:jungleleaves'},
  1035. }
  1036. }
  1037. },
  1038. sounds = default.node_sound_leaves_defaults(),
  1039. })
  1040. minetest.register_node("cg_decor:sapling_jungle", {
  1041. description = "Jungle Sapling",
  1042. drawtype = "plantlike",
  1043. visual_scale = 1.5,
  1044. tiles = {"cg_decor_junglesapling.png"},
  1045. inventory_image = "cg_decor_junglesapling.png",
  1046. wield_image = "cg_decor_junglesapling.png",
  1047. paramtype = "light",
  1048. walkable = false,
  1049. selection_box = {
  1050. type = "fixed",
  1051. fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
  1052. },
  1053. groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
  1054. sounds = default.node_sound_leaves_defaults(),
  1055. })
  1056. minetest.register_node("cg_decor:sapling_redwood", {
  1057. description = "Redwood Sapling",
  1058. drawtype = "plantlike",
  1059. visual_scale = 1.9,
  1060. tiles = {"cg_decor_redwood_sapling.png"},
  1061. inventory_image = "cg_decor_redwood_sapling.png",
  1062. wield_image = "cg_decor_redwood_sapling.png",
  1063. paramtype = "light",
  1064. walkable = false,
  1065. selection_box = {
  1066. type = "fixed",
  1067. fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
  1068. },
  1069. groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
  1070. sounds = default.node_sound_leaves_defaults(),
  1071. })
  1072. minetest.register_node("cg_decor:redwood_leaves", {
  1073. description = "Redwood Leaves",
  1074. drawtype = "allfaces_optional",
  1075. waving = 1,
  1076. visual_scale = 1.3,
  1077. tiles = {"cg_decor_redwood_leaves.png"},
  1078. paramtype = "light",
  1079. climbable = true,
  1080. is_ground_content = false,
  1081. groups = {snappy=3, rwldecay=6, flammable=2, leaves=1},
  1082. drop = {
  1083. max_items = 1,
  1084. items = {
  1085. {
  1086. -- player will get sapling with 1/20 chance
  1087. items = {'cg_decor:sapling_redwood'},
  1088. rarity = 500,
  1089. },
  1090. {
  1091. -- player will get leaves only if he get no saplings,
  1092. -- this is because max_items is 1
  1093. items = {'cg_decor:redwood_leaves'},
  1094. }
  1095. }
  1096. },
  1097. sounds = default.node_sound_leaves_defaults()
  1098. })
  1099. minetest.register_node("cg_decor:leaves", {
  1100. drawtype = "allfaces_optional",
  1101. waving = 1,
  1102. visual_scale = 1.3,
  1103. tiles = {"default_leaves.png"},
  1104. paramtype = "light",
  1105. is_ground_content = false,
  1106. groups = {snappy=3, leafdecay=4, flammable=2, leaves=1},
  1107. drop = {
  1108. max_items = 1,
  1109. items = {
  1110. {
  1111. -- player will get leaves only if he get no saplings,
  1112. -- this is because max_items is 1
  1113. items = {'cg_decor:leaves'},
  1114. }
  1115. }
  1116. },
  1117. sounds = default.node_sound_leaves_defaults(),
  1118. })
  1119. minetest.register_node("cg_decor:sapling", {
  1120. description = "Sapling",
  1121. drawtype = "plantlike",
  1122. visual_scale = 1.5,
  1123. tiles = {"cg_decor_sapling.png"},
  1124. inventory_image = "cg_decor_sapling.png",
  1125. wield_image = "cg_decor_sapling.png",
  1126. paramtype = "light",
  1127. walkable = false,
  1128. is_ground_content = true,
  1129. selection_box = {
  1130. type = "fixed",
  1131. fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
  1132. },
  1133. groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
  1134. sounds = default.node_sound_leaves_defaults(),
  1135. })
  1136. minetest.register_node("cg_decor:sapling_apple", {
  1137. description = "Sapling",
  1138. drawtype = "plantlike",
  1139. visual_scale = 1.5,
  1140. tiles = {"cg_decor_applesapling.png"},
  1141. inventory_image = "cg_decor_applesapling.png",
  1142. wield_image = "cg_decor_applesapling.png",
  1143. paramtype = "light",
  1144. walkable = false,
  1145. is_ground_content = true,
  1146. selection_box = {
  1147. type = "fixed",
  1148. fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
  1149. },
  1150. groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
  1151. sounds = default.node_sound_leaves_defaults(),
  1152. })
  1153. --------------------------------------------------------------------------------------------
  1154. local air_node = minetest.get_content_id("air")
  1155. local ignore_node = minetest.get_content_id("ignore")
  1156. local tree_node = minetest.get_content_id("default:tree")
  1157. local jtree_node = minetest.get_content_id("default:jungletree")
  1158. local dleaf_node = minetest.get_content_id("default:leaves")
  1159. local leaf_node = minetest.get_content_id("cg_decor:leaves")
  1160. local jleaf_node = minetest.get_content_id("cg_decor:jungleleaves")
  1161. local djleaf_node = minetest.get_content_id("default:jungleleaves")
  1162. local apple_node = minetest.get_content_id("default:apple")
  1163. function cg_decor.grow_tree(data, a, pos, is_apple_tree)
  1164. local height = math.random(8, 14)
  1165. if is_apple_tree == true then height = 5 end
  1166. for x_area = -3, 3 do
  1167. for y_area = -2, 3 do
  1168. for z_area = -3, 3 do
  1169. if math.random(1,30) < 23 and math.abs(x_area) + math.abs(z_area) < 5
  1170. and math.abs(x_area) + math.abs(y_area) < 5 and math.abs(z_area) + math.abs(y_area) < 5 then
  1171. local area_l = a:index(pos.x+x_area, pos.y+height+y_area-1, pos.z+z_area)
  1172. if data[area_l] == air_node or data[area_l] == ignore_node then
  1173. if is_apple_tree and math.random(1, 50) <= 10 then
  1174. data[area_l] = apple_node
  1175. else
  1176. data[area_l] = leaf_node
  1177. end
  1178. end
  1179. end
  1180. end
  1181. end
  1182. end
  1183. for tree_h = 0, height-1 do
  1184. local area_t = a:index(pos.x, pos.y+tree_h, pos.z)
  1185. if data[area_t] == air_node or data[area_t] == rleaf_node or data[area_t] == ignore_node
  1186. or data[area_t] == leaf_node or data[area_t] == jleaf_node or data[area_t] == dleaf_node
  1187. or data[area_t] == djleaf_node or data[area_t] == apple_node then
  1188. data[area_t] = tree_node
  1189. end
  1190. end
  1191. end
  1192. function cg_decor.grow_jungletree(data, a, pos)
  1193. local height = math.random(11, 20)
  1194. for x_area = -5, 5 do
  1195. for y_area = -4, 4 do
  1196. for z_area = -5, 5 do
  1197. if math.random(1,30) < 23 and math.abs(x_area) + math.abs(z_area) < 8
  1198. and math.abs(x_area) + math.abs(y_area) < 8 and math.abs(z_area) + math.abs(y_area) < 8 then
  1199. local area_l = a:index(pos.x+x_area, pos.y+height+y_area-1, pos.z+z_area)
  1200. if data[area_l] == air_node or data[area_l] == ignore_node then
  1201. data[area_l] = jleaf_node
  1202. end
  1203. end
  1204. end
  1205. end
  1206. end
  1207. for tree_h = 0, height-1 do
  1208. local area_t = a:index(pos.x, pos.y+tree_h, pos.z)
  1209. if data[area_t] == air_node or data[area_t] == rleaf_node or data[area_t] == ignore_node
  1210. or data[area_t] == leaf_node or data[area_t] == jleaf_node or data[area_t] == dleaf_node
  1211. or data[area_t] == djleaf_node then
  1212. data[area_t] = jtree_node
  1213. end
  1214. end
  1215. for roots_x = -1, 1 do
  1216. for roots_z = -1, 1 do
  1217. if math.random(1, 3) >= 2 then
  1218. if a:contains(pos.x+roots_x, pos.y-1, pos.z+roots_z) and data[a:index(pos.x+roots_x, pos.y-1, pos.z+roots_z)] == air_node then
  1219. data[a:index(pos.x+roots_x, pos.y-1, pos.z+roots_z)] = jtree_node
  1220. elseif a:contains(pos.x+roots_x, pos.y, pos.z+roots_z) and data[a:index(pos.x+roots_x, pos.y, pos.z+roots_z)] == air_node then
  1221. data[a:index(pos.x+roots_x, pos.y, pos.z+roots_z)] = jtree_node
  1222. end
  1223. end
  1224. end
  1225. end
  1226. end
  1227. function cg_decor.grow_redwood(data, a, pos)
  1228. local rtree_node = minetest.get_content_id("cg_decor:redwood_tree")
  1229. local rleaf_node = minetest.get_content_id("cg_decor:redwood_leaves")
  1230. local height = math.random(40, 60)
  1231. local giant = math.random(1,72)
  1232. if giant == (15 or 28) then --random giant redwoods
  1233. height = math.random(70, 90)
  1234. elseif giant == 36 then
  1235. height = math.random(90, 120)
  1236. end
  1237. for x_area = -8, 8 do
  1238. for y_area = -12, 12 do
  1239. for z_area = -8, 8 do
  1240. if math.random(1,30) < 20 and math.abs(x_area) + math.abs(z_area) < 14
  1241. and math.abs(x_area) + math.abs(y_area) < 17 and math.abs(z_area) + math.abs(y_area) < 17 then
  1242. local area_l = a:index(pos.x+x_area, pos.y+height+y_area-5, pos.z+z_area)
  1243. if data[area_l] == air_node or data[area_l] == ignore_node then
  1244. if math.random(1, 30) >= 28 and math.abs(x_area) < 5
  1245. and math.abs(z_area) < 5 and math.abs(y_area) < 9 then
  1246. data[area_l] = rtree_node
  1247. else
  1248. data[area_l] = rleaf_node
  1249. end
  1250. end
  1251. end
  1252. end
  1253. end
  1254. end
  1255. for tree_h = -5, height-1 do
  1256. for x_dir = -1, 1 do
  1257. for z_dir = -1, 1 do
  1258. if math.abs(x_dir) + math.abs(z_dir) == 1 then
  1259. local area_t = a:index(pos.x+x_dir, pos.y+tree_h, pos.z+z_dir)
  1260. if data[area_t] == air_node or data[area_t] == rleaf_node or data[area_t] == ignore_node
  1261. or data[area_t] == leaf_node or data[area_t] == jleaf_node or data[area_t] == dleaf_node
  1262. or data[area_t] == djleaf_node then
  1263. data[area_t] = rtree_node
  1264. end
  1265. elseif x_dir == 0 and z_dir == 0 and tree_h > 0 then
  1266. local area_a = a:index(pos.x+x_dir, pos.y+tree_h, pos.z+z_dir)
  1267. data[area_a] = air_node
  1268. end
  1269. end
  1270. end
  1271. end
  1272. local area_tt = a:index(pos.x, pos.y+height, pos.z)
  1273. data[area_tt] = rtree_node
  1274. end
  1275. function cg_decor.can_grow_on(pos, type)
  1276. local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
  1277. local is_type = minetest.get_item_group(nu, type)
  1278. if is_type == 0 then
  1279. return true
  1280. end
  1281. end
  1282. function cg_decor.add_tree_to_map(vm, data)
  1283. vm:set_data(data)
  1284. vm:write_to_map(data)
  1285. vm:update_map()
  1286. end
  1287. minetest.register_abm({
  1288. nodenames = {"cg_decor:sapling"},
  1289. interval = 1,
  1290. chance = 5,
  1291. action = function(pos, node)
  1292. cg_decor.can_grow_on(pos, "soil")
  1293. minetest.remove_node(pos)
  1294. minetest.log("action", "A decor sapling grows into a tree at "..minetest.pos_to_string(pos))
  1295. local vm = minetest.get_voxel_manip()
  1296. local minp, maxp = vm:read_from_map({x=pos.x-16, y=pos.y, z=pos.z-16}, {x=pos.x+16, y=pos.y+16, z=pos.z+16})
  1297. local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp}
  1298. local data = vm:get_data()
  1299. cg_decor.grow_tree(data, a, pos, false)
  1300. cg_decor.add_tree_to_map(vm, data)
  1301. end
  1302. })
  1303. minetest.register_abm({
  1304. nodenames = {"cg_decor:sapling_apple"},
  1305. interval = 1,
  1306. chance = 5,
  1307. action = function(pos, node)
  1308. cg_decor.can_grow_on(pos, "soil")
  1309. minetest.remove_node(pos)
  1310. minetest.log("action", "A decor apple sapling grows into a tree at "..minetest.pos_to_string(pos))
  1311. local vm = minetest.get_voxel_manip()
  1312. local minp, maxp = vm:read_from_map({x=pos.x-16, y=pos.y, z=pos.z-16}, {x=pos.x+16, y=pos.y+26, z=pos.z+16})
  1313. local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp}
  1314. local data = vm:get_data()
  1315. cg_decor.grow_tree(data, a, pos, true)
  1316. cg_decor.add_tree_to_map(vm, data)
  1317. end
  1318. })
  1319. minetest.register_abm({
  1320. nodenames = {"cg_decor:sapling_jungle"},
  1321. interval = 1,
  1322. chance = 5,
  1323. action = function(pos, node)
  1324. cg_decor.can_grow_on(pos, "soil")
  1325. minetest.remove_node(pos)
  1326. minetest.log("action", "A jungle decor sapling grows into a tree at "..minetest.pos_to_string(pos))
  1327. local vm = minetest.get_voxel_manip()
  1328. local minp, maxp = vm:read_from_map({x=pos.x-16, y=pos.y-1, z=pos.z-16}, {x=pos.x+16, y=pos.y+16, z=pos.z+16})
  1329. local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp}
  1330. local data = vm:get_data()
  1331. cg_decor.grow_jungletree(data, a, pos)
  1332. cg_decor.add_tree_to_map(vm, data)
  1333. end
  1334. })
  1335. minetest.register_abm({
  1336. nodenames = {"cg_decor:sapling_redwood"},
  1337. interval = 1,
  1338. chance = 5,
  1339. action = function(pos, node)
  1340. cg_decor.can_grow_on(pos, "soil")
  1341. minetest.remove_node(pos)
  1342. minetest.log("action", "A redwood sapling grows into a tree at "..minetest.pos_to_string(pos))
  1343. local vm = minetest.get_voxel_manip()
  1344. local minp, maxp = vm:read_from_map({x=pos.x-24, y=pos.y-7, z=pos.z-24}, {x=pos.x+24, y=pos.y+140, z=pos.z+24})
  1345. local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp}
  1346. local data = vm:get_data()
  1347. cg_decor.grow_redwood(data, a, pos)
  1348. cg_decor.add_tree_to_map(vm, data)
  1349. end
  1350. })
  1351. minetest.register_abm({
  1352. nodenames = {"group:rwldecay"},
  1353. neighbors = {"air", "group:liquid"},
  1354. interval = 5,
  1355. chance = 2,
  1356. action = function(pos, node, _, _)
  1357. local pos1 = {x=pos.x, y=pos.y-1, z=pos.z}
  1358. local node = minetest.get_node(pos)
  1359. local node_under = minetest.get_node(pos1)
  1360. local decay = minetest.registered_nodes[node.name].groups.rwldecay
  1361. local nodes_around = minetest.find_node_near(pos, decay, {"ignore", "group:redwood"})
  1362. if not decay or decay == 0 then
  1363. return
  1364. elseif decay ~= 1 and nodes_around then
  1365. return
  1366. else
  1367. if minetest.get_item_group(node_under.name, "rerwood") >= 1 then
  1368. return
  1369. else
  1370. itemstacks = minetest.get_node_drops(node.name)
  1371. for _, itemname in ipairs(itemstacks) do
  1372. if itemname ~= node.name then
  1373. local p_drop = {
  1374. x = pos.x - 0.5 + math.random(),
  1375. y = pos.y - 0.5 + math.random(),
  1376. z = pos.z - 0.5 + math.random(),
  1377. }
  1378. minetest.add_item(p_drop, itemname)
  1379. end
  1380. end
  1381. minetest.remove_node(pos)
  1382. nodeupdate(pos)
  1383. end
  1384. end
  1385. end
  1386. })