brewing/effects.lua

228 lines
6.9 KiB
Lua

local S = ...
local function drink_particles(player)
local pos = player:get_pos()
minetest.add_particlespawner({
amount = 20,
time = 0.001,
minpos = pos,
maxpos = pos,
minvel = vector.new(-2,-2,-2),
maxvel = vector.new(2,2,2),
minacc = {x=0, y=0, z=0},
maxacc = {x=0, y=0, z=0},
minexptime = 1.1,
maxexptime = 1.5,
minsize = 1,
maxsize = 2,
collisiondetection = false,
vertical = false,
texture = "bubble.png",
--playername = player:get_player_name()
})
end
--The Engine (Potions/Effects) Part!!!
brewing.effects = {}
brewing.effects.phys_override = function(effect_name, description_name, potion_name, sdata, flags)
local def = {
on_use = function(itemstack, user, pointed_thing)
brewing.make_sound("player", user, "brewing_magic_sound")
drink_particles(user)
brewing.grant(user, effect_name, potion_name.."_"..flags.type..sdata.type, description_name, sdata.time or 0, flags)
itemstack:take_item()
return itemstack
end,
potions = {
speed = 0,
jump = 0,
gravity = 0,
tnt = 0,
air = 0,
},
}
return def
end
brewing.effects.fixhp = function(sname, name, fname, sdata, flags)
local def = {
on_use = function(itemstack, user, pointed_thing)
brewing.make_sound("player", user, "brewing_magic_sound")
drink_particles(user)
for i=0, (sdata.time or 0) do
minetest.after(i, function()
local hp = user:get_hp()
if flags.inv==true then
hp = hp - (sdata.hp or 3)
else
hp = hp + (sdata.hp or 3)
end
hp = math.min(20, hp)
hp = math.max(0, hp)
user:set_hp(hp)
end)
end
itemstack:take_item()
return itemstack
end,
}
def.mobs = {
on_near = def.on_use,
}
return def
end
brewing.effects.air = function(sname, name, fname, sdata, flags)
local def = {
on_use = function(itemstack, user, pointed_thing)
brewing.make_sound("player", user, "brewing_magic_sound")
drink_particles(user)
local potions_e = brewing.players[user:get_player_name()]
potions_e.air = potions_e.air + (sdata.time or 0)
for i=0, (sdata.time or 0) do
minetest.after(i, function(v_user, v_sdata)
local br = v_user:get_breath()
if flags.inv==true then
br = br - (v_sdata.br or 3)
else
br = br + (v_sdata.br or 3)
end
br = math.min(11, br)
br = math.max(0, br)
v_user:set_breath(br)
if i==(v_sdata.time or 0) then
potions_e.air = potions_e.air - (v_sdata.time or 0)
end
end, user, sdata)
end
itemstack:take_item()
return itemstack
end,
}
return def
end
brewing.effects.invisibility = function(sname, name, fname, sdata, flags)
local def = {
on_use = function(itemstack, user, pointed_thing)
brewing.make_sound("player", user, "brewing_magic_sound")
drink_particles(user)
user:set_nametag_attributes({
color = {a = 0, r = 255, g = 255, b = 255}
})
user:set_properties({
visual_size = {x = 0, y = 0},
})
local user_name = user:get_player_name()
minetest.chat_send_player(user_name, S("You are invisible thanks to a invisibility potion."))
minetest.after(sdata.time, function(player, player_name)
if minetest.get_player_by_name(player_name) then
player:set_nametag_attributes({
color = {a = 255, r = 255, g = 255, b = 255}
})
player:set_properties({
visual_size = {x = 1, y = 1},
})
minetest.chat_send_player(player_name, S("You are visible again."))
end
end, user, user_name)
itemstack:take_item()
return itemstack
end,
}
return def
end
brewing.effects.resist_fire = function(sname, name, fname, sdata, flags)
local def = {
on_use = function(itemstack, user, pointed_thing)
brewing.make_sound("player", user, "brewing_magic_sound")
drink_particles(user)
local user_name = user:get_player_name()
brewing.players[user_name]["resist_fire"] = true
user:get_meta():set_string("brewing:resist_fire", "true")
minetest.chat_send_player(user_name, S("You are able to resist fire thanks to a Resist Fire Potion."))
minetest.after(sdata.time, function(player, player_name)
if minetest.get_player_by_name(player_name) then
brewing.players[player_name]["resist_fire"] = false
minetest.chat_send_player(player_name, S("The effect of the Resist Potion has worn off."))
end
end, user, user_name)
itemstack:take_item()
return itemstack
end,
}
return def
end
brewing.effects.teleport = function(sname, name, fname, sdata, flags)
local def = {
on_use = function(itemstack, user, pointed_thing)
brewing.make_sound("player", user, "brewing_magic_sound")
local user_name = user:get_player_name()
local teleport_pos = brewing.players[user_name]["teleport"]
if not teleport_pos then
brewing.players[user_name]["teleport"] = user:get_pos()
brewing.make_sound("player", user, "brewing_magic_sound")
minetest.chat_send_player(user_name, S("Your position was saved for teleport."))
drink_particles(user)
minetest.after(sdata.time, function(player, player_name)
if minetest.get_player_by_name(player_name) and brewing.players[player_name]["teleport"] then
brewing.players[player_name]["teleport"] = nil
minetest.chat_send_player(player_name, S("The effect of the Teleport Potion has worn off."))
end
end, user, user_name)
else
local teleport_node = minetest.get_node_or_nil(teleport_pos)
if not teleport_node then
minetest.get_voxel_manip():read_from_map(teleport_pos, teleport_pos)
teleport_node = minetest.get_node(teleport_pos)
end
if minetest.registered_nodes[teleport_node.name].drawtype == "airlike" then
user:set_pos(teleport_pos)
drink_particles(user)
brewing.make_sound("player", user, "brewing_magic_sound")
else
brewing.make_sound("player", user, "brewing_magic_fail")
minetest.chat_send_player(user_name, S("Failed teleport: The position is ocupied"))
end
brewing.players[user_name]["teleport"] = nil
end
itemstack:take_item()
return itemstack
end,
}
return def
end
brewing.grant = function(player, effect_name, potion_name, description_name, time, flags)
local rootdef = minetest.registered_items[potion_name]
if rootdef == nil then
return
end
if rootdef.potions == nil then
return
end
local def = {}
for name, val in pairs(rootdef.potions) do
def[name] = val
end
if flags.inv==true then
def.gravity = 0 - def.gravity
def.speed = 0 - def.speed
def.jump = 0 - def.jump
def.tnt = 0 - def.tnt
end
local player_name = player:get_player_name()
playerphysics.add_physics_factor(player, effect_name, potion_name, def[effect_name])
minetest.chat_send_player(player_name, S("You are under the effects of the").." "..description_name.." "..S("potion."))
minetest.after(time, function()
if minetest.get_player_by_name(player_name)~=nil then
playerphysics.remove_physics_factor(player, effect_name, potion_name)
minetest.chat_send_player(player_name, S("The effects of the").." "..description_name.." "..S("potion have worn off."))
end
end)
end