123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734 |
- local function vadd(a, b)
- return {
- x = (a.x or 0) + (b.x or 0),
- y = (a.y or 0) + (b.y or 0),
- z = (a.z or 0) + (b.z or 0),
- }
- end
- local function check_block(min, max, name)
-
- for x = min.x,max.x,1 do
- for y = min.y,max.y,1 do
- for z = min.z,max.z,1 do
-
- if minetest.get_node({x=x, y=y, z=z}).name ~= name then
- return false
- end
-
- end
- end
- end
-
- return true
- end
- local function set_block(min, max, name)
-
- local node
- if type(name) == "string" then
- node = {name=name}
- else
- node = name
- end
-
- for x = min.x,max.x,1 do
- for y = min.y,max.y,1 do
- for z = min.z,max.z,1 do
-
- minetest.set_node({x=x, y=y, z=z}, node)
-
- end
- end
- end
-
- return true
- end
- local function replace_block(min, max, what, with)
-
- local node
- if type(with) == "string" then
- node = {name = with}
- else
- node = with
- end
-
- for x = min.x,max.x,1 do
- for y = min.y,max.y,1 do
- for z = min.z,max.z,1 do
- local n = {x=x, y=y, z=z}
- if minetest.get_node(n).name == what then
- minetest.set_node(n, node)
- end
- end
- end
- end
-
- return true
- end
- local function replace_nonempty_block(min, max, with)
-
- local node
- if type(with) == "string" then
- node = {name = with}
- else
- node = with
- end
-
- for x = min.x,max.x,1 do
- for y = min.y,max.y,1 do
- for z = min.z,max.z,1 do
- local n = {x=x, y=y, z=z}
- if minetest.get_node(n).name ~= "air" then
- minetest.set_node(n, node)
- end
- end
- end
- end
-
- return true
- end
- local function check_layout(pos, layout)
- local correct = 0
-
- for i,v in ipairs(layout) do
-
- local p = vadd(pos, v)
-
- local n = minetest.get_node(p)
- if n.name == v.n then
- correct = correct + 1
- end
- end
-
- return (correct == #layout), correct, #layout
- end
- local function probe_layout(pos, layout)
- local correct = 0
-
- for i,v in ipairs(layout) do
- if v.n then
- if v.min and v.max then
- if not check_block(vadd(pos, v.min), vadd(pos, v.max), v.n) then
- return false
- end
- else
- local p = vadd(pos, v)
-
- local n = minetest.get_node(p)
- if n.name ~= v.n then
- return false
- end
- end
- end
- end
-
- return true
- end
- local function create_spawner(pos, sz, tex)
- minetest.add_particlespawner({
- amount = 4000,
- time = 5,
- minpos = vector.add({x=pos.x-sz, y=pos.y-ht, z=pos.z-sz}, vector.multiply(vel, -.95)),
- maxpos = vector.add({x=pos.x+sz, y=pos.y+ht, z=pos.z+sz}, vector.multiply(vel, -.95)),
- minvel = vector.add(vel, {x=-1, y=0, z=-1}),
- maxvel = vector.add(vel, {x=5, y=0.5, z=5}),
- minacc = {x=-01.1, y=0.1, z=-01.1},
- maxacc = {x=01.1, y=01.3, z=01.1},
- minexptime = 1.5,
- maxexptime = 2.5,
- -- collisiondetection = true,
- -- collision_removal = true,
- minsize = 40,
- maxsize = 45,
- texture = tex,
- -- animation = tileanimation
- -- glow = 1
- })
- end
- local function execute_alchemy(pos, layout, player)
- local correct = 0
-
- for i,v in ipairs(layout) do
- local p = vadd(pos, v)
-
- if v.set then
- if v.min and v.max then
- set_block(vadd(pos, v.min), vadd(pos, v.max), v.set)
- else
-
- if type(v.set) == "string" then
- minetest.set_node(p, {name=v.set})
- else
- minetest.set_node(p, v.set)
- end
- end
- elseif v.replace then
- if v.min and v.max then
- replace_block(vadd(pos, v.min), vadd(pos, v.max), v.replace, v.with)
- end
- end
-
- if v.fn then
- v.fn({x=p.x, y=p.y, z=p.z}, player)
- end
- end
-
- return true
- end
- potions.alchemy_layouts = {}
- potions.alchemy_layouts.sand = {
- {x=0, z=0, n="default:stone"},
- {x=1, z=1, n="default:sand"},
- {x=1, z=-1, n="default:sand"},
- {x=-1, z=1, n="default:sand"},
- {x=-1, z=-1, n="default:sand",},
- {y=1, set="default:glass"},
- }
- potions.alchemy_layouts.dirt = {
- {x=0, z=0, n="default:stone"},
- {x=1, z=1, n="default:desert_sand"},
- {x=1, z=-1, n="default:desert_sand"},
- {x=-1, z=1, n="default:desert_sand"},
- {x=-1, z=-1, n="default:desert_sand",},
-
- {min={x=-1, z=-1, y=1}, max={x=1, z=1, y=1}, n="air"},
- {min={x=-1, z=-1, y=1}, max={x=1, z=1, y=3}, replace="air", with="fire:basic_flame"},
-
- {y=1, set="default:brick"},
-
- {particle_spawner = {
- min={x=-1, z=-1, y=1},
- max={x=1, z=1, y=3},
- radius = 3,
- type = "rise",
- speed = 1,
- accel = .3,
- random = .2,
- density = 100,
- plife = 2,
- }}
- }
- potions.alchemy_layouts.silver_snake = {
- {x=0, z=0, n="tnt:tnt"},
-
- {x=1, z=1, n="default:mossycobble"},
- {x=1, z=-1, n="default:mossycobble"},
- {x=-1, z=1, n="default:mossycobble"},
- {x=-1, z=-1, n="default:mossycobble",},
-
- {x=-2, z=-2, n="default:silver_sandstone_brick",},
- {x=2, z=-2, n="default:silver_sandstone_brick",},
- {x=-2, z=2, n="default:silver_sandstone_brick",},
- {x=2, z=2, n="default:silver_sandstone_brick",},
-
- {x=1, z=0, n="default:silver_sandstone_brick",},
- {x=-1, z=0, n="default:silver_sandstone_brick",},
- {x=0, z=1, n="default:silver_sandstone_brick",},
- {x=0, z=-1, n="default:silver_sandstone_brick",},
-
- {x=3, z=0, n="default:silver_sandstone_brick",},
- {x=3, z=-1, n="default:silver_sandstone_brick",},
- {x=3, z=1, n="default:silver_sandstone_brick",},
- {x=-3, z=0, n="default:silver_sandstone_brick",},
- {x=-3, z=-1, n="default:silver_sandstone_brick",},
- {x=-3, z=1, n="default:silver_sandstone_brick",},
- {x=0, z=3, n="default:silver_sandstone_brick",},
- {x=-1, z=3, n="default:silver_sandstone_brick",},
- {x=1, z=3, n="default:silver_sandstone_brick",},
- {x=0, z=-3, n="default:silver_sandstone_brick",},
- {x=-1, z=-3, n="default:silver_sandstone_brick",},
- {x=1, z=-3, n="default:silver_sandstone_brick",},
-
- {fn = function(pos, player)
- -- pos.y = pos.y + 1
- -- minetest.set_node(pos, {name="default:glass"})
-
- local min = vector.add(pos, {x=-3, y=-32, z=-3})
- local max = vector.add(pos, {x=3, y=-1, z=3})
-
- set_block(
- min, max,
- "air"
- )
-
- -- flying around
- minetest.add_particlespawner({
- amount = 100,
- time = 5,
- minpos = {x=min.x, y=max.y+1, z=min.z},
- maxpos = {x=max.x, y=max.y+1, z=max.z},
- minvel = {x=-01.01, y=2, z=-01.01},
- maxvel = {x=01.05, y=3, z=01.05},
- minacc = {x=-01.1, y=0.1, z=-01.1},
- maxacc = {x=01.1, y=0.3, z=01.1},
- minexptime = 0.5,
- maxexptime = 2.5,
- -- collisiondetection = true,
- -- collision_removal = true,
- minsize = 4,
- maxsize = 4,
- texture = "potions_particle.png^[colorize:red:60",
- -- animation = tileanimation
- glow = 1
- })
-
- -- going down
- minetest.add_particlespawner({
- amount = 800,
- time = 5,
- minpos = {x=min.x, y=max.y, z=min.z},
- maxpos = {x=max.x, y=max.y, z=max.z},
- minvel = {x=-0.01, y=-5, z=-0.01},
- maxvel = {x=0.05, y=-6, z=0.05},
- minacc = {x=0, y=-0.1, z=0},
- maxacc = {x=0, y=-1.3, z=0},
- minexptime = 1.5,
- maxexptime = 1.5,
- -- collisiondetection = true,
- -- collision_removal = true,
- minsize = 4,
- maxsize = 4,
- texture = "potions_particle.png^[colorize:red:60",
- -- animation = tileanimation
- glow = 1
- })
-
-
- minetest.after(1, function()
- replace_block(vadd(pos, {x=-3,z=-3}), vadd(pos, {x=3,z=3}), "air", "fire:basic_flame")
- end)
- minetest.after(6, function()
- set_block(vadd(pos, {x=-3,z=-3}), vadd(pos, {x=3,z=3}), "air")
- minetest.add_particlespawner({
- amount = 300,
- time = 4,
- minpos = vadd(pos, {x=-3, y=-.5, z=-3}),
- maxpos = vadd(pos, {x=3, y=-.5, z=3}),
- minvel = {x=-0.1, y=-.6, z=-0.1},
- maxvel = {x=0.1, y=.6, z=0.1},
- minacc = {x=-02.1, y=-1.1, z=-02.1},
- maxacc = {x=02.1, y=1.1, z=02.1},
- minexptime = 1.5,
- maxexptime = 1.5,
- minsize = 2.2,
- maxsize = 2.2,
- texture = "potions_particle.png^[colorize:purple:60",
- glow = 1
- })
- end)
-
- local function dig(p, s)
- minetest.set_node({x=p.x, y=p.y-1, z=p.z}, {name="default:silver_sandstone_brick"})
-
- if s ~= 0 then
- minetest.set_node(p, {name="stairs:slab_silver_sandstone_brick"})
- else
- minetest.set_node(p, {name="air"})
- end
-
- minetest.set_node({x=p.x, y=p.y+1, z=p.z}, {name="air"})
- minetest.set_node({x=p.x, y=p.y+2, z=p.z}, {name="air"})
- minetest.set_node({x=p.x, y=p.y+3, z=p.z}, {name="air"})
- end
-
-
- local function iterate(i)
- local m = math.floor(i % 8)
- local d = math.floor((i % 32) / 8)
- local x, z
- if d < 1 then
- x = m - 4
- z = -4
- elseif d < 2 then
- x = 4
- z = m - 4
- elseif d < 3 then
- x = 4 - m
- z = 4
- else
- x = -4
- z = 4 - m
- end
-
- local p = vadd(pos, {x=x, y=math.floor(i/-2), z=z})
- dig(p, i%2)
-
- p.y = p.y - 0.5
- minetest.add_particlespawner({
- amount = 80,
- time = 2,
- minpos = p,
- maxpos = p,
- minvel = {x=-0.1, y=1, z=-0.1},
- maxvel = {x=0.1, y=.6, z=0.1},
- minacc = {x=-02.1, y=0.1, z=-02.1},
- maxacc = {x=02.1, y=1.3, z=02.1},
- minexptime = 1.5,
- maxexptime = 1.5,
- -- collisiondetection = true,
- -- collision_removal = true,
- minsize = 2.2,
- maxsize = 2.2,
- texture = "potions_particle.png^[colorize:green:60",
- -- animation = tileanimation
- glow = 1
- })
-
-
- if i < 64 then
- minetest.after(1, function() iterate(i+1) end)
- end
- end
-
- iterate(0)
- end},
- }
- local function find_layout(pos)
- for k,v in pairs(potions.alchemy_layouts) do
- if probe_layout(pos, v) then
- return k, v
- end
- end
-
- return nil, nil
- end
- minetest.register_craftitem("potions:wand", {
- description = "Alchemy Wand",
- inventory_image = "default_stick.png^[colorize:black:200",
- stack_max = 5,
- on_use = function(itemstack, user, pointed_thing)
-
- if potions.get_manna(user) > 20 then
-
- local pos = pointed_thing.under
-
- local name, def = find_layout(pos)
- if name then
-
- execute_alchemy(pos, def, user)
-
- potions.add_manna(user, -15)
- end
- end
-
- end,
- })
- minetest.register_craftitem("potions:book_silver_snake", {
- description = "Alchemy Wand",
- inventory_image = "default_book.png^[colorize:white:200",
- stack_max = 5,
- on_use = function(itemstack, user, pointed_thing)
-
- local pos = pointed_thing.under
- local def = potions.alchemy_layouts.silver_snake
-
- if not pos then
- return itemstack
- end
-
- if probe_layout(pos, def) then
- execute_alchemy(pos, def, user)
- itemstack:take_item()
- end
-
- return itemstack
-
- end,
- })
- minetest.register_node("potions:cauldron", {
- description = "Cauldron",
- paramtype = "light",
- paramtype2 = "facedir",
- drawtype = "nodebox",
- tiles = {"default_steel_block.png^[colorize:black:160"},
- node_box = {
- type = "fixed",
- fixed = {
- {-.45, .45, -.45, 0.45, .5, 0.45},
- {-.5, -.3, -.5, 0.5, .3, 0.5},
- {-.4, -.4, -.4, 0.4, .45, 0.4},
- {-.3, -.5, -.3, 0.3, -.4, 0.3},
- },
- },
- groups = {cracky=3,},
- on_construct = function(pos)
- local meta = minetest.get_meta(pos)
- local inv = meta:get_inventory();
-
- inv:set_size("main", 4*4)
-
- local formspec =
- "size[8,9]" ..
- "list[current_name;main;2,0.3;4,4;]" ..
- "list[current_player;main;0,4.85;8,1;]" ..
- "list[current_player;main;0,6.08;8,3;8]" ..
- "listring[nodemeta:" .. spos .. ";main]" ..
- "listring[current_player;main]" ..
- default.get_hotbar_bg(0,4.85)
-
- meta:set_string("formspec", formspec)
- end,
-
- can_dig = function(pos, player)
- local meta = minetest.get_meta(pos);
- local inv = meta:get_inventory()
- return inv:is_empty("main")
- end,
- on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
- -- take water out of bucket
- end,
-
- allow_metadata_inventory_put = function(pos, listname, index, stack, player)
- return stack:get_count()
- end,
- allow_metadata_inventory_take = function(pos, listname, index, stack, player)
- return stack:get_count()
- end,
-
- })
- minetest.register_node("potions:still", {
- description = "Still",
- paramtype = "light",
- paramtype2 = "facedir",
- drawtype = "nodebox",
- tiles = {"default_copper_block.png"},
- node_box = {
- type = "fixed",
- fixed = {
- {-.45, -5, -.45, 0.45, -.45, 0.45},
- {-.1, -.45, -.1, 0.1, .4, 0.1},
- {-.1, .3, -.1, 1.1, .4, 0.1},
- {1.1, -.5, -.1, .9, .4, .1},
- },
- },
- groups = {cracky=3,},
- })
- minetest.register_node("potions:ethanol_flask", {
- description = "Flask of Ethanol",
- inventory_image = "potions_eflask_clear.png",
- tiles = {"potions_eflask_clear.png"},
- drawtype = "plantlike",
- visual_scale = .5,
- waving = false,
- buildable_to = false,
- walkable = false,
- groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
- })
- minetest.register_node("potions:methanol_flask", {
- description = "Flask of Methanol",
- inventory_image = "potions_eflask_clear.png",
- tiles = {"potions_eflask_clear.png"},
- drawtype = "plantlike",
- visual_scale = .5,
- waving = false,
- buildable_to = false,
- walkable = false,
- groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
- })
- minetest.register_node("potions:ammonia_flask", {
- description = "Flask of Ammonia",
- inventory_image = "potions_eflask_ammonia.png",
- tiles = {"potions_eflask_ammonia.png"},
- drawtype = "plantlike",
- visual_scale = .5,
- waving = false,
- buildable_to = false,
- walkable = false,
- groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
- })
- minetest.register_node("potions:muriatic_acid_flask", {
- description = "Flask of Muriatic Acid",
- inventory_image = "potions_eflask_clear.png",
- tiles = {"potions_eflask_clear.png"},
- drawtype = "plantlike",
- visual_scale = .5,
- waving = false,
- buildable_to = false,
- walkable = false,
- groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
- })
- -- hydrochloric acid
- minetest.register_node("potions:muriatic_acid_flask", {
- description = "Flask of Muriatic Acid",
- inventory_image = "potions_eflask_clear.png",
- tiles = {"potions_eflask_clear.png"},
- drawtype = "plantlike",
- visual_scale = .5,
- waving = false,
- buildable_to = false,
- walkable = false,
- groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
- })
- -- sulfuric acid
- minetest.register_node("potions:vitriol_flask", {
- description = "Flask of Vitriol",
- inventory_image = "potions_eflask_clear.png",
- tiles = {"potions_eflask_clear.png"},
- drawtype = "plantlike",
- visual_scale = .5,
- waving = false,
- buildable_to = false,
- walkable = false,
- groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
- })
- -- nitric acid
- minetest.register_node("potions:aqua_fortis_flask", {
- description = "Flask of Vitriol",
- inventory_image = "potions_eflask_clear.png",
- tiles = {"potions_eflask_clear.png"},
- drawtype = "plantlike",
- visual_scale = .5,
- waving = false,
- buildable_to = false,
- walkable = false,
- groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
- })
- minetest.register_node("potions:iodine_flask", {
- description = "Flask of Iodine",
- inventory_image = "potions_rflask_iodine.png",
- tiles = {"potions_rflask_iodine.png"},
- drawtype = "plantlike",
- visual_scale = .5,
- waving = false,
- buildable_to = false,
- walkable = false,
- groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
- })
- minetest.register_node("potions:aqua_regia_flask", {
- description = "Flask of Aqua Regia",
- inventory_image = "potions_eflask_clear.png",
- tiles = {"potions_eflask_clear.png"},
- drawtype = "plantlike",
- visual_scale = .5,
- waving = false,
- buildable_to = false,
- walkable = false,
- groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
- })
- minetest.register_craft({
- output = "potions:aqua_regia_flask 2",
- type = "shapeless",
- recipe = {"potions:aqua_fortis_flask", "potions:muriatic_acid_flask"},
- })
- minetest.register_node("potions:aqua_regia_with_gold", {
- description = "Orange Flask of Aqua Regia",
- inventory_image = "potions_eflask_aregia_with_gold.png",
- tiles = {"potions_eflask_aregia_with_gold.png"},
- drawtype = "plantlike",
- visual_scale = .5,
- waving = false,
- buildable_to = false,
- walkable = false,
- groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
- })
- minetest.register_craft({
- output = "potions:aqua_regia_with_gold",
- type = "shapeless",
- recipe = {"potions:aqua_regia_flask", "default:gold_ingot"},
- })
- minetest.register_craft({
- output = "potions:aqua_regia_with_gold",
- type = "shapeless",
- recipe = {"potions:aqua_regia_flask", "default:gold_lump"},
- })
- -- nitric acid
- minetest.register_node("potions:aqua_fortis_with_silver", {
- description = "Blue Flask of Aqua Fortis",
- inventory_image = "potions_eflask_afortis_with_silver.png",
- tiles = {"potions_eflask_afortis_with_silver.png"},
- drawtype = "plantlike",
- visual_scale = .5,
- waving = false,
- buildable_to = false,
- walkable = false,
- groups = {vessel=1, oddly_breakable_by_hand=3, cracky=3, choppy=3, snappy=3, crumbly=3},
- })
- minetest.register_craft({
- output = "potions:aqua_fortis_with_silver",
- type = "shapeless",
- recipe = {"potions:aqua_fortis_flask", "potions:silver_ingot"},
- })
- minetest.register_craft({
- output = "potions:aqua_fortis_with_silver",
- type = "shapeless",
- recipe = {"potions:aqua_fortis_flask", "potions:silver_lump"},
- })
|