diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/SelectWorldScreen.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.Client/SelectWorldScreen.cpp')
| -rw-r--r-- | Minecraft.Client/SelectWorldScreen.cpp | 310 |
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); + +} |
