From b7f72be930c850b60c2ab365bc0452fafc2fc52c Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Fri, 21 Sep 2012 05:45:09 +0000 Subject: [PATCH] - added the ability for admin player to disconnect other network players in game from a new popup menu --- source/glest_game/game/commander.cpp | 50 +++++++- source/glest_game/game/commander.h | 1 + source/glest_game/game/game.cpp | 148 ++++++++++++++++++++++ source/glest_game/game/game.h | 6 + source/glest_game/network/network_types.h | 3 +- 5 files changed, 206 insertions(+), 2 deletions(-) diff --git a/source/glest_game/game/commander.cpp b/source/glest_game/game/commander.cpp index e337c59d..eaae0f7f 100644 --- a/source/glest_game/game/commander.cpp +++ b/source/glest_game/game/commander.cpp @@ -469,6 +469,11 @@ void Commander::trySwitchTeamVote(const Faction* faction, SwitchTeamVote *vote) pushNetworkCommand(&command); } +void Commander::tryDisconnectNetworkPlayer(const Faction* faction, int playerIndex) const { + NetworkCommand command(this->world,nctDisconnectNetworkPlayer, faction->getIndex(), playerIndex); + pushNetworkCommand(&command); +} + void Commander::tryPauseGame() const { NetworkCommand command(this->world,nctPauseResume, 1); pushNetworkCommand(&command); @@ -511,7 +516,8 @@ CommandResult Commander::pushNetworkCommand(const NetworkCommand* networkCommand if( networkCommand->getNetworkCommandType() != nctSwitchTeam && networkCommand->getNetworkCommandType() != nctSwitchTeamVote && networkCommand->getNetworkCommandType() != nctPauseResume && - networkCommand->getNetworkCommandType() != nctPlayerStatusChange) { + networkCommand->getNetworkCommandType() != nctPlayerStatusChange && + networkCommand->getNetworkCommandType() != nctDisconnectNetworkPlayer) { unit= world->findUnitById(networkCommand->getUnitId()); if(unit == NULL) { char szBuf[1024]=""; @@ -809,6 +815,48 @@ void Commander::giveNetworkCommand(NetworkCommand* networkCommand) const { } break; + case nctDisconnectNetworkPlayer: { + if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] found nctDisconnectNetworkPlayer\n",__FILE__,__FUNCTION__,__LINE__); + + commandWasHandled = true; + + NetworkManager &networkManager= NetworkManager::getInstance(); + NetworkRole role = networkManager.getNetworkRole(); + GameSettings *settings = world->getGameSettingsPtr(); + + if(role == nrServer) { + int factionIndex = networkCommand->getUnitId(); + int playerIndex = networkCommand->getCommandTypeId(); + + GameNetworkInterface *gameNetworkInterface= NetworkManager::getInstance().getGameNetworkInterface(); + if(gameNetworkInterface != NULL) { +// +// Lang &lang= Lang::getInstance(); +// const vector languageList = settings->getUniqueNetworkPlayerLanguages(); +// for(unsigned int i = 0; i < languageList.size(); ++i) { +// char szMsg[1024]=""; +// if(lang.hasString("DisconnectNetorkPlayerIndexConfirmed",languageList[i]) == true) { +// sprintf(szMsg,lang.get("DisconnectNetorkPlayerIndexConfirmed",languageList[i]).c_str(),playerIndex,settings->getNetworkPlayerName(factionIndex).c_str()); +// } +// else { +// sprintf(szMsg,"Notice - Admin is disconnecting player #%d - %s",playerIndex,settings->getNetworkPlayerName(factionIndex).c_str()); +// } +// bool localEcho = lang.isLanguageLocal(languageList[i]); +// gameNetworkInterface->sendTextMessage(szMsg,-1, localEcho,languageList[i]); +// } +// +// sleep(10); + ServerInterface *server = networkManager.getServerInterface(); + if(server->isClientConnected(playerIndex) == true) { + ConnectionSlot *slot = server->getSlot(playerIndex); + slot->close(); + } + } + } + if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] found nctDisconnectNetworkPlayer\n",__FILE__,__FUNCTION__,__LINE__); + } + break; + case nctPauseResume: { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] found nctPauseResume\n",__FILE__,__FUNCTION__,__LINE__); diff --git a/source/glest_game/game/commander.h b/source/glest_game/game/commander.h index 7b3f6125..c7170921 100644 --- a/source/glest_game/game/commander.h +++ b/source/glest_game/game/commander.h @@ -111,6 +111,7 @@ public: void trySetMeetingPoint(const Unit* unit, const Vec2i &pos) const; void trySwitchTeam(const Faction* faction, int teamIndex) const; void trySwitchTeamVote(const Faction* faction, SwitchTeamVote *vote) const; + void tryDisconnectNetworkPlayer(const Faction* faction, int playerIndex) const; void tryPauseGame() const; void tryResumeGame() const; void tryNetworkPlayerDisconnected(int factionIndex) const; diff --git a/source/glest_game/game/game.cpp b/source/glest_game/game/game.cpp index 255c5731..4722ca07 100644 --- a/source/glest_game/game/game.cpp +++ b/source/glest_game/game/game.cpp @@ -48,6 +48,8 @@ const float PHOTO_MODE_MAXHEIGHT = 500.0; const int CREATE_NEW_TEAM = -100; const int CANCEL_SWITCH_TEAM = -1; +const int CANCEL_DISCONNECT_PLAYER = -1; + const float Game::highlightTime= 0.5f; int fadeMusicMilliseconds = 3500; @@ -110,7 +112,14 @@ Game::Game() : ProgramState(NULL) { popupMenuSwitchTeams.setEnabled(false); popupMenuSwitchTeams.setVisible(false); + popupMenuDisconnectPlayer.setEnabled(false); + popupMenuDisconnectPlayer.setVisible(false); + switchTeamConfirmMessageBox.setEnabled(false); + disconnectPlayerConfirmMessageBox.setEnabled(false); + + disconnectPlayerIndexMap.clear(); + exitGamePopupMenuIndex = -1; joinTeamPopupMenuIndex = -1; pauseGamePopupMenuIndex = -1; @@ -119,6 +128,7 @@ Game::Game() : ProgramState(NULL) { markCellPopupMenuIndex = -1; unmarkCellPopupMenuIndex = -1; keyboardSetupPopupMenuIndex = -1; + disconnectPlayerPopupMenuIndex = -1; isMarkCellEnabled = false; isMarkCellTextEnabled = false; @@ -167,7 +177,14 @@ void Game::resetMembers() { popupMenuSwitchTeams.setEnabled(false); popupMenuSwitchTeams.setVisible(false); + popupMenuDisconnectPlayer.setEnabled(false); + popupMenuDisconnectPlayer.setVisible(false); + switchTeamConfirmMessageBox.setEnabled(false); + disconnectPlayerConfirmMessageBox.setEnabled(false); + + disconnectPlayerIndexMap.clear(); + exitGamePopupMenuIndex = -1; joinTeamPopupMenuIndex = -1; pauseGamePopupMenuIndex = -1; @@ -176,6 +193,7 @@ void Game::resetMembers() { markCellPopupMenuIndex = -1; unmarkCellPopupMenuIndex = -1; keyboardSetupPopupMenuIndex = -1; + disconnectPlayerPopupMenuIndex = -1; isMarkCellEnabled = false; isMarkCellTextEnabled = false; @@ -1300,9 +1318,15 @@ void Game::setupPopupMenus(bool checkClientAdminOverrideOnly) { // menuItems.push_back(lang.get("LoadGame")); // loadGamePopupMenuIndex= menuItems.size() - 1; } + + if(gameSettings.isNetworkGame() == true){ + menuItems.push_back(lang.get("DisconnectNetorkPlayer")); + disconnectPlayerPopupMenuIndex= menuItems.size() - 1; + } } menuItems.push_back(lang.get("Keyboardsetup")); keyboardSetupPopupMenuIndex = menuItems.size()-1; + menuItems.push_back(lang.get("Cancel")); popupMenu.setW(100); @@ -1313,6 +1337,9 @@ void Game::setupPopupMenus(bool checkClientAdminOverrideOnly) { popupMenuSwitchTeams.setEnabled(false); popupMenuSwitchTeams.setVisible(false); + + popupMenuDisconnectPlayer.setEnabled(false); + popupMenuDisconnectPlayer.setVisible(false); } } @@ -2199,6 +2226,42 @@ void Game::mouseDownLeft(int x, int y) { popupMenuSwitchTeams.setEnabled(true); popupMenuSwitchTeams.setVisible(true); } + else if(result.first == disconnectPlayerPopupMenuIndex) { + Lang &lang= Lang::getInstance(); + disconnectPlayerIndexMap.clear(); + std::vector menuItems; + for(unsigned int i = 0; i < world.getFactionCount(); ++i) { + Faction *faction = world.getFaction(i); + + //printf("faction->getPersonalityType() = %d index [%d,%d] control [%d]\n",faction->getPersonalityType(),world.getThisFaction()->getIndex(),faction->getIndex(),faction->getControlType()); + + if(faction->getPersonalityType() != fpt_Observer && + world.getThisFaction()->getIndex() != faction->getIndex() && + faction->getControlType() == ctNetwork) { + + char szBuf[1024]=""; + if(lang.hasString("DisconnectNetorkPlayerIndex") == true) { + sprintf(szBuf,lang.get("DisconnectNetorkPlayerIndex").c_str(),faction->getIndex()+1,this->gameSettings.getNetworkPlayerName(i).c_str()); + } + else { + sprintf(szBuf,"Disconnect player #%d - %s:",faction->getIndex()+1,this->gameSettings.getNetworkPlayerName(i).c_str()); + } + + menuItems.push_back(szBuf); + + disconnectPlayerIndexMap[menuItems.size()-1] = faction->getStartLocationIndex(); + } + } + + menuItems.push_back(lang.get("Cancel")); + disconnectPlayerIndexMap[menuItems.size()-1] = CANCEL_DISCONNECT_PLAYER; + + popupMenuDisconnectPlayer.setW(100); + popupMenuDisconnectPlayer.setH(100); + popupMenuDisconnectPlayer.init(lang.get("DisconnectNetorkPlayer"),menuItems); + popupMenuDisconnectPlayer.setEnabled(true); + popupMenuDisconnectPlayer.setVisible(true); + } else if(result.first == keyboardSetupPopupMenuIndex) { MainMenu *newMenu = new MainMenu(program); // open keyboard shortcuts setup screen currentUIState = newMenu; @@ -2302,6 +2365,70 @@ void Game::mouseDownLeft(int x, int y) { break; } } + else if(popupMenuDisconnectPlayer.mouseClick(x, y)) { + //popupMenuSwitchTeams + std::pair result = popupMenuDisconnectPlayer.mouseClickedMenuItem(x, y); + //printf("In popup callback menuItemSelected [%s] menuIndexSelected = %d\n",result.second.c_str(),result.first); + + popupMenuDisconnectPlayer.setEnabled(false); + popupMenuDisconnectPlayer.setVisible(false); + + //bool isNetworkGame = this->gameSettings.isNetworkGame(); + + int playerIndex = disconnectPlayerIndexMap[result.first]; + switch(playerIndex) { + case CANCEL_DISCONNECT_PLAYER: + break; + default: +// if(isNetworkGame == true) { +// const Faction *faction = world.getThisFaction(); +// commander.trySwitchTeam(faction,teamIndex); +// } +// else { +// const Faction *faction = world.getThisFaction(); +// commander.trySwitchTeam(faction,teamIndex); +// } + + + GameSettings *settings = world.getGameSettingsPtr(); + Lang &lang= Lang::getInstance(); + + char szBuf[1024]=""; + if(lang.hasString("DisconnectNetorkPlayerIndexConfirm") == true) { + sprintf(szBuf,lang.get("DisconnectNetorkPlayerIndexConfirm").c_str(),playerIndex,settings->getNetworkPlayerName(playerIndex).c_str()); + } + else { + sprintf(szBuf,"Confirm disconnection for player #%d - %s?",playerIndex,settings->getNetworkPlayerName(playerIndex).c_str()); + } + + disconnectPlayerConfirmMessageBox.setText(szBuf); + disconnectPlayerConfirmMessageBox.init(lang.get("Yes"), lang.get("No")); + disconnectPlayerConfirmMessageBox.setEnabled(true); + + playerIndexDisconnect = playerIndex; + + GameNetworkInterface *gameNetworkInterface= NetworkManager::getInstance().getGameNetworkInterface(); + if(gameNetworkInterface != NULL) { + Lang &lang= Lang::getInstance(); + const vector languageList = settings->getUniqueNetworkPlayerLanguages(); + for(unsigned int i = 0; i < languageList.size(); ++i) { + char szMsg[1024]=""; + if(lang.hasString("DisconnectNetorkPlayerIndexConfirmed",languageList[i]) == true) { + sprintf(szMsg,lang.get("DisconnectNetorkPlayerIndexConfirmed",languageList[i]).c_str(),playerIndex,settings->getNetworkPlayerName(playerIndex).c_str()); + } + else { + sprintf(szMsg,"Notice - Admin is warning to disconnect player #%d - %s!",playerIndex+1,settings->getNetworkPlayerName(playerIndex).c_str()); + } + bool localEcho = lang.isLanguageLocal(languageList[i]); + gameNetworkInterface->sendTextMessage(szMsg,-1, localEcho,languageList[i]); + } + + sleep(10); + } + + break; + } + } if(switchTeamConfirmMessageBox.getEnabled() == true) { int button= -1; @@ -2316,6 +2443,17 @@ void Game::mouseDownLeft(int x, int y) { commander.trySwitchTeamVote(faction,vote); } } + else if(disconnectPlayerConfirmMessageBox.getEnabled() == true) { + int button= -1; + if(disconnectPlayerConfirmMessageBox.mouseClick(x,y,button)) { + disconnectPlayerConfirmMessageBox.setEnabled(false); + + if(button == 0) { + const Faction *faction = world.getThisFaction(); + commander.tryDisconnectNetworkPlayer(faction,playerIndexDisconnect); + } + } + } //scrip message box, only if the exit box is not enabled if( mainMessageBox.getEnabled() == false && @@ -2717,6 +2855,7 @@ void Game::mouseMove(int x, int y, const MouseState *ms) { popupMenu.mouseMove(x, y); popupMenuSwitchTeams.mouseMove(x, y); + popupMenuDisconnectPlayer.mouseMove(x, y); const Metrics &metrics = Metrics::getInstance(); @@ -2802,6 +2941,10 @@ void Game::mouseMove(int x, int y, const MouseState *ms) { switchTeamConfirmMessageBox.mouseMove(x,y); } + if(disconnectPlayerConfirmMessageBox.getEnabled() == true) { + disconnectPlayerConfirmMessageBox.mouseMove(x,y); + } + if (mainMessageBox.getEnabled()) { mainMessageBox.mouseMove(x, y); } @@ -3665,6 +3808,10 @@ void Game::render2d() { renderer.renderMessageBox(&switchTeamConfirmMessageBox); } + if(disconnectPlayerConfirmMessageBox.getEnabled() == true) { + renderer.renderMessageBox(&disconnectPlayerConfirmMessageBox); + } + //exit message box if(errorMessageBox.getEnabled()) { renderer.renderMessageBox(&errorMessageBox); @@ -3700,6 +3847,7 @@ void Game::render2d() { renderer.renderPopupMenu(&popupMenu); renderer.renderPopupMenu(&popupMenuSwitchTeams); + renderer.renderPopupMenu(&popupMenuDisconnectPlayer); if(program != NULL) program->renderProgramMsgBox(); diff --git a/source/glest_game/game/game.h b/source/glest_game/game/game.h index 9c21c618..2e0283b9 100644 --- a/source/glest_game/game/game.h +++ b/source/glest_game/game/game.h @@ -141,10 +141,15 @@ private: PopupMenu popupMenu; PopupMenu popupMenuSwitchTeams; + PopupMenu popupMenuDisconnectPlayer; std::map switchTeamIndexMap; GraphicMessageBox switchTeamConfirmMessageBox; + std::map disconnectPlayerIndexMap; + int playerIndexDisconnect; + GraphicMessageBox disconnectPlayerConfirmMessageBox; + int exitGamePopupMenuIndex; int joinTeamPopupMenuIndex; int pauseGamePopupMenuIndex; @@ -153,6 +158,7 @@ private: int markCellPopupMenuIndex; int unmarkCellPopupMenuIndex; int keyboardSetupPopupMenuIndex; + int disconnectPlayerPopupMenuIndex; //GLuint statelist3dMenu; ProgramState *currentUIState; diff --git a/source/glest_game/network/network_types.h b/source/glest_game/network/network_types.h index 10a3add2..a75dd92d 100644 --- a/source/glest_game/network/network_types.h +++ b/source/glest_game/network/network_types.h @@ -75,7 +75,8 @@ enum NetworkCommandType { nctSwitchTeam, nctSwitchTeamVote, nctPauseResume, - nctPlayerStatusChange + nctPlayerStatusChange, + nctDisconnectNetworkPlayer //nctNetworkCommand };