1
0
forked from 0ad/0ad
0ad/binaries/data/mods/public/simulation/components/Timer.js
Ykkrosh cfae58928f # New unit movement system, which does a far better job of approaching targets and avoiding obstacles.
Add short-range vertex-based pathfinder.
Integrate new pathfinder into unit motion code.
Change obstruction system to get rid of circles, and differentiate
structures from units.
Make PositionChanged messages synchronous.
Try to prevent some accidental float->int conversions.

This was SVN commit r7484.
2010-04-29 23:36:05 +00:00

66 lines
1.5 KiB
JavaScript

function Timer() {}
Timer.prototype.Schema =
"<a:component type='system'/><empty/>";
Timer.prototype.Init = function()
{
this.id = 0;
this.time = 0;
this.timers = {};
};
Timer.prototype.GetTime = function()
{
return this.time;
}
Timer.prototype.OnUpdate = function(msg)
{
var dt = Math.round(msg.turnLength * 1000);
this.time += dt;
// Collect the timers that need to run
// (We do this in two stages to avoid deleting from the timer list while
// we're in the middle of iterating through it)
var run = [];
for (var id in this.timers)
{
if (this.timers[id][3] <= this.time)
run.push(id);
}
for each (var id in run)
{
var t = this.timers[id];
var cmp = Engine.QueryInterface(t[0], t[1]);
try {
cmp[t[2]](t[4]);
} catch (e) {
var stack = e.stack.trimRight().replace(/^/mg, ' '); // indent the stack trace
print("Error in timer on entity "+t[0]+", IID "+t[1]+", function "+t[2]+": "+e+"\n"+stack+"\n");
// TODO: should report in an error log
}
delete this.timers[id];
}
}
/**
* Create a new timer, which will call the 'funcname' method with argument 'data'
* on the 'iid' component of the 'ent' entity, after at least 'time' milliseconds.
* Returns a non-zero id that can be passed to CancelTimer.
*/
Timer.prototype.SetTimeout = function(ent, iid, funcname, time, data)
{
var id = ++this.id;
this.timers[id] = [ent, iid, funcname, this.time + time, data];
return id;
};
Timer.prototype.CancelTimer = function(id)
{
delete this.timers[id];
};
Engine.RegisterComponentType(IID_Timer, "Timer", Timer);