alchemy.lua 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. local function vadd(a, b)
  2. return {
  3. x = (a.x or 0) + (b.x or 0),
  4. y = (a.y or 0) + (b.y or 0),
  5. z = (a.z or 0) + (b.z or 0),
  6. }
  7. end
  8. local function check_block(min, max, name)
  9. for x = min.x,max.x,1 do
  10. for y = min.y,max.y,1 do
  11. for z = min.z,max.z,1 do
  12. if minetest.get_node({x=x, y=y, z=z}).name ~= name then
  13. return false
  14. end
  15. end
  16. end
  17. end
  18. return true
  19. end
  20. local function set_block(min, max, name)
  21. local node
  22. if type(name) == "string" then
  23. node = {name=name}
  24. else
  25. node = name
  26. end
  27. for x = min.x,max.x,1 do
  28. for y = min.y,max.y,1 do
  29. for z = min.z,max.z,1 do
  30. minetest.set_node({x=x, y=y, z=z}, node)
  31. end
  32. end
  33. end
  34. return true
  35. end
  36. local function replace_block(min, max, what, with)
  37. local node
  38. if type(with) == "string" then
  39. node = {name = with}
  40. else
  41. node = with
  42. end
  43. for x = min.x,max.x,1 do
  44. for y = min.y,max.y,1 do
  45. for z = min.z,max.z,1 do
  46. local n = {x=x, y=y, z=z}
  47. if minetest.get_node(n).name == what then
  48. minetest.set_node(n, node)
  49. end
  50. end
  51. end
  52. end
  53. return true
  54. end
  55. local function replace_nonempty_block(min, max, with)
  56. local node
  57. if type(with) == "string" then
  58. node = {name = with}
  59. else
  60. node = with
  61. end
  62. for x = min.x,max.x,1 do
  63. for y = min.y,max.y,1 do
  64. for z = min.z,max.z,1 do
  65. local n = {x=x, y=y, z=z}
  66. if minetest.get_node(n).name ~= "air" then
  67. minetest.set_node(n, node)
  68. end
  69. end
  70. end
  71. end
  72. return true
  73. end
  74. local function check_layout(pos, layout)
  75. local correct = 0
  76. for i,v in ipairs(layout) do
  77. local p = vadd(pos, v)
  78. local n = minetest.get_node(p)
  79. if n.name == v.n then
  80. correct = correct + 1
  81. end
  82. end
  83. return (correct == #layout), correct, #layout
  84. end
  85. local function probe_layout(pos, layout)
  86. local correct = 0
  87. for i,v in ipairs(layout) do
  88. if v.n then
  89. if v.min and v.max then
  90. if not check_block(vadd(pos, v.min), vadd(pos, v.max), v.n) then
  91. return false
  92. end
  93. else
  94. local p = vadd(pos, v)
  95. local n = minetest.get_node(p)
  96. if n.name ~= v.n then
  97. return false
  98. end
  99. end
  100. end
  101. end
  102. return true
  103. end
  104. local function create_spawner(pos, sz, tex)
  105. minetest.add_particlespawner({
  106. amount = 4000,
  107. time = 5,
  108. minpos = vector.add({x=pos.x-sz, y=pos.y-ht, z=pos.z-sz}, vector.multiply(vel, -.95)),
  109. maxpos = vector.add({x=pos.x+sz, y=pos.y+ht, z=pos.z+sz}, vector.multiply(vel, -.95)),
  110. minvel = vector.add(vel, {x=-1, y=0, z=-1}),
  111. maxvel = vector.add(vel, {x=5, y=0.5, z=5}),
  112. minacc = {x=-01.1, y=0.1, z=-01.1},
  113. maxacc = {x=01.1, y=01.3, z=01.1},
  114. minexptime = 1.5,
  115. maxexptime = 2.5,
  116. -- collisiondetection = true,
  117. -- collision_removal = true,
  118. minsize = 40,
  119. maxsize = 45,
  120. texture = tex,
  121. -- animation = tileanimation
  122. -- glow = 1
  123. })
  124. end
  125. local function execute_alchemy(pos, layout, player)
  126. local correct = 0
  127. for i,v in ipairs(layout) do
  128. local p = vadd(pos, v)
  129. if v.set then
  130. if v.min and v.max then
  131. set_block(vadd(pos, v.min), vadd(pos, v.max), v.set)
  132. else
  133. if type(v.set) == "string" then
  134. minetest.set_node(p, {name=v.set})
  135. else
  136. minetest.set_node(p, v.set)
  137. end
  138. end
  139. elseif v.replace then
  140. if v.min and v.max then
  141. replace_block(vadd(pos, v.min), vadd(pos, v.max), v.replace, v.with)
  142. end
  143. end
  144. if v.fn then
  145. v.fn({x=p.x, y=p.y, z=p.z}, player)
  146. end
  147. end
  148. return true
  149. end
  150. potions.alchemy_layouts = {}
  151. potions.alchemy_layouts.sand = {
  152. {x=0, z=0, n="default:stone"},
  153. {x=1, z=1, n="default:sand"},
  154. {x=1, z=-1, n="default:sand"},
  155. {x=-1, z=1, n="default:sand"},
  156. {x=-1, z=-1, n="default:sand",},
  157. {y=1, set="default:glass"},
  158. }
  159. potions.alchemy_layouts.dirt = {
  160. {x=0, z=0, n="default:stone"},
  161. {x=1, z=1, n="default:desert_sand"},
  162. {x=1, z=-1, n="default:desert_sand"},
  163. {x=-1, z=1, n="default:desert_sand"},
  164. {x=-1, z=-1, n="default:desert_sand",},
  165. {min={x=-1, z=-1, y=1}, max={x=1, z=1, y=1}, n="air"},
  166. {min={x=-1, z=-1, y=1}, max={x=1, z=1, y=3}, replace="air", with="fire:basic_flame"},
  167. {y=1, set="default:brick"},
  168. {particle_spawner = {
  169. min={x=-1, z=-1, y=1},
  170. max={x=1, z=1, y=3},
  171. radius = 3,
  172. type = "rise",
  173. speed = 1,
  174. accel = .3,
  175. random = .2,
  176. density = 100,
  177. plife = 2,
  178. }}
  179. }
  180. potions.alchemy_layouts.silver_snake = {
  181. {x=0, z=0, n="tnt:tnt"},
  182. {x=1, z=1, n="default:mossycobble"},
  183. {x=1, z=-1, n="default:mossycobble"},
  184. {x=-1, z=1, n="default:mossycobble"},
  185. {x=-1, z=-1, n="default:mossycobble",},
  186. {x=-2, z=-2, n="default:silver_sandstone_brick",},
  187. {x=2, z=-2, n="default:silver_sandstone_brick",},
  188. {x=-2, z=2, n="default:silver_sandstone_brick",},
  189. {x=2, z=2, n="default:silver_sandstone_brick",},
  190. {x=1, z=0, n="default:silver_sandstone_brick",},
  191. {x=-1, z=0, n="default:silver_sandstone_brick",},
  192. {x=0, z=1, n="default:silver_sandstone_brick",},
  193. {x=0, z=-1, n="default:silver_sandstone_brick",},
  194. {x=3, z=0, n="default:silver_sandstone_brick",},
  195. {x=3, z=-1, n="default:silver_sandstone_brick",},
  196. {x=3, z=1, n="default:silver_sandstone_brick",},
  197. {x=-3, z=0, n="default:silver_sandstone_brick",},
  198. {x=-3, z=-1, n="default:silver_sandstone_brick",},
  199. {x=-3, z=1, n="default:silver_sandstone_brick",},
  200. {x=0, z=3, n="default:silver_sandstone_brick",},
  201. {x=-1, z=3, n="default:silver_sandstone_brick",},
  202. {x=1, z=3, n="default:silver_sandstone_brick",},
  203. {x=0, z=-3, n="default:silver_sandstone_brick",},
  204. {x=-1, z=-3, n="default:silver_sandstone_brick",},
  205. {x=1, z=-3, n="default:silver_sandstone_brick",},
  206. {fn = function(pos, player)
  207. -- pos.y = pos.y + 1
  208. -- minetest.set_node(pos, {name="default:glass"})
  209. local min = vector.add(pos, {x=-3, y=-32, z=-3})
  210. local max = vector.add(pos, {x=3, y=-1, z=3})
  211. set_block(
  212. min, max,
  213. "air"
  214. )
  215. -- flying around
  216. minetest.add_particlespawner({
  217. amount = 100,
  218. time = 5,
  219. minpos = {x=min.x, y=max.y+1, z=min.z},
  220. maxpos = {x=max.x, y=max.y+1, z=max.z},
  221. minvel = {x=-01.01, y=2, z=-01.01},
  222. maxvel = {x=01.05, y=3, z=01.05},
  223. minacc = {x=-01.1, y=0.1, z=-01.1},
  224. maxacc = {x=01.1, y=0.3, z=01.1},
  225. minexptime = 0.5,
  226. maxexptime = 2.5,
  227. -- collisiondetection = true,
  228. -- collision_removal = true,
  229. minsize = 4,
  230. maxsize = 4,
  231. texture = "potions_particle.png^[colorize:red:60",
  232. -- animation = tileanimation
  233. glow = 1
  234. })
  235. -- going down
  236. minetest.add_particlespawner({
  237. amount = 800,
  238. time = 5,
  239. minpos = {x=min.x, y=max.y, z=min.z},
  240. maxpos = {x=max.x, y=max.y, z=max.z},
  241. minvel = {x=-0.01, y=-5, z=-0.01},
  242. maxvel = {x=0.05, y=-6, z=0.05},
  243. minacc = {x=0, y=-0.1, z=0},
  244. maxacc = {x=0, y=-1.3, z=0},
  245. minexptime = 1.5,
  246. maxexptime = 1.5,
  247. -- collisiondetection = true,
  248. -- collision_removal = true,
  249. minsize = 4,
  250. maxsize = 4,
  251. texture = "potions_particle.png^[colorize:red:60",
  252. -- animation = tileanimation
  253. glow = 1
  254. })
  255. minetest.after(1, function()
  256. replace_block(vadd(pos, {x=-3,z=-3}), vadd(pos, {x=3,z=3}), "air", "fire:basic_flame")
  257. end)
  258. minetest.after(6, function()
  259. set_block(vadd(pos, {x=-3,z=-3}), vadd(pos, {x=3,z=3}), "air")
  260. minetest.add_particlespawner({
  261. amount = 300,
  262. time = 4,
  263. minpos = vadd(pos, {x=-3, y=-.5, z=-3}),
  264. maxpos = vadd(pos, {x=3, y=-.5, z=3}),
  265. minvel = {x=-0.1, y=-.6, z=-0.1},
  266. maxvel = {x=0.1, y=.6, z=0.1},
  267. minacc = {x=-02.1, y=-1.1, z=-02.1},
  268. maxacc = {x=02.1, y=1.1, z=02.1},
  269. minexptime = 1.5,
  270. maxexptime = 1.5,
  271. minsize = 2.2,
  272. maxsize = 2.2,
  273. texture = "potions_particle.png^[colorize:purple:60",
  274. glow = 1
  275. })
  276. end)
  277. local function dig(p, s)
  278. minetest.set_node({x=p.x, y=p.y-1, z=p.z}, {name="default:silver_sandstone_brick"})
  279. if s ~= 0 then
  280. minetest.set_node(p, {name="stairs:slab_silver_sandstone_brick"})
  281. else
  282. minetest.set_node(p, {name="air"})
  283. end
  284. minetest.set_node({x=p.x, y=p.y+1, z=p.z}, {name="air"})
  285. minetest.set_node({x=p.x, y=p.y+2, z=p.z}, {name="air"})
  286. minetest.set_node({x=p.x, y=p.y+3, z=p.z}, {name="air"})
  287. end
  288. local function iterate(i)
  289. local m = math.floor(i % 8)
  290. local d = math.floor((i % 32) / 8)
  291. local x, z
  292. if d < 1 then
  293. x = m - 4
  294. z = -4
  295. elseif d < 2 then
  296. x = 4
  297. z = m - 4
  298. elseif d < 3 then
  299. x = 4 - m
  300. z = 4
  301. else
  302. x = -4
  303. z = 4 - m
  304. end
  305. local p = vadd(pos, {x=x, y=math.floor(i/-2), z=z})
  306. dig(p, i%2)
  307. p.y = p.y - 0.5
  308. minetest.add_particlespawner({
  309. amount = 80,
  310. time = 2,
  311. minpos = p,
  312. maxpos = p,
  313. minvel = {x=-0.1, y=1, z=-0.1},
  314. maxvel = {x=0.1, y=.6, z=0.1},
  315. minacc = {x=-02.1, y=0.1, z=-02.1},
  316. maxacc = {x=02.1, y=1.3, z=02.1},
  317. minexptime = 1.5,
  318. maxexptime = 1.5,
  319. -- collisiondetection = true,
  320. -- collision_removal = true,
  321. minsize = 2.2,
  322. maxsize = 2.2,
  323. texture = "potions_particle.png^[colorize:green:60",
  324. -- animation = tileanimation
  325. glow = 1
  326. })
  327. if i < 64 then
  328. minetest.after(1, function() iterate(i+1) end)
  329. end
  330. end
  331. iterate(0)
  332. end},
  333. }
  334. local function find_layout(pos)
  335. for k,v in pairs(potions.alchemy_layouts) do
  336. if probe_layout(pos, v) then
  337. return k, v
  338. end
  339. end
  340. return nil, nil
  341. end
  342. minetest.register_craftitem("potions:wand", {
  343. description = "Alchemy Wand",
  344. inventory_image = "default_stick.png^[colorize:black:200",
  345. stack_max = 5,
  346. on_use = function(itemstack, user, pointed_thing)
  347. if potions.get_manna(user) > 20 then
  348. local pos = pointed_thing.under
  349. local name, def = find_layout(pos)
  350. if name then
  351. execute_alchemy(pos, def, user)
  352. potions.add_manna(user, -15)
  353. end
  354. end
  355. end,
  356. })
  357. minetest.register_craftitem("potions:book_silver_snake", {
  358. description = "Alchemy Wand",
  359. inventory_image = "default_book.png^[colorize:white:200",
  360. stack_max = 5,
  361. on_use = function(itemstack, user, pointed_thing)
  362. local pos = pointed_thing.under
  363. local def = potions.alchemy_layouts.silver_snake
  364. if not pos then
  365. return itemstack
  366. end
  367. if probe_layout(pos, def) then
  368. execute_alchemy(pos, def, user)
  369. itemstack:take_item()
  370. end
  371. return itemstack
  372. end,
  373. })
  374. minetest.register_node("potions:cauldron", {
  375. description = "Cauldron",
  376. paramtype = "light",
  377. paramtype2 = "facedir",
  378. drawtype = "nodebox",
  379. tiles = {"default_steel_block.png^[colorize:black:160"},
  380. node_box = {
  381. type = "fixed",
  382. fixed = {
  383. {-.45, .45, -.45, 0.45, .5, 0.45},
  384. {-.5, -.3, -.5, 0.5, .3, 0.5},
  385. {-.4, -.4, -.4, 0.4, .45, 0.4},
  386. {-.3, -.5, -.3, 0.3, -.4, 0.3},
  387. },
  388. },
  389. groups = {cracky=3,},
  390. on_construct = function(pos)
  391. local meta = minetest.get_meta(pos)
  392. local inv = meta:get_inventory();
  393. inv:set_size("main", 4*4)
  394. local formspec =
  395. "size[8,9]" ..
  396. "list[current_name;main;2,0.3;4,4;]" ..
  397. "list[current_player;main;0,4.85;8,1;]" ..
  398. "list[current_player;main;0,6.08;8,3;8]" ..
  399. "listring[nodemeta:" .. spos .. ";main]" ..
  400. "listring[current_player;main]" ..
  401. default.get_hotbar_bg(0,4.85)
  402. meta:set_string("formspec", formspec)
  403. end,
  404. can_dig = function(pos, player)
  405. local meta = minetest.get_meta(pos);
  406. local inv = meta:get_inventory()
  407. return inv:is_empty("main")
  408. end,
  409. on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
  410. -- take water out of bucket
  411. end,
  412. allow_metadata_inventory_put = function(pos, listname, index, stack, player)
  413. return stack:get_count()
  414. end,
  415. allow_metadata_inventory_take = function(pos, listname, index, stack, player)
  416. return stack:get_count()
  417. end,
  418. })
  419. minetest.register_node("potions:still", {
  420. description = "Still",
  421. paramtype = "light",
  422. paramtype2 = "facedir",
  423. drawtype = "nodebox",
  424. tiles = {"default_copper_block.png"},
  425. node_box = {
  426. type = "fixed",
  427. fixed = {
  428. {-.45, -5, -.45, 0.45, -.45, 0.45},
  429. {-.1, -.45, -.1, 0.1, .4, 0.1},
  430. {-.1, .3, -.1, 1.1, .4, 0.1},
  431. {1.1, -.5, -.1, .9, .4, .1},
  432. },
  433. },
  434. groups = {cracky=3,},
  435. })
  436. minetest.register_node("potions:ethanol_flask", {
  437. description = "Flask of Ethanol",
  438. inventory_image = "potions_eflask_clear.png",
  439. tiles = {"potions_eflask_clear.png"},
  440. drawtype = "plantlike",
  441. visual_scale = .5,
  442. waving = false,
  443. buildable_to = false,
  444. walkable = false,
  445. groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
  446. })
  447. minetest.register_node("potions:methanol_flask", {
  448. description = "Flask of Methanol",
  449. inventory_image = "potions_eflask_clear.png",
  450. tiles = {"potions_eflask_clear.png"},
  451. drawtype = "plantlike",
  452. visual_scale = .5,
  453. waving = false,
  454. buildable_to = false,
  455. walkable = false,
  456. groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
  457. })
  458. minetest.register_node("potions:ammonia_flask", {
  459. description = "Flask of Ammonia",
  460. inventory_image = "potions_eflask_ammonia.png",
  461. tiles = {"potions_eflask_ammonia.png"},
  462. drawtype = "plantlike",
  463. visual_scale = .5,
  464. waving = false,
  465. buildable_to = false,
  466. walkable = false,
  467. groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
  468. })
  469. minetest.register_node("potions:muriatic_acid_flask", {
  470. description = "Flask of Muriatic Acid",
  471. inventory_image = "potions_eflask_clear.png",
  472. tiles = {"potions_eflask_clear.png"},
  473. drawtype = "plantlike",
  474. visual_scale = .5,
  475. waving = false,
  476. buildable_to = false,
  477. walkable = false,
  478. groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
  479. })
  480. -- hydrochloric acid
  481. minetest.register_node("potions:muriatic_acid_flask", {
  482. description = "Flask of Muriatic Acid",
  483. inventory_image = "potions_eflask_clear.png",
  484. tiles = {"potions_eflask_clear.png"},
  485. drawtype = "plantlike",
  486. visual_scale = .5,
  487. waving = false,
  488. buildable_to = false,
  489. walkable = false,
  490. groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
  491. })
  492. -- sulfuric acid
  493. minetest.register_node("potions:vitriol_flask", {
  494. description = "Flask of Vitriol",
  495. inventory_image = "potions_eflask_clear.png",
  496. tiles = {"potions_eflask_clear.png"},
  497. drawtype = "plantlike",
  498. visual_scale = .5,
  499. waving = false,
  500. buildable_to = false,
  501. walkable = false,
  502. groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
  503. })
  504. -- nitric acid
  505. minetest.register_node("potions:aqua_fortis_flask", {
  506. description = "Flask of Vitriol",
  507. inventory_image = "potions_eflask_clear.png",
  508. tiles = {"potions_eflask_clear.png"},
  509. drawtype = "plantlike",
  510. visual_scale = .5,
  511. waving = false,
  512. buildable_to = false,
  513. walkable = false,
  514. groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
  515. })
  516. minetest.register_node("potions:iodine_flask", {
  517. description = "Flask of Iodine",
  518. inventory_image = "potions_rflask_iodine.png",
  519. tiles = {"potions_rflask_iodine.png"},
  520. drawtype = "plantlike",
  521. visual_scale = .5,
  522. waving = false,
  523. buildable_to = false,
  524. walkable = false,
  525. groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
  526. })
  527. minetest.register_node("potions:aqua_regia_flask", {
  528. description = "Flask of Aqua Regia",
  529. inventory_image = "potions_eflask_clear.png",
  530. tiles = {"potions_eflask_clear.png"},
  531. drawtype = "plantlike",
  532. visual_scale = .5,
  533. waving = false,
  534. buildable_to = false,
  535. walkable = false,
  536. groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
  537. })
  538. minetest.register_craft({
  539. output = "potions:aqua_regia_flask 2",
  540. type = "shapeless",
  541. recipe = {"potions:aqua_fortis_flask", "potions:muriatic_acid_flask"},
  542. })
  543. minetest.register_node("potions:aqua_regia_with_gold", {
  544. description = "Orange Flask of Aqua Regia",
  545. inventory_image = "potions_eflask_aregia_with_gold.png",
  546. tiles = {"potions_eflask_aregia_with_gold.png"},
  547. drawtype = "plantlike",
  548. visual_scale = .5,
  549. waving = false,
  550. buildable_to = false,
  551. walkable = false,
  552. groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
  553. })
  554. minetest.register_craft({
  555. output = "potions:aqua_regia_with_gold",
  556. type = "shapeless",
  557. recipe = {"potions:aqua_regia_flask", "default:gold_ingot"},
  558. })
  559. minetest.register_craft({
  560. output = "potions:aqua_regia_with_gold",
  561. type = "shapeless",
  562. recipe = {"potions:aqua_regia_flask", "default:gold_lump"},
  563. })
  564. -- nitric acid
  565. minetest.register_node("potions:aqua_fortis_with_silver", {
  566. description = "Blue Flask of Aqua Fortis",
  567. inventory_image = "potions_eflask_afortis_with_silver.png",
  568. tiles = {"potions_eflask_afortis_with_silver.png"},
  569. drawtype = "plantlike",
  570. visual_scale = .5,
  571. waving = false,
  572. buildable_to = false,
  573. walkable = false,
  574. groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
  575. })
  576. minetest.register_craft({
  577. output = "potions:aqua_fortis_with_silver",
  578. type = "shapeless",
  579. recipe = {"potions:aqua_fortis_flask", "potions:silver_ingot"},
  580. })
  581. minetest.register_craft({
  582. output = "potions:aqua_fortis_with_silver",
  583. type = "shapeless",
  584. recipe = {"potions:aqua_fortis_flask", "potions:silver_lump"},
  585. })