Brewing somewhat works with the new API

This commit is contained in:
the-real-herowl 2024-04-01 06:58:33 +02:00
parent 09be413e3f
commit f60f50041d
3 changed files with 88 additions and 71 deletions

@ -82,7 +82,7 @@ local function brewable(inv)
for i=1,stand_size do
bottle = inv:get_stack("stand", i):get_name()
bottle = inv:get_stack("stand", i)
alchemy = mcl_potions.get_alchemy(ingredient, bottle)
if alchemy then

@ -29,6 +29,7 @@ dofile(modpath .. "/splash.lua")
dofile(modpath .. "/lingering.lua")
dofile(modpath .. "/tipped_arrow.lua")
dofile(modpath .. "/potions.lua")
local potions = mcl_potions.registered_potions
minetest.register_craftitem("mcl_potions:fermented_spider_eye", {
description = S("Fermented Spider Eye"),
@ -370,97 +371,110 @@ local output_table = {
["mcl_potions:awkward"] = awkward_table,
}
local enhancement_table = {}
local extension_table = {}
local potions = {}
for i, potion in ipairs({"healing","harming","swiftness","slowness",
"leaping","poison","regeneration","invisibility","fire_resistance",
-- "weakness","strength",
"water_breathing","night_vision", "withering"}) do
table.insert(potions, potion)
if potion ~= "invisibility" and potion ~= "night_vision" and potion ~= "weakness" and potion ~= "water_breathing" and potion ~= "fire_resistance" then
enhancement_table["mcl_potions:"..potion] = "mcl_potions:"..potion.."_2"
enhancement_table["mcl_potions:"..potion.."_splash"] = "mcl_potions:"..potion.."_2_splash"
table.insert(potions, potion.."_2")
end
if potion ~= "healing" and potion ~= "harming" then
extension_table["mcl_potions:"..potion.."_splash"] = "mcl_potions:"..potion.."_plus_splash"
extension_table["mcl_potions:"..potion] = "mcl_potions:"..potion.."_plus"
table.insert(potions, potion.."_plus")
end
end
for i, potion in ipairs({"awkward", "mundane", "thick", "water"}) do
table.insert(potions, potion)
end
local inversion_table = {
["mcl_potions:healing"] = "mcl_potions:harming",
["mcl_potions:healing_2"] = "mcl_potions:harming_2",
["mcl_potions:swiftness"] = "mcl_potions:slowness",
["mcl_potions:swiftness_plus"] = "mcl_potions:slowness_plus",
["mcl_potions:leaping"] = "mcl_potions:slowness",
["mcl_potions:leaping_plus"] = "mcl_potions:slowness_plus",
["mcl_potions:night_vision"] = "mcl_potions:invisibility",
["mcl_potions:night_vision_plus"] = "mcl_potions:invisibility_plus",
["mcl_potions:poison"] = "mcl_potions:harming",
["mcl_potions:poison_2"] = "mcl_potions:harming_2",
["mcl_potions:healing_splash"] = "mcl_potions:harming_splash",
["mcl_potions:healing_2_splash"] = "mcl_potions:harming_2_splash",
["mcl_potions:swiftness_splash"] = "mcl_potions:slowness_splash",
["mcl_potions:swiftness_plus_splash"] = "mcl_potions:slowness_plus_splash",
["mcl_potions:leaping_splash"] = "mcl_potions:slowness_splash",
["mcl_potions:leaping_plus_splash"] = "mcl_potions:slowness_plus_splash",
["mcl_potions:night_vision_splash"] = "mcl_potions:invisibility_splash",
["mcl_potions:night_vision_plus_splash"] = "mcl_potions:invisibility_plus_splash",
["mcl_potions:poison_splash"] = "mcl_potions:harming_splash",
["mcl_potions:poison_2_splash"] = "mcl_potions:harming_2_splash",
-- ["mcl_potions:healing_splash"] = "mcl_potions:harming_splash",
-- ["mcl_potions:swiftness_splash"] = "mcl_potions:slowness_splash",
-- ["mcl_potions:leaping_splash"] = "mcl_potions:slowness_splash",
-- ["mcl_potions:night_vision_splash"] = "mcl_potions:invisibility_splash",
-- ["mcl_potions:poison_splash"] = "mcl_potions:harming_splash",
}
local splash_table = {}
local lingering_table = {}
for i, potion in ipairs(potions) do
splash_table["mcl_potions:"..potion] = "mcl_potions:"..potion.."_splash"
lingering_table["mcl_potions:"..potion.."_splash"] = "mcl_potions:"..potion.."_lingering"
for potion, def in pairs(potions) do
if def.has_splash then
splash_table[potion] = potion.."_splash"
end
if def.has_lingering then
lingering_table[potion.."_splash"] = potion.."_lingering"
end
end
local mod_table = {
["mesecons:wire_00000000_off"] = extension_table,
["mcl_potions:fermented_spider_eye"] = inversion_table,
["mcl_nether:glowstone_dust"] = enhancement_table,
["mcl_mobitems:gunpowder"] = splash_table,
["mcl_potions:dragon_breath"] = lingering_table,
}
-- Compare two ingredients for compatable alchemy
local function extend_dur(potionstack)
local def = potions[potionstack:get_name()]
if not def then return false end -- somehow, it initially always fails
if not def.has_plus then return false end -- bail out if can't be extended
local potionstack = ItemStack(potionstack)
local meta = potionstack:get_meta()
local potent = meta:get_int("mcl_potions:potion_potent")
local plus = meta:get_int("mcl_potions:potion_plus")
if plus == 0 then
if potent ~= 0 then
meta:set_int("mcl_potions:potion_potent", 0)
end
meta:set_int("mcl_potions:potion_plus", def._default_extend_level)
tt.reload_itemstack_description(potionstack)
return potionstack
end
return false
end
local function enhance_pow(potionstack)
local def = potions[potionstack:get_name()]
if not def then return false end -- somehow, it initially always fails
if not def.has_potent then return false end -- bail out if has no potent variant
local potionstack = ItemStack(potionstack)
local meta = potionstack:get_meta()
local potent = meta:get_int("mcl_potions:potion_potent")
local plus = meta:get_int("mcl_potions:potion_plus")
if potent == 0 then
if plus ~= 0 then
meta:set_int("mcl_potions:potion_plus", 0)
end
meta:set_int("mcl_potions:potion_potent", def._default_potent_level-1)
tt.reload_itemstack_description(potionstack)
return potionstack
end
return false
end
local meta_mod_table = {
["mesecons:wire_00000000_off"] = extend_dur,
["mcl_nether:glowstone_dust"] = enhance_pow,
}
-- Find an alchemical recipe for given ingredient and potion
-- returns outcome
function mcl_potions.get_alchemy(ingr, pot)
if output_table[pot] then
local brew_selector = output_table[pot:get_name()]
if brew_selector and brew_selector[ingr] then
local meta = pot:get_meta():to_table()
local alchemy = ItemStack(brew_selector[ingr])
local metaref = alchemy:get_meta()
metaref:from_table(meta)
tt.reload_itemstack_description(alchemy)
return alchemy
end
local brew_table = output_table[pot]
if brew_table[ingr] then
return brew_table[ingr]
brew_selector = mod_table[ingr]
if brew_selector then
local brew = brew_selector[pot:get_name()]
if brew then
local meta = pot:get_meta():to_table()
local alchemy = ItemStack(brew)
local metaref = alchemy:get_meta()
metaref:from_table(meta)
tt.reload_itemstack_description(alchemy)
return alchemy
end
end
if mod_table[ingr] then
local brew_table = mod_table[ingr]
if brew_table[pot] then
return brew_table[pot]
end
if meta_mod_table[ingr] then
local brew_func = meta_mod_table[ingr]
if brew_func then return brew_func(pot) end
end
return false
@ -493,10 +507,6 @@ minetest.register_globalstep(function(dtime)
end)
mcl_wip.register_wip_item("mcl_potions:night_vision")
mcl_wip.register_wip_item("mcl_potions:night_vision_plus")
mcl_wip.register_wip_item("mcl_potions:night_vision_splash")
mcl_wip.register_wip_item("mcl_potions:night_vision_plus_splash")
mcl_wip.register_wip_item("mcl_potions:night_vision_lingering")
mcl_wip.register_wip_item("mcl_potions:night_vision_plus_lingering")
mcl_wip.register_wip_item("mcl_potions:night_vision_arrow")
mcl_wip.register_wip_item("mcl_potions:night_vision_plus_arrow")

@ -1,5 +1,7 @@
local S = minetest.get_translator(minetest.get_current_modname())
mcl_potions.registered_potions = {}
local function potion_image(colorstring, opacity)
if not opacity then
opacity = 127
@ -268,6 +270,7 @@ function mcl_potions.register_potion(def)
sdef.on_splash = def.custom_splash_effect
if not def._effect_list then sdef.instant = true end
mcl_potions.register_splash(name, splash_desc, color, sdef)
pdef.has_splash = true
end
if def.has_lingering or def.has_lingering == nil then
@ -289,6 +292,7 @@ function mcl_potions.register_potion(def)
ldef.while_lingering = def.custom_linger_effect
if not def._effect_list then ldef.instant = true end
mcl_potions.register_lingering(name, ling_desc, color, ldef)
pdef.has_lingering = true
end
if def.has_arrow then
@ -316,7 +320,10 @@ function mcl_potions.register_potion(def)
adef.custom_effect = def.custom_effect
if not def._effect_list then adef.instant = true end
mcl_potions.register_arrow(name, arr_desc, color, adef)
pdef.has_arrow = true
end
mcl_potions.registered_potions[modname..":"..name] = pdef
end
mcl_potions.register_potion({