0ad/binaries/data/mods/public/simulation/components/TriggerPoint.js
wraitii 8f8996e338 Allow registering custom data for triggers
This allows easier handling of e.g. range triggers calling into the same
function.

The original trigger data is also forwarded for convenience.

Differential Revision: https://code.wildfiregames.com/D3904
This was SVN commit r25413.
2021-05-09 16:55:36 +00:00

79 lines
2.4 KiB
JavaScript

function TriggerPoint() {}
TriggerPoint.prototype.Schema =
"<optional>" +
"<element name='Reference'>" +
"<text/>" +
"</element>" +
"</optional>";
TriggerPoint.prototype.Init = function()
{
if (this.template && this.template.Reference)
{
var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
cmpTrigger.RegisterTriggerPoint(this.template.Reference, this.entity);
}
this.currentCollections = {};
this.triggers = {};
};
TriggerPoint.prototype.OnDestroy = function()
{
if (this.template && this.template.EntityReference)
{
var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
cmpTrigger.RemoveRegisteredTriggerPoint(this.template.Reference, this.entity);
}
};
/**
* @param name Name of the trigger.
* @param data The data is an object containing information for the range query
* Some of the data has sendible defaults (mentionned next to the object)
* data.players = [1,2,3,...] * list of player ids
* data.minRange = 0 * Minimum range for the query
* data.maxRange = -1 * Maximum range for the query (-1 = no maximum)
* data.requiredComponent = 0 * Required component id the entities will have
* data.enabled = false * If the query is enabled by default
*/
TriggerPoint.prototype.RegisterRangeTrigger = function(name, data)
{
var players = data.players || Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayers();
var minRange = data.minRange || 0;
var maxRange = data.maxRange || -1;
var cid = data.requiredComponent || 0;
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
var tag = cmpRangeManager.CreateActiveQuery(this.entity, minRange, maxRange, players, cid, cmpRangeManager.GetEntityFlagMask("normal"), true);
this.currentCollections[tag] = [];
this.triggers[tag] = name;
return tag;
};
TriggerPoint.prototype.OnRangeUpdate = function(msg)
{
var collection = this.currentCollections[msg.tag];
if (!collection)
return;
for (var ent of msg.removed)
{
var index = collection.indexOf(ent);
if (index > -1)
collection.splice(index, 1);
}
for (var entity of msg.added)
collection.push(entity);
var r = { "currentCollection": collection.slice() };
r.added = msg.added;
r.removed = msg.removed;
var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
cmpTrigger.CallTrigger("OnRange", this.triggers[msg.tag], r);
};
Engine.RegisterComponentType(IID_TriggerPoint, "TriggerPoint", TriggerPoint);