2021-05-29 16:12:33 +02:00
local modname = minetest.get_current_modname ( )
local modpath = minetest.get_modpath ( modname )
local S = minetest.get_translator ( modname )
2020-06-13 01:11:06 +02:00
mcl_potions = { }
2020-06-27 14:15:01 +02:00
-- duration effects of redstone are a factor of 8/3
-- duration effects of glowstone are a time factor of 1/2
-- splash potion duration effects are reduced by a factor of 3/4
2020-06-27 13:56:27 +02:00
2023-10-27 05:02:43 +02:00
mcl_potions.POTENT_FACTOR = 2
2020-07-12 02:26:45 +02:00
mcl_potions.PLUS_FACTOR = 8 / 3
2023-10-27 05:02:43 +02:00
mcl_potions.INV_FACTOR = 0.50
2020-07-12 02:26:45 +02:00
2020-06-27 13:56:27 +02:00
mcl_potions.DURATION = 180
2023-10-27 05:02:43 +02:00
mcl_potions.DURATION_INV = mcl_potions.DURATION * mcl_potions.INV_FACTOR
2024-01-08 00:26:56 +01:00
mcl_potions.DURATION_POISON = 45
2023-10-27 05:02:43 +02:00
mcl_potions.II_FACTOR = mcl_potions.POTENT_FACTOR -- TODO remove at some point
mcl_potions.DURATION_PLUS = mcl_potions.DURATION * mcl_potions.PLUS_FACTOR -- TODO remove at some point
mcl_potions.DURATION_2 = mcl_potions.DURATION / mcl_potions.II_FACTOR -- TODO remove at some point
2020-06-27 13:56:27 +02:00
2020-06-27 14:15:01 +02:00
mcl_potions.SPLASH_FACTOR = 0.75
2020-07-12 13:59:29 +02:00
mcl_potions.LINGERING_FACTOR = 0.25
2020-06-27 13:56:27 +02:00
2020-06-13 01:54:45 +02:00
dofile ( modpath .. " /functions.lua " )
2020-08-10 10:40:10 +02:00
dofile ( modpath .. " /commands.lua " )
2020-06-13 01:54:45 +02:00
dofile ( modpath .. " /splash.lua " )
2020-06-18 13:43:50 +02:00
dofile ( modpath .. " /lingering.lua " )
2020-07-20 00:56:18 +02:00
dofile ( modpath .. " /tipped_arrow.lua " )
2020-06-17 23:50:18 +02:00
dofile ( modpath .. " /potions.lua " )
2024-04-01 06:58:33 +02:00
local potions = mcl_potions.registered_potions
2019-03-08 00:22:28 +01:00
2017-01-12 03:04:58 +01:00
minetest.register_craftitem ( " mcl_potions:fermented_spider_eye " , {
2019-03-08 00:22:28 +01:00
description = S ( " Fermented Spider Eye " ) ,
2021-04-17 09:26:37 +02:00
_doc_items_longdesc = S ( " Try different combinations to create potions. " ) ,
2017-01-12 03:04:58 +01:00
wield_image = " mcl_potions_spider_eye_fermented.png " ,
inventory_image = " mcl_potions_spider_eye_fermented.png " ,
2020-08-05 20:04:12 +02:00
groups = { brewitem = 1 , } ,
2017-01-12 03:04:58 +01:00
stack_max = 64 ,
} )
minetest.register_craft ( {
type = " shapeless " ,
output = " mcl_potions:fermented_spider_eye " ,
2017-03-01 01:16:52 +01:00
recipe = { " mcl_mushrooms:mushroom_brown " , " mcl_core:sugar " , " mcl_mobitems:spider_eye " } ,
2017-01-12 03:04:58 +01:00
} )
2017-01-20 11:11:33 +01:00
minetest.register_craftitem ( " mcl_potions:glass_bottle " , {
2019-03-08 00:22:28 +01:00
description = S ( " Glass Bottle " ) ,
2020-02-19 04:54:17 +01:00
_tt_help = S ( " Liquid container " ) ,
2019-03-08 00:22:28 +01:00
_doc_items_longdesc = S ( " A glass bottle is used as a container for liquids and can be used to collect water directly. " ) ,
2020-07-12 17:58:34 +02:00
_doc_items_usagehelp = S ( " To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water). " ) ,
2020-07-04 00:33:24 +02:00
inventory_image = " mcl_potions_potion_bottle.png " ,
wield_image = " mcl_potions_potion_bottle.png " ,
2017-01-20 11:11:33 +01:00
groups = { brewitem = 1 } ,
2017-03-01 16:53:03 +01:00
liquids_pointable = true ,
on_place = function ( itemstack , placer , pointed_thing )
if pointed_thing.type == " node " then
local node = minetest.get_node ( pointed_thing.under )
local def = minetest.registered_nodes [ node.name ]
2017-03-01 16:55:48 +01:00
-- Call on_rightclick if the pointed node defines it
2020-06-08 23:47:53 +02:00
if placer and not placer : get_player_control ( ) . sneak then
2017-03-01 16:55:48 +01:00
if def and def.on_rightclick then
return def.on_rightclick ( pointed_thing.under , node , placer , itemstack ) or itemstack
end
end
2017-03-01 16:53:03 +01:00
-- Try to fill glass bottle with water
2017-03-01 18:06:09 +01:00
local get_water = false
2021-04-17 09:26:37 +02:00
--local from_liquid_source = false
2017-11-30 19:27:57 +01:00
local river_water = false
2021-04-17 09:26:37 +02:00
if def and def.groups and def.groups . water and def.liquidtype == " source " then
2017-03-01 18:06:09 +01:00
-- Water source
get_water = true
2021-04-17 09:26:37 +02:00
--from_liquid_source = true
2017-11-30 19:27:57 +01:00
river_water = node.name == " mclx_core:river_water_source "
2017-03-01 18:06:09 +01:00
-- Or reduce water level of cauldron by 1
2019-02-08 22:17:51 +01:00
elseif string.sub ( node.name , 1 , 14 ) == " mcl_cauldrons: " then
local pname = placer : get_player_name ( )
if minetest.is_protected ( pointed_thing.under , pname ) then
minetest.record_protection_violation ( pointed_thing.under , pname )
return itemstack
end
if node.name == " mcl_cauldrons:cauldron_3 " then
get_water = true
minetest.set_node ( pointed_thing.under , { name = " mcl_cauldrons:cauldron_2 " } )
elseif node.name == " mcl_cauldrons:cauldron_2 " then
get_water = true
minetest.set_node ( pointed_thing.under , { name = " mcl_cauldrons:cauldron_1 " } )
elseif node.name == " mcl_cauldrons:cauldron_1 " then
get_water = true
minetest.set_node ( pointed_thing.under , { name = " mcl_cauldrons:cauldron " } )
elseif node.name == " mcl_cauldrons:cauldron_3r " then
get_water = true
river_water = true
minetest.set_node ( pointed_thing.under , { name = " mcl_cauldrons:cauldron_2r " } )
elseif node.name == " mcl_cauldrons:cauldron_2r " then
get_water = true
river_water = true
minetest.set_node ( pointed_thing.under , { name = " mcl_cauldrons:cauldron_1r " } )
elseif node.name == " mcl_cauldrons:cauldron_1r " then
get_water = true
river_water = true
minetest.set_node ( pointed_thing.under , { name = " mcl_cauldrons:cauldron " } )
end
2017-03-01 18:06:09 +01:00
end
if get_water then
2020-09-27 20:56:39 +02:00
local water_bottle
if river_water then
water_bottle = ItemStack ( " mcl_potions:river_water " )
else
water_bottle = ItemStack ( " mcl_potions:water " )
end
-- Replace with water bottle, if possible, otherwise
-- place the water potion at a place where's space
local inv = placer : get_inventory ( )
minetest.sound_play ( " mcl_potions_bottle_fill " , { pos = pointed_thing.under , gain = 0.5 , max_hear_range = 16 } , true )
if minetest.is_creative_enabled ( placer : get_player_name ( ) ) then
-- Don't replace empty bottle in creative for convenience reasons
if not inv : contains_item ( " main " , water_bottle ) then
inv : add_item ( " main " , water_bottle )
2019-02-08 23:55:49 +01:00
end
2020-09-27 20:56:39 +02:00
elseif itemstack : get_count ( ) == 1 then
return water_bottle
else
if inv : room_for_item ( " main " , water_bottle ) then
inv : add_item ( " main " , water_bottle )
2019-02-08 23:55:49 +01:00
else
2020-09-27 20:56:39 +02:00
minetest.add_item ( placer : get_pos ( ) , water_bottle )
2017-03-01 16:53:03 +01:00
end
2020-09-27 20:56:39 +02:00
itemstack : take_item ( )
2017-03-01 16:53:03 +01:00
end
end
end
return itemstack
end ,
2017-01-20 11:11:33 +01:00
} )
minetest.register_craft ( {
output = " mcl_potions:glass_bottle 3 " ,
recipe = {
2017-01-31 23:32:56 +01:00
{ " mcl_core:glass " , " " , " mcl_core:glass " } ,
{ " " , " mcl_core:glass " , " " }
2017-01-20 11:11:33 +01:00
}
} )
2017-11-30 20:35:21 +01:00
-- Template function for creating images of filled potions
2017-03-01 16:36:26 +01:00
-- - colorstring must be a ColorString of form “#RRGGBB”, e.g. “#0000FF” for blue.
-- - opacity is optional opacity from 0-255 (default: 127)
2021-05-29 16:12:33 +02:00
local function potion_image ( colorstring , opacity )
2017-03-01 16:36:26 +01:00
if not opacity then
opacity = 127
end
2020-07-04 00:33:24 +02:00
return " mcl_potions_potion_overlay.png^[colorize: " .. colorstring .. " : " .. tostring ( opacity ) .. " ^mcl_potions_potion_bottle.png "
2020-06-08 23:47:53 +02:00
end
2020-06-13 01:54:45 +02:00
2017-03-01 16:36:26 +01:00
2017-11-30 20:35:21 +01:00
-- Cauldron fill up rules:
-- Adding any water increases the water level by 1, preserving the current water type
2017-11-30 19:27:57 +01:00
local cauldron_levels = {
2017-11-30 20:35:21 +01:00
-- start = { add water, add river water }
{ " " , " _1 " , " _1r " } ,
{ " _1 " , " _2 " , " _2 " } ,
{ " _2 " , " _3 " , " _3 " } ,
{ " _1r " , " _2r " , " _2r " } ,
{ " _2r " , " _3r " , " _3r " } ,
2017-11-30 19:27:57 +01:00
}
local fill_cauldron = function ( cauldron , water_type )
local base = " mcl_cauldrons:cauldron "
for i = 1 , # cauldron_levels do
if cauldron == base .. cauldron_levels [ i ] [ 1 ] then
if water_type == " mclx_core:river_water_source " then
return base .. cauldron_levels [ i ] [ 3 ]
else
return base .. cauldron_levels [ i ] [ 2 ]
end
end
end
end
2022-07-08 01:50:51 +02:00
-- function to set node and empty water bottle (used for cauldrons and mud)
local function set_node_empty_bottle ( itemstack , placer , pointed_thing , newitemstring )
local pname = placer : get_player_name ( )
if minetest.is_protected ( pointed_thing.under , pname ) then
minetest.record_protection_violation ( pointed_thing.under , pname )
return itemstack
end
-- set the node to `itemstring`
minetest.set_node ( pointed_thing.under , { name = newitemstring } )
-- play sound
minetest.sound_play ( " mcl_potions_bottle_pour " , { pos = pointed_thing.under , gain = 0.5 , max_hear_range = 16 } , true )
2023-08-08 02:53:01 +02:00
--
2022-07-08 01:50:51 +02:00
if minetest.is_creative_enabled ( placer : get_player_name ( ) ) then
return itemstack
else
return " mcl_potions:glass_bottle "
end
end
-- used for water bottles and river water bottles
local function dispense_water_bottle ( stack , pos , droppos )
local node = minetest.get_node ( droppos )
if node.name == " mcl_core:dirt " or node.name == " mcl_core:coarse_dirt " then
-- convert dirt/coarse dirt to mud
minetest.set_node ( droppos , { name = " mcl_mud:mud " } )
minetest.sound_play ( " mcl_potions_bottle_pour " , { pos = droppos , gain = 0.5 , max_hear_range = 16 } , true )
return ItemStack ( " mcl_potions:glass_bottle " )
elseif node.name == " mcl_mud:mud " then
-- dont dispense into mud
return stack
end
end
-- on_place function for `mcl_potions:water` and `mcl_potions:river_water`
local function water_bottle_on_place ( itemstack , placer , pointed_thing )
if pointed_thing.type == " node " then
local node = minetest.get_node ( pointed_thing.under )
local def = minetest.registered_nodes [ node.name ]
-- Call on_rightclick if the pointed node defines it
if placer and not placer : get_player_control ( ) . sneak then
if def and def.on_rightclick then
return def.on_rightclick ( pointed_thing.under , node , placer , itemstack ) or itemstack
end
end
local cauldron = nil
if itemstack : get_name ( ) == " mcl_potions:water " then -- regular water
cauldron = fill_cauldron ( node.name , " mcl_core:water_source " )
elseif itemstack : get_name ( ) == " mcl_potions:river_water " then -- river water
cauldron = fill_cauldron ( node.name , " mclx_core:river_water_source " )
end
if cauldron then
set_node_empty_bottle ( itemstack , placer , pointed_thing , cauldron )
elseif node.name == " mcl_core:dirt " or node.name == " mcl_core:coarse_dirt " then
set_node_empty_bottle ( itemstack , placer , pointed_thing , " mcl_mud:mud " )
end
end
-- Drink the water by default
return minetest.do_item_eat ( 0 , " mcl_potions:glass_bottle " , itemstack , placer , pointed_thing )
end
2020-09-08 05:21:29 +02:00
-- Itemstring of potions is “mcl_potions:<NBT Potion Tag>”
2017-03-01 16:36:26 +01:00
2020-06-18 13:43:50 +02:00
minetest.register_craftitem ( " mcl_potions:water " , {
2019-03-08 00:22:28 +01:00
description = S ( " Water Bottle " ) ,
2020-02-19 04:54:17 +01:00
_tt_help = S ( " No effect " ) ,
2019-03-08 00:22:28 +01:00
_doc_items_longdesc = S ( " Water bottles can be used to fill cauldrons. Drinking water has no effect. " ) ,
2019-03-25 12:05:57 +01:00
_doc_items_usagehelp = S ( " Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron. " ) ,
2017-03-01 16:36:26 +01:00
stack_max = 1 ,
2020-07-17 23:25:49 +02:00
inventory_image = potion_image ( " #0022FF " ) ,
wield_image = potion_image ( " #0022FF " ) ,
2023-10-27 00:15:57 +02:00
groups = { brewitem = 1 , food = 3 , can_eat_when_full = 1 , water_bottle = 1 , bottle = 1 } ,
2022-07-08 01:50:51 +02:00
on_place = water_bottle_on_place ,
_on_dispense = dispense_water_bottle ,
2022-07-06 21:43:54 +02:00
_dispense_into_walkable = true ,
2017-11-30 19:27:57 +01:00
on_secondary_use = minetest.item_eat ( 0 , " mcl_potions:glass_bottle " ) ,
} )
2020-07-17 23:25:49 +02:00
2020-06-18 13:43:50 +02:00
minetest.register_craftitem ( " mcl_potions:river_water " , {
2019-03-08 00:22:28 +01:00
description = S ( " River Water Bottle " ) ,
2020-02-19 04:54:17 +01:00
_tt_help = S ( " No effect " ) ,
2019-03-08 00:22:28 +01:00
_doc_items_longdesc = S ( " River water bottles can be used to fill cauldrons. Drinking it has no effect. " ) ,
2019-03-25 12:05:57 +01:00
_doc_items_usagehelp = S ( " Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron. " ) ,
2017-11-30 19:27:57 +01:00
stack_max = 1 ,
inventory_image = potion_image ( " #0044FF " ) ,
wield_image = potion_image ( " #0044FF " ) ,
2023-10-27 00:15:57 +02:00
groups = { brewitem = 1 , food = 3 , can_eat_when_full = 1 , water_bottle = 1 , bottle = 1 } ,
2022-07-08 01:50:51 +02:00
on_place = water_bottle_on_place ,
_on_dispense = dispense_water_bottle ,
2022-07-06 21:43:54 +02:00
_dispense_into_walkable = true ,
2017-03-01 16:36:26 +01:00
on_secondary_use = minetest.item_eat ( 0 , " mcl_potions:glass_bottle " ) ,
2020-07-17 23:25:49 +02:00
2017-03-01 16:36:26 +01:00
} )
2017-03-18 17:18:12 +01:00
2020-08-05 18:33:53 +02:00
-- Hurt mobs
2021-05-29 16:12:33 +02:00
local function water_splash ( obj , damage )
2020-08-05 18:33:53 +02:00
if not obj then
return
end
if not damage or ( damage > 0 and damage < 1 ) then
damage = 1
end
-- Damage mobs that are vulnerable to water
local lua = obj : get_luaentity ( )
2022-05-25 14:02:10 +02:00
if lua and lua.is_mob then
2020-08-05 18:33:53 +02:00
obj : punch ( obj , 1.0 , {
full_punch_interval = 1.0 ,
damage_groups = { water_vulnerable = damage } ,
} , nil )
end
end
mcl_potions.register_splash ( " water " , S ( " Splash Water Bottle " ) , " #0022FF " , {
tt = S ( " Extinguishes fire and hurts some mobs " ) ,
2020-08-08 10:00:16 +02:00
longdesc = S ( " A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water. " ) ,
2020-08-05 18:33:53 +02:00
no_effect = true ,
potion_fun = water_splash ,
effect = 1
} )
mcl_potions.register_lingering ( " water " , S ( " Lingering Water Bottle " ) , " #0022FF " , {
tt = S ( " Extinguishes fire and hurts some mobs " ) ,
2020-08-08 10:00:16 +02:00
longdesc = S ( " A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water. " ) ,
2020-08-05 18:33:53 +02:00
no_effect = true ,
potion_fun = water_splash ,
effect = 1
} )
2017-11-30 19:27:57 +01:00
2017-01-20 11:21:55 +01:00
minetest.register_craftitem ( " mcl_potions:speckled_melon " , {
2019-03-08 00:22:28 +01:00
description = S ( " Glistering Melon " ) ,
_doc_items_longdesc = S ( " This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else. " ) ,
2017-01-20 11:21:55 +01:00
stack_max = 64 ,
2020-08-05 20:04:12 +02:00
groups = { brewitem = 1 , } ,
2017-01-20 11:21:55 +01:00
inventory_image = " mcl_potions_melon_speckled.png " ,
} )
minetest.register_craft ( {
output = " mcl_potions:speckled_melon " ,
recipe = {
2021-05-29 16:12:33 +02:00
{ " mcl_core:gold_nugget " , " mcl_core:gold_nugget " , " mcl_core:gold_nugget " } ,
{ " mcl_core:gold_nugget " , " mcl_farming:melon_item " , " mcl_core:gold_nugget " } ,
{ " mcl_core:gold_nugget " , " mcl_core:gold_nugget " , " mcl_core:gold_nugget " } ,
2017-01-20 11:21:55 +01:00
}
} )
2020-06-13 01:11:06 +02:00
2024-04-02 05:03:27 +02:00
local output_table = { }
-- API
-- registers a potion that can be combined with multiple ingredients for different outcomes
-- out_table contains the recipes for those outcomes
function mcl_potions . register_ingredient_potion ( input , out_table )
if output_table [ input ] then
error ( " Attempt to register the same ingredient twice! " )
end
if type ( input ) ~= " string " then
error ( " Invalid argument! input must be a string " )
end
if type ( out_table ) ~= " table " then
error ( " Invalid argument! out_table must be a table " )
end
output_table [ input ] = out_table
end
2020-05-28 03:15:46 +02:00
local water_table = {
2020-06-17 22:49:52 +02:00
[ " mcl_nether:nether_wart_item " ] = " mcl_potions:awkward " ,
2024-04-02 05:03:27 +02:00
[ " mcl_potions:fermented_spider_eye " ] = " mcl_potions:weakness " ,
2020-06-17 22:49:52 +02:00
[ " mcl_potions:speckled_melon " ] = " mcl_potions:mundane " ,
[ " mcl_core:sugar " ] = " mcl_potions:mundane " ,
[ " mcl_mobitems:magma_cream " ] = " mcl_potions:mundane " ,
[ " mcl_mobitems:blaze_powder " ] = " mcl_potions:mundane " ,
[ " mesecons:wire_00000000_off " ] = " mcl_potions:mundane " ,
[ " mcl_mobitems:ghast_tear " ] = " mcl_potions:mundane " ,
[ " mcl_mobitems:spider_eye " ] = " mcl_potions:mundane " ,
2020-07-17 23:05:40 +02:00
[ " mcl_mobitems:rabbit_foot " ] = " mcl_potions:mundane " ,
[ " mcl_nether:glowstone_dust " ] = " mcl_potions:thick " ,
[ " mcl_mobitems:gunpowder " ] = " mcl_potions:water_splash "
2020-05-28 03:15:46 +02:00
}
2024-04-02 05:03:27 +02:00
-- API
-- register a potion recipe brewed from water
function mcl_potions . register_water_brew ( ingr , potion )
if water_table [ ingr ] then
error ( " Attempt to register the same ingredient twice! " )
end
if type ( ingr ) ~= " string " then
error ( " Invalid argument! ingr must be a string " )
end
if type ( potion ) ~= " string " then
error ( " Invalid argument! potion must be a string " )
end
water_table [ ingr ] = potion
end
mcl_potions.register_ingredient_potion ( " mcl_potions:river_water " , water_table )
mcl_potions.register_ingredient_potion ( " mcl_potions:water " , water_table )
2020-06-08 23:47:53 +02:00
2020-05-28 03:15:46 +02:00
local awkward_table = {
[ " mcl_potions:speckled_melon " ] = " mcl_potions:healing " ,
[ " mcl_farming:carrot_item_gold " ] = " mcl_potions:night_vision " ,
[ " mcl_core:sugar " ] = " mcl_potions:swiftness " ,
2020-06-28 22:45:49 +02:00
[ " mcl_mobitems:magma_cream " ] = " mcl_potions:fire_resistance " ,
2024-04-02 05:03:27 +02:00
[ " mcl_mobitems:blaze_powder " ] = " mcl_potions:strength " ,
2020-06-21 03:00:57 +02:00
[ " mcl_fishing:pufferfish_raw " ] = " mcl_potions:water_breathing " ,
[ " mcl_mobitems:ghast_tear " ] = " mcl_potions:regeneration " ,
[ " mcl_mobitems:spider_eye " ] = " mcl_potions:poison " ,
2023-08-08 02:53:01 +02:00
[ " mcl_flowers:wither_rose " ] = " mcl_potions:withering " ,
2020-06-18 23:59:36 +02:00
[ " mcl_mobitems:rabbit_foot " ] = " mcl_potions:leaping " ,
2024-04-09 00:25:31 +02:00
[ " mcl_flowers:fourleaf_clover " ] = " mcl_potions:luck " ,
[ " mcl_farming:potato_item_poison " ] = " mcl_potions:nausea " ,
2024-05-02 04:09:39 +02:00
[ " mcl_mobitems:spectre_membrane " ] = " mcl_potions:slow_falling " ,
2024-04-17 22:52:25 +02:00
[ " mcl_core:apple_gold " ] = " mcl_potions:resistance " ,
2024-05-02 04:09:39 +02:00
[ " mcl_mobitems:aery_charge " ] = " mcl_potions:haste " ,
[ " mcl_mobitems:crystalline_drop " ] = " mcl_potions:absorption " ,
[ " mcl_mobitems:earthen_ash " ] = " mcl_potions:stone_cloak " ,
[ " mcl_mobitems:shiny_ice_crystal " ] = " mcl_potions:frost " ,
2024-04-17 22:52:25 +02:00
-- TODO darkness - sculk?
2020-05-28 03:15:46 +02:00
}
2024-04-02 05:03:27 +02:00
-- API
-- register a potion recipe brewed from awkward potion
function mcl_potions . register_awkward_brew ( ingr , potion )
if awkward_table [ ingr ] then
error ( " Attempt to register the same ingredient twice! " )
end
if type ( ingr ) ~= " string " then
error ( " Invalid argument! ingr must be a string " )
end
if type ( potion ) ~= " string " then
error ( " Invalid argument! potion must be a string " )
end
awkward_table [ ingr ] = potion
end
mcl_potions.register_ingredient_potion ( " mcl_potions:awkward " , awkward_table )
2020-06-08 23:47:53 +02:00
2024-04-09 01:11:31 +02:00
local mundane_table = {
[ " mcl_potions:fermented_spider_eye " ] = " mcl_potions:weakness " ,
}
-- API
-- register a potion recipe brewed from mundane potion
function mcl_potions . register_mundane_brew ( ingr , potion )
if mundane_table [ ingr ] then
error ( " Attempt to register the same ingredient twice! " )
end
if type ( ingr ) ~= " string " then
error ( " Invalid argument! ingr must be a string " )
end
if type ( potion ) ~= " string " then
error ( " Invalid argument! potion must be a string " )
end
mundane_table [ ingr ] = potion
end
mcl_potions.register_ingredient_potion ( " mcl_potions:mundane " , mundane_table )
local thick_table = {
2024-04-17 22:52:25 +02:00
[ " mcl_crimson:shroomlight " ] = " mcl_potions:glowing " ,
[ " mcl_mobitems:nether_star " ] = " mcl_potions:ominous " ,
[ " mcl_mobitems:ink_sac " ] = " mcl_potions:blindness " ,
[ " mcl_farming:carrot_item_gold " ] = " mcl_potions:saturation " ,
2024-04-09 01:11:31 +02:00
}
-- API
-- register a potion recipe brewed from thick potion
function mcl_potions . register_thick_brew ( ingr , potion )
if thick_table [ ingr ] then
error ( " Attempt to register the same ingredient twice! " )
end
if type ( ingr ) ~= " string " then
error ( " Invalid argument! ingr must be a string " )
end
if type ( potion ) ~= " string " then
error ( " Invalid argument! potion must be a string " )
end
thick_table [ ingr ] = potion
end
mcl_potions.register_ingredient_potion ( " mcl_potions:thick " , thick_table )
2024-04-02 05:03:27 +02:00
local mod_table = { }
-- API
-- registers a brewing recipe altering the potion using a table
-- this is supposed to substitute one item with another
function mcl_potions . register_table_modifier ( ingr , modifier )
if mod_table [ ingr ] then
error ( " Attempt to register the same ingredient twice! " )
end
if type ( ingr ) ~= " string " then
error ( " Invalid argument! ingr must be a string " )
end
if type ( modifier ) ~= " table " then
error ( " Invalid argument! modifier must be a table " )
end
mod_table [ ingr ] = modifier
end
2020-05-28 03:15:46 +02:00
2020-06-08 23:47:53 +02:00
local inversion_table = {
[ " mcl_potions:healing " ] = " mcl_potions:harming " ,
[ " mcl_potions:swiftness " ] = " mcl_potions:slowness " ,
[ " mcl_potions:leaping " ] = " mcl_potions:slowness " ,
2020-06-13 01:11:06 +02:00
[ " mcl_potions:night_vision " ] = " mcl_potions:invisibility " ,
2020-06-17 04:29:35 +02:00
[ " mcl_potions:poison " ] = " mcl_potions:harming " ,
2024-04-09 00:25:31 +02:00
[ " mcl_potions:luck " ] = " mcl_potions:bad_luck " ,
[ " mcl_potions:haste " ] = " mcl_potions:fatigue " ,
2024-04-17 22:52:25 +02:00
[ " mcl_potions:saturation " ] = " mcl_potions:food_poisoning " ,
[ " mcl_potions:slow_falling " ] = " mcl_potions:levitation " ,
[ " mcl_potions:absorption " ] = " mcl_potions:health_boost " ,
2024-05-02 04:17:16 +02:00
[ " mcl_potions:glowing " ] = " mcl_potions:darkness " , -- TODO remove after adding a direct recipe?
2020-06-08 23:47:53 +02:00
}
2024-04-02 05:03:27 +02:00
-- API
function mcl_potions . register_inversion_recipe ( input , output )
if inversion_table [ input ] then
error ( " Attempt to register the same input twice! " )
end
if type ( input ) ~= " string " then
error ( " Invalid argument! input must be a string " )
end
if type ( output ) ~= " string " then
error ( " Invalid argument! output must be a string " )
end
inversion_table [ input ] = output
end
local function fill_inversion_table ( ) -- autofills with splash and lingering inversion recipes
local filling_table = { }
for input , output in pairs ( inversion_table ) do
if potions [ input ] . has_splash and potions [ output ] . has_splash then
filling_table [ input .. " _splash " ] = output .. " _splash "
if potions [ input ] . has_lingering and potions [ output ] . has_lingering then
filling_table [ input .. " _lingering " ] = output .. " _lingering "
end
end
end
table.update ( inversion_table , filling_table )
mcl_potions.register_table_modifier ( " mcl_potions:fermented_spider_eye " , inversion_table )
end
minetest.register_on_mods_loaded ( fill_inversion_table )
2020-06-08 23:47:53 +02:00
local splash_table = { }
2020-06-17 23:05:44 +02:00
local lingering_table = { }
2024-04-01 06:58:33 +02:00
for potion , def in pairs ( potions ) do
if def.has_splash then
splash_table [ potion ] = potion .. " _splash "
2024-04-17 22:52:25 +02:00
if def.has_lingering then
lingering_table [ potion .. " _splash " ] = potion .. " _lingering "
end
2024-04-01 06:58:33 +02:00
end
2020-06-08 23:47:53 +02:00
end
2024-04-02 05:03:27 +02:00
mcl_potions.register_table_modifier ( " mcl_mobitems:gunpowder " , splash_table )
mcl_potions.register_table_modifier ( " mcl_potions:dragon_breath " , lingering_table )
2020-06-08 23:47:53 +02:00
2020-06-18 13:43:50 +02:00
2024-04-02 05:03:27 +02:00
local meta_mod_table = { }
-- API
-- registers a brewing recipe altering the potion using a function
-- this is supposed to be a recipe that changes metadata only
function mcl_potions . register_meta_modifier ( ingr , mod_func )
if meta_mod_table [ ingr ] then
error ( " Attempt to register the same ingredient twice! " )
end
if type ( ingr ) ~= " string " then
error ( " Invalid argument! ingr must be a string " )
end
if type ( mod_func ) ~= " function " then
error ( " Invalid argument! mod_func must be a function " )
end
meta_mod_table [ ingr ] = mod_func
end
2020-06-08 23:47:53 +02:00
2024-04-01 06:58:33 +02:00
local function extend_dur ( potionstack )
local def = potions [ potionstack : g et_name ( ) ]
2024-04-02 03:57:14 +02:00
if not def then return false end
2024-04-01 06:58:33 +02:00
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
2024-04-02 05:03:27 +02:00
mcl_potions.register_meta_modifier ( " mesecons:wire_00000000_off " , extend_dur )
2020-07-25 21:27:04 +02:00
2024-04-01 06:58:33 +02:00
local function enhance_pow ( potionstack )
local def = potions [ potionstack : get_name ( ) ]
2024-04-02 03:57:14 +02:00
if not def then return false end
2024-04-01 06:58:33 +02:00
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 )
2020-05-28 00:36:10 +02:00
end
2024-04-01 06:58:33 +02:00
meta : set_int ( " mcl_potions:potion_potent " , def._default_potent_level - 1 )
tt.reload_itemstack_description ( potionstack )
return potionstack
2020-07-25 21:27:04 +02:00
end
2024-04-01 06:58:33 +02:00
return false
end
2024-04-02 05:03:27 +02:00
mcl_potions.register_meta_modifier ( " mcl_nether:glowstone_dust " , enhance_pow )
2020-07-25 21:27:04 +02:00
2020-06-08 23:47:53 +02:00
2024-04-01 06:58:33 +02:00
-- Find an alchemical recipe for given ingredient and potion
-- returns outcome
function mcl_potions . get_alchemy ( ingr , pot )
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
2020-07-25 21:27:04 +02:00
2024-04-01 06:58:33 +02:00
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
2020-06-08 23:47:53 +02:00
end
2024-04-01 06:58:33 +02:00
end
2020-06-17 22:49:52 +02:00
2024-04-01 06:58:33 +02:00
if meta_mod_table [ ingr ] then
local brew_func = meta_mod_table [ ingr ]
if brew_func then return brew_func ( pot ) end
2020-05-28 00:36:10 +02:00
end
2020-06-08 23:47:53 +02:00
2020-05-28 03:15:46 +02:00
return false
2020-05-28 00:36:10 +02:00
end
2021-03-07 00:42:34 +01:00
2023-09-23 20:33:34 +02:00
-- give withering to players in a wither rose
2023-08-09 11:43:00 +02:00
local etime = 0
minetest.register_globalstep ( function ( dtime )
etime = dtime + etime
if etime < 0.5 then return end
etime = 0
for _ , pl in pairs ( minetest.get_connected_players ( ) ) do
2023-09-23 20:33:34 +02:00
local npos = vector.offset ( pl : get_pos ( ) , 0 , 0.2 , 0 )
local n = minetest.get_node ( npos )
if n.name == " mcl_flowers:wither_rose " then mcl_potions.withering_func ( pl , 1 , 2 ) end
2023-08-09 11:43:00 +02:00
end
end )
2021-03-07 00:42:34 +01:00
mcl_wip.register_wip_item ( " mcl_potions:night_vision " )
mcl_wip.register_wip_item ( " mcl_potions:night_vision_splash " )
mcl_wip.register_wip_item ( " mcl_potions:night_vision_lingering " )
mcl_wip.register_wip_item ( " mcl_potions:night_vision_arrow " )