Only delete/create players until the needed number is reached. Patch by trompetin17. Fixes #1953.

Previously we removed all players and created them anew. This caused
issues in Atlas,
as some components were recreated, but did not get informed about
already existing
entities (eg cmpTechnologyManager). By only creating/deleting players
until we obtain
the new number of players we do not have this issue.

This was SVN commit r16080.
This commit is contained in:
leper 2014-12-29 17:33:39 +00:00
parent f2edd35989
commit 354bd8b088
3 changed files with 28 additions and 23 deletions

View File

@ -56,12 +56,20 @@ PlayerManager.prototype.RemoveAllPlayers = function()
{
// Destroy existing player entities
for each (var id in this.playerEntities)
{
Engine.DestroyEntity(id);
}
this.playerEntities = [];
};
PlayerManager.prototype.RemoveLastPlayer = function()
{
if (this.playerEntities.length == 0)
return;
var lastId = this.playerEntities.pop();
Engine.DestroyEntity(lastId);
};
PlayerManager.prototype.GetAllPlayerEntities = function()
{
return this.playerEntities;

View File

@ -4,8 +4,9 @@
* all other initialization must be done after loading map (terrain/entities).
* DO NOT use other components here, as they may fail unpredictably.
* settings is the object containing settings for this map.
* newPlayers if true will remove any old player entities and add new ones
* (used when loading a map or when Atlas changes the number of players).
* newPlayers if true will remove old player entities or add new ones until
* the new number of player entities is obtained
* (used when loading a map or when Atlas changes the number of players).
*/
function LoadPlayerSettings(settings, newPlayers)
{
@ -20,45 +21,40 @@ function LoadPlayerSettings(settings, newPlayers)
var playerDefaults = rawData.PlayerData;
// default number of players
var numPlayers = 8;
// Get player manager
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
var numPlayers = cmpPlayerManager.GetNumPlayers();
// Remove existing players and add new ones
// Remove existing players or add new ones
if (newPlayers)
{
cmpPlayerManager.RemoveAllPlayers();
var settingsNumPlayers = 9; // default 8 players + gaia
if (settings.PlayerData)
{
// Get number of players including gaia
numPlayers = settings.PlayerData.length + 1;
}
settingsNumPlayers = settings.PlayerData.length + 1; // including gaia
else
{
warn("Player.js: Setup has no player data - using defaults");
}
for (var i = 0; i < numPlayers; ++i)
while (settingsNumPlayers > numPlayers)
{
// Add player entity to engine
// TODO: Get player template name from civ data
var entID = Engine.AddEntity("special/player");
var cmpPlayer = Engine.QueryInterface(entID, IID_Player);
if (!cmpPlayer)
throw("Player.js: Error creating player entity "+i);
throw("Player.js: Error creating player entity " + numPlayers);
cmpPlayer.SetPlayerID(i);
// Add player to player manager
cmpPlayerManager.AddPlayer(entID);
++numPlayers;
}
while (settingsNumPlayers < numPlayers)
{
cmpPlayerManager.RemoveLastPlayer();
--numPlayers;
}
}
numPlayers = cmpPlayerManager.GetNumPlayers();
// Initialize the player data
for (var i = 0; i < numPlayers; ++i)
{

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2013 Wildfire Games.
/* Copyright (C) 2014 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -878,6 +878,7 @@ BEGIN_COMMAND(DeleteObjects)
oldObjects.push_back(obj);
g_Game->GetSimulation2()->DestroyEntity(obj.entityID);
}
g_Game->GetSimulation2()->FlushDestroyedEntities();
}
void Undo()