#include "JoinGameScreen.h" #include "StartMenuScreen.h" #include "ProgressScreen.h" #include "../Font.h" #include "../../../network/RakNetInstance.h" JoinGameScreen::JoinGameScreen() : bJoin( 2, "Join Game"), bBack( 3, "Back"), gamesList(NULL) { bJoin.active = false; //gamesList->yInertia = 0.5f; } JoinGameScreen::~JoinGameScreen() { delete gamesList; } void JoinGameScreen::buttonClicked(Button* button) { if (button->id == bJoin.id) { if (isIndexValid(gamesList->selectedItem)) { PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; minecraft->joinMultiplayer(selectedServer); { bJoin.active = false; bBack.active = false; minecraft->setScreen(new ProgressScreen()); } } //minecraft->locateMultiplayer(); //minecraft->setScreen(new JoinGameScreen()); } if (button->id == bBack.id) { minecraft->cancelLocateMultiplayer(); minecraft->screenChooser.setScreen(SCREEN_STARTMENU); } } bool JoinGameScreen::handleBackEvent(bool isDown) { if (!isDown) { minecraft->cancelLocateMultiplayer(); minecraft->screenChooser.setScreen(SCREEN_STARTMENU); } return true; } bool JoinGameScreen::isIndexValid( int index ) { return gamesList && index >= 0 && index < gamesList->getNumberOfItems(); } void JoinGameScreen::tick() { const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); ServerList serverList; for (unsigned int i = 0; i < orgServerList.size(); ++i) if (orgServerList[i].name.GetLength() > 0) serverList.push_back(orgServerList[i]); if (serverList.size() != gamesList->copiedServerList.size()) { // copy the currently selected item PingedCompatibleServer selectedServer; bool hasSelection = false; if (isIndexValid(gamesList->selectedItem)) { selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; hasSelection = true; } gamesList->copiedServerList = serverList; gamesList->selectItem(-1, false); // re-select previous item if it still exists if (hasSelection) { for (unsigned int i = 0; i < gamesList->copiedServerList.size(); i++) { if (gamesList->copiedServerList[i].address == selectedServer.address) { gamesList->selectItem(i, false); break; } } } } else { for (int i = (int)gamesList->copiedServerList.size()-1; i >= 0 ; --i) { for (int j = 0; j < (int) serverList.size(); ++j) if (serverList[j].address == gamesList->copiedServerList[i].address) gamesList->copiedServerList[i].name = serverList[j].name; } } bJoin.active = isIndexValid(gamesList->selectedItem); } void JoinGameScreen::init() { buttons.push_back(&bJoin); buttons.push_back(&bBack); minecraft->raknetInstance->clearServerList(); gamesList = new AvailableGamesList(minecraft, width, height); #ifdef ANDROID tabButtons.push_back(&bJoin); tabButtons.push_back(&bBack); #endif } void JoinGameScreen::setupPositions() { int yBase = height - 26; //#ifdef ANDROID bJoin.y = yBase; bBack.y = yBase; bBack.width = bJoin.width = 120; //#endif // Center buttons bJoin.x = width / 2 - 4 - bJoin.width; bBack.x = width / 2 + 4; } void JoinGameScreen::render( int xm, int ym, float a ) { bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); #ifdef WIN32 hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); #endif renderBackground(); if (hasNetwork) gamesList->render(xm, ym, a); Screen::render(xm, ym, a); if (hasNetwork) { #ifdef RPI std::string s = "Scanning for Local Network Games..."; #else std::string s = "Scanning for WiFi Games..."; #endif drawCenteredString(minecraft->font, s, width / 2, 8, 0xffffffff); const int textWidth = minecraft->font->width(s); const int spinnerX = width/2 + textWidth / 2 + 6; static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; int n = ((int)(5.5f * getTimeS()) % 4); drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX, 8, 0xffffffff); } else { std::string s = "WiFi is disabled"; const int yy = height / 2 - 8; drawCenteredString(minecraft->font, s, width / 2, yy, 0xffffffff); } } bool JoinGameScreen::isInGameScreen() { return false; }