minetest_potions/init.lua

762 lines
17 KiB
Lua

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"}},
})