Differences From
Artifact [9a580a99bf]:
103 103 elseif d.pos then -- find effects anchored here and people in range
104 104 for id,effect in pairs(starlit.effect.active) do
105 105 if not effect.anchor then goto skip end -- this intentionally excludes attached effects
106 106 if ineffectrange(effect,d.pos,d.range) then
107 107 effects[#effects+1] = {v=effect,i=id}
108 108 end
109 109 ::skip::end
110 - local ppl = minetest.get_objects_inside_radius(d.pos,d.range)
110 + local ppl = core.get_objects_inside_radius(d.pos,d.range)
111 111 if #targets == 0 then targets = ppl else
112 112 for _,p in pairs(ppl) do targets[#targets+1] = p end
113 113 end
114 114 end
115 115
116 116 -- iterate over targets to remove from any effect's influence
117 117 for _,t in pairs(targets) do
................................................................................
137 137 if v == effect then starlit.effect.active[k] = nil break end
138 138 end
139 139 end
140 140 end
141 141 end
142 142
143 143 starlit.effect.ensorcelled = function(player,effect)
144 - if type(player) == 'string' then player = minetest.get_player_by_name(player) end
144 + if type(player) == 'string' then player = core.get_player_by_name(player) end
145 145 for _,s in pairs(starlit.effect.active) do
146 146 if effect and (s.name ~= effect) then goto skip end
147 147 for _,sub in pairs(s.subjects) do
148 148 if sub.player == player then return s end
149 149 end
150 150 ::skip::end
151 151 return false
................................................................................
163 163 end
164 164 end
165 165 until idx >= #starlit.effect.active
166 166 end
167 167 end
168 168
169 169 -- when a new effect is created, we analyze it and make the appropriate calls
170 --- to minetest.after to queue up the events. each job returned needs to be
170 +-- to core.after to queue up the events. each job returned needs to be
171 171 -- saved in 'jobs' so they can be canceled if the effect is disjoined. no polling
172 172 -- necessary :D
173 173
174 174 starlit.effect.cast = function(proto)
175 175 local s = table.copy(proto)
176 176 s.jobs = s.jobs or {} s.vfx = s.vfx or {} s.sfx = s.sfx or {}
177 177 s.impacts = s.impacts or {} s.subjects = s.subjects or {}
178 178 s.delay = s.delay or 0
179 179 s.visual = function(subj, def)
180 180 s.vfx[#s.vfx + 1] = {
181 - handle = minetest.add_particlespawner(def);
181 + handle = core.add_particlespawner(def);
182 182 subject = subj;
183 183 }
184 184 end
185 185 s.visual_caster = function(def) -- convenience function
186 186 local d = table.copy(def)
187 187 d.attached = s.caster
188 188 s.visual(nil, d)
................................................................................
206 206 s.impacts[#s.impacts+1] = rec
207 207 etbl[#etbl+1] = rec
208 208 end
209 209 return etbl
210 210 end
211 211 s.abort = function()
212 212 for _,j in ipairs(s.jobs) do j:cancel() end
213 - for _,v in ipairs(s.vfx) do minetest.delete_particlespawner(v.handle) end
213 + for _,v in ipairs(s.vfx) do core.delete_particlespawner(v.handle) end
214 214 for _,i in ipairs(s.sfx) do s.silence(i) end
215 215 for _,i in ipairs(s.impacts) do i.effect:stop() end
216 216 end
217 217 s.release_subject = function(si)
218 218 local t = s.subjects[si]
219 219 for _,f in pairs(s.sfx) do if f.subject == t then s.silence(f) end end
220 220 for _,f in pairs(s.impacts) do if f.subject == t then f.effect:stop() end end
221 221 for _,f in pairs(s.vfx) do
222 - if f.subject == t then minetest.delete_particlespawner(f.handle) end
222 + if f.subject == t then core.delete_particlespawner(f.handle) end
223 223 end
224 224 s.subjects[si] = nil
225 225 end
226 226 local interpret_timespec = function(when)
227 227 if when == nil then return 0 end
228 228 local t if type(when) == 'number' then
229 229 t = s.duration * when
................................................................................
232 232 end
233 233 if t then return math.min(s.duration,math.max(0,t)) end
234 234
235 235 log.err('invalid timespec ' .. dump(when))
236 236 return 0
237 237 end
238 238 s.queue = function(when,fn)
239 - local elapsed = s.starttime and minetest.get_server_uptime() - s.starttime or 0
239 + local elapsed = s.starttime and core.get_server_uptime() - s.starttime or 0
240 240 local timepast = interpret_timespec(when)
241 241 if not timepast then timepast = 0 end
242 242 local timeleft = s.duration - timepast
243 243 local howlong = (s.delay + timepast) - elapsed
244 244 if howlong < 0 then
245 245 log.err('cannot time-travel! queue() called with `when` specifying timepoint that has already passed')
246 246 howlong = 0
247 247 end
248 - s.jobs[#s.jobs+1] = minetest.after(howlong, function()
248 + s.jobs[#s.jobs+1] = core.after(howlong, function()
249 249 -- this is somewhat awkward. since we're using a non-polling approach, we
250 250 -- need to find a way to account for a caster or subject walking into an
251 251 -- existing antimagic field, or someone with an existing antimagic aura
252 252 -- walking into range of the anchor. so every time a effect effect would
253 253 -- take place, we first check to see if it's in range of something nasty
254 254 if not s.disjunction and -- avoid self-disjunction
255 255 ((s.caster and starlit.effect.probe(s.caster:get_pos()).disjunction) or
................................................................................
286 286 for _,sub in pairs(s.subjects) do addobj(sub.player,sub) end
287 287 elseif spec.where == 'pos' then specs[#specs+1] = { spec = {pos = s.anchor} }
288 288 else specs[#specs+1] = { spec = {pos = spec.where} } end
289 289
290 290 for _,sp in pairs(specs) do
291 291 sp.spec.gain = sp.spec.gain or spec.gain
292 292 local so = {
293 - handle = minetest.sound_play(spec.sound, sp.spec, spec.ephemeral);
293 + handle = core.sound_play(spec.sound, sp.spec, spec.ephemeral);
294 294 ctl = spec;
295 295 -- object = sp.obj;
296 296 subject = sp.subject;
297 297 }
298 298 stbl[#stbl+1] = so
299 299 s.sfx[#s.sfx+1] = so
300 300 end
................................................................................
308 308 for _,snd in pairs(snds) do s.silence(snd) end
309 309 end)
310 310 end
311 311 end)
312 312 end
313 313 s.silence = function(sound)
314 314 if not sound.handle then return end
315 - if sound.ctl.fade == 0 then minetest.sound_stop(sound.handle)
316 - else minetest.sound_fade(sound.handle,sound.ctl.fade or 1,0) end
315 + if sound.ctl.fade == 0 then core.sound_stop(sound.handle)
316 + else core.sound_fade(sound.handle,sound.ctl.fade or 1,0) end
317 317 end
318 318 local startqueued, termqueued = false, false
319 319 local myid = #starlit.effect.active+1
320 320 s.cancel = function()
321 321 s.abort()
322 322 starlit.effect.active[myid] = nil
323 323 end
................................................................................
365 365 iteration = iteration;
366 366 iterationcount = itercount;
367 367 timeleft = timeleft;
368 368 timeelapsed = s.duration - timeleft;
369 369 lastreturn = lastreturn;
370 370 }
371 371 if nr ~= false and iteration < itercount then
372 - s.jobs[#s.jobs+1] = minetest.after(int.period,
372 + s.jobs[#s.jobs+1] = core.after(int.period,
373 373 function() iterate(nr) end)
374 374 end
375 375 end
376 376 if int.after
377 377 then s.queue(int.after, iterate)
378 378 else s.queue({whence=0, secs=s.period}, iterate)
379 379 end
................................................................................
385 385 end
386 386 end
387 387 if s.sounds then
388 388 for when,what in pairs(s.sounds) do s.play(when,what) end
389 389 end
390 390 starlit.effect.active[myid] = s
391 391 if not termqueued then
392 - s.jobs[#s.jobs+1] = minetest.after(s.delay + s.duration, function()
392 + s.jobs[#s.jobs+1] = core.after(s.delay + s.duration, function()
393 393 if s.terminate then s:terminate() end
394 394 starlit.effect.active[myid] = nil
395 395 end)
396 396 end
397 - s.starttime = minetest.get_server_uptime()
397 + s.starttime = core.get_server_uptime()
398 398 return s
399 399 end
400 400
401 -minetest.register_on_dieplayer(function(player)
401 +core.register_on_dieplayer(function(player)
402 402 starlit.effect.disjoin{target=player}
403 403 end)