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:
parent
f2edd35989
commit
354bd8b088
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user