minetest-playereffects/init.lua

103 lines
3.2 KiB
Lua

effects_api = {}
effects_api.registered_effects = {}
effects_api.register_effect = function(definition)
local name = definition.name
if not effects_api.registered_effects[name] then
effects_api.registered_effects[name] = definition
end
end
effects_api.give_effect_to_player = function(effect_n, name)
local player = minetest.get_player_by_name(name)
local effect = effects_api.registered_effects[effect_n]
local current_effects = minetest.deserialize(player:get_attribute("effects_api:effects")) or {}
if not effect then
minetest.log("[EFFECTS API] effects_api.give_effect_to_player(effect_n, name): Effect is nil")
return
end
current_effects[effect.name] = {}
effects_api.registered_effects[effect.name].on_add(name) -- Handle the on_add function.
player:set_attribute("effects_api:effects", minetest.serialize(current_effects))
end
minetest.register_globalstep(function(dtime)
for _,player in ipairs(minetest.get_connected_players()) do
local name = player:get_player_name()
local current_effects = minetest.deserialize(player:get_attribute("effects_api:effects")) or {}
for effect,data in pairs(current_effects) do
if not effect or not effects_api.registered_effects[effect] then
break
end
effects_api.registered_effects[effect].on_loop(name)
end
end
end)
effects_api.remove_effect_to_player = function(effect_n, name)
local player = minetest.get_player_by_name(name)
local effect = effects_api.registered_effects[effect_n]
local current_effects = minetest.deserialize(player:get_attribute("effects_api:effects")) or {}
if not effect then
minetest.log("[EFFECTS API] effects_api.remove_effect_to_player(effect_n, name): Effect is nil")
return
end
current_effects[effect.name] = nil
effects_api.registered_effects[effect.name].on_remove(name)
player:set_attribute("effects_api:effects", minetest.serialize(current_effects))
end
minetest.register_chatcommand("remove_effect_test", {
params = "",
description = "Removes the test effect.",
func = function(name, param)
effects_api.remove_effect_to_player("test", name)
end,
})
minetest.register_chatcommand("effects", {
params = "",
description = "Lists the current effects.",
func = function(name, param)
local player = minetest.get_player_by_name(name)
local message = "Your effects are: "
local current_effects = minetest.deserialize(player:get_attribute("effects_api:effects")) or {}
for iter,data in pairs(current_effects) do
message = message .. iter .. " "
end
minetest.chat_send_all(message)
end,
})
-- Effects --
effects_api.register_effect({
name = "flight",
on_loop = function(name)
minetest.chat_send_all(name .. " is flying!")
end,
on_add = function(name)
minetest.set_player_privs(name, {fly=true})
minetest.chat_send_all("Player " .. name .. " can fly like a bird!")
end,
on_remove = function(name)
minetest.set_player_privs(name, {fly=false})
minetest.chat_send_all("Player " .. name .. " can fly like a stone!")
end,
})
minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
effects_api.give_effect_to_player("flight", name)
end)