aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/SelectWorldScreen.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/SelectWorldScreen.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.Client/SelectWorldScreen.cpp')
-rw-r--r--Minecraft.Client/SelectWorldScreen.cpp310
1 files changed, 310 insertions, 0 deletions
diff --git a/Minecraft.Client/SelectWorldScreen.cpp b/Minecraft.Client/SelectWorldScreen.cpp
new file mode 100644
index 00000000..a07eb7b2
--- /dev/null
+++ b/Minecraft.Client/SelectWorldScreen.cpp
@@ -0,0 +1,310 @@
+#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" " + _toString<int>(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" + _toString<int>(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" " + _toString<int>(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 size = levelSummary->getSizeOnDisk();
+ id = id + L", " + _toString<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);
+
+}