starlit  Diff

Differences From Artifact [9a580a99bf]:

To Artifact [ee92b6e11c]:


   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)