forked from Mirrors/openclonk
117 lines
2.9 KiB
C
117 lines
2.9 KiB
C
/**
|
|
Schedule.c
|
|
Schedule can be used to execute scripts or functions repetitively with delay.
|
|
|
|
@author
|
|
*/
|
|
|
|
// Executes a script repetitively with delay.
|
|
// documented in /docs/sdk/script/fn
|
|
global func Schedule(object obj, string script, int interval, int repeats)
|
|
{
|
|
// Defaults.
|
|
if (!repeats)
|
|
repeats = 1;
|
|
// Create effect.
|
|
var fx = AddEffect("IntSchedule", obj, 1, interval, obj);
|
|
if (!fx)
|
|
return false;
|
|
// Set variables.
|
|
fx.Script = script;
|
|
fx.Repeats = repeats;
|
|
return true;
|
|
}
|
|
|
|
global func FxIntScheduleTimer(object obj, effect fx)
|
|
{
|
|
// Just a specific number of repeats.
|
|
var done = --fx.Repeats <= 0;
|
|
// Execute.
|
|
eval(fx.Script);
|
|
// Remove schedule if done.
|
|
if (done)
|
|
return FX_Execute_Kill;
|
|
return FX_OK;
|
|
}
|
|
|
|
// Adds a timed call to an object, replacement of DefCore TimerCall.
|
|
global func AddTimer(call_function, int interval)
|
|
{
|
|
if (!this)
|
|
return false;
|
|
// Default to one second.
|
|
if (interval == nil)
|
|
interval = 36;
|
|
// Create effect and add function and repeat infinitely.
|
|
var fx = AddEffect("IntScheduleCall", this, 1, interval, this);
|
|
fx.Function = call_function;
|
|
fx.NoStop = true;
|
|
fx.Pars = [];
|
|
return true;
|
|
}
|
|
|
|
// removes a timer from an object that was added earlier with AddTimer. This removes exactly one timer that fits to the name and returns true on success
|
|
global func RemoveTimer(call_function /* name or pointer to the timer to remove */)
|
|
{
|
|
if(!this)
|
|
return false;
|
|
|
|
var fx, index = 0;
|
|
while(fx = GetEffect("IntScheduleCall", this, index++))
|
|
{
|
|
if(fx.Function != call_function) continue;
|
|
if(fx.NoStop != true) continue;
|
|
RemoveEffect(nil, this, fx);
|
|
return true;
|
|
}
|
|
|
|
// not found
|
|
return false;
|
|
}
|
|
|
|
// Executes a function repetitively with delay.
|
|
// documented in /docs/sdk/script/fn
|
|
global func ScheduleCall(object obj, call_function, int interval, int repeats, par0, par1, par2, par3, par4)
|
|
{
|
|
// Defaults.
|
|
if (!repeats)
|
|
repeats = 1;
|
|
// Create effect.
|
|
var fx = AddEffect("IntScheduleCall", obj, 1, interval, obj);
|
|
if (!fx)
|
|
return false;
|
|
// Set variables.
|
|
fx.Function = call_function;
|
|
fx.Repeats = repeats;
|
|
fx.Pars = [par0, par1, par2, par3, par4];
|
|
return true;
|
|
}
|
|
|
|
global func FxIntScheduleCallTimer(object obj, effect fx)
|
|
{
|
|
// Just a specific number of repeats.
|
|
var done = --fx.Repeats <= 0;
|
|
// Execute.
|
|
Call(fx.Function, fx.Pars[0], fx.Pars[1], fx.Pars[2], fx.Pars[3], fx.Pars[4]);
|
|
// Remove schedule call if done, take into account infinite schedules.
|
|
if (done && !fx.NoStop)
|
|
return FX_Execute_Kill;
|
|
return FX_OK;
|
|
}
|
|
|
|
// documented in /docs/sdk/script/fn
|
|
global func ClearScheduleCall(object obj, call_function)
|
|
{
|
|
var i;
|
|
// Count downwards from effectnumber, to remove effects.
|
|
i = GetEffectCount("IntScheduleCall", obj);
|
|
while (i--) {
|
|
// Check All ScheduleCall-Effects.
|
|
var fx = GetEffect("IntScheduleCall", obj, i);
|
|
if (fx && fx.Function == call_function)
|
|
// Found right function. Remove effect.
|
|
RemoveEffect(nil, obj, fx);
|
|
}
|
|
return;
|
|
}
|