Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/simulation/components/Trigger.js
Show First 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | |||||
}; | }; | ||||
Trigger.prototype.GetTriggerPoints = function(ref) | Trigger.prototype.GetTriggerPoints = function(ref) | ||||
{ | { | ||||
return this.triggerPoints[ref] || []; | return this.triggerPoints[ref] || []; | ||||
}; | }; | ||||
/** | /** | ||||
* Binds a function to the specified event. | * Create a trigger listening on a specific event. | ||||
* | * | ||||
* @param {string} event - One of eventNames | * @param {string} event - One of eventNames | ||||
* @param {string} action - Name of a function available to this object | * @param {string} name - Name of the trigger. | ||||
* @param {Object} data - f.e. enabled or not, delay for timers, range for range triggers | * If no action is specified in triggerData, the action will be the trigger name. | ||||
* @param {Object} triggerData - f.e. enabled or not, delay for timers, range for range triggers. | |||||
* | * | ||||
* @example | * @example | ||||
* data = { enabled: true, interval: 1000, delay: 500 } | * triggerData = { enabled: true, interval: 1000, delay: 500 } | ||||
* | |||||
* General settings: | |||||
* enabled = false * If the trigger is enabled by default. | |||||
* action = name * The function (on Trigger) to call. Defaults to the trigger name. | |||||
* | * | ||||
* Range trigger: | * Range trigger: | ||||
* data.entities = [id1, id2] * Ids of the source | * entities = [id1, id2] * Ids of the source | ||||
* data.players = [1,2,3,...] * list of player ids | * players = [1,2,3,...] * list of player ids | ||||
* data.minRange = 0 * Minimum range for the query | * minRange = 0 * Minimum range for the query | ||||
* data.maxRange = -1 * Maximum range for the query (-1 = no maximum) | * maxRange = -1 * Maximum range for the query (-1 = no maximum) | ||||
* data.requiredComponent = 0 * Required component id the entities will have | * requiredComponent = 0 * Required component id the entities will have | ||||
* data.enabled = false * If the query is enabled by default | |||||
*/ | */ | ||||
Trigger.prototype.RegisterTrigger = function(event, action, data) | Trigger.prototype.RegisterTrigger = function(event, name, triggerData) | ||||
{ | { | ||||
if (!this[event]) | if (!this[event]) | ||||
{ | { | ||||
warn("Trigger.js: Invalid trigger event \"" + event + "\"."); | warn("Trigger.js: Invalid trigger event \"" + event + "\"."); | ||||
return; | return; | ||||
} | } | ||||
if (this[event][action]) | if (this[event][name]) | ||||
{ | { | ||||
warn("Trigger.js: Trigger \"" + action + "\" has been registered before. Aborting..."); | warn("Trigger.js: Trigger \"" + name + "\" has been registered before. Aborting..."); | ||||
return; | return; | ||||
} | } | ||||
// clone the data to be sure it's only modified locally | // clone the data to be sure it's only modified locally | ||||
// We could run into triggers overwriting each other's data otherwise. | // We could run into triggers overwriting each other's data otherwise. | ||||
// F.e. getting the wrong timer tag | // F.e. getting the wrong timer tag | ||||
data = clone(data) || { "enabled": false }; | triggerData = clone(triggerData) || { "enabled": false }; | ||||
if (!triggerData.action) | |||||
triggerData.action = name; | |||||
this[event][action] = data; | this[event][name] = triggerData; | ||||
// setup range query | // setup range query | ||||
if (event == "OnRange") | if (event == "OnRange") | ||||
{ | { | ||||
if (!data.entities) | if (!triggerData.entities) | ||||
{ | { | ||||
warn("Trigger.js: Range triggers should carry extra data"); | warn("Trigger.js: Range triggers should carry extra data"); | ||||
return; | return; | ||||
} | } | ||||
data.queries = []; | triggerData.queries = []; | ||||
for (let ent of data.entities) | for (let ent of triggerData.entities) | ||||
{ | { | ||||
let cmpTriggerPoint = Engine.QueryInterface(ent, IID_TriggerPoint); | let cmpTriggerPoint = Engine.QueryInterface(ent, IID_TriggerPoint); | ||||
if (!cmpTriggerPoint) | if (!cmpTriggerPoint) | ||||
{ | { | ||||
warn("Trigger.js: Range triggers must be defined on trigger points"); | warn("Trigger.js: Range triggers must be defined on trigger points"); | ||||
continue; | continue; | ||||
} | } | ||||
data.queries.push(cmpTriggerPoint.RegisterRangeTrigger(action, data)); | triggerData.queries.push(cmpTriggerPoint.RegisterRangeTrigger(name, triggerData)); | ||||
} | } | ||||
} | } | ||||
if (data.enabled) | if (triggerData.enabled) | ||||
this.EnableTrigger(event, action); | this.EnableTrigger(event, name); | ||||
}; | }; | ||||
Trigger.prototype.DisableTrigger = function(event, action) | Trigger.prototype.DisableTrigger = function(event, name) | ||||
{ | { | ||||
if (!this[event][action]) | if (!this[event][name]) | ||||
{ | { | ||||
warn("Trigger.js: Disabling unknown trigger"); | warn("Trigger.js: Disabling unknown trigger"); | ||||
return; | return; | ||||
} | } | ||||
let data = this[event][action]; | let data = this[event][name]; | ||||
// special casing interval and range triggers for performance | // special casing interval and range triggers for performance | ||||
if (event == "OnInterval") | if (event == "OnInterval") | ||||
{ | { | ||||
if (!data.timer) // don't disable it a second time | if (!data.timer) // don't disable it a second time | ||||
return; | return; | ||||
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); | let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); | ||||
cmpTimer.CancelTimer(data.timer); | cmpTimer.CancelTimer(data.timer); | ||||
data.timer = null; | data.timer = null; | ||||
} | } | ||||
else if (event == "OnRange") | else if (event == "OnRange") | ||||
{ | { | ||||
if (!data.queries) | if (!data.queries) | ||||
{ | { | ||||
warn("Trigger.js: Range query wasn't set up before trying to disable it."); | warn("Trigger.js: Range query wasn't set up before trying to disable it."); | ||||
return; | return; | ||||
} | } | ||||
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); | let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); | ||||
for (let query of data.queries) | for (let query of data.queries) | ||||
cmpRangeManager.DisableActiveQuery(query); | cmpRangeManager.DisableActiveQuery(query); | ||||
} | } | ||||
data.enabled = false; | data.enabled = false; | ||||
}; | }; | ||||
Trigger.prototype.EnableTrigger = function(event, action) | Trigger.prototype.EnableTrigger = function(event, name) | ||||
{ | { | ||||
if (!this[event][action]) | if (!this[event][name]) | ||||
{ | { | ||||
warn("Trigger.js: Enabling unknown trigger"); | warn("Trigger.js: Enabling unknown trigger"); | ||||
return; | return; | ||||
} | } | ||||
let data = this[event][action]; | let data = this[event][name]; | ||||
// special casing interval and range triggers for performance | // special casing interval and range triggers for performance | ||||
if (event == "OnInterval") | if (event == "OnInterval") | ||||
{ | { | ||||
if (data.timer) // don't enable it a second time | if (data.timer) // don't enable it a second time | ||||
return; | return; | ||||
if (!data.interval) | if (!data.interval) | ||||
{ | { | ||||
warn("Trigger.js: An interval trigger should have an intervel in its data"); | warn("Trigger.js: An interval trigger should have an intervel in its data"); | ||||
return; | return; | ||||
} | } | ||||
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); | let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); | ||||
data.timer = cmpTimer.SetInterval(this.entity, IID_Trigger, "DoAction", | data.timer = cmpTimer.SetInterval(this.entity, IID_Trigger, "DoAction", | ||||
data.delay || 0, data.interval, { "action": action }); | data.delay || 0, data.interval, { "name": name }); | ||||
} | } | ||||
else if (event == "OnRange") | else if (event == "OnRange") | ||||
{ | { | ||||
if (!data.queries) | if (!data.queries) | ||||
{ | { | ||||
warn("Trigger.js: Range query wasn't set up before"); | warn("Trigger.js: Range query wasn't set up before"); | ||||
return; | return; | ||||
} | } | ||||
Show All 16 Lines | |||||
Trigger.prototype.CallEvent = function(event, data) | Trigger.prototype.CallEvent = function(event, data) | ||||
{ | { | ||||
if (!this[event]) | if (!this[event]) | ||||
{ | { | ||||
warn("Trigger.js: Unknown trigger event called:\"" + event + "\"."); | warn("Trigger.js: Unknown trigger event called:\"" + event + "\"."); | ||||
return; | return; | ||||
} | } | ||||
for (let action in this[event]) | for (let name in this[event]) | ||||
if (this[event][action].enabled) | if (this[event][name].enabled) | ||||
this.DoAction({ "action": action, "data": data }); | this.DoAction({ "action": this[event][name].action, "data": data }); | ||||
}; | }; | ||||
Trigger.prototype.OnGlobalInitGame = function(msg) | Trigger.prototype.OnGlobalInitGame = function(msg) | ||||
{ | { | ||||
this.CallEvent("OnInitGame", {}); | this.CallEvent("OnInitGame", {}); | ||||
}; | }; | ||||
Trigger.prototype.OnGlobalConstructionFinished = function(msg) | Trigger.prototype.OnGlobalConstructionFinished = function(msg) | ||||
▲ Show 20 Lines • Show All 121 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator