mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-24 13:33:36 +00:00
293 lines
9.8 KiB
C++
293 lines
9.8 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 <string>
|
|
|
|
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);
|
|
}
|
|
} |