mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-24 13:33:36 +00:00
i restored the Select World scene so it no longer immediately opens "Create New World" i wrapped the not used code in if (0) so its ignored at runtime but still compiled to catch build breaks. fixing the Select World scene also fixed the Cancel button so you can go back to the previous scene (before it was stuck on Create New World) i didnt remove the weird code because i dont know why its there left it disabled for now Signed-off-by: ViniciusCruzMoura <contato.cruz.moura@gmail.com>
424 lines
16 KiB
C++
424 lines
16 KiB
C++
#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 "MessageScreen.h"
|
|
#include <string>
|
|
|
|
CreateWorldScreen::CreateWorldScreen(Screen* lastScreen) {
|
|
done = false; // 4J added
|
|
moreOptions = false;
|
|
gameMode = L"survival";
|
|
generateStructures = true;
|
|
bonusChest = false;
|
|
cheatsEnabled = false;
|
|
flatWorld = false;
|
|
this->lastScreen = lastScreen;
|
|
}
|
|
|
|
void CreateWorldScreen::tick() {
|
|
nameEdit->tick();
|
|
if (moreOptions) 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 - 155, height - 28, 150, 20,
|
|
language->getElement(L"selectWorld.create")));
|
|
buttons.push_back(new Button(1, width / 2 + 5, height - 28, 150, 20,
|
|
language->getElement(L"gui.cancel")));
|
|
|
|
nameEdit = new EditBox(this, font, width / 2 - 100, 60, 200, 20,
|
|
language->getElement(L"selectWorld.newWorld"));
|
|
nameEdit->inFocus = true;
|
|
nameEdit->setMaxLength(32);
|
|
|
|
seedEdit = new EditBox(this, font, width / 2 - 100, 60, 200, 20, L"");
|
|
|
|
buttons.push_back(gameModeButton = new Button(
|
|
2, width / 2 - 75, 100, 150, 20,
|
|
language->getElement(L"selectWorld.gameMode")));
|
|
buttons.push_back(
|
|
moreWorldOptionsButton =
|
|
new Button(3, width / 2 - 75, 172, 150, 20,
|
|
language->getElement(L"selectWorld.moreWorldOptions")));
|
|
buttons.push_back(generateStructuresButton = new Button(
|
|
4, width / 2 - 155, 100, 150, 20,
|
|
language->getElement(L"selectWorld.mapFeatures")));
|
|
generateStructuresButton->visible = false;
|
|
generateStructuresButton->active = false;
|
|
buttons.push_back(bonusChestButton = new Button(
|
|
7, width / 2 + 5, 136, 150, 20,
|
|
language->getElement(L"selectWorld.bonusItems")));
|
|
bonusChestButton->visible = false;
|
|
bonusChestButton->active = false;
|
|
buttons.push_back(worldTypeButton = new Button(
|
|
5, width / 2 + 5, 100, 150, 20,
|
|
language->getElement(L"selectWorld.mapType")));
|
|
worldTypeButton->visible = false;
|
|
worldTypeButton->active = false;
|
|
buttons.push_back(cheatsEnabledButton = new Button(
|
|
6, width / 2 - 155, 136, 150, 20,
|
|
language->getElement(L"selectWorld.allowCommands")));
|
|
cheatsEnabledButton->visible = false;
|
|
cheatsEnabledButton->active = false;
|
|
|
|
updateStrings();
|
|
updateResultFolder();
|
|
}
|
|
|
|
// 4jcraft: referenced from func_73914_h in MCP 7.1 fr those wondering
|
|
void CreateWorldScreen::updateStrings() {
|
|
Language* language = Language::getInstance();
|
|
|
|
gameModeButton->msg =
|
|
language->getElement(L"selectWorld.gameMode") + L" " +
|
|
language->getElement(L"selectWorld.gameMode." + gameMode);
|
|
|
|
std::wstring line1Key = L"selectWorld.gameMode." + gameMode + L".line1";
|
|
std::wstring line2Key = L"selectWorld.gameMode." + gameMode + L".line2";
|
|
gameModeDescriptionLine1 = language->getElement(line1Key);
|
|
gameModeDescriptionLine2 = language->getElement(line2Key);
|
|
|
|
generateStructuresButton->msg =
|
|
language->getElement(L"selectWorld.mapFeatures") + L" " +
|
|
(generateStructures ? language->getElement(L"options.on")
|
|
: language->getElement(L"options.off"));
|
|
|
|
bonusChestButton->msg = language->getElement(L"selectWorld.bonusItems") +
|
|
L" " +
|
|
(bonusChest ? language->getElement(L"options.on")
|
|
: language->getElement(L"options.off"));
|
|
|
|
worldTypeButton->msg =
|
|
language->getElement(L"selectWorld.mapType") + L" " +
|
|
(flatWorld ? language->getElement(L"selectWorld.mapType.flat")
|
|
: language->getElement(L"selectWorld.mapType.normal"));
|
|
|
|
cheatsEnabledButton->msg =
|
|
language->getElement(L"selectWorld.allowCommands") + L" " +
|
|
(cheatsEnabled ? language->getElement(L"options.on")
|
|
: language->getElement(L"options.off"));
|
|
}
|
|
|
|
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) {
|
|
app.DebugPrintf("CreateWorldScreen::buttonClicked START\n");
|
|
if (!button->active) return;
|
|
if (button->id == 1) {
|
|
app.DebugPrintf("CreateWorldScreen::buttonClicked 'Cancel' minecraft->setScreen(lastScreen)\n");
|
|
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 = generateStructures;
|
|
moreOptionsParams->bFlatWorld = flatWorld;
|
|
moreOptionsParams->bBonusChest = bonusChest;
|
|
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->bCheatsEnabled = cheatsEnabled;
|
|
moreOptionsParams->iPad = 0;
|
|
|
|
moreOptionsParams->worldName = nameEdit->getValue();
|
|
moreOptionsParams->seed = seedEdit->getValue();
|
|
|
|
moreOptionsParams->dwTexturePack = 0;
|
|
|
|
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,
|
|
(gameMode == L"survival")
|
|
? GameType::SURVIVAL->getId()
|
|
: GameType::CREATIVE->getId());
|
|
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);
|
|
app.SetGameHostOption(eGameHostOption_CheatsEnabled,
|
|
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);
|
|
Language* language = Language::getInstance();
|
|
minecraft->setScreen(
|
|
new MessageScreen(language->getElement(L"menu.generatingLevel")));
|
|
// 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
|
|
} else if (button->id == 2) {
|
|
if (gameMode == L"survival")
|
|
gameMode = L"creative";
|
|
else
|
|
gameMode = L"survival";
|
|
updateStrings();
|
|
} else if (button->id == 3) {
|
|
moreOptions = !moreOptions;
|
|
gameModeButton->visible = !moreOptions;
|
|
gameModeButton->active = !moreOptions;
|
|
generateStructuresButton->visible = moreOptions;
|
|
generateStructuresButton->active = moreOptions;
|
|
bonusChestButton->visible = moreOptions;
|
|
bonusChestButton->active = moreOptions;
|
|
worldTypeButton->visible = moreOptions;
|
|
worldTypeButton->active = moreOptions;
|
|
cheatsEnabledButton->visible = moreOptions;
|
|
cheatsEnabledButton->active = moreOptions;
|
|
|
|
Language* language = Language::getInstance();
|
|
if (moreOptions) {
|
|
moreWorldOptionsButton->msg = language->getElement(L"gui.done");
|
|
} else {
|
|
moreWorldOptionsButton->msg =
|
|
language->getElement(L"selectWorld.moreWorldOptions");
|
|
}
|
|
} else if (button->id == 4) {
|
|
generateStructures = !generateStructures;
|
|
updateStrings();
|
|
} else if (button->id == 7) {
|
|
bonusChest = !bonusChest;
|
|
updateStrings();
|
|
} else if (button->id == 5) {
|
|
flatWorld = !flatWorld;
|
|
updateStrings();
|
|
} else if (button->id == 6) {
|
|
cheatsEnabled = !cheatsEnabled;
|
|
updateStrings();
|
|
}
|
|
}
|
|
|
|
void CreateWorldScreen::keyPressed(wchar_t ch, int eventKey) {
|
|
if (nameEdit->inFocus && !moreOptions)
|
|
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);
|
|
|
|
if (!moreOptions)
|
|
nameEdit->mouseClicked(x, y, buttonNum);
|
|
else
|
|
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, 20, 0xffffff);
|
|
if (!moreOptions) {
|
|
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);
|
|
|
|
nameEdit->render();
|
|
|
|
drawString(font, gameModeDescriptionLine1, width / 2 - 100, 122,
|
|
0xa0a0a0);
|
|
drawString(font, gameModeDescriptionLine2, width / 2 - 100, 134,
|
|
0xa0a0a0);
|
|
} else {
|
|
drawString(font, language->getElement(L"selectWorld.enterSeed"),
|
|
width / 2 - 100, 47, 0xa0a0a0);
|
|
drawString(font, language->getElement(L"selectWorld.seedInfo"),
|
|
width / 2 - 100, 85, 0xa0a0a0);
|
|
drawString(font, language->getElement(L"selectWorld.mapFeatures.info"),
|
|
width / 2 - 150, 122, 0xa0a0a0);
|
|
drawString(font,
|
|
language->getElement(L"selectWorld.allowCommands.info"),
|
|
width / 2 - 150, 157, 0xa0a0a0);
|
|
|
|
seedEdit->render();
|
|
}
|
|
|
|
Screen::render(xm, ym, a);
|
|
|
|
Screen::render(xm, ym, a);
|
|
}
|
|
|
|
void CreateWorldScreen::tabPressed() {
|
|
if (!moreOptions) return;
|
|
|
|
if (nameEdit->inFocus) {
|
|
nameEdit->focus(false);
|
|
seedEdit->focus(true);
|
|
} else {
|
|
nameEdit->focus(true);
|
|
seedEdit->focus(false);
|
|
}
|
|
}
|