New debug message
[minetest_playereffects.git] / init.lua
blobbdbf5bbd58a1336e73a5732729f676065f9ae231
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 minetest.log("action", "Effect type "..effect.effect_type_id.." cancelled from player "..effect.playername.."!")
98 end
100 function playereffects.get_player_effects(playername)
101 if(minetest.get_player_by_name(playername) ~= nil) then
102 local effects = {}
103 for k,v in pairs(playereffects.effects) do
104 if(v.playername == playername) then
105 table.insert(effects, v)
108 return effects
109 else
110 return {}
114 --[=[ Callbacks ]=]
115 --[[ Cancel all effects on player death ]]
116 minetest.register_on_dieplayer(function(player)
117 local effects = playereffects.get_player_effects(player:get_player_name())
118 for e=1,#effects do
119 playereffects.cancel_effect(effects[e].effect_id)
121 end)
123 --[[
124 minetest.register_on_leaveplayer(function(player)
125 playereffects.hud_clear(player)
126 playereffects.hudids[player:get_player_name()] = nil
127 end)
129 minetest.register_on_joinplayer(function(player)
130 playereffects.hud_update(player)
131 end)
133 minetest.register_on_shutdown(function()
135 end)
138 --[=[ HUD ]=]
139 function playereffects.hud_update(player)
140 playereffects.hud_clear(player)
141 local effects = playereffects.get_player_effects(player:get_player_name())
142 for e=1,#effects do
143 playereffects.hud_effect(effects[e], player, e-1)
147 function playereffects.hud_clear(player)
148 local playername = player:get_player_name()
149 local effects = playereffects.get_player_effects(playername)
150 if(effects ~= nil) then
151 for i=1,#effects do
152 player:hud_remove(effects[i].hudid)
157 function playereffects.hud_effect(effect_type_id, player, pos)
158 local id
159 id = player:hud_add({
160 hud_elem_type = "text",
161 position = { x = 0.95, y = 0.3 },
162 name = "effect_"..effect_type_id,
163 text = playereffects.effect_types[effect_type_id].description,
164 scale = { x = 20, y = 100},
165 alignment = 1,
166 direction = 1,
167 number = 0xFFFFFF,
168 offset = { x = 0, y = pos*20 }
170 local playername = player:get_player_name()
171 return id
175 ----- EXAMPLE EFFECT TYPES -----
177 playereffects.register_effect_type("high_speed", "high speed", {"speed"},
178 function(player)
179 player:set_physics_override(4,nil,nil)
180 end,
182 function(effect)
183 local player = minetest.get_player_by_name(effect.playername)
184 player:set_physics_override(1,nil,nil)
187 playereffects.register_effect_type("low_speed", "low speed", {"speed"},
188 function(player)
189 player:set_physics_override(0.25,nil,nil)
190 end,
192 function(effect)
193 local player = minetest.get_player_by_name(effect.playername)
194 player:set_physics_override(1,nil,nil)
197 playereffects.register_effect_type("highjump", "greater jump height", {"jump"},
198 function(player)
199 player:set_physics_override(nil,2,nil)
200 end,
201 function(effect)
202 local player = minetest.get_player_by_name(effect.playername)
203 player:set_physics_override(nil,1,nil)
208 minetest.register_chatcommand("fast", {
209 params = "",
210 description = "Makes you fast for a short time.",
211 privs = {},
212 func = function(name, param)
213 playereffects.apply_effect_type("high_speed", 10, minetest.get_player_by_name(name))
214 end,
216 minetest.register_chatcommand("slow", {
217 params = "",
218 description = "Makes you slow for a short time.",
219 privs = {},
220 func = function(name, param)
221 playereffects.apply_effect_type("low_speed", 10, minetest.get_player_by_name(name))
222 end,
224 minetest.register_chatcommand("highjump", {
225 params = "",
226 description = "Makes you jump higher for a short time.",
227 privs = {},
228 func = function(name, param)
229 playereffects.apply_effect_type("highjump", 20, minetest.get_player_by_name(name))
230 end,