#include "../../Platform/stdafx.h" #include "CreateWorldScreen.h" #include "../EditBox.h" #include "../Button.h" #include "../../GameState/SurvivalMode.h" #include "../../../Minecraft.World/Headers/net.minecraft.locale.h" #include "../../../Minecraft.World/Util/StringHelpers.h" #include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" #include "../../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" #include "../../../Minecraft.World/Util/SharedConstants.h" #include "../../../Minecraft.World/Util/Random.h" #include "../../MinecraftServer.h" #include "../../GameState/Options.h" #include CreateWorldScreen::CreateWorldScreen(Screen *lastScreen) { done = false; // 4J added this->lastScreen = lastScreen; } void CreateWorldScreen::tick() { nameEdit->tick(); seedEdit->tick(); // 4J - debug code - to be removed static int count = 0; if(count++ == 100 ) buttonClicked(buttons[0]); } void CreateWorldScreen::init() { Language *language = Language::getInstance(); Keyboard::enableRepeatEvents(true); buttons.clear(); buttons.push_back(new Button(0, width / 2 - 100, height / 4 + 24 * 4 + 12, language->getElement(L"selectWorld.create"))); buttons.push_back(new Button(1, width / 2 - 100, height / 4 + 24 * 5 + 12, language->getElement(L"gui.cancel"))); nameEdit = new EditBox(this, font, width / 2 - 100, 60, 200, 20, language->getElement(L"testWorld")); // 4J - test - should be L"selectWorld.newWorld" nameEdit->inFocus = true; nameEdit->setMaxLength(32); seedEdit = new EditBox(this, font, width / 2 - 100, 116, 200, 20, L""); updateResultFolder(); } void CreateWorldScreen::updateResultFolder() { resultFolder = trimString(nameEdit->getValue()); for( int i = 0; i < SharedConstants::ILLEGAL_FILE_CHARACTERS_LENGTH; i++ ) { size_t pos; while( (pos = resultFolder.find(SharedConstants::ILLEGAL_FILE_CHARACTERS[i])) != std::wstring::npos) { resultFolder[pos] = L'_'; } } if (resultFolder.length()==0) { resultFolder = L"World"; } resultFolder = CreateWorldScreen::findAvailableFolderName(minecraft->getLevelSource(), resultFolder); } std::wstring CreateWorldScreen::findAvailableFolderName(LevelStorageSource *levelSource, const std::wstring& folder) { std::wstring folder2 = folder; // 4J - copy input as it is const #if 0 while (levelSource->getDataTagFor(folder2) != NULL) { folder2 = folder2 + L"-"; } #endif return folder2; } void CreateWorldScreen::removed() { Keyboard::enableRepeatEvents(false); } void CreateWorldScreen::buttonClicked(Button *button) { if (!button->active) return; if (button->id == 1) { minecraft->setScreen(lastScreen); } else if (button->id == 0) { minecraft->setScreen(new Screen()); // blank screen while the world loads if (done) return; done = true; MoreOptionsParams* moreOptionsParams = new MoreOptionsParams(); // these r just the defaults from the createworldmenu UIscene // i had higher ambitions for what id do with these but its not worth it for a temp ui moreOptionsParams->bGenerateOptions = TRUE; moreOptionsParams->bStructures = TRUE; moreOptionsParams->bFlatWorld = FALSE; moreOptionsParams->bBonusChest = FALSE; moreOptionsParams->bPVP = TRUE; moreOptionsParams->bTrust = TRUE; moreOptionsParams->bFireSpreads = TRUE; moreOptionsParams->bTNT = TRUE; moreOptionsParams->bHostPrivileges = FALSE; moreOptionsParams->bOnlineGame = FALSE; moreOptionsParams->bInviteOnly = FALSE; moreOptionsParams->bAllowFriendsOfFriends = FALSE; moreOptionsParams->bOnlineSettingChangedBySystem = FALSE; moreOptionsParams->iPad = 0; moreOptionsParams->worldName = nameEdit->getValue(); moreOptionsParams->seed = seedEdit->getValue(); moreOptionsParams->dwTexturePack = 0; bool bGameModeSurvival = true; std::wstring worldName = nameEdit->getValue(); if (worldName.empty()) { worldName = L"2slimey"; } StorageManager.ResetSaveData(); StorageManager.SetSaveTitle((wchar_t *)worldName.c_str()); std::wstring seedString = seedEdit->getValue(); __int64 seedValue = 0; NetworkGameInitData *param = new NetworkGameInitData(); if (seedString.length() != 0) { // try to convert it to a long first // try { // 4J - removed try/catch __int64 value = _fromString<__int64>(seedString); bool isNumber = true; for (unsigned int i = 0; i < seedString.length(); ++i) { if (seedString.at(i) < L'0' || seedString.at(i) > L'9') { if (!(i == 0 && seedString.at(i) == L'-')) { isNumber = false; break; } } } if (isNumber) value = _fromString<__int64>(seedString); if (value != 0) { seedValue = value; } else { int hashValue = 0; for (unsigned int i = 0; i < seedString.length(); ++i) hashValue = 31 * hashValue + seedString.at(i); seedValue = hashValue; } // } catch (NumberFormatException e) { // // not a number, fetch hash value // seedValue = seedString.hashCode(); // } } else { param->findSeed = true; } param->seed = seedValue; param->saveData = NULL; param->texturePackId = 0; param->settings = 0; app.SetGameHostOption(eGameHostOption_Difficulty, minecraft->options->difficulty); app.SetGameHostOption(eGameHostOption_FriendsOfFriends, moreOptionsParams->bAllowFriendsOfFriends); app.SetGameHostOption(eGameHostOption_Gamertags, 1); app.SetGameHostOption(eGameHostOption_BedrockFog, 0); app.SetGameHostOption(eGameHostOption_GameType, bGameModeSurvival ? GameType::SURVIVAL->getId() : GameType::CREATIVE->getId()); // TODO: gamemode switch app.SetGameHostOption(eGameHostOption_LevelType, moreOptionsParams->bFlatWorld); app.SetGameHostOption(eGameHostOption_Structures, moreOptionsParams->bStructures); app.SetGameHostOption(eGameHostOption_BonusChest, moreOptionsParams->bBonusChest); app.SetGameHostOption(eGameHostOption_PvP, moreOptionsParams->bPVP); app.SetGameHostOption(eGameHostOption_TrustPlayers, moreOptionsParams->bTrust); app.SetGameHostOption(eGameHostOption_FireSpreads, moreOptionsParams->bFireSpreads); app.SetGameHostOption(eGameHostOption_TNT, moreOptionsParams->bTNT); app.SetGameHostOption(eGameHostOption_HostCanFly, moreOptionsParams->bHostPrivileges); app.SetGameHostOption(eGameHostOption_HostCanChangeHunger, moreOptionsParams->bHostPrivileges); app.SetGameHostOption(eGameHostOption_HostCanBeInvisible, moreOptionsParams->bHostPrivileges); param->settings = app.GetGameHostOption(eGameHostOption_All); param->xzSize = LEVEL_MAX_WIDTH; param->hellScale = HELL_LEVEL_MAX_SCALE; g_NetworkManager.HostGame(0, false, false, MINECRAFT_NET_MAX_PLAYERS, 0); g_NetworkManager.FakeLocalPlayerJoined(); LoadingInputParams *loadingParams = new LoadingInputParams(); loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; loadingParams->lpParam = (LPVOID)param; app.SetAutosaveTimerTime(); UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); completionData->bShowBackground = TRUE; completionData->bShowLogo = TRUE; completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; completionData->iPad = 0; loadingParams->completionData = completionData; ui.NavigateToScene(0, eUIScene_FullscreenProgress, loadingParams); // 4J Stu - This screen is not used, so removing this to stop the build failing #if 0 minecraft->gameMode = new SurvivalMode(minecraft); minecraft->selectLevel(resultFolder, nameEdit->getValue(), seedValue); minecraft->setScreen(NULL); #endif } } void CreateWorldScreen::keyPressed(wchar_t ch, int eventKey) { if (nameEdit->inFocus) nameEdit->keyPressed(ch, eventKey); else seedEdit->keyPressed(ch, eventKey); if (ch == 13) { buttonClicked(buttons[0]); } buttons[0]->active = nameEdit->getValue().length() > 0; updateResultFolder(); } void CreateWorldScreen::mouseClicked(int x, int y, int buttonNum) { Screen::mouseClicked(x, y, buttonNum); nameEdit->mouseClicked(x, y, buttonNum); seedEdit->mouseClicked(x, y, buttonNum); } void CreateWorldScreen::render(int xm, int ym, float a) { Language *language = Language::getInstance(); // fill(0, 0, width, height, 0x40000000); renderBackground(); drawCenteredString(font, language->getElement(L"selectWorld.create"), width / 2, height / 4 - 60 + 20, 0xffffff); drawString(font, language->getElement(L"selectWorld.enterName"), width / 2 - 100, 47, 0xa0a0a0); drawString(font, language->getElement(L"selectWorld.resultFolder") + L" " + resultFolder, width / 2 - 100, 85, 0xa0a0a0); drawString(font, language->getElement(L"selectWorld.enterSeed"), width / 2 - 100, 104, 0xa0a0a0); drawString(font, language->getElement(L"selectWorld.seedInfo"), width / 2 - 100, 140, 0xa0a0a0); nameEdit->render(); seedEdit->render(); Screen::render(xm, ym, a); } void CreateWorldScreen::tabPressed() { if (nameEdit->inFocus) { nameEdit->focus(false); seedEdit->focus(true); } else { nameEdit->focus(true); seedEdit->focus(false); } }