1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
|
----- EXAMPLE EFFECT TYPES -----
--[[ This is just a helper function to inform the user of the chat command
of the result and, if successful, shows the effect ID. ]]
local function notify(name, retcode)
if(retcode == false) then
minetest.chat_send_player(name, "Effect application failed. Effect was NOT applied.")
else
minetest.chat_send_player(name, "Effect applied. Effect ID: "..tostring(retcode))
end
end
--[[ Null effect. The apply function always returns false, which means applying the
effect will never succeed ]]
playereffects.register_effect_type("null", "No effect", nil, {},
function()
return false
end
)
-- Makes the player screen black for 5 seconds (very experimental!)
playereffects.register_effect_type("blind", "Blind", nil, {},
function(player)
local hudid = player:hud_add({
hud_elem_type = "image",
position = { x=0.5, y=0.5 },
scale = { x=-100, y=-100 },
text = "playereffects_example_black.png",
})
if(hudid ~= nil) then
return { hudid = hudid }
else
minetest.log("error", "[playereffects] [examples] The effect \"Blind\" could not be applied. The call to hud_add(...) failed.")
return false
end
end,
function(effect)
local player = minetest.get_player_by_name(effect.playername)
player:hud_remove(effect.metadata.hudid)
end
)
-- Makes the user faster
playereffects.register_effect_type("high_speed", "High speed", nil, {"speed"},
function(player)
player:set_physics_override(4,nil,nil)
end,
function(effect)
local player = minetest.get_player_by_name(effect.playername)
player:set_physics_override(1,nil,nil)
end
)
-- Makes the user faster (hidden effect)
playereffects.register_effect_type("high_speed_hidden", "High speed", nil, {"speed"},
function(player)
player:set_physics_override(4,nil,nil)
end,
function(effect)
local player = minetest.get_player_by_name(effect.playername)
player:set_physics_override(1,nil,nil)
end,
true
)
-- Slows the user down
playereffects.register_effect_type("low_speed", "Low speed", nil, {"speed"},
function(player)
player:set_physics_override(0.25,nil,nil)
end,
function(effect)
local player = minetest.get_player_by_name(effect.playername)
player:set_physics_override(1,nil,nil)
end
)
-- Increases the jump height
playereffects.register_effect_type("highjump", "Greater jump height", "playereffects_example_highjump.png", {"jump"},
function(player)
player:set_physics_override(nil,2,nil)
end,
function(effect)
local player = minetest.get_player_by_name(effect.playername)
player:set_physics_override(nil,1,nil)
end
)
-- Adds the “fly” privilege
playereffects.register_effect_type("fly", "Fly mode available", "playereffects_example_fly.png", {"fly"},
function(player)
local playername = player:get_player_name()
local privs = minetest.get_player_privs(playername)
privs.fly = true
minetest.set_player_privs(playername, privs)
end,
function(effect)
local privs = minetest.get_player_privs(effect.playername)
privs.fly = nil
minetest.set_player_privs(effect.playername, privs)
end
)
-- Dummy effect for the stree test
playereffects.register_effect_type("stress", "Stress Test Effect", nil, {},
function(player)
end,
function(effect)
end
)
------ Chat commands for the example effects ------
-- Null effect (never succeeds)
minetest.register_chatcommand("null", {
params = "",
description = "Does nothing.",
privs = {},
func = function(name, param)
local ret = playereffects.apply_effect_type("null", 5, minetest.get_player_by_name(name))
notify(name, ret)
end,
})
minetest.register_chatcommand("blind", {
params = "",
description = "Makes your screen black for a short time.",
privs = {},
func = function(name, param)
local ret = playereffects.apply_effect_type("blind", 5, minetest.get_player_by_name(name))
notify(name, ret)
end,
})
minetest.register_chatcommand("fast", {
params = "",
description = "Makes you fast for a short time.",
privs = {},
func = function(name, param)
local ret = playereffects.apply_effect_type("high_speed", 10, minetest.get_player_by_name(name))
notify(name, ret)
end,
})
minetest.register_chatcommand("hfast", {
params = "",
description = "Makes you fast for a short time (hidden effect).",
privs = {},
func = function(name, param)
local ret = playereffects.apply_effect_type("high_speed_hidden", 10, minetest.get_player_by_name(name))
notify(name, ret)
end,
})
minetest.register_chatcommand("slow", {
params = "",
description = "Makes you slow for a long time.",
privs = {},
func = function(name, param)
local ret = playereffects.apply_effect_type("low_speed", 120, minetest.get_player_by_name(name))
notify(name, ret)
end,
})
minetest.register_chatcommand("highjump", {
params = "",
description = "Makes you jump higher for a short time.",
privs = {},
func = function(name, param)
local ret = playereffects.apply_effect_type("highjump", 20, minetest.get_player_by_name(name))
notify(name, ret)
end,
})
minetest.register_chatcommand("fly", {
params = "",
description = "Grants you the fly privilege for a short time.",
privs = {},
func = function(name, param)
local ret = playereffects.apply_effect_type("fly", 20, minetest.get_player_by_name(name))
notify(name, ret)
end,
})
--[[
Cancel all active effects
]]
minetest.register_chatcommand("cancelall", {
params = "",
description = "Cancels all your effects.",
privs = {},
func = function(name, param)
local effects = playereffects.get_player_effects(name)
for e=1, #effects do
playereffects.cancel_effect(effects[e].effect_id)
end
minetest.chat_send_player(name, "All effects cancelled.")
end,
})
--[[ The stress test applies a shitload of effects at once.
This is used to test the performance of this mod at very large effect numbers. ]]
minetest.register_chatcommand("stresstest", {
params = "[<effects>]",
descriptions = "Start the stress test for Player Effects with <effects> effects.",
privs = {server=true},
func = function(name, param)
local player = minetest.get_player_by_name(name)
local max = 100
if(type(param)=="string") then
if(type(tonumber(param)) == "number") then
max = tonumber(param)
if(max > 1000) then max = 1000 end
end
end
minetest.debug("[playereffects] Stress test started for "..name.." with "..max.." effects.")
for i=1,max do
playereffects.apply_effect_type("stress", 10, player)
end
end
})
|