potions = { geodes = {}, utils = {}, } local potions_players = {} local modpath = minetest.get_modpath("potions") -- Add everything: local modname = "potions" -- nodes and some mapgen dofile(modpath.."/glassware.lua") dofile(modpath.."/metals.lua") dofile(modpath.."/geodes.lua") dofile(modpath.."/hotsprings.lua") dofile(modpath.."/structures/ziggurat.lua") dofile(modpath.."/structures/coffer_dam.lua") dofile(modpath.."/structures/bridge.lua") dofile(modpath.."/structures/tunnel.lua") dofile(modpath.."/structures/island.lua") dofile(modpath.."/structures/hole.lua") dofile(modpath.."/util/spiral.lua") dofile(modpath.."/util/spawn.lua") -- core dofile(modpath.."/gates.lua") dofile(modpath.."/minetunnels.lua") dofile(modpath.."/beanstalk.lua") dofile(modpath.."/enchanting.lua") dofile(modpath.."/alchemy.lua") --spells dofile(modpath.."/spells/plant_growth.lua") -- pure mapgen dofile(modpath.."/rocks.lua") -- utility dofile(modpath.."/scanner.lua") --[[ potions/magic destroy all nodes in area of certain type (stone), leaving others transform all nearby nodes into another node underwater breathing dig faster loaves and fishes when placing nodes summon a homunculus to provide knowledge conjure more magic books wards, ie area node protection spawn ice crust on nearby water scry for nearby things; particles lead the way summon a storm blight an area accelerate (certain) plant/fungus growth in an area conjure a volcano spawn magma node forge-style movement each move takes a time meta value along for cooling conjure a meteor freeze/thaw an area conjure a floatland conjure butterflies or fireflies a spell with two areas that sucks life-force from one area and vents it to another conjure a fully equipped wizard's tower conjure a (fully equipped) castle hollow a horizontal tunnel some potions are thrown, to break and activate where they land conjure a prison effectively change biome clone object nodes that explode when you dig them grow a big hollow bubble from the ground create a space of air emergent jungle tree with ladder inthe core up to a treehouse install stairs on a random slope ward areas climbable magic blocks, like antigrav [engine] stateless particle systems custom particle shaders above/below positional abms on_craft callback nodes that randomly emit particles on their own particles that break into or emit more particles mapgen "regions" or extra biome params ("magicness" or other such variations) ore-ish registration that guarantees a certain limited number of spawns mapgen distance-from-center params store a region in a gem, release later more particle functions raillike path prediction and pathing for entities fermentation, distillation, soaking/boiling pot, ball mill glass crafting furnace need books to do certain spells "Apocryphon" - secret book ink, black/gold/silver/red saltpeter, halite, iron(II) sulfate aka green vitriol (melanterite), soda nitre, pot ash pyrite iodine (from seaweed) fossils fireworks green alchemist's fire that ignites on and burns water extra metals: silver, lead, platinum, rhodium, arsenic, bismuth, mercury, iridium, osmium, zinc gems: lapis lazuli, opal, citrine, aquamarine cyclopian masonry ancient sunken cities fumaroles spawning, textures and features joshua trees (connected node) bogs cobwebs prickly pear - polishing, spawning and fruit barrel cactus bamboo forests clover fields basalt outcroppings with mesh nodes undersea sponges undersea volcanic vents deep-sea worms thornbushes blighted areas, purple miasma, dead plants, etc creosote bush pirate ships, treasure chests quicksand mayan temples on top of mountains poppies magic beanstalk arching bridge fancy tower summon a ziggurat (player is flung into the air while it spawns underneath) magic armor regeneration amulets force field fireball spell to unlock chests treasure maps of some sort minetunnels: torches in coves wood bracing ceiling bolts ladders to upper areas minecart chests wood walkways over caverns hail of arrows trap catapult that flings player back stone columns in large rooms chemistry glassware getting used or consumed brown version of glassware fancier glassware needed for fancier chemicals some chemicals are light-sensitive and are ruined or explode if in bright light some chemicals explode if heated can place potions bottles on the ground enchant tools can only dig certain nodes explode and damage player if used to dig certain nodes only works below ground/above ground ancient artifacts volcanic hotsprings geysers minetunnels a la mobehavior with geodes pentagram on enchanting table top higher level enchanting tables ]] minetest.register_node("potions:prickly_pear", { description = "Prickly Pear", drawtype = "plantlike", waving = 0, visual_scale = 2.828, tiles = {"potions_prickly_pear.png"}, inventory_image = "potions_prickly_pear.png", wield_image = "default_junglegrass.png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flora = 1, flammable = 3}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-8 / 16, -0.5, -8 / 16, 8 / 16, 0.5, 8 / 16}, }, }) minetest.register_node("potions:prickly_pear_plus", { description = "Prickly Pear", drawtype = "plantlike", waving = 0, visual_scale = 2, tiles = {"potions_prickly_pear.png"}, inventory_image = "potions_prickly_pear.png", wield_image = "default_junglegrass.png", paramtype = "light", paramtype2 = "meshoptions", place_param2 = 2, sunlight_propagates = true, walkable = false, buildable_to = true, drop = "potions:prickly_pear", groups = {snappy = 3, flora = 1, flammable = 3}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-8 / 16, -0.5, -8 / 16, 8 / 16, 0.5, 8 / 16}, }, }) minetest.register_abm({ nodenames = "potions:prickly_pear", chance = 20, interval = 10, action = function(pos, node) local meta = minetest.get_meta(pos) local h = meta:get_int("height") + 1 if 1 ~= math.random(h*h*h*h) then return end local offs = { {x=1, y=1, z=1}, {x=1, y=1, z=-1}, {x=-1, y=1, z=1}, {x=-1, y=1, z=-1}, } local p = vector.add(pos, offs[math.random(#offs)]) local opts = { "potions:prickly_pear_plus", "potions:prickly_pear_plus", } local n = minetest.get_node(p) if n.name == "air" then minetest.set_node(p, {name=opts[math.random(#opts)], param2 = 1}) local pmeta = minetest.get_meta(p) pmeta:set_int("height", h) end end }) minetest.register_abm({ nodenames = "potions:prickly_pear_plus", chance = 40, interval = 15, action = function(pos, node) local meta = minetest.get_meta(pos) local h = meta:get_int("height") + 1 if 1 ~= math.random(h*h*h*h) then return end local offs = { {x=0, y=1, z=1}, {x=0, y=1, z=-1}, {x=1, y=1, z=0}, {x=-1, y=1, z=0}, } local p = vector.add(pos, offs[math.random(#offs)]) local opts = { "potions:prickly_pear", "potions:prickly_pear", } local n = minetest.get_node(p) if n.name == "air" then minetest.set_node(p, {name=opts[math.random(#opts)]}) local pmeta = minetest.get_meta(p) pmeta:set_int("height", h) end end }) minetest.register_on_joinplayer(function(player) local name = player:get_player_name() local mid = player:hud_add({ hud_elem_type = "image", position = {x = 0, y = 1}, offset = {x = 10, y = -120}, text = "potions_manna_bar.png", scale = { x = 1, y = .1}, alignment = { x = 0, y = -1 }, }) player:hud_add({ hud_elem_type = "image", position = {x = 0, y = 1}, offset = {x = 10, y = -120}, text = "potions_manna_border.png", scale = { x = 1, y = 1 }, alignment = { x = 0, y = -1 }, }) if player:get_attribute("max_manna") == nil then player:set_attribute("manna", 10) player:set_attribute("max_manna", 100) end potions_players[name] = { player = player, ui = { manna_bar = mid, }, } -- player:hud_change(idx, "text", "New Text") -- -- local meta = player:get_meta() -- local digs_text = "Digs: " .. meta:get_int("score:digs") -- local places_text = "Places: " .. meta:get_int("score:places") -- local percent = tonumber(meta:get("score:score") or 0.2) -- -- player:hud_change(ids["bar_foreground"], -- "scale", { x = percent, y = 1 }) -- print(dump(potions_players[name].default_sky)) end) minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() potions_players[name] = nil end) local function update_player_manna(player, increase) local p = player.player local manna = tonumber(p:get_attribute("manna")) or 0 local max_manna = tonumber(p:get_attribute("max_manna")) or 100 manna = math.min(manna + increase, max_manna) local mpct = manna / max_manna p:hud_change(player.ui.manna_bar, "scale", {x = 1, y = mpct}) p:set_attribute("manna", manna) end local function update_all_manna() for _,p in pairs(potions_players) do update_player_manna(p, 20) -- HACK manna regenerates quickly for debugging end minetest.after(1, update_all_manna) end function trigger_negative_manna(player, m) return false end minetest.after(1, update_all_manna) potions.use_manna = function(player, amt) local om = tonumber(player:get_attribute("manna")) or 0 local remm = om - amt local used = amt if remm < 0 then local res = trigger_negative_manna(player, m) if res ~= false then return res end used = om remm = 0 end player:set_attribute("manna", remm) update_player_manna(potions_players[player:get_player_name()], 0) return used end potions.get_manna = function(player) return tonumber(player:get_attribute("manna")) or 0 end potions.set_manna = function(player, amt) local max = tonumber(player:get_attribute("max_manna")) or 100 player:set_attribute("manna", math.max(0, math.min(max, amt))) update_player_manna(potions_players[player:get_player_name()], 0) end potions.add_manna = function(player, amt) update_player_manna(potions_players[player:get_player_name()], amt) end potions.set_max_manna = function(player, amt) player:set_attribute("manna", math.max(0, amt)) update_player_manna(potions_players[player:get_player_name()], 0) end minetest.register_craftitem("potions:holy_water", { description = "Holy Water", inventory_image = "potions_healing_broth.png", stack_max = 5, }) minetest.register_craftitem("potions:solvent", { description = "Solvent", inventory_image = "potions_healing_broth.png", stack_max = 5, }) --[[ minetest.register_craft({ output = "potions:solvent 3", recipe = { {"flowers:mushroom_red", "dye:red", "default:apple"}, {"", "bucket:bucket_water", ""}, {"vessels:glass_bottle", "vessels:glass_bottle", "vessels:glass_bottle"}, }, replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}}, }) ]] minetest.register_craftitem("potions:healing_broth", { description = "Healing Potion Broth", inventory_image = "potions_healing_broth.png", stack_max = 5, }) minetest.register_craftitem("potions:healing", { description = "Healing Potion", inventory_image = "potions_healing.png", stack_max = 5, on_use = function(itemstack, user, pointed_thing) user:set_hp(2*10) itemstack:take_item(1) local inv = user:get_inventory() inv:add_item("main", "vessels:glass_bottle 1") return itemstack end, }) minetest.register_craft( { type = "cooking", cooktime = 90, output = "potions:healing", recipe = "potions:healing_broth", }) minetest.register_craft({ output = "potions:healing_broth 3", recipe = { {"flowers:mushroom_red", "dye:red", "default:apple"}, {"", "bucket:bucket_water", ""}, {"vessels:glass_bottle", "vessels:glass_bottle", "vessels:glass_bottle"}, }, replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}}, }) -- ----------------------------------- minetest.register_craftitem("potions:speed_broth", { description = "Speed Potion Broth", inventory_image = "potions_speed_broth.png", stack_max = 5, }) minetest.register_craftitem("potions:speed", { description = "Speed Potion", inventory_image = "potions_speed.png", stack_max = 5, on_use = function(itemstack, user, pointed_thing) user:set_physics_override({ speed = 3.0, }) minetest.after(20, function() user:set_physics_override({ speed = 1.0, }) end) itemstack:take_item(1) local inv = user:get_inventory() inv:add_item("main", "vessels:glass_bottle 1") return itemstack end, }) minetest.register_craft( { type = "cooking", cooktime = 30, output = "potions:speed", recipe = "potions:speed_broth", }) minetest.register_craft({ output = "potions:speed_broth 3", recipe = { {"default:mese_crystal_fragment", "dye:yellow", "default:mese_crystal_fragment"}, {"", "bucket:bucket_water", ""}, {"vessels:glass_bottle", "vessels:glass_bottle", "vessels:glass_bottle"}, }, replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}}, }) ---------------------------------------------------- minetest.register_craftitem("potions:lowgrav_broth", { description = "Low Gravity Potion Broth", inventory_image = "potions_lowgrav_broth.png", stack_max = 5, }) minetest.register_craftitem("potions:lowgrav", { description = "Low Gravity Potion", inventory_image = "potions_lowgrav.png", stack_max = 5, on_use = function(itemstack, user, pointed_thing) user:set_physics_override({ gravity = .1, }) minetest.after(10, function() user:set_physics_override({ gravity = .5, }) end) minetest.after(18, function() user:set_physics_override({ gravity = .75, }) end) minetest.after(25, function() user:set_physics_override({ gravity = 1.0, }) end) itemstack:take_item(1) local inv = user:get_inventory() inv:add_item("main", "vessels:glass_bottle 1") return itemstack end, }) minetest.register_craft( { type = "cooking", cooktime = 30, output = "potions:lowgrav", recipe = "potions:lowgrav_broth", }) minetest.register_craft({ output = "potions:lowgrav_broth 3", recipe = { {"flowers:dandelion_white", "dye:white", "flowers:dandelion_white"}, {"", "bucket:bucket_water", ""}, {"vessels:glass_bottle", "vessels:glass_bottle", "vessels:glass_bottle"}, }, replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}}, }) ---------------------------------------------------- minetest.register_craftitem("potions:teleport_broth", { description = "Teleportation Potion Broth", inventory_image = "potions_teleport_broth.png", stack_max = 4, }) minetest.register_craftitem("potions:teleport", { description = "Teleportation Potion", inventory_image = "potions_teleport.png", stack_max = 1, on_use = function(itemstack, user, pointed_thing) return {name="potions:teleport_recall", count=1, wear=0, metadata=minetest.serialize(user:getpos())} end, }) minetest.register_craftitem("potions:teleport_recall", { description = "Teleportation Recall Potion", inventory_image = "potions_teleport_recall.png", stack_max = 1, on_use = function(itemstack, user, pointed_thing) local item = itemstack:take_item(1) local pos = minetest.deserialize(item:get_metadata()) if pos ~= nil then user:setpos(pos) end return "vessels:glass_bottle 1" end, }) minetest.register_craft( { type = "cooking", cooktime = 30, output = "potions:teleport", recipe = "potions:teleport_broth", }) minetest.register_craft({ output = "potions:teleport_broth 3", recipe = { {"default:obsidian_shard", "dye:violet", "default:obsidian_shard"}, {"", "bucket:bucket_water", ""}, {"vessels:glass_bottle", "vessels:glass_bottle", "vessels:glass_bottle"}, }, replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}}, }) ----------------------------------------------- minetest.register_craftitem("potions:flight_broth", { description = "Flight Potion Broth", inventory_image = "potions_flight_broth.png", stack_max = 5, }) minetest.register_craftitem("potions:flight", { description = "Flight Potion", inventory_image = "potions_flight.png", stack_max = 5, on_use = function(itemstack, user, pointed_thing) local name = user:get_player_name() local privs = minetest.get_player_privs(name) privs.fly = true minetest.set_player_privs(name, privs) minetest.after(14, function() local privs = minetest.get_player_privs(name) privs.fly = nil minetest.set_player_privs(name, privs) user:set_physics_override({ gravity = .5, }) end) minetest.after(18, function() user:set_physics_override({ gravity = .75, }) end) minetest.after(22, function() user:set_physics_override({ gravity = 1.0, }) end) itemstack:take_item(1) local inv = user:get_inventory() inv:add_item("main", "vessels:glass_bottle 1") return itemstack end, }) minetest.register_craft( { type = "cooking", cooktime = 30, output = "potions:flight", recipe = "potions:flight_broth", }) minetest.register_craft({ output = "potions:flight_broth 3", recipe = { {"farming:cotton", "dye:cyan", "farming:cotton"}, {"", "bucket:bucket_water", ""}, {"vessels:glass_bottle", "vessels:glass_bottle", "vessels:glass_bottle"}, }, replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}}, })