diff --git a/binaries/data/mods/public/maps/random/danubius_triggers.js b/binaries/data/mods/public/maps/random/danubius_triggers.js index 89c088ffe1..e78c1b1a51 100644 --- a/binaries/data/mods/public/maps/random/danubius_triggers.js +++ b/binaries/data/mods/public/maps/random/danubius_triggers.js @@ -195,7 +195,7 @@ Trigger.prototype.debugLog = function(txt) Math.round(Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer).GetTime() / 60 / 1000) + "] " + txt + "\n"); }; -Trigger.prototype.GarrisonAllGallicBuildings = function(gaiaEnts) +Trigger.prototype.GarrisonAllGallicBuildings = function() { this.debugLog("Garrisoning all gallic buildings"); @@ -210,22 +210,14 @@ Trigger.prototype.GarrisonAllGallicBuildings = function(gaiaEnts) /** * Spawn units of the template at each gaia Civic Center and set them to defensive. */ -Trigger.prototype.SpawnInitialCCDefenders = function(gaiaEnts) +Trigger.prototype.SpawnInitialCCDefenders = function() { this.debugLog("To defend CCs, spawning " + uneval(ccDefenders)); - for (let gaiaEnt of gaiaEnts) - { - let cmpIdentity = Engine.QueryInterface(gaiaEnt, IID_Identity); - if (!cmpIdentity || !cmpIdentity.HasClass("CivCentre")) - continue; - - this.civicCenters.add(gaiaEnt); - + for (let ent of this.civicCenters) for (let ccDefender of ccDefenders) - for (let ent of TriggerHelper.SpawnUnits(gaiaEnt, pickRandom(ccDefender.templates), ccDefender.count, gaulPlayer)) + for (let ent of TriggerHelper.SpawnUnits(ent, pickRandom(ccDefender.templates), ccDefender.count, gaulPlayer)) TriggerHelper.SetUnitStance(ent, "defensive"); - } }; Trigger.prototype.SpawnCCAttackers = function() @@ -270,14 +262,10 @@ Trigger.prototype.SpawnCCAttackers = function() * Remember most Humans present at the beginning of the match (before spawning any unit) and * make them defensive. */ -Trigger.prototype.StartCelticRitual = function(gaiaEnts) +Trigger.prototype.StartCelticRitual = function() { - for (let ent of gaiaEnts) + for (let ent of TriggerHelper.GetPlayerEntitiesByClass(gaulPlayer, "Human")) { - let cmpIdentity = Engine.QueryInterface(ent, IID_Identity); - if (!cmpIdentity || !cmpIdentity.HasClass("Human")) - continue; - if (randBool(ritualProbability)) this.ritualEnts.add(ent); @@ -336,7 +324,7 @@ Trigger.prototype.SpawnShips = function() gaulPlayer)[0]); for (let ship of this.ships) - this.AttackAndPatrol([ship], shipTargetClass, triggerPointShipPatrol, "Ships"); + this.AttackAndPatrol([ship], shipTargetClass, triggerPointShipPatrol, "Ship"); this.DoAfterDelay(shipRespawnTime(time) * 60 * 1000, "SpawnShips", {}); @@ -408,13 +396,8 @@ Trigger.prototype.AttackAndPatrol = function(attackers, targetClass, triggerPoin if (!attackers.length) return; - let allTargets = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetNonGaiaEntities().filter(ent => { - let cmpIdentity = Engine.QueryInterface(ent, IID_Identity); - return cmpIdentity && MatchesClassList(cmpIdentity.GetClassesList(), targetClass); - }); - - let targets = allTargets.sort((ent1, ent2) => - DistanceBetweenEntities(attackers[0], ent1) - DistanceBetweenEntities(attackers[0], ent2)).slice(0, targetCount); + let targets = TriggerHelper.MatchEntitiesByClass(TriggerHelper.GetAllPlayersEntities(), targetClass).sort( + (ent1, ent2) => DistanceBetweenEntities(attackers[0], ent1) - DistanceBetweenEntities(attackers[0], ent2)).slice(0, targetCount); this.debugLog(debugName + " " + uneval(attackers) + " attack " + uneval(targets)); @@ -458,12 +441,8 @@ Trigger.prototype.GetActiveRiversides = function() let left = false; let right = false; - for (let ent of Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetNonGaiaEntities()) + for (let ent of TriggerHelper.GetAllPlayersEntitiesByClass(siegeTargetClass)) { - let cmpIdentity = Engine.QueryInterface(ent, IID_Identity); - if (!cmpIdentity || !cmpIdentity.HasClass(siegeTargetClass)) - continue; - if (this.IsLeftRiverside(ent)) left = true; else @@ -603,7 +582,7 @@ Trigger.prototype.InitDanubius = function() this.heroes = new Set(); // Remember gaia CCs to spawn attackers from - this.civicCenters = new Set(); + this.civicCenters = new Set(TriggerHelper.GetPlayerEntitiesByClass(gaulPlayer, "CivCentre")) // Maps from gaia ship entity ID to ungarrison trigger point entity ID and land patrol triggerpoint name this.shipTarget = {}; @@ -616,10 +595,9 @@ Trigger.prototype.InitDanubius = function() Engine.QueryInterface(this.GetTriggerPoints(triggerPointRiverDirection)[0], IID_Position).GetPosition2D(), this.mapCenter); - let gaiaEnts = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetEntitiesByPlayer(0); - this.StartCelticRitual(gaiaEnts); - this.GarrisonAllGallicBuildings(gaiaEnts); - this.SpawnInitialCCDefenders(gaiaEnts); + this.StartCelticRitual(); + this.GarrisonAllGallicBuildings(); + this.SpawnInitialCCDefenders(); this.SpawnCCAttackers(); this.SpawnShips(); diff --git a/binaries/data/mods/public/maps/random/elephantine_triggers.js b/binaries/data/mods/public/maps/random/elephantine_triggers.js index 5da0af15f1..d531db34fe 100644 --- a/binaries/data/mods/public/maps/random/elephantine_triggers.js +++ b/binaries/data/mods/public/maps/random/elephantine_triggers.js @@ -1,3 +1,5 @@ +var elephantinePlayerID = 0; + Trigger.prototype.InitElephantine = function() { this.InitElephantine_DefenderStance(); @@ -6,12 +8,8 @@ Trigger.prototype.InitElephantine = function() Trigger.prototype.InitElephantine_DefenderStance = function() { - for (let ent of Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetEntitiesByPlayer(0)) - { - let cmpIdentity = Engine.QueryInterface(ent, IID_Identity); - if (cmpIdentity && cmpIdentity.HasClass("Soldier")) - TriggerHelper.SetUnitStance(ent, "defensive"); - } + for (let ent of TriggerHelper.GetPlayerEntitiesByClass(elephantinePlayerID, "Soldier")) + TriggerHelper.SetUnitStance(ent, "defensive") }; Trigger.prototype.InitElephantine_GarrisonBuildings = function() @@ -19,10 +17,10 @@ Trigger.prototype.InitElephantine_GarrisonBuildings = function() let kushInfantryUnits = TriggerHelper.GetTemplateNamesByClasses("CitizenSoldier+Infantry", "kush", undefined, "Elite", true); let kushSupportUnits = TriggerHelper.GetTemplateNamesByClasses("FemaleCitizen Healer", "kush", undefined, "Elite", true); - TriggerHelper.SpawnAndGarrisonAtClasses(0, "Tower", kushInfantryUnits, 1); + TriggerHelper.SpawnAndGarrisonAtClasses(elephantinePlayerID, "Tower", kushInfantryUnits, 1); for (let identityClass of ["Wonder", "Temple", "Pyramid"]) - TriggerHelper.SpawnAndGarrisonAtClasses(0, identityClass, kushInfantryUnits.concat(kushSupportUnits), 1); + TriggerHelper.SpawnAndGarrisonAtClasses(elephantinePlayerID, identityClass, kushInfantryUnits.concat(kushSupportUnits), 1); }; { diff --git a/binaries/data/mods/public/maps/random/survivalofthefittest_triggers.js b/binaries/data/mods/public/maps/random/survivalofthefittest_triggers.js index 1688a2336a..69805e54d6 100644 --- a/binaries/data/mods/public/maps/random/survivalofthefittest_triggers.js +++ b/binaries/data/mods/public/maps/random/survivalofthefittest_triggers.js @@ -148,23 +148,11 @@ Trigger.prototype.SetDisableTemplates = function() */ Trigger.prototype.InitStartingUnits = function() { - let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); - for (let i = 1; i < TriggerHelper.GetNumberOfPlayers(); ++i) + for (let playerID = 1; playerID < TriggerHelper.GetNumberOfPlayers(); ++playerID) { - let playerEntities = cmpRangeManager.GetEntitiesByPlayer(i); - - for (let entity of playerEntities) - { - if (TriggerHelper.EntityMatchesClassList(entity, "CivilCentre")) - this.playerCivicCenter[i] = entity; - else if (TriggerHelper.EntityMatchesClassList(entity, "FemaleCitizen")) - { - this.treasureFemale[i] = entity; - - let cmpDamageReceiver = Engine.QueryInterface(entity, IID_DamageReceiver); - cmpDamageReceiver.SetInvulnerability(true); - } - } + this.playerCivicCenter[playerID] = TriggerHelper.GetPlayerEntitiesByClass(playerID, "CivilCentre")[0]; + this.treasureFemale[playerID] = TriggerHelper.GetPlayerEntitiesByClass(playerID, "FemaleCitizen")[0]; + Engine.QueryInterface(this.treasureFemale[playerID], IID_DamageReceiver).SetInvulnerability(true); } }; diff --git a/binaries/data/mods/public/maps/scripts/TriggerHelper.js b/binaries/data/mods/public/maps/scripts/TriggerHelper.js index dbaf6ee128..735e58c44f 100644 --- a/binaries/data/mods/public/maps/scripts/TriggerHelper.js +++ b/binaries/data/mods/public/maps/scripts/TriggerHelper.js @@ -21,6 +21,16 @@ TriggerHelper.GetOwner = function(ent) return -1; }; +TriggerHelper.GetEntitiesByPlayer = function(playerID) +{ + return Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetEntitiesByPlayer(playerID); +}; + +TriggerHelper.GetAllPlayersEntities = function() +{ + return Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetNonGaiaEntities(); +}; + TriggerHelper.SetUnitStance = function(ent, stance) { let cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI); @@ -212,12 +222,27 @@ TriggerHelper.GetNumberOfPlayers = function() * See globalscripts/Templates.js for details of MatchesClassList. * * @param entity - ID of the entity that we want to check for classes. - * @param classlist - List of the classes we are checking if the entity matches. + * @param classes - List of the classes we are checking if the entity matches. */ -TriggerHelper.EntityMatchesClassList = function(entity, classlist) +TriggerHelper.EntityMatchesClassList = function(entity, classes) { let cmpIdentity = Engine.QueryInterface(entity, IID_Identity); - return cmpIdentity && MatchesClassList(cmpIdentity.GetClassesList(), classlist); + return cmpIdentity && MatchesClassList(cmpIdentity.GetClassesList(), classes); +}; + +TriggerHelper.MatchEntitiesByClass = function(entities, classes) +{ + return entities.filter(ent => TriggerHelper.EntityMatchesClassList(ent, classes)); +}; + +TriggerHelper.GetPlayerEntitiesByClass = function(playerID, classes) +{ + return TriggerHelper.MatchEntitiesByClass(TriggerHelper.GetEntitiesByPlayer(playerID), classes); +}; + +TriggerHelper.GetAllPlayersEntitiesByClass = function(playerID, classes) +{ + return TriggerHelper.MatchEntitiesByClass(TriggerHelper.GetAllPlayersEntities(), classes); }; /**