mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-17 13:53:57 -07:00
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.
79 lines
2.4 KiB
JavaScript
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);
|