Index: binaries/data/mods/public/simulation/components/PlayerManager.js =================================================================== --- binaries/data/mods/public/simulation/components/PlayerManager.js +++ binaries/data/mods/public/simulation/components/PlayerManager.js @@ -25,45 +25,57 @@ newDiplo[id] = 1; cmpPlayer.SetDiplomacy(newDiplo); + Engine.BroadcastMessage(MT_PlayerEntityChanged, { + "player": id, + "from": INVALID_ENTITY, + "to": ent + }); + return id; }; /** - * To avoid possible problems with cached quantities (as in TechnologyManager), + * To avoid possible problems, * we first remove all entities from this player, and add them back after the replacement. * Note: This should only be called during setup/init and not during the game */ PlayerManager.prototype.ReplacePlayer = function(id, ent) { - var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); - var entities = cmpRangeManager.GetEntitiesByPlayer(id); - for (var e of entities) + let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); + let entities = cmpRangeManager.GetEntitiesByPlayer(id); + for (let e of entities) { - var cmpOwnership = Engine.QueryInterface(e, IID_Ownership); + let cmpOwnership = Engine.QueryInterface(e, IID_Ownership); if (cmpOwnership) cmpOwnership.SetOwner(INVALID_PLAYER); } - var oldent = this.playerEntities[id]; - var cmpPlayer = Engine.QueryInterface(oldent, IID_Player); - var diplo = cmpPlayer.GetDiplomacy(); - var color = cmpPlayer.GetColor(); + let oldent = this.playerEntities[id]; + let oldCmpPlayer = Engine.QueryInterface(oldent, IID_Player); + let diplo = oldCmpPlayer.GetDiplomacy(); + let color = oldCmpPlayer.GetColor(); - var cmpPlayer = Engine.QueryInterface(ent, IID_Player); - cmpPlayer.SetPlayerID(id); + let newCmpPlayer = Engine.QueryInterface(ent, IID_Player); + newCmpPlayer.SetPlayerID(id); this.playerEntities[id] = ent; - cmpPlayer.SetColor(color); - cmpPlayer.SetDiplomacy(diplo); + newCmpPlayer.SetColor(color); + newCmpPlayer.SetDiplomacy(diplo); + + Engine.BroadcastMessage(MT_PlayerEntityChanged, { + "player": id, + "from": oldent, + "to": ent + }); + + for (let e of entities) + { + let cmpOwnership = Engine.QueryInterface(e, IID_Ownership); + if (cmpOwnership) + cmpOwnership.SetOwner(id); + } Engine.DestroyEntity(oldent); Engine.FlushDestroyedEntities(); - - for (var e of entities) - { - var cmpOwnership = Engine.QueryInterface(e, IID_Ownership); - if (cmpOwnership) - cmpOwnership.SetOwner(id); - } }; /** @@ -126,8 +138,15 @@ PlayerManager.prototype.RemoveAllPlayers = function() { // Destroy existing player entities - for (var id of this.playerEntities) - Engine.DestroyEntity(id); + for (let player in this.playerEntities) + { + Engine.BroadcastMessage(MT_PlayerEntityChanged, { + "player": player, + "from": this.playerEntities[player], + "to": INVALID_ENTITY + }); + Engine.DestroyEntity(this.playerEntities[player]); + } this.playerEntities = []; }; @@ -138,6 +157,11 @@ return; var lastId = this.playerEntities.pop(); + Engine.BroadcastMessage(MT_PlayerEntityChanged, { + "player": this.playerEntities.length + 1, + "from": lastId, + "to": INVALID_ENTITY + }); Engine.DestroyEntity(lastId); }; Index: binaries/data/mods/public/simulation/components/interfaces/PlayerManager.js =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/components/interfaces/PlayerManager.js @@ -0,0 +1,6 @@ +/** + * Message of the form { player": number, "from": number, "to": number } + * sent from PlayerManager component to warn other components when a player changed entities. + * This is also sent when the player gets created or destroyed. + */ +Engine.RegisterMessageType("PlayerEntityChanged");