Initial commit
[minetest_playereffects.git] / init.lua
blob801e88206a0511dfd4562150e453cb655b4dea6a
1 --[=[ Main tables ]=]
3 playereffects = {}
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
25 end
27 --[=[ API functions ]=]
28 function playereffects.register_effect_type(name, description, groups, apply, cancel)
29 effect_type = {}
30 effect_type.description = description
31 effect_type.apply = apply
32 effect_type.groups = groups
33 if cancel ~= nil then
34 effect_type.cancel = cancel
35 else
36 effect_type.cancel = function() end
37 end
38 playereffects.effect_types[name] = effect_type
39 minetest.log("action", "Effect type "..name.." registered!")
40 end
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)
48 end
49 local effect_id = playereffects.next_effect_id()
50 local hudid = playereffects.hud_effect(effect_type_id, player, #playereffects.get_player_effects(playername))
51 local effect = {
52 playername = playername,
53 effect_id = effect_id,
54 effect_type_id = effect_type_id,
55 start_time = start_time,
56 time_left = duration,
57 hudid = hudid
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)
66 end
68 -- TODO
69 function playereffects.cancel_effect_type(effect_type_id, playername)
70 end
72 function playereffects.cancel_effect_group(groupname, playername)
73 local effects = playereffects.get_player_effects(playername)
74 for e=1,#effects do
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))
79 local delete = false
80 for g=1,#thesegroups do
81 if(thesegroups[g] == groupname) then
82 playereffects.cancel_effect(effect.effect_id)
83 break
84 end
85 end
86 end
87 end
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
96 end
97 end
99 function playereffects.get_player_effects(playername)
100 if(minetest.get_player_by_name(playername) ~= nil) then
101 local effects = {}
102 for k,v in pairs(playereffects.effects) do
103 if(v.playername == playername) then
104 table.insert(effects, v)
107 return effects
108 else
109 return {}
113 --[=[ Callbacks ]=]
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())
117 for e=1,#effects do
118 playereffects.cancel_effect(effects[e].effect_id)
120 end)
122 --[[
123 minetest.register_on_leaveplayer(function(player)
124 playereffects.hud_clear(player)
125 playereffects.hudids[player:get_player_name()] = nil
126 end)
128 minetest.register_on_joinplayer(function(player)
129 playereffects.hud_update(player)
130 end)
132 minetest.register_on_shutdown(function()
134 end)
137 --[=[ HUD ]=]
138 function playereffects.hud_update(player)
139 playereffects.hud_clear(player)
140 local effects = playereffects.get_player_effects(player:get_player_name())
141 for e=1,#effects do
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
150 for i=1,#effects do
151 player:hud_remove(effects[i].hudid)
156 function playereffects.hud_effect(effect_type_id, player, pos)
157 local id
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},
164 direction = 1,
165 number = 0xFFFFFF,
166 offset = { x = 0, y = pos*20 }
168 local playername = player:get_player_name()
169 return id
173 ----- EXAMPLE EFFECT TYPES -----
175 playereffects.register_effect_type("high_speed", "high speed", {"speed"},
176 function(player)
177 player:set_physics_override(4,nil,nil)
178 end,
180 function(effect)
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"},
186 function(player)
187 player:set_physics_override(0.25,nil,nil)
188 end,
190 function(effect)
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"},
196 function(player)
197 player:set_physics_override(nil,2,nil)
198 end,
199 function(effect)
200 local player = minetest.get_player_by_name(effect.playername)
201 player:set_physics_override(nil,1,nil)
206 minetest.register_chatcommand("fast", {
207 params = "",
208 description = "Makes you fast for a short time.",
209 privs = {},
210 func = function(name, param)
211 playereffects.apply_effect_type("high_speed", 10, minetest.get_player_by_name(name))
212 end,
214 minetest.register_chatcommand("slow", {
215 params = "",
216 description = "Makes you slow for a short time.",
217 privs = {},
218 func = function(name, param)
219 playereffects.apply_effect_type("low_speed", 10, minetest.get_player_by_name(name))
220 end,
222 minetest.register_chatcommand("highjump", {
223 params = "",
224 description = "Makes you jump higher for a short time.",
225 privs = {},
226 func = function(name, param)
227 playereffects.apply_effect_type("highjump", 20, minetest.get_player_by_name(name))
228 end,