local S = minetest.get_translator("mcl_potions") local brewhelp = S("Try different combinations to create potions.") local potion_image = function(colorstring, opacity) if not opacity then opacity = 127 end return "mcl_potions_potion_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_potion_bottle.png" end local how_to_drink = S("Use the “Place” key to drink it.") local potion_intro = S("Drinking a potion gives you a particular effect.") local function time_string(dur) if not dur then return nil end return math.floor(dur/60)..string.format(":%02d",math.floor(dur % 60)) end local function perc_string(num) local rem = math.floor((num-1.0)*100 + 0.1) % 5 local out = math.floor((num-1.0)*100 + 0.1) - rem if (num - 1.0) < 0 then return out.."%" else return "+"..out.."%" end end -- ██████╗░███████╗░██████╗░██╗░██████╗████████╗███████╗██████╗░ -- ██╔══██╗██╔════╝██╔════╝░██║██╔════╝╚══██╔══╝██╔════╝██╔══██╗ -- ██████╔╝█████╗░░██║░░██╗░██║╚█████╗░░░░██║░░░█████╗░░██████╔╝ -- ██╔══██╗██╔══╝░░██║░░╚██╗██║░╚═══██╗░░░██║░░░██╔══╝░░██╔══██╗ -- ██║░░██║███████╗╚██████╔╝██║██████╔╝░░░██║░░░███████╗██║░░██║ -- ╚═╝░░╚═╝╚══════╝░╚═════╝░╚═╝╚═════╝░░░░╚═╝░░░╚══════╝╚═╝░░╚═╝ -- -- ██████╗░░█████╗░████████╗██╗░█████╗░███╗░░██╗░██████╗ -- ██╔══██╗██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║██╔════╝ -- ██████╔╝██║░░██║░░░██║░░░██║██║░░██║██╔██╗██║╚█████╗░ -- ██╔═══╝░██║░░██║░░░██║░░░██║██║░░██║██║╚████║░╚═══██╗ -- ██║░░░░░╚█████╔╝░░░██║░░░██║╚█████╔╝██║░╚███║██████╔╝ -- ╚═╝░░░░░░╚════╝░░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝╚═════╝░ function return_on_use(def, effect, dur) return function (itemstack, user, pointed_thing) if pointed_thing.type == "node" then if user and not user:get_player_control().sneak then -- Use pointed node's on_rightclick function first, if present local node = minetest.get_node(pointed_thing.under) if user and not user:get_player_control().sneak then if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack end end end elseif pointed_thing.type == "object" then return itemstack end def.on_use(user, effect, dur) local old_name, old_count = itemstack:get_name(), itemstack:get_count() itemstack = minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) if old_name ~= itemstack:get_name() or old_count ~= itemstack:get_count() then mcl_potions._use_potion(itemstack, user, def.color) end return itemstack end end local function register_potion(def) local dur = mcl_potions.DURATION if def.is_inv then dur = dur * mcl_potions.INV_FACTOR end if def.name == "poison" or def.name == "regeneration" then dur = 45 end local on_use = nil if def.on_use then on_use = return_on_use(def, def.effect, dur) end local function get_tt(tt, effect, dur) local _tt if effect and def.is_dur then _tt = perc_string(effect).." | "..time_string(dur) if def.name == "poison" or def.name == "regeneration" then _tt = S("1 HP/@1s | @2", effect, time_string(dur)) end elseif def.name == "healing" or def.name == "harming" then _tt = S("@1 HP", effect) else _tt = tt or time_string(dur) or S("No effect") end return _tt end local function get_splash_fun(effect, sp_dur) if def.is_dur then return function(player, redx) def.on_use(player, effect, sp_dur*redx) end elseif def.effect then return function(player, redx) def.on_use(player, effect*redx, sp_dur) end end -- covers case of no effect (water, awkward, mundane) return function() end end local function get_lingering_fun(effect, ling_dur) if def.is_dur then return function(player) def.on_use(player, effect, ling_dur) end elseif def.effect then return function(player) def.on_use(player, effect*0.5, ling_dur) end end -- covers case of no effect (water, awkward, mundane) return function() end end local function get_arrow_fun(effect, dur) if def.is_dur then return function(player) def.on_use(player, effect, dur) end elseif def.effect then return function(player) def.on_use(player, effect, dur) end end -- covers case of no effect (water, awkward, mundane) return function() end end local desc if not def.no_potion then if def.description_potion then desc = def.description_potion else desc = S("@1 Potion", def.description) end else desc = def.description end local potion_longdesc = def._longdesc if not def.no_effect then potion_longdesc = potion_intro .. "\n" .. def._longdesc end local potion_usagehelp local basic_potion_tt if def.name ~= "dragon_breath" then potion_usagehelp = how_to_drink basic_potion_tt = get_tt(def._tt, def.effect, dur) end minetest.register_craftitem("mcl_potions:"..def.name, { description = desc, _tt_help = basic_potion_tt, _doc_items_longdesc = potion_longdesc, _doc_items_usagehelp = potion_usagehelp, stack_max = def.stack_max or 1, inventory_image = def.image or potion_image(def.color), wield_image = def.image or potion_image(def.color), groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1 }, on_place = on_use, on_secondary_use = on_use, }) -- Register Splash and Lingering local splash_dur = dur * mcl_potions.SPLASH_FACTOR local ling_dur = dur * mcl_potions.LINGERING_FACTOR local splash_def = { tt = get_tt(def._tt, def.effect, splash_dur), longdesc = def._longdesc, potion_fun = get_splash_fun(def.effect, splash_dur), no_effect = def.no_effect, instant = def.instant, } local ling_def if def.name == "healing" or def.name == "harming" then ling_def = { tt = get_tt(def._tt, def.effect*mcl_potions.LINGERING_FACTOR, ling_dur), longdesc = def._longdesc, potion_fun = get_lingering_fun(def.effect*mcl_potions.LINGERING_FACTOR, ling_dur), no_effect = def.no_effect, instant = def.instant, } else ling_def = { tt = get_tt(def._tt, def.effect, ling_dur), longdesc = def._longdesc, potion_fun = get_lingering_fun(def.effect, ling_dur), no_effect = def.no_effect, instant = def.instant, } end local arrow_def = { tt = get_tt(def._tt, def.effect, dur/8.), longdesc = def._longdesc, potion_fun = get_arrow_fun(def.effect, dur/8.), no_effect = def.no_effect, instant = def.instant, } if def.color and not def.no_throwable then local desc if def.description_splash then desc = def.description_splash else desc = S("Splash @1 Potion", def.description) end mcl_potions.register_splash(def.name, desc, def.color, splash_def) if def.description_lingering then desc = def.description_lingering else desc = S("Lingering @1 Potion", def.description) end mcl_potions.register_lingering(def.name, desc, def.color, ling_def) if not def.no_arrow then mcl_potions.register_arrow(def.name, S("Arrow of @1", def.description), def.color, arrow_def) end end if def.is_II then local desc_mod = S(" II") local effect_II if def.name == "healing" or def.name == "harming" then effect_II = def.effect*mcl_potions.II_FACTOR elseif def.name == "poison" or def.name == "regeneration" then effect_II = 1.2 else effect_II = def.effect^mcl_potions.II_FACTOR end local dur_2 = dur / mcl_potions.II_FACTOR if def.name == "poison" then dur_2 = dur_2 - 1 end if def.name == "slowness" then dur_2 = 20 effect_II = 0.40 desc_mod = S(" IV") end on_use = return_on_use(def, effect_II, dur_2) minetest.register_craftitem("mcl_potions:"..def.name.."_2", { description = S("@1 Potion@2", def.description, desc_mod), _tt_help = get_tt(def._tt_2, effect_II, dur_2), _doc_items_longdesc = potion_longdesc, _doc_items_usagehelp = potion_usagehelp, stack_max = def.stack_max or 1, inventory_image = def.image or potion_image(def.color), wield_image = def.image or potion_image(def.color), groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1}, on_place = on_use, on_secondary_use = on_use, }) -- Register Splash and Lingering local splash_dur_2 = dur_2 * mcl_potions.SPLASH_FACTOR local ling_dur_2 = dur_2 * mcl_potions.LINGERING_FACTOR local splash_def_2 if def.name == "healing" then splash_def_2 = { tt = get_tt(def._tt_2, 7, splash_dur_2), longdesc = def._longdesc, potion_fun = get_splash_fun(7, splash_dur_2), no_effect = def.no_effect, instant = def.instant, } else splash_def_2 = { tt = get_tt(def._tt_2, effect_II, splash_dur_2), longdesc = def._longdesc, potion_fun = get_splash_fun(effect_II, splash_dur_2), no_effect = def.no_effect, instant = def.instant, } end local ling_def_2 if def.name == "healing" or def.name == "harming" then ling_def_2 = { tt = get_tt(def._tt_2, effect_II*mcl_potions.LINGERING_FACTOR, ling_dur_2), longdesc = def._longdesc, potion_fun = get_lingering_fun(effect_II*mcl_potions.LINGERING_FACTOR, ling_dur_2), no_effect = def.no_effect, instant = def.instant, } else ling_def_2 = { tt = get_tt(def._tt_2, effect_II, ling_dur_2), longdesc = def._longdesc, potion_fun = get_lingering_fun(effect_II, ling_dur_2), no_effect = def.no_effect, instant = def.instant, } end local arrow_def_2 = { tt = get_tt(def._tt_2, effect_II, dur_2/8.), longdesc = def._longdesc, potion_fun = get_arrow_fun(effect_II, dur_2/8.), no_effect = def.no_effect, instant = def.instant, } if def.color and not def.no_throwable then mcl_potions.register_splash(def.name.."_2", S("Splash @1@2 Potion", def.description, desc_mod), def.color, splash_def_2) mcl_potions.register_lingering(def.name.."_2", S("Lingering @1@2 Potion", def.description, desc_mod), def.color, ling_def_2) if not def.no_arrow then mcl_potions.register_arrow(def.name.."_2", S("Arrow of @1@2", def.description, desc_mod), def.color, arrow_def_2) end end end if def.is_plus then local dur_pl = dur * mcl_potions.PLUS_FACTOR if def.name == "poison" or def.name == "regeneration" then dur_pl = 90 end on_use = return_on_use(def, def.effect, dur_pl) minetest.register_craftitem("mcl_potions:"..def.name.."_plus", { description = S("@1 + Potion", def.description), _tt_help = get_tt(def._tt_plus, def.effect, dur_pl), _doc_items_longdesc = potion_longdesc, _doc_items_usagehelp = potion_usagehelp, stack_max = 1, inventory_image = def.image or potion_image(def.color), wield_image = def.image or potion_image(def.color), groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1}, on_place = on_use, on_secondary_use = on_use, }) -- Register Splash local splash_dur_pl = dur_pl * mcl_potions.SPLASH_FACTOR local ling_dur_pl = dur_pl * mcl_potions.LINGERING_FACTOR local splash_def_pl = { tt = get_tt(def._tt_plus, def.effect, splash_dur_pl), longdesc = def._longdesc, potion_fun = get_splash_fun(def.effect, splash_dur_pl), no_effect = def.no_effect, instant = def.instant, } local ling_def_pl = { tt = get_tt(def._tt_plus, def.effect, ling_dur_pl), longdesc = def._longdesc, potion_fun = get_lingering_fun(def.effect, ling_dur_pl), no_effect = def.no_effect, instant = def.instant, } local arrow_def_pl = { tt = get_tt(def._tt_pl, def.effect, dur_pl/8.), longdesc = def._longdesc, potion_fun = get_arrow_fun(def.effect, dur_pl/8.), no_effect = def.no_effect, instant = def.instant, } if def.color and not def.no_throwable then mcl_potions.register_splash(def.name.."_plus", S("Splash @1 + Potion", def.description), def.color, splash_def_pl) mcl_potions.register_lingering(def.name.."_plus", S("Lingering @1 + Potion", def.description), def.color, ling_def_pl) if not def.no_arrow then mcl_potions.register_arrow(def.name.."_plus", S("Arrow of @1 +", def.description), def.color, arrow_def_pl) end end end end -- ██████╗░░█████╗░████████╗██╗░█████╗░███╗░░██╗ -- ██╔══██╗██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║ -- ██████╔╝██║░░██║░░░██║░░░██║██║░░██║██╔██╗██║ -- ██╔═══╝░██║░░██║░░░██║░░░██║██║░░██║██║╚████║ -- ██║░░░░░╚█████╔╝░░░██║░░░██║╚█████╔╝██║░╚███║ -- ╚═╝░░░░░░╚════╝░░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝ -- -- ██████╗░███████╗███████╗██╗███╗░░██╗██╗████████╗██╗░█████╗░███╗░░██╗░██████╗ -- ██╔══██╗██╔════╝██╔════╝██║████╗░██║██║╚══██╔══╝██║██╔══██╗████╗░██║██╔════╝ -- ██║░░██║█████╗░░█████╗░░██║██╔██╗██║██║░░░██║░░░██║██║░░██║██╔██╗██║╚█████╗░ -- ██║░░██║██╔══╝░░██╔══╝░░██║██║╚████║██║░░░██║░░░██║██║░░██║██║╚████║░╚═══██╗ -- ██████╔╝███████╗██║░░░░░██║██║░╚███║██║░░░██║░░░██║╚█████╔╝██║░╚███║██████╔╝ -- ╚═════╝░╚══════╝╚═╝░░░░░╚═╝╚═╝░░╚══╝╚═╝░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝╚═════╝░ local awkward_def = { name = "awkward", description_potion = S("Awkward Potion"), description_splash = S("Awkward Splash Potion"), description_lingering = S("Awkward Lingering Potion"), no_arrow = true, no_effect = true, _tt = S("No effect"), _longdesc = S("Has an awkward taste and is used for brewing potions."), color = "#0000FF", groups = {brewitem=1, food=3, can_eat_when_full=1}, on_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), } local mundane_def = { name = "mundane", description_potion = S("Mundane Potion"), description_splash = S("Mundane Splash Potion"), description_lingering = S("Mundane Lingering Potion"), no_arrow = true, no_effect = true, _tt = S("No effect"), _longdesc = S("Has a terrible taste and is not useful for brewing potions."), color = "#0000FF", on_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), } local thick_def = { name = "thick", description_potion = S("Thick Potion"), description_splash = S("Thick Splash Potion"), description_lingering = S("Thick Lingering Potion"), no_arrow = true, no_effect = true, _tt = S("No effect"), _longdesc = S("Has a bitter taste and is not useful for brewing potions."), color = "#0000FF", on_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), } local dragon_breath_def = { name = "dragon_breath", description = S("Dragon's Breath"), no_arrow = true, no_potion = true, no_throwable = true, no_effect = true, _longdesc = S("This item is used in brewing and can be combined with splash potions to create lingering potions."), image = "mcl_potions_dragon_breath.png", groups = { brewitem = 1 }, on_use = nil, stack_max = 64, } local healing_def = { name = "healing", description = S("Healing"), _tt = S("+4 HP"), _tt_2 = S("+8 HP"), _longdesc = S("Instantly heals."), color = "#CC0000", effect = 4, instant = true, on_use = mcl_potions.healing_func, is_II = true, } local harming_def = { name = "harming", description = S("Harming"), _tt = S("-6 HP"), _tt_II = S("-12 HP"), _longdesc = S("Instantly deals damage."), color = "#660099", effect = -6, instant = true, on_use = mcl_potions.healing_func, is_II = true, is_inv = true, } local night_vision_def = { name = "night_vision", description = S("Night Vision"), _tt = nil, _longdesc = S("Increases the perceived brightness of light under a dark sky."), color = "#1010AA", effect = nil, is_dur = true, on_use = mcl_potions.night_vision_func, is_plus = true, } local swiftness_def = { name = "swiftness", description = S("Swiftness"), _tt = nil, _longdesc = S("Increases walking speed."), color = "#009999", effect = 1.2, is_dur = true, on_use = mcl_potions.swiftness_func, is_II = true, is_plus = true, } local slowness_def = { name = "slowness", description = S("Slowness"), _tt = nil, _longdesc = S("Decreases walking speed."), color = "#000080", effect = 0.85, is_dur = true, on_use = mcl_potions.swiftness_func, is_II = true, is_plus = true, is_inv = true, } local leaping_def = { name = "leaping", description = S("Leaping"), _tt = nil, _longdesc = S("Increases jump strength."), color = "#00CC33", effect = 1.15, is_dur = true, on_use = mcl_potions.leaping_func, is_II = true, is_plus = true, } local poison_def = { name = "poison", description = S("Poison"), _tt = nil, _longdesc = S("Applies the poison effect which deals damage at a regular interval."), color = "#447755", effect = 2.5, is_dur = true, on_use = mcl_potions.poison_func, is_II = true, is_plus = true, is_inv = true, } local regeneration_def = { name = "regeneration", description = S("Regeneration"), _tt = nil, _longdesc = S("Regenerates health over time."), color = "#B52CC2", effect = 2.5, is_dur = true, on_use = mcl_potions.regeneration_func, is_II = true, is_plus = true, } local invisibility_def = { name = "invisibility", description = S("Invisibility"), _tt = nil, _longdesc = S("Grants invisibility."), color = "#B0B0B0", is_dur = true, on_use = mcl_potions.invisiblility_func, is_plus = true, } local water_breathing_def = { name = "water_breathing", description = S("Water Breathing"), _tt = nil, _longdesc = S("Grants limitless breath underwater."), color = "#0000AA", is_dur = true, on_use = mcl_potions.water_breathing_func, is_plus = true, } local fire_resistance_def = { name = "fire_resistance", description = S("Fire Resistance"), _tt = nil, _longdesc = S("Grants immunity to damage from heat sources like fire."), color = "#D0A040", is_dur = true, on_use = mcl_potions.fire_resistance_func, is_plus = true, } local defs = { awkward_def, mundane_def, thick_def, dragon_breath_def, healing_def, harming_def, night_vision_def, swiftness_def, slowness_def, leaping_def, poison_def, regeneration_def, invisibility_def, water_breathing_def, fire_resistance_def} for _, def in ipairs(defs) do register_potion(def) end -- minetest.register_craftitem("mcl_potions:weakness", { -- description = S("Weakness"), -- _tt_help = TODO, -- _doc_items_longdesc = brewhelp, -- wield_image = potion_image("#6600AA"), -- inventory_image = potion_image("#6600AA"), -- groups = { brewitem=1, food=3, can_eat_when_full=1 }, -- stack_max = 1, -- -- on_place = function(itemstack, user, pointed_thing) -- mcl_potions.weakness_func(user, -4, mcl_potions.DURATION*mcl_potions.INV_FACTOR) -- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) -- mcl_potions._use_potion(itemstack, user, "#6600AA") -- return itemstack -- end, -- -- on_secondary_use = function(itemstack, user, pointed_thing) -- mcl_potions.weakness_func(user, -4, mcl_potions.DURATION*mcl_potions.INV_FACTOR) -- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) -- mcl_potions._use_potion(itemstack, user, "#6600AA") -- return itemstack -- end -- }) -- -- minetest.register_craftitem("mcl_potions:weakness_plus", { -- description = S("Weakness +"), -- _tt_help = TODO, -- _doc_items_longdesc = brewhelp, -- wield_image = potion_image("#7700BB"), -- inventory_image = potion_image("#7700BB"), -- groups = { brewitem=1, food=3, can_eat_when_full=1 }, -- stack_max = 1, -- -- on_place = function(itemstack, user, pointed_thing) -- mcl_potions.weakness_func(user, -4, mcl_potions.DURATION_2*mcl_potions.INV_FACTOR) -- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) -- mcl_potions._use_potion(itemstack, user, "#7700BB") -- return itemstack -- end, -- -- on_secondary_use = function(itemstack, user, pointed_thing) -- mcl_potions.weakness_func(user, -4, mcl_potions.DURATION_2*mcl_potions.INV_FACTOR) -- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) -- mcl_potions._use_potion(itemstack, user, "#7700BB") -- return itemstack -- end -- }) -- -- minetest.register_craftitem("mcl_potions:strength", { -- description = S("Strength"), -- _tt_help = TODO, -- _doc_items_longdesc = brewhelp, -- wield_image = potion_image("#D444D4"), -- inventory_image = potion_image("#D444D4"), -- groups = { brewitem=1, food=3, can_eat_when_full=1 }, -- stack_max = 1, -- -- on_place = function(itemstack, user, pointed_thing) -- mcl_potions.weakness_func(user, 3, mcl_potions.DURATION) -- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) -- mcl_potions._use_potion(itemstack, user, "#D444D4") -- return itemstack -- end, -- -- on_secondary_use = function(itemstack, user, pointed_thing) -- mcl_potions.weakness_func(user, 3, mcl_potions.DURATION) -- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) -- mcl_potions._use_potion(itemstack, user, "#D444D4") -- return itemstack -- end -- }) -- -- minetest.register_craftitem("mcl_potions:strength_2", { -- description = S("Strength II"), -- _tt_help = TODO, -- _doc_items_longdesc = brewhelp, -- wield_image = potion_image("#D444E4"), -- inventory_image = potion_image("#D444E4"), -- groups = { brewitem=1, food=3, can_eat_when_full=1 }, -- stack_max = 1, -- -- on_place = function(itemstack, user, pointed_thing) -- mcl_potions.weakness_func(user, 6, mcl_potions.DURATION_2) -- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) -- mcl_potions._use_potion(itemstack, user, "#D444E4") -- return itemstack -- end, -- -- on_secondary_use = function(itemstack, user, pointed_thing) -- mcl_potions.weakness_func(user, 6, mcl_potions.DURATION_2) -- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) -- mcl_potions._use_potion(itemstack, user, "#D444E4") -- return itemstack -- end -- }) -- -- minetest.register_craftitem("mcl_potions:strength_plus", { -- description = S("Strength +"), -- _tt_help = TODO, -- _doc_items_longdesc = brewhelp, -- wield_image = potion_image("#D444F4"), -- inventory_image = potion_image("#D444F4"), -- groups = { brewitem=1, food=3, can_eat_when_full=1 }, -- stack_max = 1, -- -- on_place = function(itemstack, user, pointed_thing) -- mcl_potions.weakness_func(user, 3, mcl_potions.DURATION_PLUS) -- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) -- mcl_potions._use_potion(itemstack, user, "#D444F4") -- return itemstack -- end, -- -- on_secondary_use = function(itemstack, user, pointed_thing) -- mcl_potions.weakness_func(user, 3, mcl_potions.DURATION_PLUS) -- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) -- mcl_potions._use_potion(itemstack, user, "#D444F4") -- return itemstack -- end -- })