228 lines
6.9 KiB
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
|