Index: binaries/data/mods/public/simulation/components/Auras.js =================================================================== --- binaries/data/mods/public/simulation/components/Auras.js +++ binaries/data/mods/public/simulation/components/Auras.js @@ -117,20 +117,19 @@ var cmpPlayer = Engine.QueryInterface(this.entity, IID_Player); if (!cmpPlayer) cmpPlayer = QueryOwnerInterface(this.entity); + if (!cmpPlayer || cmpPlayer.GetState() == "defeated") return; - var numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers(); - for (var i = 0; i < numPlayers; ++i) + let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); + for (let i of cmpPlayerManager.GetNonGaiaPlayers()) { - for (let p of affectedPlayers) - { - if (p == "Player" ? cmpPlayer.GetPlayerID() == i : cmpPlayer["Is" + p](i)) - { - this.affectedPlayers[name].push(i); - break; - } - } + let cmpAffectedPlayer = QueryPlayerIDInterface(i); + if (!cmpAffectedPlayer || cmpAffectedPlayer.GetState() == "defeated") + continue; + + if (affectedPlayers.some(p => p == "Player" ? cmpPlayer.GetPlayerID() == i : cmpPlayer["Is" + p](i))) + this.affectedPlayers[name].push(i); } }; @@ -480,8 +479,14 @@ } }; -Auras.prototype.OnPlayerDefeated = function(msg) +/** + * Only update playerauras, since units and structures are updated OnOwnershipChanged. + */ +Auras.prototype.OnGlobalPlayerDefeated = function(msg) { + if (!Engine.QueryInterface(this.entity, IID_Player)) + return + this.Clean(); }; Index: binaries/data/mods/public/simulation/components/Player.js =================================================================== --- binaries/data/mods/public/simulation/components/Player.js +++ binaries/data/mods/public/simulation/components/Player.js @@ -495,7 +495,7 @@ }); } - Engine.BroadcastMessage(won ? MT_PlayerWon : MT_PlayerDefeated, { "playerId": this.playerID }); + Engine.PostMessage(this.entity, won ? MT_PlayerWon : MT_PlayerDefeated, { "playerId": this.playerID }); if (message) {