Differential D3723 Diff 16625 ps/trunk/binaries/data/mods/public/gui/gamesetup/Controls/PlayerAssignmentsControl.js
Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/binaries/data/mods/public/gui/gamesetup/Controls/PlayerAssignmentsControl.js
Show All 11 Lines | constructor(setupWindow, netMessages, gameRegisterStanza) | ||||
if (!g_IsNetworked) | if (!g_IsNetworked) | ||||
{ | { | ||||
let name = singleplayerName(); | let name = singleplayerName(); | ||||
// Replace empty player name when entering a single-player match for the first time. | // Replace empty player name when entering a single-player match for the first time. | ||||
Engine.ConfigDB_CreateAndWriteValueToFile("user", this.ConfigNameSingleplayer, name, "config/user.cfg"); | Engine.ConfigDB_CreateAndWriteValueToFile("user", this.ConfigNameSingleplayer, name, "config/user.cfg"); | ||||
// By default, assign the player to the first slot. | |||||
g_PlayerAssignments = { | g_PlayerAssignments = { | ||||
"local": { | "local": { | ||||
"name": name, | "name": name, | ||||
"player": -1 | "player": 1 | ||||
} | } | ||||
}; | }; | ||||
} | } | ||||
g_GameSettings.playerCount.watch(() => this.unassignInvalidPlayers(), ["nbPlayers"]); | g_GameSettings.playerCount.watch(() => this.unassignInvalidPlayers(), ["nbPlayers"]); | ||||
setupWindow.registerLoadHandler(this.onLoad.bind(this)); | setupWindow.registerLoadHandler(this.onLoad.bind(this)); | ||||
setupWindow.registerGetHotloadDataHandler(this.onGetHotloadData.bind(this)); | setupWindow.registerGetHotloadDataHandler(this.onGetHotloadData.bind(this)); | ||||
netMessages.registerNetMessageHandler("players", this.onPlayerAssignmentMessage.bind(this)); | netMessages.registerNetMessageHandler("players", this.onPlayerAssignmentMessage.bind(this)); | ||||
this.registerClientJoinHandler(this.onClientJoin.bind(this)); | |||||
} | } | ||||
registerPlayerAssignmentsChangeHandler(handler) | registerPlayerAssignmentsChangeHandler(handler) | ||||
{ | { | ||||
this.playerAssignmentsChangeHandlers.add(handler); | this.playerAssignmentsChangeHandlers.add(handler); | ||||
} | } | ||||
unregisterPlayerAssignmentsChangeHandler(handler) | unregisterPlayerAssignmentsChangeHandler(handler) | ||||
Show All 23 Lines | class PlayerAssignmentsControl | ||||
onLoad(initData, hotloadData) | onLoad(initData, hotloadData) | ||||
{ | { | ||||
if (hotloadData) | if (hotloadData) | ||||
{ | { | ||||
g_PlayerAssignments = hotloadData.playerAssignments; | g_PlayerAssignments = hotloadData.playerAssignments; | ||||
this.updatePlayerAssignments(); | this.updatePlayerAssignments(); | ||||
} | } | ||||
else if (!g_IsNetworked) | |||||
{ | |||||
// Simulate a net message for the local player to keep a common path. | |||||
this.onPlayerAssignmentMessage({ | |||||
"newAssignments": g_PlayerAssignments | |||||
}); | |||||
} | |||||
} | } | ||||
onGetHotloadData(object) | onGetHotloadData(object) | ||||
{ | { | ||||
object.playerAssignments = g_PlayerAssignments; | object.playerAssignments = g_PlayerAssignments; | ||||
} | } | ||||
/** | /** | ||||
* On client join, try to assign them to a free slot. | |||||
* (This is called before g_PlayerAssignments is updated). | |||||
*/ | |||||
onClientJoin(newGUID, newAssignments) | |||||
{ | |||||
if (!g_IsController || newAssignments[newGUID].player != -1) | |||||
return; | |||||
// Assign the client (or only buddies if prefered) to a free slot | |||||
if (newGUID != Engine.GetPlayerGUID()) | |||||
{ | |||||
let assignOption = Engine.ConfigDB_GetValue("user", this.ConfigAssignPlayers); | |||||
if (assignOption == "disabled" || | |||||
assignOption == "buddies" && g_Buddies.indexOf(splitRatingFromNick(newAssignments[newGUID].name).nick) == -1) | |||||
return; | |||||
} | |||||
// Find a player slot that no other player is assigned to. | |||||
let firstFreeSlot = [...Array(g_MaxPlayers).keys()]; | |||||
firstFreeSlot = firstFreeSlot.find(i => { | |||||
for (let guid in newAssignments) | |||||
if (newAssignments[guid].player == i + 1) | |||||
return false; | |||||
return true; | |||||
}); | |||||
if (firstFreeSlot === -1) | |||||
return; | |||||
this.assignClient(newGUID, firstFreeSlot + 1); | |||||
} | |||||
/** | |||||
* To be called when g_PlayerAssignments is modified. | * To be called when g_PlayerAssignments is modified. | ||||
*/ | */ | ||||
updatePlayerAssignments() | updatePlayerAssignments() | ||||
{ | { | ||||
Engine.ProfileStart("updatePlayerAssignments"); | Engine.ProfileStart("updatePlayerAssignments"); | ||||
for (let handler of this.playerAssignmentsChangeHandlers) | for (let handler of this.playerAssignmentsChangeHandlers) | ||||
handler(); | handler(); | ||||
Engine.ProfileStop(); | Engine.ProfileStop(); | ||||
Show All 19 Lines | onPlayerAssignmentMessage(message) | ||||
this.updatePlayerAssignments(); | this.updatePlayerAssignments(); | ||||
// Send at most one gameRegisterStanza after all handlers run in case a | // Send at most one gameRegisterStanza after all handlers run in case a | ||||
// joining observer has been assigned to a playerslot. | // joining observer has been assigned to a playerslot. | ||||
this.gameRegisterStanza.sendImmediately?.(); | this.gameRegisterStanza.sendImmediately?.(); | ||||
} | } | ||||
assignClient(guid, playerIndex) | assignClient(guid, playerIndex) | ||||
{ | { | ||||
g_GameSettings.playerAI.setAI(playerIndex - 1, undefined); | |||||
if (g_IsNetworked) | if (g_IsNetworked) | ||||
Engine.AssignNetworkPlayer(playerIndex, guid); | Engine.AssignNetworkPlayer(playerIndex, guid); | ||||
if (g_PlayerAssignments[guid]) | else | ||||
{ | |||||
g_PlayerAssignments[guid].player = playerIndex; | g_PlayerAssignments[guid].player = playerIndex; | ||||
this.updatePlayerAssignments(); | this.updatePlayerAssignments(); | ||||
} | } | ||||
} | |||||
/** | /** | ||||
* If both clients are assigned players, this will swap their assignments. | * If both clients are assigned players, this will swap their assignments. | ||||
*/ | */ | ||||
assignPlayer(guidToAssign, playerIndex) | assignPlayer(guidToAssign, playerIndex) | ||||
{ | { | ||||
if (g_PlayerAssignments[guidToAssign].player != -1) | if (g_PlayerAssignments[guidToAssign].player != -1) | ||||
{ | { | ||||
Show All 16 Lines | else if (g_PlayerAssignments.local.player == playerID) | ||||
g_PlayerAssignments.local.player = -1; | g_PlayerAssignments.local.player = -1; | ||||
this.updatePlayerAssignments(); | this.updatePlayerAssignments(); | ||||
} | } | ||||
} | } | ||||
unassignInvalidPlayers() | unassignInvalidPlayers() | ||||
{ | { | ||||
if (g_IsNetworked) | if (g_IsNetworked) | ||||
for (let playerID = g_GameSettings.playerCount.nbPlayers + 1; playerID <= g_MaxPlayers; ++playerID) | { | ||||
// Remove obsolete playerIDs from the servers playerassignments copy | for (let guid in g_PlayerAssignments) | ||||
Engine.AssignNetworkPlayer(playerID, ""); | if (g_PlayerAssignments[guid].player > g_GameSettings.playerCount.nbPlayers) | ||||
Engine.AssignNetworkPlayer(g_PlayerAssignments[guid].player, ""); | |||||
} | |||||
else if (g_PlayerAssignments.local.player > g_GameSettings.playerCount.nbPlayers) | else if (g_PlayerAssignments.local.player > g_GameSettings.playerCount.nbPlayers) | ||||
{ | { | ||||
g_PlayerAssignments.local.player = -1; | g_PlayerAssignments.local.player = -1; | ||||
this.updatePlayerAssignments(); | this.updatePlayerAssignments(); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
PlayerAssignmentsControl.prototype.ConfigNameSingleplayer = | PlayerAssignmentsControl.prototype.ConfigNameSingleplayer = | ||||
"playername.singleplayer"; | "playername.singleplayer"; | ||||
PlayerAssignmentsControl.prototype.ConfigAssignPlayers = | |||||
"gui.gamesetup.assignplayers"; |
Wildfire Games · Phabricator