Merge branch 'bzoss_brew' of https://git.minetest.land/Wuzzy/MineClone2 into bzoss_brew

This commit is contained in:
Brandon 2020-06-22 20:52:26 -04:00
commit 6d774acb53
30 changed files with 2729 additions and 73 deletions

View file

@ -202,6 +202,7 @@ There are so many people to list (sorry). Check out the respective mod directori
* [aligator](https://github.com/aligator): Improvement of doors
* [ryvnf](https://github.com/ryvnf): Explosion mechanics
* MysticTempest: Bugfixes
* [bzoss](https://github.com/bzoss): Brewing Stand
* Lots of other people: TO BE WRITTEN (see mod directories for details)
#### Mod credits (summary)

View file

@ -36,17 +36,8 @@ mobs:register_mob("mobs_mc:ghast", {
walk_velocity = 1.6,
run_velocity = 3.2,
drops = {
{name = mobs_mc.items.gunpowder,
chance = 1,
min = 0,
max = 2,},
-- TODO: drop tear when it's useful
-- ghast tear replaced with gunpowder
--{name = mobs_mc.items.ghast_tear,
{name = mobs_mc.items.gunpowder,
chance = 1,
min = 0,
max = 1,},
{name = mobs_mc.items.gunpowder, chance = 1, min = 0, max = 2,},
{name = mobs_mc.items.ghast_tear, chance = 3,min = 0,max = 1,},
},
animation = {
stand_speed = 50, walk_speed = 50, run_speed = 50,

View file

@ -33,6 +33,7 @@ local rabbit = {
drops = {
{name = mobs_mc.items.rabbit_raw, chance = 1, min = 0, max = 1},
{name = mobs_mc.items.rabbit_hide, chance = 1, min = 0, max = 1},
{name = mobs_mc.items.rabbit_foot, chance = 10, min = 0, max = 1},
-- TODO: Drop rabbit's foot when it's useful
--{name = mobs_mc.items.rabbit_foot, chance = 10, min = 1, max = 1},
},

View file

@ -0,0 +1,7 @@
mcl_init
mcl_formspec
mcl_sounds
mcl_potions
mcl_mobitems
mcl_core?
screwdriver?

1043
mods/ITEMS/mcl_brewing/init.lua Executable file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,3 @@
# textdomain: mcl_brewing
Brewing Stand=
The brewing stand allows the creating of potions for the benefit of various effects. Stay tuned for developments, as you can only view the stand and interact with it, but not create potions.

View file

@ -0,0 +1 @@
name = mcl_brewing

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

View file

@ -1,3 +1,5 @@
mcl_core
mcl_farming
mcl_mobitems
mcl_fishing
playerphysics

View file

@ -0,0 +1,469 @@
local is_invisible = {}
local is_poisoned = {}
local is_regenerating = {}
local is_strong = {}
local is_weak = {}
local is_water_breathing = {}
local is_leaping = {}
local is_swift = {}
local is_cat = {}
minetest.register_globalstep(function(dtime)
-- Check for invisible players
for player, vals in pairs(is_invisible) do
if is_invisible[player] and player:get_properties() then
player = player or player:get_luaentity()
is_invisible[player].timer = is_invisible[player].timer + dtime
if player:get_pos() then mcl_potions._add_spawner(player, "#B0B0B0") end
if is_invisible[player].timer >= is_invisible[player].dur then
mcl_potions.make_invisible(player, false)
is_invisible[player] = nil
end
elseif not player:get_properties() then
is_invisible[player] = nil
end
end
-- Check for poisoned players
for player, vals in pairs(is_poisoned) do
if is_poisoned[player] and player:get_properties() then
player = player or player:get_luaentity()
is_poisoned[player].timer = is_poisoned[player].timer + dtime
is_poisoned[player].hit_timer = (is_poisoned[player].hit_timer or 0) + dtime
if player:get_pos() then mcl_potions._add_spawner(player, "#225533") end
if is_poisoned[player].hit_timer >= is_poisoned[player].step then
player:set_hp( math.max(player:get_hp() - 1, 1) )
is_poisoned[player].hit_timer = 0
end
if is_poisoned[player].timer >= is_poisoned[player].dur then
is_poisoned[player] = nil
end
elseif not player:get_properties() then
is_poisoned[player] = nil
end
end
-- Check for regnerating players
for player, vals in pairs(is_regenerating) do
if is_regenerating[player] and player:get_properties() then
player = player or player:get_luaentity()
is_regenerating[player].timer = is_regenerating[player].timer + dtime
is_regenerating[player].heal_timer = (is_regenerating[player].heal_timer or 0) + dtime
if player:get_pos() then mcl_potions._add_spawner(player, "#A52BB2") end
if is_regenerating[player].heal_timer >= is_regenerating[player].step then
player:set_hp(math.min(player:get_properties().hp_max or 20, player:get_hp() + 1))
is_regenerating[player].heal_timer = 0
end
if is_regenerating[player].timer >= is_regenerating[player].dur then
is_regenerating[player] = nil
end
elseif not player:get_properties() then
is_regenerating[player] = nil
end
end
-- Check for water breathing players
for player, vals in pairs(is_water_breathing) do
if is_water_breathing[player] and player:get_properties() then
player = player or player:get_luaentity()
is_water_breathing[player].timer = is_water_breathing[player].timer + dtime
if player:get_pos() then mcl_potions._add_spawner(player, "#0000AA") end
if player:get_breath() then
if player:get_breath() < 10 then player:set_breath(10) end
end
if is_water_breathing[player].timer >= is_water_breathing[player].dur then
is_water_breathing[player] = nil
end
elseif not player:get_properties() then
is_water_breathing[player] = nil
end
end
-- Check for leaping players
for player, vals in pairs(is_leaping) do
if is_leaping[player] and player:get_properties() then
player = player or player:get_luaentity()
is_leaping[player].timer = is_leaping[player].timer + dtime
if player:get_pos() then mcl_potions._add_spawner(player, "#00CC33") end
if is_leaping[player].timer >= is_leaping[player].dur then
playerphysics.remove_physics_factor(player, "jump", "leaping")
is_leaping[player] = nil
end
elseif not player:get_properties() then
is_leaping[player] = nil
end
end
-- Check for swift players
for player, vals in pairs(is_swift) do
if is_swift[player] and player:get_properties() then
player = player or player:get_luaentity()
is_swift[player].timer = is_swift[player].timer + dtime
if player:get_pos() then mcl_potions._add_spawner(player, "#009999") end
if is_swift[player].timer >= is_swift[player].dur then
playerphysics.remove_physics_factor(player, "speed", "swiftness")
is_swift[player] = nil
end
elseif not player:get_properties() then
is_swift[player] = nil
end
end
-- Check for Night Vision equipped players
for player, vals in pairs(is_cat) do
if is_cat[player] and player:get_properties() then
player = player or player:get_luaentity()
is_cat[player].timer = is_cat[player].timer + dtime
if player:get_pos() then mcl_potions._add_spawner(player, "#1010AA") end
player:override_day_night_ratio(0.45)
if is_cat[player].timer >= is_cat[player].dur then
is_cat[player] = nil
end
elseif not player:get_properties() then
is_cat[player] = nil
end
end
end )
-- reset player is_invisible/poison if they go offline
minetest.register_on_leaveplayer(function(player)
player = player or player:get_luaentity()
if is_invisible[player] then
is_invisible[player] = nil
end
if is_poisoned[player] then
is_poisoned[player] = nil
end
if is_regenerating[player] then
is_regenerating[player] = nil
end
if is_strong[player] then
is_strong[player] = nil
end
if is_weak[player] then
is_weak[player] = nil
end
if is_water_breathing[player] then
is_water_breathing[player] = nil
end
if is_leaping[player] then
is_leaping[player] = nil
end
if is_swift[player] then
is_swift[player] = nil
end
if is_cat[player] then
is_cat[player] = nil
end
end)
function mcl_potions.make_invisible(player, toggle)
if not player then return false end
if toggle then -- hide player
is_invisible[player].old_size = player:get_properties().visual_size
player:set_properties({visual_size = {x = 0, y = 0}})
player:set_nametag_attributes({color = {a = 0}})
else -- show player
player:set_properties({visual_size = is_invisible[player].old_size})
player:set_nametag_attributes({color = {a = 255}})
end
end
function mcl_potions.poison(player, toggle)
if not player then return false end
is_poisoned[player:get_player_name()] = toggle
end
function mcl_potions.regenerate(player, toggle)
if not player then return false end
is_regenerating[player:get_player_name()] = toggle
end
function mcl_potions._use_potion(item, obj, color)
local d = 0.1
local pos = obj:get_pos()
item:replace("mcl_potions:glass_bottle")
minetest.sound_play("mcl_potions_drinking", {pos = pos, max_hear_distance = 6, gain = 1})
minetest.add_particlespawner({
amount = 25,
time = 1,
minpos = {x=pos.x-d, y=pos.y+1, z=pos.z-d},
maxpos = {x=pos.x+d, y=pos.y+2, z=pos.z+d},
minvel = {x=-0.1, y=0, z=-0.1},
maxvel = {x=0.1, y=0.1, z=0.1},
minacc = {x=-0.1, y=0, z=-0.1},
maxacc = {x=0.1, y=.1, z=0.1},
minexptime = 1,
maxexptime = 5,
minsize = 0.5,
maxsize = 1,
collisiondetection = true,
vertical = false,
texture = "mcl_potions_sprite.png^[colorize:"..color..":127",
})
end
function mcl_potions._add_spawner(obj, color)
local d = 0.2
local pos = obj:get_pos()
minetest.add_particlespawner({
amount = 2,
time = 1,
minpos = {x=pos.x-d, y=pos.y+1, z=pos.z-d},
maxpos = {x=pos.x+d, y=pos.y+2, z=pos.z+d},
minvel = {x=-0.1, y=0, z=-0.1},
maxvel = {x=0.1, y=0.1, z=0.1},
minacc = {x=-0.1, y=0, z=-0.1},
maxacc = {x=0.1, y=.1, z=0.1},
minexptime = 0.5,
maxexptime = 1,
minsize = 0.5,
maxsize = 1,
collisiondetection = false,
vertical = false,
texture = "mcl_potions_sprite.png^[colorize:"..color..":127",
})
end
local is_zombie = {}
for i, zombie in ipairs({"husk","zombie","pigman"}) do
is_zombie["mobs_mc:"..zombie] = true
is_zombie["mobs_mc:baby_"..zombie] = true
end
function mcl_potions.healing_func(player, hp)
if is_zombie[player:get_entity_name()] then hp = -hp end
if hp > 0 then
player:set_hp(math.min(player:get_hp() + hp, player:get_properties().hp_max))
else
player:set_hp(math.max(player:get_hp() + hp, 1))
end
end
function mcl_potions.swiftness_func(player, factor, duration)
if not player:get_meta() then return false end
if not is_swift[player] then
is_swift[player] = {dur = duration, timer = 0}
playerphysics.add_physics_factor(player, "speed", "swiftness", factor)
else
local victim = is_swift[player]
playerphysics.add_physics_factor(player, "speed", "swiftness", factor)
victim.dur = math.max(duration, victim.dur - victim.timer)
victim.timer = 0
end
end
function mcl_potions.leaping_func(player, factor, duration)
if not player:get_meta() then return false end
if not is_leaping[player] then
is_leaping[player] = {dur = duration, timer = 0}
playerphysics.add_physics_factor(player, "jump", "leaping", factor)
else
local victim = is_leaping[player]
playerphysics.add_physics_factor(player, "jump", "leaping", factor)
victim.dur = math.max(duration, victim.dur - victim.timer)
victim.timer = 0
end
end
function mcl_potions.weakness_func(player, factor, duration)
player:set_attribute("weakness", tostring(factor))
-- print(player:get_player_name().." ".."weakness = "..player:get_attribute("weakness"))
minetest.after(duration, function() player:set_attribute("weakness", tostring(0)) end )
for i=1,math.floor(duration) do
minetest.after(i, function() mcl_potions._add_spawner(player, "#6600AA") end)
end
end
function mcl_potions.poison_func(player, factor, duration)
if not is_poisoned[player] then
is_poisoned[player] = {step = factor, dur = duration, timer = 0}
else
local victim = is_poisoned[player]
victim.step = math.min(victim.step, factor)
victim.dur = math.max(duration, victim.dur - victim.timer)
victim.timer = 0
end
end
function mcl_potions.regeneration_func(player, factor, duration)
if not is_regenerating[player] then
is_regenerating[player] = {step = factor, dur = duration, timer = 0}
else
local victim = is_regenerating[player]
victim.step = math.min(victim.step, factor)
victim.dur = math.max(duration, victim.dur - victim.timer)
victim.timer = 0
end
end
function mcl_potions.invisiblility_func(player, duration)
if not is_invisible[player] then
is_invisible[player] = {dur = duration, timer = 0}
mcl_potions.make_invisible(player, true)
else
local victim = is_invisible[player]
victim.dur = math.max(duration, victim.dur - victim.timer)
victim.timer = 0
end
end
function mcl_potions.water_breathing_func(player, duration)
if not is_water_breathing[player] then
is_water_breathing[player] = {dur = duration, timer = 0}
else
local victim = is_water_breathing[player]
victim.dur = math.max(duration, victim.dur - victim.timer)
victim.timer = 0
end
end
function mcl_potions.fire_resistance_func(player, duration)
end
function mcl_potions.night_vision_func(player, duration)
if not is_cat[player] then
is_cat[player] = {dur = duration, timer = 0}
else
local victim = is_cat[player]
victim.dur = math.max(duration, victim.dur - victim.timer)
victim.timer = 0
end
end

View file

@ -1,6 +1,13 @@
local S = minetest.get_translator("mcl_potions")
mcl_potions = {}
local brewhelp = S("Put this item in an item frame for decoration. It's useless otherwise.")
local modpath = minetest.get_modpath("mcl_potions")
dofile(modpath .. "/functions.lua")
dofile(modpath .. "/splash.lua")
dofile(modpath .. "/lingering.lua")
dofile(modpath .. "/potions.lua")
local brewhelp = S("Try different combinations to create potions.")
minetest.register_craftitem("mcl_potions:fermented_spider_eye", {
description = S("Fermented Spider Eye"),
@ -8,7 +15,7 @@ minetest.register_craftitem("mcl_potions:fermented_spider_eye", {
wield_image = "mcl_potions_spider_eye_fermented.png",
inventory_image = "mcl_potions_spider_eye_fermented.png",
-- TODO: Reveal item when it's actually useful
groups = { brewitem = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1 },
groups = { brewitem = 1, not_in_creative_inventory = 0, not_in_craft_guide = 0 },
stack_max = 64,
})
@ -87,9 +94,9 @@ minetest.register_craftitem("mcl_potions:glass_bottle", {
-- place the water potion at a place where's space
local water_bottle
if river_water then
water_bottle = ItemStack("mcl_potions:potion_river_water")
water_bottle = ItemStack("mcl_potions:river_water")
else
water_bottle = ItemStack("mcl_potions:potion_water")
water_bottle = ItemStack("mcl_potions:water")
end
local inv = placer:get_inventory()
if creative then
@ -130,9 +137,11 @@ local potion_image = function(colorstring, opacity)
if not opacity then
opacity = 127
end
return "mcl_potions_potion_bottle_drinkable.png^(mcl_potions_potion_overlay.png^[colorize:"..colorstring..":"..tostring(opacity)..")"
return "mcl_potions_potion_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_potion_bottle_drinkable.png"
end
-- Cauldron fill up rules:
-- Adding any water increases the water level by 1, preserving the current water type
local cauldron_levels = {
@ -158,7 +167,7 @@ end
-- Itemstring of potions is “mcl_potions:potion_<NBT Potion Tag>”
minetest.register_craftitem("mcl_potions:potion_water", {
minetest.register_craftitem("mcl_potions:water", {
description = S("Water Bottle"),
_tt_help = S("No effect"),
_doc_items_longdesc = S("Water bottles can be used to fill cauldrons. Drinking water has no effect."),
@ -203,7 +212,7 @@ minetest.register_craftitem("mcl_potions:potion_water", {
on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"),
})
minetest.register_craftitem("mcl_potions:potion_river_water", {
minetest.register_craftitem("mcl_potions:river_water", {
description = S("River Water Bottle"),
_tt_help = S("No effect"),
_doc_items_longdesc = S("River water bottles can be used to fill cauldrons. Drinking it has no effect."),
@ -250,55 +259,11 @@ minetest.register_craftitem("mcl_potions:potion_river_water", {
})
local how_to_drink = S("Use the “Place” key to drink it.")
minetest.register_craftitem("mcl_potions:potion_awkward", {
description = S("Awkward Potion"),
_tt_help = S("No effect"),
_doc_items_longdesc = S("This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect."),
_doc_items_usagehelp = how_to_drink,
stack_max = 1,
inventory_image = potion_image("#0000FF"),
wield_image = potion_image("#0000FF"),
-- TODO: Reveal item when it's actually useful
groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1},
on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"),
on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"),
})
minetest.register_craftitem("mcl_potions:potion_mundane", {
description = S("Mundane Potion"),
_tt_help = S("No effect"),
_doc_items_longdesc = S("This potion has a clean taste and is used for brewing more potions. Drinking it has no effect."),
_doc_items_usagehelp = how_to_drink,
stack_max = 1,
inventory_image = potion_image("#0000FF"),
wield_image = potion_image("#0000FF"),
-- TODO: Reveal item when it's actually useful
groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1 },
on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"),
on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"),
})
minetest.register_craftitem("mcl_potions:potion_thick", {
description = S("Thick Potion"),
_tt_help = S("No effect"),
_doc_items_longdesc = S("This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect."),
_doc_items_usagehelp = how_to_drink,
stack_max = 1,
inventory_image = potion_image("#0000FF"),
wield_image = potion_image("#0000FF"),
-- TODO: Reveal item when it's actually useful
groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1 },
on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"),
on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"),
})
minetest.register_craftitem("mcl_potions:speckled_melon", {
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."),
stack_max = 64,
-- TODO: Reveal item when it's actually useful
groups = { brewitem = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1 },
groups = { brewitem = 1, not_in_creative_inventory = 0, not_in_craft_guide = 1 },
inventory_image = "mcl_potions_melon_speckled.png",
})
@ -311,12 +276,127 @@ minetest.register_craft({
}
})
minetest.register_craftitem("mcl_potions:dragon_breath", {
description = S("Dragon's Breath"),
_doc_items_longdesc = brewhelp,
wield_image = "mcl_potions_dragon_breath.png",
inventory_image = "mcl_potions_dragon_breath.png",
-- TODO: Reveal item when it's actually useful
groups = { brewitem = 1, not_in_creative_inventory = 1 },
stack_max = 64,
})
-- duration effects of redstone are a factor of 8/3
-- duration effects of glowstone are a time factor of 1/2 and effect of 14/12
-- splash potion effects are reduced by a factor of 3/4
local water_table = {
["mcl_nether:nether_wart_item"] = "mcl_potions:awkward",
["mcl_potions:fermented_spider_eye"] = "mcl_potions:weakness",
["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",
["mcl_mobitems:rabbit_foot"] = "mcl_potions:mundane"
}
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",
["mcl_mobitems:magma_cream"] = "mcl_potions:fire_resistance", --add craft
["mcl_mobitems:blaze_powder"] = "mcl_potions:strength", --add craft
["mcl_fishing:pufferfish_raw"] = "mcl_potions:water_breathing",
["mcl_mobitems:ghast_tear"] = "mcl_potions:regeneration",
["mcl_mobitems:spider_eye"] = "mcl_potions:poison",
["mcl_mobitems:rabbit_foot"] = "mcl_potions:leaping",
}
local output_table = {
["mcl_potions:river_water"] = water_table,
["mcl_potions:water"] = water_table,
["mcl_potions:awkward"] = awkward_table,
}
local enhancement_table = {}
local extension_table = {}
local potions = {"awkward", "mundane", "thick"}
for i, potion in ipairs({"healing","harming","swiftness","leaping","poison","regeneration","invisibility","weakness","water_breathing","night_vision"}) 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
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"] = "mlc_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"] = "mlc_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",
}
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"
end
for i, potion in ipairs({"awkward", "mundane", "thick", "water", "river_water"}) do
splash_table["mcl_potions:"..potion] = "mcl_potions:"..potion.."_splash"
lingering_table["mcl_potions:"..potion.."_splash"] = "mcl_potions:"..potion.."_lingering"
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
function mcl_potions.get_alchemy(ingr, pot)
if output_table[pot] ~= nil then
local brew_table = output_table[pot]
if brew_table[ingr] ~= nil then
return brew_table[ingr]
end
elseif mod_table[ingr] ~= nil then
local brew_table = mod_table[ingr]
if brew_table[pot] ~= nil then
return brew_table[pot]
end
end
return false
end

View file

@ -0,0 +1,183 @@
local lingering_image = function(colorstring, opacity)
if not opacity then
opacity = 127
end
return "mcl_potions_splash_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_splash_bottle.png"
end
local function register_lingering(name, descr, color, def)
local id = "mcl_potions:"..name.."_lingering"
minetest.register_craftitem(id, {
description = descr,
inventory_image = lingering_image(color),
on_use = function(item, placer, pointed_thing)
--weapons_shot(itemstack, placer, pointed_thing, def.velocity, name)
local velocity = 10
local dir = placer:get_look_dir();
local pos = placer:getpos();
local obj = minetest.env:add_entity({x=pos.x+dir.x,y=pos.y+2+dir.y,z=pos.z+dir.z}, id.."_flying")
obj:setvelocity({x=dir.x*velocity,y=dir.y*velocity,z=dir.z*velocity})
obj:setacceleration({x=0, y=-9.8, z=0})
item:take_item()
return item
end,
stack_max = 1,
})
local w = 0.7
minetest.register_entity(id.."_flying",{
textures = {lingering_image(color)},
hp_max = 1,
visual_size = {x=w/2,y=w/2},
collisionbox = {0,0,0,0,0,0},
on_step = function(self, dtime)
local pos = self.object:getpos()
local node = minetest.get_node(pos)
local n = node.name
local d = 2
local redux_map = {7/8,0.5,0.25}
if n ~= "air" then
minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1})
minetest.add_particlespawner({
amount = 1000,
time = 30,
minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d},
maxpos = {x=pos.x+d, y=pos.y+d, z=pos.z+d},
minvel = {x=-0.5, y=0, z=-0.5},
maxvel = {x=0.5, y=0.5, z=0.5},
minacc = {x=-0.2, y=0, z=-0.2},
maxacc = {x=0.2, y=.05, z=0.2},
minexptime = 1,
maxexptime = 2,
minsize = 2,
maxsize = 4,
collisiondetection = true,
vertical = false,
texture = "mcl_potions_sprite.png^[colorize:"..color..":127",
})
self.object:remove()
for i, obj in ipairs(minetest.get_objects_inside_radius(pos, 4)) do
if minetest.is_player(obj) or obj:get_entity_name() then
pos2 = obj:get_pos()
local rad = math.floor(math.sqrt((pos2.x-pos.x)^2 + (pos2.y-pos.y)^2 + (pos2.z-pos.z)^2))
if rad > 0 then def.potion_fun(obj, redux_map[rad]) else def.potion_fun(obj, 1) end
end
end
end
end,
})
end
register_lingering("water", "Lingering Potion", "#0000FF", {
potion_fun = function(player, redx) end,
})
register_lingering("river_water", "Lingering Potion", "#0000FF", {
potion_fun = function(player, redx) end,
})
register_lingering("awkward", "Lingering Awkward Potion", "#0000FF", {
potion_fun = function(player, redx) end,
})
register_lingering("mundane", "Lingering Mundane Potion", "#0000FF", {
potion_fun = function(player, redx) end,
})
register_lingering("thick", "Lingering Thick Potion", "#0000FF", {
potion_fun = function(player, redx) end,
})
register_lingering("healing", "Lingering Healing", "#AA0000", {
potion_fun = function(player, redx) player:set_hp(player:get_hp() + 3*redx) end,
})
register_lingering("healing_2", "Lingering Healing II", "#DD0000", {
potion_fun = function(player, redx) player:set_hp(player:get_hp() + 6*redx) end,
})
register_lingering("harming", "Lingering Harming", "#660099", {
potion_fun = function(player, redx) mcl_potions.healing_func(player, -4*redx) end,
})
register_lingering("harming_2", "Lingering Harming II", "#330066", {
potion_fun = function(player, redx) mcl_potions.healing_func(player, -6*redx) end,
})
register_lingering("leaping", "Lingering Leaping", "#00CC33", {
potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, 135*redx) end
})
register_lingering("leaping_2", "Lingering Leaping II", "#00EE33", {
potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.4, 135*redx) end
})
register_lingering("leaping_plus", "Lingering Leaping +", "#00DD33", {
potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, 360*redx) end
})
register_lingering("swiftness", "Lingering Swiftness", "#009999", {
potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, 135*redx) end
})
register_lingering("swiftness_2", "Lingering Swiftness II", "#00BBBB", {
potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.4, 135*redx) end
})
register_lingering("swiftness_plus", "Lingering Swiftness +", "#00BBBB", {
potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, 360*redx) end
})
register_lingering("slowness", "Lingering Slowness ", "#000080", {
potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, 68*redx) end
})
register_lingering("slowness_plus", "Lingering Slowness +", "#000066", {
potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, 180*redx) end
})
register_lingering("poison", "Lingering Poison", "#335544", {
potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, 45*redx) end
})
register_lingering("poison_2", "Lingering Poison II", "#446655", {
potion_fun = function(player, redx) mcl_potions.poison_func(player, 1.2, 21*redx) end
})
register_lingering("poison_plus", "Lingering Poison +", "#557766", {
potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, 90*redx) end
})
register_lingering("regeneration", "Lingering Regeneration", "#A52BB2", {
potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, 45*redx) end
})
register_lingering("regeneration_2", "Lingering Regeneration II", "#B52CC2", {
potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 1.2, 21*redx) end
})
register_lingering("regeneration_plus", "Lingering Regeneration +", "#C53DD3", {
potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, 90*redx) end
})
register_lingering("invisibility", "Lingering Invisibility", "#B0B0B0", {
potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, 135*redx) end
})
register_lingering("invisibility_plus", "Lingering Invisibility +", "#A0A0A0", {
potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, 300*redx) end
})
register_lingering("weakness", "Lingering Weakness", "#6600AA", {
potion_fun = function(player, redx) mcl_potions.weakness_func(player, 1.2, 68*redx) end
})
register_lingering("weakness_plus", "Lingering Weakness +", "#7700BB", {
potion_fun = function(player, redx) mcl_potions.weakness_func(player, 1.4, 180*redx) end
})

