Source: TriggerPoint.js

/**
 * @class
 */
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);