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 (indexed by player names) containing tables containing the active HUD IDs for players
15 Example: { ["Player 1"] = {1,2,3}, ["Player 2"] = {2}, ["Player 3"] = {} }
17 playereffects
.hudids
= {}
19 -- Variable for counting the effect_id
20 playereffects
.last_effect_id
= 0
22 function playereffects
.next_effect_id()
23 playereffects
.last_effect_id
= playereffects
.last_effect_id
+ 1
24 return playereffects
.last_effect_id
27 --[=[ API functions ]=]
28 function playereffects
.register_effect_type(name
, description
, groups
, apply
, cancel
)
30 effect_type
.description
= description
31 effect_type
.apply
= apply
32 effect_type
.groups
= groups
34 effect_type
.cancel
= cancel
36 effect_type
.cancel
= function() end
38 playereffects
.effect_types
[name
] = effect_type
39 minetest
.log("action", "Effect type "..name
.." registered!")
42 function playereffects
.apply_effect_type(effect_type_id
, duration
, player
)
43 local start_time
= os
.time()
44 local playername
= player
:get_player_name()
45 local groups
= playereffects
.effect_types
[effect_type_id
].groups
46 for k
,v
in pairs(groups
) do
47 playereffects
.cancel_effect_group(v
, playername
)
49 local effect_id
= playereffects
.next_effect_id()
50 local hudid
= playereffects
.hud_effect(effect_type_id
, player
, #playereffects
.get_player_effects(playername
))
52 playername
= playername
,
53 effect_id
= effect_id
,
54 effect_type_id
= effect_type_id
,
55 start_time
= start_time
,
60 playereffects
.effects
[effect_id
] = effect
62 playereffects
.effect_types
[effect_type_id
].apply(player
)
63 minetest
.log("action", "Effect type "..effect_type_id
.." applied to player "..playername
.."!")
64 minetest
.after(duration
, function(effect_id
) playereffects
.cancel_effect(effect_id
) end, effect_id
)
69 function playereffects
.cancel_effect_type(effect_type_id
, playername
)
72 function playereffects
.cancel_effect_group(groupname
, playername
)
73 local effects
= playereffects
.get_player_effects(playername
)
75 local effect
= effects
[e
]
76 local thesegroups
= playereffects
.effect_types
[effect
.effect_type_id
].groups
77 minetest
.log("action", "thesegroups = "..dump(thesegroups
))
78 minetest
.log("action", "groupname = "..dump(groupname
))
80 for g
=1,#thesegroups
do
81 if(thesegroups
[g
] == groupname
) then
82 playereffects
.cancel_effect(effect
.effect_id
)
89 function playereffects
.cancel_effect(effect_id
)
90 local effect
= playereffects
.effects
[effect_id
]
91 if(effect
~= nil) then
92 local player
= minetest
.get_player_by_name(effect
.playername
)
93 player
:hud_remove(effect
.hudid
)
94 playereffects
.effect_types
[effect
.effect_type_id
].cancel(effect
)
95 playereffects
.effects
[effect_id
] = nil
99 function playereffects
.get_player_effects(playername
)
100 if(minetest
.get_player_by_name(playername
) ~= nil) then
102 for k
,v
in pairs(playereffects
.effects
) do
103 if(v
.playername
== playername
) then
104 table.insert(effects
, v
)
114 --[[ Cancel all effects on player death ]]
115 minetest
.register_on_dieplayer(function(player
)
116 local effects
= playereffects
.get_player_effects(player
:get_player_name())
118 playereffects
.cancel_effect(effects
[e
].effect_id
)
123 minetest.register_on_leaveplayer(function(player)
124 playereffects.hud_clear(player)
125 playereffects.hudids[player:get_player_name()] = nil
128 minetest.register_on_joinplayer(function(player)
129 playereffects.hud_update(player)
132 minetest.register_on_shutdown(function()
138 function playereffects
.hud_update(player
)
139 playereffects
.hud_clear(player
)
140 local effects
= playereffects
.get_player_effects(player
:get_player_name())
142 playereffects
.hud_effect(effects
[e
], player
, e
-1)
146 function playereffects
.hud_clear(player
)
147 local playername
= player
:get_player_name()
148 local effects
= playereffects
.get_player_effects(playername
)
149 if(effects
~= nil) then
151 player
:hud_remove(effects
[i
].hudid
)
156 function playereffects
.hud_effect(effect_type_id
, player
, pos
)
158 id
= player
:hud_add({
159 hud_elem_type
= "text",
160 position
= { x
= 0.95, y
= 0.3 },
161 name
= "effect_"..effect_type_id
,
162 text
= playereffects
.effect_types
[effect_type_id
].description
,
163 scale
= { x
= 20, y
= 100},
166 offset
= { x
= 0, y
= pos
*20 }
168 local playername
= player
:get_player_name()
173 ----- EXAMPLE EFFECT TYPES -----
175 playereffects
.register_effect_type("high_speed", "high speed", {"speed"},
177 player
:set_physics_override(4,nil,nil)
181 local player
= minetest
.get_player_by_name(effect
.playername
)
182 player
:set_physics_override(1,nil,nil)
185 playereffects
.register_effect_type("low_speed", "low speed", {"speed"},
187 player
:set_physics_override(0.25,nil,nil)
191 local player
= minetest
.get_player_by_name(effect
.playername
)
192 player
:set_physics_override(1,nil,nil)
195 playereffects
.register_effect_type("highjump", "greater jump height", {"jump"},
197 player
:set_physics_override(nil,2,nil)
200 local player
= minetest
.get_player_by_name(effect
.playername
)
201 player
:set_physics_override(nil,1,nil)
206 minetest
.register_chatcommand("fast", {
208 description
= "Makes you fast for a short time.",
210 func
= function(name
, param
)
211 playereffects
.apply_effect_type("high_speed", 10, minetest
.get_player_by_name(name
))
214 minetest
.register_chatcommand("slow", {
216 description
= "Makes you slow for a short time.",
218 func
= function(name
, param
)
219 playereffects
.apply_effect_type("low_speed", 10, minetest
.get_player_by_name(name
))
222 minetest
.register_chatcommand("highjump", {
224 description
= "Makes you jump higher for a short time.",
226 func
= function(name
, param
)
227 playereffects
.apply_effect_type("highjump", 20, minetest
.get_player_by_name(name
))