Files
MinecraftConsoles/Minecraft.Client/SelectWorldScreen.cpp
Loki Rautio 087b7e7abf Revert "Project modernization (#630)"
This code was not tested and breaks in Release builds, reverting to restore
functionality of the nightly. All in-game menus do not work and generating
a world crashes.

This reverts commit a9be52c41a.
2026-03-07 21:12:22 -06:00

311 lines
9.0 KiB
C++

#include "stdafx.h"
#include "SelectWorldScreen.h"
#include "Button.h"
#include "ConfirmScreen.h"
#include "CreateWorldScreen.h"
#include "RenameWorldScreen.h"
#include "DemoMode.h"
#include "..\Minecraft.World\net.minecraft.locale.h"
#include "..\Minecraft.World\net.minecraft.world.level.h"
#include "..\Minecraft.World\net.minecraft.world.level.storage.h"
SelectWorldScreen::SelectWorldScreen(Screen *lastScreen)
{
// 4J - added initialisers
title = L"Select world";
done = false;
selectedWorld = 0;
worldSelectionList = NULL;
isDeleting = false;
deleteButton = NULL;
selectButton = NULL;
renameButton = NULL;
this->lastScreen = lastScreen;
}
void SelectWorldScreen::init()
{
Language *language = Language::getInstance();
title = language->getElement(L"selectWorld.title");
worldLang = language->getElement(L"selectWorld.world");
conversionLang = language->getElement(L"selectWorld.conversion");
loadLevelList();
worldSelectionList = new WorldSelectionList(this);
worldSelectionList->init(&buttons, BUTTON_UP_ID, BUTTON_DOWN_ID);
postInit();
}
void SelectWorldScreen::loadLevelList()
{
LevelStorageSource *levelSource = minecraft->getLevelSource();
levelList = levelSource->getLevelList();
// Collections.sort(levelList); // 4J - TODO - get sort functor etc.
selectedWorld = -1;
}
wstring SelectWorldScreen::getWorldId(int id)
{
return levelList->at(id)->getLevelId();
}
wstring SelectWorldScreen::getWorldName(int id)
{
wstring levelName = levelList->at(id)->getLevelName();
if ( levelName.length() == 0 )
{
Language *language = Language::getInstance();
levelName = language->getElement(L"selectWorld.world") + L" " + std::to_wstring(id + 1);
}
return levelName;
}
void SelectWorldScreen::postInit()
{
Language *language = Language::getInstance();
buttons.push_back(selectButton = new Button(BUTTON_SELECT_ID, width / 2 - 154, height - 52, 150, 20, language->getElement(L"selectWorld.select")));
buttons.push_back(deleteButton = new Button(BUTTON_RENAME_ID, width / 2 - 154, height - 28, 70, 20, language->getElement(L"selectWorld.rename")));
buttons.push_back(renameButton = new Button(BUTTON_DELETE_ID, width / 2 - 74, height - 28, 70, 20, language->getElement(L"selectWorld.delete")));
buttons.push_back(new Button(BUTTON_CREATE_ID, width / 2 + 4, height - 52, 150, 20, language->getElement(L"selectWorld.create")));
buttons.push_back(new Button(BUTTON_CANCEL_ID, width / 2 + 4, height - 28, 150, 20, language->getElement(L"gui.cancel")));
selectButton->active = false;
deleteButton->active = false;
renameButton->active = false;
}
void SelectWorldScreen::buttonClicked(Button *button)
{
if (!button->active) return;
if (button->id == BUTTON_DELETE_ID)
{
wstring worldName = getWorldName(selectedWorld);
if (worldName != L"")
{
isDeleting = true;
Language *language = Language::getInstance();
wstring title = language->getElement(L"selectWorld.deleteQuestion");
wstring warning = L"'" + worldName + L"' " + language->getElement(L"selectWorld.deleteWarning");
wstring yes = language->getElement(L"selectWorld.deleteButton");
wstring no = language->getElement(L"gui.cancel");
ConfirmScreen *confirmScreen = new ConfirmScreen(this, title, warning, yes, no, selectedWorld);
minecraft->setScreen(confirmScreen);
}
}
else if (button->id == BUTTON_SELECT_ID)
{
worldSelected(selectedWorld);
}
else if (button->id == BUTTON_CREATE_ID)
{
if (ProfileManager.IsFullVersion())
{
minecraft->setScreen(new CreateWorldScreen(this));
}
else
{
// create demo world
minecraft->setScreen(NULL);
if (done) return;
done = true;
// 4J Stu - Not used, so commenting to stop the build failing
#if 0
minecraft->gameMode = new DemoMode(minecraft);
minecraft->selectLevel(CreateWorldScreen::findAvailableFolderName(minecraft->getLevelSource(), L"Demo"), L"Demo World", 0L);
minecraft->setScreen(NULL);
#endif
}
}
else if (button->id == BUTTON_RENAME_ID)
{
minecraft->setScreen(new RenameWorldScreen(this, getWorldId(selectedWorld)));
}
else if (button->id == BUTTON_CANCEL_ID)
{
minecraft->setScreen(lastScreen);
}
else
{
worldSelectionList->buttonClicked(button);
}
}
void SelectWorldScreen::worldSelected(int id)
{
minecraft->setScreen(NULL);
if (done) return;
done = true;
minecraft->gameMode = NULL; //new SurvivalMode(minecraft);
wstring worldFolderName = getWorldId(id);
if (worldFolderName == L"") // 4J - was NULL comparison
{
worldFolderName = L"World" + std::to_wstring(id);
}
// 4J Stu - Not used, so commenting to stop the build failing
#if 0
minecraft->selectLevel(worldFolderName, getWorldName(id), 0);
minecraft->setScreen(NULL);
#endif
}
void SelectWorldScreen::confirmResult(bool result, int id)
{
if (isDeleting)
{
isDeleting = false;
if (result)
{
LevelStorageSource *levelSource = minecraft->getLevelSource();
levelSource->clearAll();
levelSource->deleteLevel(getWorldId(id));
loadLevelList();
}
minecraft->setScreen(this);
}
}
void SelectWorldScreen::render(int xm, int ym, float a)
{
// fill(0, 0, width, height, 0x40000000);
worldSelectionList->render(xm, ym, a);
drawCenteredString(font, title, width / 2, 20, 0xffffff);
Screen::render(xm, ym, a);
// 4J - debug code - remove
static int count = 0;
static bool forceCreateLevel = false;
if( count++ >= 100 )
{
if( !forceCreateLevel && levelList->size() > 0 )
{
// 4J Stu - For some obscures reason the "delete" button is called "renameButton" and vice versa.
//if( levelList->size() > 2 && deleteButton->active )
//{
// this->selectedWorld = 2;
// count = 0;
// buttonClicked(deleteButton);
//}
//else
if( levelList->size() > 1 && renameButton->active )
{
this->selectedWorld = 1;
count = 0;
buttonClicked(renameButton);
}
else
if( selectButton->active == true )
{
this->selectedWorld = 0;
buttonClicked(selectButton);
//this->worldSelected( 0 );
}
else
{
selectButton->active = true;
deleteButton->active = true;
renameButton->active = true;
count = 0;
}
}
else
{
minecraft->setScreen(new CreateWorldScreen(this));
}
}
}
SelectWorldScreen::WorldSelectionList::WorldSelectionList(SelectWorldScreen *sws) : ScrolledSelectionList(sws->minecraft, sws->width, sws->height, 32, sws->height - 64, 36)
{
parent = sws;
}
int SelectWorldScreen::WorldSelectionList::getNumberOfItems()
{
return (int)this->parent->levelList->size();
}
void SelectWorldScreen::WorldSelectionList::selectItem(int item, bool doubleClick)
{
parent->selectedWorld = item;
bool active = (this->parent->selectedWorld >= 0 && this->parent->selectedWorld < getNumberOfItems());
parent->selectButton->active = active;
parent->deleteButton->active = active;
parent->renameButton->active = active;
if (doubleClick && active)
{
parent->worldSelected(item);
}
}
bool SelectWorldScreen::WorldSelectionList::isSelectedItem(int item)
{
return item == parent->selectedWorld;
}
int SelectWorldScreen::WorldSelectionList::getMaxPosition()
{
return (int)parent->levelList->size() * 36;
}
void SelectWorldScreen::WorldSelectionList::renderBackground()
{
parent->renderBackground(); // 4J - was SelectWorldScreen.this.renderBackground();
}
void SelectWorldScreen::WorldSelectionList::renderItem(int i, int x, int y, int h, Tesselator *t)
{
LevelSummary *levelSummary = parent->levelList->at(i);
wstring name = levelSummary->getLevelName();
if (name.length()==0)
{
name = parent->worldLang + L" " + std::to_wstring(i + 1);
}
wstring id = levelSummary->getLevelId();
ULARGE_INTEGER rawtime;
rawtime.QuadPart = levelSummary->getLastPlayed() * 10000; // Convert it from milliseconds back to FileTime
FILETIME timeasfiletime;
timeasfiletime.dwHighDateTime = rawtime.HighPart;
timeasfiletime.dwLowDateTime = rawtime.LowPart;
SYSTEMTIME time;
FileTimeToSystemTime( &timeasfiletime, &time );
wchar_t buffer[20];
// 4J Stu - Currently shows years as 4 digits, where java only showed 2
swprintf(buffer,20,L"%d/%d/%d %d:%02d",time.wDay, time.wMonth, time.wYear, time.wHour, time.wMinute); // 4J - TODO Localise this
id = id + L" (" + buffer;
int64_t size = levelSummary->getSizeOnDisk();
id = id + L", " + std::to_wstring(static_cast<float>(size / 1024 * 100 / 1024 / 100.0f)) + L" MB)";
wstring info;
if (levelSummary->isRequiresConversion())
{
info = parent->conversionLang + L" " + info;
}
parent->drawString(parent->font, name, x + 2, y + 1, 0xffffff);
parent->drawString(parent->font, id, x + 2, y + 12, 0x808080);
parent->drawString(parent->font, info, x + 2, y + 12 + 10, 0x808080);
}