5 --[[ table containing the groups (experimental) ]]
6 playereffects
.groups
= {}
8 --[[ table containing all the effect types ]]
9 playereffects
.effect_types
= {}
11 --[[ table containing all the active effects ]]
12 playereffects
.effects
= {}
14 --[[ table containing all the inactive effects.
15 Effects become inactive if a player leaves an become active again if they join again. ]]
16 playereffects
.inactive_effects
= {}
18 --[[ table (indexed by player names) containing tables containing the active HUD IDs for players
19 Example: { ["Player 1"] = {1,2,3}, ["Player 2"] = {2}, ["Player 3"] = {} }
21 playereffects
.hudids
= {}
23 -- Variable for counting the effect_id
24 playereffects
.last_effect_id
= 0
26 function playereffects
.next_effect_id()
27 playereffects
.last_effect_id
= playereffects
.last_effect_id
+ 1
28 return playereffects
.last_effect_id
31 --[=[ API functions ]=]
32 function playereffects
.register_effect_type(name
, description
, groups
, apply
, cancel
)
34 effect_type
.description
= description
35 effect_type
.apply
= apply
36 effect_type
.groups
= groups
38 effect_type
.cancel
= cancel
40 effect_type
.cancel
= function() end
42 playereffects
.effect_types
[name
] = effect_type
43 minetest
.log("action", "Effect type "..name
.." registered!")
46 function playereffects
.apply_effect_type(effect_type_id
, duration
, player
)
47 local start_time
= os
.time()
48 local playername
= player
:get_player_name()
49 local groups
= playereffects
.effect_types
[effect_type_id
].groups
50 for k
,v
in pairs(groups
) do
51 playereffects
.cancel_effect_group(v
, playername
)
53 local effect_id
= playereffects
.next_effect_id()
54 -- local hudpos = #playereffects.get_player_effects(playername)
55 local effects
= playereffects
.get_player_effects(playername
)
57 local biggest_hudpos
= -1
60 local hudpos
= effects
[e
].hudpos
61 if(hudpos
> biggest_hudpos
) then
62 biggest_hudpos
= hudpos
64 if(smallest_hudpos
== nil) then
65 smallest_hudpos
= hudpos
66 elseif(hudpos
< smallest_hudpos
) then
67 smallest_hudpos
= hudpos
70 if(smallest_hudpos
== nil) then
72 elseif(smallest_hudpos
>= 0) then
73 free_hudpos
= smallest_hudpos
- 1
75 free_hudpos
= biggest_hudpos
+ 1
77 local hudid
= playereffects
.hud_effect(effect_type_id
, player
, free_hudpos
)
80 playername
= playername
,
81 effect_id
= effect_id
,
82 effect_type_id
= effect_type_id
,
83 start_time
= start_time
,
89 playereffects
.effects
[effect_id
] = effect
91 playereffects
.effect_types
[effect_type_id
].apply(player
)
92 minetest
.log("action", "Effect type "..effect_type_id
.." applied to player "..playername
.."!")
93 minetest
.after(duration
, function(effect_id
) playereffects
.cancel_effect(effect_id
) end, effect_id
)
97 function playereffects
.cancel_effect_type(effect_type_id
, playername
)
100 function playereffects
.cancel_effect_group(groupname
, playername
)
101 local effects
= playereffects
.get_player_effects(playername
)
103 local effect
= effects
[e
]
104 local thesegroups
= playereffects
.effect_types
[effect
.effect_type_id
].groups
105 minetest
.log("action", "thesegroups = "..dump(thesegroups
))
106 minetest
.log("action", "groupname = "..dump(groupname
))
108 for g
=1,#thesegroups
do
109 if(thesegroups
[g
] == groupname
) then
110 playereffects
.cancel_effect(effect
.effect_id
)
117 function playereffects
.cancel_effect(effect_id
)
118 local effect
= playereffects
.effects
[effect_id
]
119 if(effect
~= nil) then
120 local player
= minetest
.get_player_by_name(effect
.playername
)
121 player
:hud_remove(effect
.hudid
)
122 playereffects
.effect_types
[effect
.effect_type_id
].cancel(effect
)
123 playereffects
.effects
[effect_id
] = nil
124 minetest
.log("action", "Effect type "..effect
.effect_type_id
.." cancelled from player "..effect
.playername
.."!")
128 function playereffects
.get_player_effects(playername
)
129 if(minetest
.get_player_by_name(playername
) ~= nil) then
131 for k
,v
in pairs(playereffects
.effects
) do
132 if(v
.playername
== playername
) then
133 table.insert(effects
, v
)
143 --[[ Cancel all effects on player death ]]
144 minetest
.register_on_dieplayer(function(player
)
145 local effects
= playereffects
.get_player_effects(player
:get_player_name())
147 playereffects
.cancel_effect(effects
[e
].effect_id
)
152 minetest
.register_on_leaveplayer(function(player
)
153 local leave_time
= os
.time()
154 local playername
= player
:get_player_name()
155 local effects
= playereffects
.get_player_effects(playername
)
157 playereffects
.hud_clear(player
)
158 playereffects
.hudids
[playername
] = nil
160 if(playereffects
.inactive_effects
[playername
] == nil) then
161 playereffects
.inactive_effects
[playername
] = {}
164 local start_time
= effects
[e
].start_time
165 local new_duration
= os
.difftime(leave_time
, start_time
)
166 local new_effect
= effects
[e
]
167 new_effect
.time_left
= new_duration
168 table.insert(playereffects
.inactive_effects
[playername
], new_effect
)
169 playereffects
.cancel_effect(effects
[e
].effect_id
)
174 minetest
.register_on_joinplayer(function(player
)
175 minetest
.after(0, playereffects
.join0
, player
)
178 function playereffects
.join0(player
)
179 local playername
= player
:get_player_name()
181 -- load all the effects again (if any)
182 if(playereffects
.inactive_effects
[playername
] ~= nil) then
183 for i
=1,#playereffects
.inactive_effects
[playername
] do
184 local effect
= playereffects
.inactive_effects
[playername
][i
]
185 playereffects
.apply_effect_type(effect
.effect_type_id
, effect
.time_left
, player
)
187 playereffects
.inactive_effects
[playername
] = nil
192 minetest
.register_globalstep(function()
193 local players
= minetest
.get_connected_players()
195 playereffects
.hud_update(players
[p
])
200 minetest.register_on_shutdown(function()
206 function playereffects
.hud_update(player
)
208 playereffects.hud_clear(player)
209 local effects = playereffects.get_player_effects(player:get_player_name())
211 playereffects.hud_effect(effects[e].effect_type_id, player, effects[e].hudpos)
214 local now
= os
.time()
215 local effects
= playereffects
.get_player_effects(player
:get_player_name())
217 local effect
= effects
[e
]
218 local description
= playereffects
.effect_types
[effect
.effect_type_id
].description
219 local time_left
= os
.difftime(effect
.start_time
+ effect
.time_left
, now
)
220 player
:hud_change(effect
.hudid
, "text", description
.. " ("..tostring(time_left
).." s)")
224 function playereffects
.hud_clear(player
)
225 local playername
= player
:get_player_name()
226 local effects
= playereffects
.get_player_effects(playername
)
227 if(effects
~= nil) then
229 player
:hud_remove(effects
[e
].hudid
)
234 function playereffects
.hud_effect(effect_type_id
, player
, pos
)
236 id
= player
:hud_add({
237 hud_elem_type
= "text",
238 position
= { x
= 1, y
= 0.3 },
239 name
= "effect_"..effect_type_id
,
240 text
= playereffects
.effect_types
[effect_type_id
].description
,
241 scale
= { x
= 120, y
= 20},
245 offset
= { x
= -120, y
= pos
*20 }
247 local playername
= player
:get_player_name()
253 -- uncomment the line below if you want to try out the examples
254 -- dofile(minetest.get_modpath(minetest.get_current_modname()).."/examples.lua")