1
0
forked from 0ad/0ad

Fix lobby gamelist issues when clients join and leave a match.

This patch will:

  - Pass `gameRegisterStanza` to `playerAssignmentsControl` constructor.
  - Remove handlers for `onClientJoin` and `onClientLeave` from
`gameRegisterStanza` class.
  - Call `gameRegisterStanza` method `sendImmediately` only once after
all handlers have run and after updating g_PlayerAssignments .
  - Remove from `gameRegisterStanza` the dependency on
`playerAssignmentsControl` since the `onClientJoin` and `onClientLeave`
handlers are removed.

Reviewers: Angen, wraitii

Accepted By: wraitii
Trac Tickets: #5929, #5933

Differential Revision: https://code.wildfiregames.com/D3406
This was SVN commit r24686.
This commit is contained in:
user1 2021-01-18 16:47:25 +00:00
parent d583048690
commit 8172dbbde0
3 changed files with 10 additions and 11 deletions

View File

@ -3,11 +3,12 @@
*/
class PlayerAssignmentsControl
{
constructor(setupWindow, netMessages)
constructor(setupWindow, netMessages, gameRegisterStanza)
{
this.clientJoinHandlers = new Set();
this.clientLeaveHandlers = new Set();
this.playerAssignmentsChangeHandlers = new Set();
this.gameRegisterStanza = gameRegisterStanza;
if (!g_IsNetworked)
{
@ -102,6 +103,9 @@ class PlayerAssignmentsControl
g_PlayerAssignments = newAssignments;
this.updatePlayerAssignments();
// Send at most one gameRegisterStanza after all handlers run in case a
// joining observer has been assigned to a playerslot.
this.gameRegisterStanza.sendImmediately?.();
}
assignClient(guid, playerIndex)

View File

@ -5,7 +5,7 @@
*/
class GameRegisterStanza
{
constructor(initData, setupWindow, netMessages, gameSettingsControl, playerAssignmentsControl, mapCache)
constructor(initData, setupWindow, netMessages, gameSettingsControl, mapCache)
{
this.mapCache = mapCache;
@ -20,10 +20,6 @@ class GameRegisterStanza
this.lastStanza = undefined;
// Events
let sendImmediately = this.sendImmediately.bind(this);
playerAssignmentsControl.registerClientJoinHandler(sendImmediately);
playerAssignmentsControl.registerClientLeaveHandler(sendImmediately);
setupWindow.registerClosePageHandler(this.onClosePage.bind(this));
gameSettingsControl.registerGameAttributesBatchChangeHandler(this.onGameAttributesBatchChange.bind(this));
netMessages.registerNetMessageHandler("start", this.onGameStart.bind(this));

View File

@ -27,7 +27,9 @@ class SetupWindow
let mapCache = new MapCache();
let mapFilters = new MapFilters(mapCache);
let gameSettingsControl = new GameSettingsControl(this, netMessages, startGameControl, mapCache);
let playerAssignmentsControl = new PlayerAssignmentsControl(this, netMessages);
let gameRegisterStanza = Engine.HasXmppClient() &&
new GameRegisterStanza(initData, this, netMessages, gameSettingsControl, mapCache);
let playerAssignmentsControl = new PlayerAssignmentsControl(this, netMessages, gameRegisterStanza);
let readyControl = new ReadyControl(netMessages, gameSettingsControl, startGameControl, playerAssignmentsControl);
// These class instances control central data and do not manage any GUI Object.
@ -39,10 +41,7 @@ class SetupWindow
"readyControl": readyControl,
"startGameControl": startGameControl,
"netMessages": netMessages,
"gameRegisterStanza":
Engine.HasXmppClient() &&
new GameRegisterStanza(
initData, this, netMessages, gameSettingsControl, playerAssignmentsControl, mapCache)
"gameRegisterStanza": gameRegisterStanza
};
// These are the pages within the setup window that may use the controls defined above