1
0
mirror of https://repo.or.cz/minetest_playereffects.git synced 2025-01-24 17:10:22 +01:00

More refactoring for non-player entity support

This commit is contained in:
Wuzzy 2019-02-22 03:31:07 +01:00
parent 08b2c5fd22
commit e24c55d0bd

View File

@ -98,26 +98,26 @@ function playereffects.register_effect_type(effect_type_id, description, icon, g
minetest.log("action", "[playereffects] Effect type "..effect_type_id.." registered!") minetest.log("action", "[playereffects] Effect type "..effect_type_id.." registered!")
end end
function playereffects.apply_effect_type(effect_type_id, duration, player, repeat_interval_time_left) function playereffects.apply_effect_type(effect_type_id, duration, entity, repeat_interval_time_left)
local start_time = os.time() local start_time = os.time()
local is_player = false local is_player = false
if(type(player)=="userdata") then if(type(entity)=="userdata") then
if(player.is_player ~= nil) then if(entity.is_player ~= nil) then
if(player:is_player() == true) then if(entity:is_player() == true) then
is_player = true is_player = true
end end
end end
end end
local playername = player:get_player_name() local playername = entity:get_player_name()
local groups = playereffects.effect_types[effect_type_id].groups local groups = playereffects.effect_types[effect_type_id].groups
for k,v in pairs(groups) do for k,v in pairs(groups) do
playereffects.cancel_effect_group(v, playername) playereffects.cancel_effect_group(v, entity)
end end
local metadata local metadata
if(playereffects.effect_types[effect_type_id].repeat_interval == nil) then if(playereffects.effect_types[effect_type_id].repeat_interval == nil) then
local status = playereffects.effect_types[effect_type_id].apply(player) local status = playereffects.effect_types[effect_type_id].apply(entity)
if(status == false) then if(status == false) then
if is_player then if is_player then
minetest.log("action", "[playereffects] Attempt to apply effect type "..effect_type_id.." to player "..playername.." failed!") minetest.log("action", "[playereffects] Attempt to apply effect type "..effect_type_id.." to player "..playername.." failed!")
@ -131,6 +131,14 @@ function playereffects.apply_effect_type(effect_type_id, duration, player, repea
local effect_id = playereffects.next_effect_id() local effect_id = playereffects.next_effect_id()
-- repeat stuff
local repeat_interval = playereffects.effect_types[effect_type_id].repeat_interval
if(repeat_interval ~= nil) then
if(repeat_interval_time_left == nil) then
repeat_interval_time_left = repeat_interval
end
end
-- Handle HUD -- Handle HUD
if is_player then if is_player then
local smallest_hudpos local smallest_hudpos
@ -158,21 +166,11 @@ function playereffects.apply_effect_type(effect_type_id, duration, player, repea
else else
free_hudpos = biggest_hudpos + 1 free_hudpos = biggest_hudpos + 1
end end
end
-- repeat stuff --[[ show no more than 20 effects on the screen, so that hud_update does not need to be called so often ]]
local repeat_interval = playereffects.effect_types[effect_type_id].repeat_interval
if(repeat_interval ~= nil) then
if(repeat_interval_time_left == nil) then
repeat_interval_time_left = repeat_interval
end
end
--[[ show no more than 20 effects on the screen, so that hud_update does not need to be called so often ]]
if is_player then
local text_id, icon_id local text_id, icon_id
if(free_hudpos <= 20) then if(free_hudpos <= 20) then
text_id, icon_id = playereffects.hud_effect(effect_type_id, player, free_hudpos, duration, repeat_interval_time_left) text_id, icon_id = playereffects.hud_effect(effect_type_id, entity, free_hudpos, duration, repeat_interval_time_left)
local hudinfo = { local hudinfo = {
text_id = text_id, text_id = text_id,
icon_id = icon_id, icon_id = icon_id,
@ -198,7 +196,7 @@ function playereffects.apply_effect_type(effect_type_id, duration, player, repea
playereffects.effects[effect_id] = effect playereffects.effects[effect_id] = effect
if(repeat_interval ~= nil) then if(repeat_interval ~= nil) then
minetest.after(repeat_interval_time_left, playereffects.repeater, effect_id, duration, player, playereffects.effect_types[effect_type_id].apply) minetest.after(repeat_interval_time_left, playereffects.repeater, effect_id, duration, entity, playereffects.effect_types[effect_type_id].apply)
else else
minetest.after(duration, function(effect_id) playereffects.cancel_effect(effect_id) end, effect_id) minetest.after(duration, function(effect_id) playereffects.cancel_effect(effect_id) end, effect_id)
end end
@ -206,11 +204,11 @@ function playereffects.apply_effect_type(effect_type_id, duration, player, repea
return effect_id return effect_id
end end
function playereffects.repeater(effect_id, repetitions, player, apply) function playereffects.repeater(effect_id, repetitions, entity, apply)
local effect = playereffects.effects[effect_id] local effect = playereffects.effects[effect_id]
if(effect ~= nil) then if(effect ~= nil) then
local repetitions = effect.time_left local repetitions = effect.time_left
apply(player) apply(entity)
repetitions = repetitions - 1 repetitions = repetitions - 1
effect.time_left = repetitions effect.time_left = repetitions
if(repetitions <= 0) then if(repetitions <= 0) then
@ -224,19 +222,15 @@ function playereffects.repeater(effect_id, repetitions, player, apply)
playereffects.repeater, playereffects.repeater,
effect_id, effect_id,
repetitions, repetitions,
player, entity,
apply apply
) )
end end
end end
end end
function playereffects.cancel_effect_type(effect_type_id, cancel_all, playername) function playereffects.cancel_effect_type(effect_type_id, cancel_all, entity_or_playername)
-- TODO local effects = playereffects.get_player_effects(entity_or_playername)
if(playername == "") then
return
end
local effects = playereffects.get_player_effects(playername)
if(cancel_all==nil) then cancel_all = false end if(cancel_all==nil) then cancel_all = false end
for e=1, #effects do for e=1, #effects do
if(effects[e].effect_type_id == effect_type_id) then if(effects[e].effect_type_id == effect_type_id) then
@ -248,12 +242,8 @@ function playereffects.cancel_effect_type(effect_type_id, cancel_all, playername
end end
end end
function playereffects.cancel_effect_group(groupname, playername) function playereffects.cancel_effect_group(groupname, entity_or_playername)
-- TODO local effects = playereffects.get_player_effects(entity_or_playername)
if(playername == "") then
return
end
local effects = playereffects.get_player_effects(playername)
for e=1,#effects do for e=1,#effects do
local effect = effects[e] local effect = effects[e]
local thesegroups = playereffects.effect_types[effect.effect_type_id].groups local thesegroups = playereffects.effect_types[effect.effect_type_id].groups
@ -300,9 +290,14 @@ function playereffects.cancel_effect(effect_id)
end end
end end
function playereffects.get_player_effects(playername) function playereffects.get_player_effects(entity_or_playername)
-- TODO -- TODO: support entity
if(playername == "") then local playername = ""
if type(entity_or_playername) == "string" then
playername = entity_or_playername
elseif type(entity_or_playername) == "userdata" and entity_or_playername:is_player() then
playername = entity_or_playername:get_player_name()
else
return {} return {}
end end
if(minetest.get_player_by_name(playername) ~= nil) then if(minetest.get_player_by_name(playername) ~= nil) then
@ -318,12 +313,8 @@ function playereffects.get_player_effects(playername)
end end
end end
function playereffects.has_effect_type(playername, effect_type_id) function playereffects.has_effect_type(entity_or_playername, effect_type_id)
-- TODO local pe = playereffects.get_player_effects(entity_or_playername)
if(playername == "") then
return false
end
local pe = playereffects.get_player_effects(playername)
for i=1,#pe do for i=1,#pe do
if pe[i].effect_type_id == effect_type_id then if pe[i].effect_type_id == effect_type_id then
return true return true