View file

@ -0,0 +1,669 @@
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_drinkable.png"
end
local how_to_drink = S("Use the “Place” key to drink it.")
minetest.register_craftitem("mcl_potions:awkward", {
description = S("Awkward Potion"),
_tt_help = S("No effect"),
_doc_items_longdesc = S("This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect."),
_doc_items_usagehelp = how_to_drink,
stack_max = 1,
inventory_image = potion_image("#0000FF"),
wield_image = potion_image("#0000FF"),
-- TODO: Reveal item when it's actually useful
groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1},
on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"),
on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"),
})
minetest.register_craftitem("mcl_potions:mundane", {
description = S("Mundane Potion"),
_tt_help = S("No effect"),
_doc_items_longdesc = S("This potion has a clean taste and is used for brewing more potions. Drinking it has no effect."),
_doc_items_usagehelp = how_to_drink,
stack_max = 1,
inventory_image = potion_image("#0000FF"),
wield_image = potion_image("#0000FF"),
-- TODO: Reveal item when it's actually useful
groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1 },
on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"),
on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"),
})
minetest.register_craftitem("mcl_potions:thick", {
description = S("Thick Potion"),
_tt_help = S("No effect"),
_doc_items_longdesc = S("This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect."),
_doc_items_usagehelp = how_to_drink,
stack_max = 1,
inventory_image = potion_image("#0000FF"),
wield_image = potion_image("#0000FF"),
-- TODO: Reveal item when it's actually useful
groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 },
on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"),
on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"),
})
minetest.register_craftitem("mcl_potions:dragon_breath", {
description = S("Dragon's Breath"),
_doc_items_longdesc = brewhelp,
wield_image = "mcl_potions_dragon_breath.png",
inventory_image = "mcl_potions_dragon_breath.png",
groups = { brewitem = 1, not_in_creative_inventory = 0 },
stack_max = 1,
})
minetest.register_craftitem("mcl_potions:healing", {
description = S("Healing Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#CC0000"),
inventory_image = potion_image("#CC0000"),
groups = { brewitem = 1, food=3, can_eat_when_full=1 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.healing_func(user, 4)
mcl_potions._use_potion(itemstack, user, "#CC0000")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.healing_func(user, 4)
mcl_potions._use_potion(itemstack, user, "#CC0000")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:healing_2", {
description = S("Healing Potion II"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#DD0000"),
inventory_image = potion_image("#DD0000"),
groups = { brewitem = 1, food=3, can_eat_when_full=1 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.healing_func(user, 8)
mcl_potions._use_potion(itemstack, user, "#DD0000")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.healing_func(user, 8)
mcl_potions._use_potion(itemstack, user, "#DD0000")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:harming", {
description = S("Harming Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#660099"),
inventory_image = potion_image("#660099"),
groups = { brewitem = 1, food=3, can_eat_when_full=1 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.healing_func(user, -6)
mcl_potions._use_potion(itemstack, user, "#660099")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.healing_func(user, -6)
mcl_potions._use_potion(itemstack, user, "#660099")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:harming_2", {
description = S("Harming Potion II"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#330066"),
inventory_image = potion_image("#330066"),
groups = { brewitem = 1, food=3, can_eat_when_full=1 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.healing_func(user, -12)
mcl_potions._use_potion(itemstack, user, "#330066")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.healing_func(user, -12)
mcl_potions._use_potion(itemstack, user, "#330066")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:night_vision", {
description = S("Night Vision Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#1010AA"),
inventory_image = potion_image("#1010AA"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.night_vision_func(user, 180)
mcl_potions._use_potion(itemstack, user, "#1010AA")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.night_vision_func(user, 180)
mcl_potions._use_potion(itemstack, user, "#1010AA")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:night_vision_plus", {
description = S("Night Vision Potion +"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#2020BA"),
inventory_image = potion_image("#2020BA"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.night_vision_func(user, 480)
mcl_potions._use_potion(itemstack, user, "#2020BA")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.night_vision_func(user, 480)
mcl_potions._use_potion(itemstack, user, "#2020BA")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:swiftness", {
description = S("Swiftness Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#009999"),
inventory_image = potion_image("#009999"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.swiftness_func(user, 1.2, 180)
mcl_potions._use_potion(itemstack, user, "#009999")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.swiftness_func(user, 1.2, 180)
mcl_potions._use_potion(itemstack, user, "#009999")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:swiftness_2", {
description = S("Swiftness Potion II"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#00BBBB"),
inventory_image = potion_image("#00BBBB"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.swiftness_func(user, 1.4, 90)
mcl_potions._use_potion(itemstack, user, "#00BBBB")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.swiftness_func(user, 1.4, 90)
mcl_potions._use_potion(itemstack, user, "#00BBBB")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:swiftness_plus", {
description = S("Swiftness Potion +"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#00AAAA"),
inventory_image = potion_image("#00AAAA"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.swiftness_func(user, 1.2, 480)
mcl_potions._use_potion(itemstack, user, "#00AAAA")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.swiftness_func(user, 1.2, 480)
mcl_potions._use_potion(itemstack, user, "#00AAAA")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:slowness", {
description = S("Slowness Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#000080"),
inventory_image = potion_image("#000080"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.swiftness_func(user, 0.85, 90)
mcl_potions._use_potion(itemstack, user, "#000080")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.swiftness_func(user, 0.85, 90)
mcl_potions._use_potion(itemstack, user, "#000080")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:slowness_plus", {
description = S("Slowness Potion +"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#000066"),
inventory_image = potion_image("#000066"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.swiftness_func(user, 0.85, 240)
mcl_potions._use_potion(itemstack, user, "#000066")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.swiftness_func(user, 0.85, 240)
mcl_potions._use_potion(itemstack, user, "#000066")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:leaping", {
description = S("Leaping Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#00CC33"),
inventory_image = potion_image("#00CC33"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.leaping_func(user, 1.2, 180)
mcl_potions._use_potion(itemstack, user, "#00CC33")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.leaping_func(user, 1.2, 180)
mcl_potions._use_potion(itemstack, user, "#00CC33")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:leaping_2", {
description = S("Leaping Potion II"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#00EE33"),
inventory_image = potion_image("#00EE33"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.leaping_func(user, 1.4, 90)
mcl_potions._use_potion(itemstack, user, "#00EE33")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.leaping_func(user, 1.4, 90)
mcl_potions._use_potion(itemstack, user, "#00EE33")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:leaping_plus", {
description = S("Leaping Potion +"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#00DD33"),
inventory_image = potion_image("#00DD33"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.leaping_func(user, 1.2, 480)
mcl_potions._use_potion(itemstack, user, "#00DD33")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.leaping_func(user, 1.2, 480)
mcl_potions._use_potion(itemstack, user, "#00DD33")
return itemstack
end,
})
minetest.register_craftitem("mcl_potions:weakness", {
description = S("Weakness Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#6600AA"),
inventory_image = potion_image("#6600AA"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.weakness_func(user, 1.2, 90)
mcl_potions._use_potion(itemstack, user, "#6600AA")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.weakness_func(user, 1.2, 90)
mcl_potions._use_potion(itemstack, user, "#6600AA")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:weakness_plus", {
description = S("Weakness Potion +"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#7700BB"),
inventory_image = potion_image("#7700BB"),
groups = { brewitem = 1, food=0},
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.weakness_func(user, 1.4, 240)
mcl_potions._use_potion(itemstack, user, "#7700BB")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.weakness_func(user, 1.4, 240)
mcl_potions._use_potion(itemstack, user, "#7700BB")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:poison", {
description = S("Poison Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#225533"),
inventory_image = potion_image("#225533"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.poison_func(user, 2.5, 45)
mcl_potions._use_potion(itemstack, user, "#225533")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.poison_func(user, 2.5, 45)
mcl_potions._use_potion(itemstack, user, "#225533")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:poison_2", {
description = S("Poison Potion II"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#447755"),
inventory_image = potion_image("#447755"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.poison_func(user, 1.2, 21)
mcl_potions._use_potion(itemstack, user, "#447755")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.poison_func(user, 1.2, 21)
mcl_potions._use_potion(itemstack, user, "#447755")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:poison_plus", {
description = S("Poison Potion +"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#336644"),
inventory_image = potion_image("#336644"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.poison_func(user, 2.5, 90)
mcl_potions._use_potion(itemstack, user, "#336644")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.poison_func(user, 2.5, 90)
mcl_potions._use_potion(itemstack, user, "#336644")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:regeneration", {
description = S("Regeneration Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#A52BB2"),
inventory_image = potion_image("#A52BB2"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.regeneration_func(user, 2.5, 45)
mcl_potions._use_potion(itemstack, user, "#A52BB2")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.regeneration_func(user, 2.5, 45)
mcl_potions._use_potion(itemstack, user, "#A52BB2")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:regeneration_2", {
description = S("Regeneration Potion II"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#B52CC2"),
inventory_image = potion_image("#B52CC2"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.regeneration_func(user, 1.2, 22)
mcl_potions._use_potion(itemstack, user, "#B52CC2")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.regeneration_func(user, 1.2, 22)
mcl_potions._use_potion(itemstack, user, "#B52CC2")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:regeneration_plus", {
description = S("Regeneration Potion +"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#C53DD3"),
inventory_image = potion_image("#C53DD3"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.regeneration_func(user, 2.5, 90)
mcl_potions._use_potion(itemstack, user, "#C53DD3")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.regeneration_func(user, 2.5, 90)
mcl_potions._use_potion(itemstack, user, "#C53DD3")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:invisibility", {
description = S("Invisibility Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#B0B0B0"),
inventory_image = potion_image("#B0B0B0"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.invisiblility_func(user, 180)
mcl_potions._use_potion(itemstack, user, "#B0B0B0")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.invisiblility_func(user, 180)
mcl_potions._use_potion(itemstack, user, "#B0B0B0")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:invisibility_plus", {
description = S("Invisibility Potion +"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#A0A0A0"),
inventory_image = potion_image("#A0A0A0"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.invisiblility_func(user, 480)
mcl_potions._use_potion(itemstack, user, "#A0A0A0")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.invisiblility_func(user, 480)
mcl_potions._use_potion(itemstack, user, "#A0A0A0")
return itemstack
end
})
-- Look into reducing attack on punch
minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
if puncher:get_attribute("weakness") then
print("Weakness Active")
end
end)
minetest.register_craftitem("mcl_potions:water_breathing", {
description = S("Water Breathing Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#0000AA"),
inventory_image = potion_image("#0000AA"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.water_breathing_func(user, 180)
mcl_potions._use_potion(itemstack, user, "#0000AA")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.water_breathing_func(user, 180)
mcl_potions._use_potion(itemstack, user, "#0000AA")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:water_breathing_plus", {
description = S("Water Breathing Potion +"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#0000CC"),
inventory_image = potion_image("#0000CC"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.water_breathing_func(user, 480)
mcl_potions._use_potion(itemstack, user, "#0000CC")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.water_breathing_func(user, 480)
mcl_potions._use_potion(itemstack, user, "#0000CC")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:fire_resistance", {
description = S("Fire Resistance Potion"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#D0A040"),
inventory_image = potion_image("#D0A040"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.fire_resistance_func(user, 180)
mcl_potions._use_potion(itemstack, user, "#D0A040")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.fire_resistance_func(user, 180)
mcl_potions._use_potion(itemstack, user, "#D0A040")
return itemstack
end
})
minetest.register_craftitem("mcl_potions:fire_resistance_plus", {
description = S("Fire Resistance Potion +"),
_doc_items_longdesc = brewhelp,
wield_image = potion_image("#E0B050"),
inventory_image = potion_image("#E0B050"),
groups = { brewitem = 1, food = 0 },
stack_max = 1,
on_place = function(itemstack, user, pointed_thing)
mcl_potions.fire_resistance_func(user, 480)
mcl_potions._use_potion(itemstack, user, "#E0B050")
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
mcl_potions.fire_resistance_func(user, 480)
mcl_potions._use_potion(itemstack, user, "#E0B050")
return itemstack
end
})

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,206 @@
local splash_image = function(colorstring, opacity)
if not opacity then
opacity = 127
end
return "mcl_potions_splash_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_splash_bottle.png"
end
local function register_splash(name, descr, color, def)
local id = "mcl_potions:"..name.."_splash"
minetest.register_craftitem(id, {
description = descr,
inventory_image = splash_image(color),
on_use = function(item, placer, pointed_thing)
local velocity = 10
local dir = placer:get_look_dir();
local pos = placer:get_pos();
local obj = minetest.env:add_entity({x=pos.x+dir.x,y=pos.y+2+dir.y,z=pos.z+dir.z}, id.."_flying")
obj:set_velocity({x=dir.x*velocity,y=dir.y*velocity,z=dir.z*velocity})
obj:set_acceleration({x=0, y=-9.8, z=0})
item:take_item()
return item
end,
stack_max = 1,
})
local w = 0.7
minetest.register_entity(id.."_flying",{
textures = {splash_image(color)},
hp_max = 1,
visual_size = {x=w/2,y=w/2},
collisionbox = {0,0,0,0,0,0},
on_step = function(self, dtime)
local pos = self.object:getpos()
local node = minetest.get_node(pos)
local n = node.name
local d = 2
local redux_map = {7/8,0.5,0.25}
if n ~= "air" then
minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1})
minetest.add_particlespawner({
amount = 50,
time = 2,
minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d},
maxpos = {x=pos.x+d, y=pos.y+d, z=pos.z+d},
minvel = {x=-1, y=0, z=-1},
maxvel = {x=1, y=0.5, z=1},
minacc = {x=-0.5, y=0, z=-0.5},
maxacc = {x=0.5, y=.2, z=0.5},
minexptime = 1,
maxexptime = 3,
minsize = 2,
maxsize = 4,
collisiondetection = true,
vertical = false,
texture = "mcl_potions_sprite.png^[colorize:"..color..":127",
})
self.object:remove()
for i, obj in ipairs(minetest.get_objects_inside_radius(pos, 4)) do
if minetest.is_player(obj) or obj:get_entity_name() then
local pos2 = obj:get_pos()
local rad = math.floor(math.sqrt((pos2.x-pos.x)^2 + (pos2.y-pos.y)^2 + (pos2.z-pos.z)^2))
if rad > 0 then def.potion_fun(obj, redux_map[rad]) else def.potion_fun(obj, 1) end
end
end
end
end,
})
end
register_splash("water", "Splash Water", "#0000FF", {
potion_fun = function(player, redx) end,
})
register_splash("river_water", "Splash River Water", "#0000FF", {
potion_fun = function(player, redx) end,
})
register_splash("awkward", "Splash Awkward Potion", "#0000FF", {
potion_fun = function(player, redx) end,
})
register_splash("mundane", "Splash Mundane Potion", "#0000FF", {
potion_fun = function(player, redx) end,
})
register_splash("thick", "Splash Thick Potion", "#0000FF", {
potion_fun = function(player, redx) end,
})
register_splash("healing", "Splash Healing", "#AA0000", {
potion_fun = function(player, redx) mcl_potions.healing_func(player, 3*redx) end,
})
register_splash("healing_2", "Splash Healing II", "#DD0000", {
potion_fun = function(player, redx) mcl_potions.healing_func(player, 6*redx) end,
})
register_splash("harming", "Splash Harming", "#660099", {
potion_fun = function(player, redx) mcl_potions.healing_func(player, -4*redx) end,
})
register_splash("harming_2", "Splash Harming II", "#330066", {
potion_fun = function(player, redx) mcl_potions.healing_func(player, -6*redx) end,
})
register_splash("leaping", "Splash Leaping", "#00CC33", {
potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, 135*redx) end
})
register_splash("leaping_2", "Splash Leaping II", "#00EE33", {
potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.4, 135*redx) end
})
register_splash("leaping_plus", "Splash Leaping +", "#00DD33", {
potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, 360*redx) end
})
register_splash("swiftness", "Splash Swiftness", "#009999", {
potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, 135*redx) end
})
register_splash("swiftness_2", "Splash Swiftness II", "#00BBBB", {
potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.4, 135*redx) end
})
register_splash("swiftness_plus", "Splash Swiftness +", "#00BBBB", {
potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, 360*redx) end
})
register_splash("slowness", "Splash Slowness ", "#000080", {
potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, 68*redx) end
})
register_splash("slowness_plus", "Splash Slowness +", "#000066", {
potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, 180*redx) end
})
register_splash("poison", "Splash Poison", "#335544", {
potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, 45*redx) end
})
register_splash("poison_2", "Splash Poison II", "#446655", {
potion_fun = function(player, redx) mcl_potions.poison_func(player, 1.2, 21*redx) end
})
register_splash("poison_plus", "Splash Poison +", "#557766", {
potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, 90*redx) end
})
register_splash("regeneration", "Splash Regeneration", "#A52BB2", {
potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, 45*redx) end
})
register_splash("regeneration_2", "Splash Regeneration II", "#B52CC2", {
potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 1.2, 21*redx) end
})
register_splash("regeneration_plus", "Splash Regeneration +", "#C53DD3", {
potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, 90*redx) end
})
register_splash("invisibility", "Splash Invisibility", "#B0B0B0", {
potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, 135*redx) end
})
register_splash("invisibility_plus", "Splash Invisibility +", "#A0A0A0", {
potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, 360*redx) end
})
register_splash("weakness", "Splash Weakness", "#6600AA", {
potion_fun = function(player, redx) mcl_potions.weakness_func(player, 1.2, 68*redx) end
})
register_splash("weakness_plus", "Splash Weakness +", "#7700BB", {
potion_fun = function(player, redx) mcl_potions.weakness_func(player, 1.4, 180*redx) end
})
register_splash("water_breathing", "Splash Water Breathing", "#0000AA", {
potion_fun = function(player, redx) mcl_potions.water_breathing_func(player, 135*redx) end
})
register_splash("water_breathing_plus", "Splash Water Breathing +", "#0000CC", {
potion_fun = function(player, redx) mcl_potions.water_breathing_func(player, 360*redx) end
})
register_splash("water_breathing_plus", "Splash Fire Resistance", "#D0A040", {
potion_fun = function(player, redx) mcl_potions.fire_resistance_func(player, 135*redx) end
})
register_splash("water_breathing_plus", "Splash Fire Resistance +", "#E0B050", {
potion_fun = function(player, redx) mcl_potions.fire_resistance_func(player, 360*redx) end
})
register_splash("night_vision", "Splash Night Vision", "#1010AA", {
potion_fun = function(player, redx) mcl_potions.night_vision_func(player, 135*redx) end
})
register_splash("night_vision_plus", "Splash Night Vision +", "#2020BA", {
potion_fun = function(player, redx) mcl_potions.night_vision_func(player, 360*redx) end
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB