Merge pull request #291 from realffqq/dev
Some checks are pending
Publish Documentation / build (push) Waiting to run
Build (Linux, x86_64) / build-linux (push) Waiting to run
Build (Linux, x86_64) / build-linux-debug (push) Waiting to run
Clang Format / clang-format (push) Waiting to run

Java GUI tune-up (+ pause fix for iggy)
This commit is contained in:
Tropical 2026-03-19 11:41:31 -05:00 committed by GitHub
commit f0b898b75d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 194 additions and 44 deletions

3
.gitignore vendored
View file

@ -1,6 +1,5 @@
# Exclude everything by default
/*
/subprojects/.wraplock
# Except for tracked top-level project directories
!/.devcontainer/
@ -15,7 +14,7 @@
!/Minecraft.Client/
!/Minecraft.World/
!/scripts/
!/subprojects/
!/subprojects/*.wrap
!/.clang-format
!/.git-blame-ignore-revs
!/.gitattributes

View file

@ -875,8 +875,8 @@ achievement.snipeSkeleton=Sniper Duel
achievement.snipeSkeleton.desc=Kill a skeleton with an arrow from more than 50 meters
achievement.diamonds=DIAMONDS!
achievement.diamonds.desc=Acquire diamonds with your iron tools
achievement.portal=We Need to Go Deeper
achievement.portal.desc=Build a portal to the Nether
achievement.InToTheNether=Into The Nether
achievement.InToTheNether.desc=Build a portal to the Nether
achievement.ghast=Return to Sender
achievement.ghast.desc=Destroy a Ghast with a fireball
achievement.blazeRod=Into Fire
@ -893,7 +893,50 @@ achievement.overkill=Overkill
achievement.overkill.desc=Deal eight hearts of damage in a single hit
achievement.bookcase=Librarian
achievement.bookcase.desc=Build some bookshelves to improve your enchantment table
achievement.leaderOfThePack=Leader of the Pack
achievement.leaderOfThePack.desc=Befriend five wolves
achievement.MOARTools=MOAR Tools
achievement.MOARTools.desc=Construct one type of each tool (one pickaxe, one spade, one axe and one hoe)
achievement.dispenseWithThis=Dispense With This
achievement.dispenseWithThis.desc=Construct a Dispenser
achievement.eatPorkChop=Pork Chop
achievement.eatPorkChop.desc=Cook and eat a pork chop
achievement.arrowKillCreeper=Archer
achievement.arrowKillCreeper.desc=Kill a creeper with arrows
achievement.adventuringTime=Adventuring Time
achievement.adventuringTime.desc=Discover 17 of the 40 different biomes
achievement.repopulation=Repopulation
achievement.repopulation.desc=Breed two cows with wheat
achievement.diamondsToYou=Diamonds to You!
achievement.diamondsToYou.desc=Throw diamonds at another player
achievement.theHaggler=The Haggler
achievement.theHaggler.desc=Mine or purchase 30 Emeralds
achievement.potPlanter=Pot Planter
achievement.potPlanter.desc=Craft and place a Flower Pot
achievement.itsASign=It's a Sign!
achievement.itsASign.desc=Craft and place a Sign
achievement.ironBelly=Iron Belly
achievement.ironBelly.desc=Stop starvation using Rotten Flesh
achievement.haveAShearfulDay=Have a Shearful Day
achievement.haveAShearfulDay.desc=Use Shears to obtain wool from a sheep
achievement.rainbowCollection=Rainbow Collection
achievement.rainbowCollection.desc=Gather all 16 colors of wool
achievement.stayingFrosty=Stayin' Frosty
achievement.stayingFrosty.desc=Swim in lava while having the Fire Resistance effect
achievement.chestfulOfCobblestone=Chestful of Cobblestone
achievement.chestfulOfCobblestone.desc=Mine 1,728 Cobblestone and place it in a chest
achievement.renewableEnergy=Renewable Energy
achievement.renewableEnergy.desc=Smelt wood trunks using charcoal to make more charcoal
achievement.musicToMyEars=Music to My Ears
achievement.musicToMyEars.desc=Play a music disc in a Jukebox
achievement.bodyGuard=Body Guard
achievement.bodyGuard.desc=Create an Iron Golem
achievement.ironMan=Iron Man
achievement.ironMan.desc=Wear a full suit of Iron Armour
achievement.zombieDoctor=Zombie Doctor
achievement.zombieDoctor.desc=Cure a Zombie Villager
achievement.lionTamer=Lion Tamer
achievement.lionTamer.desc=Tame an Ocelot
commands.generic.exception=An unknown error occurred while attempting to perform this command
commands.generic.syntax=Invalid command syntax
commands.generic.player.notFound=That player cannot be found

View file

@ -122,6 +122,7 @@ Minecraft::Minecraft(Component* mouseComponent, Canvas* parent,
user = NULL;
parent = NULL;
pause = false;
exitingWorldRightNow = false;
textures = NULL;
font = NULL;
screen = NULL;
@ -1254,6 +1255,15 @@ void Minecraft::run_middle() {
if (lastTime == 0) lastTime = System::nanoTime();
static int frames = 0;
#ifdef ENABLE_JAVA_GUIS
// 4jcraft: while the java ui is leaving world, don't run the rest of
// run_middle
if (exitingWorldRightNow) {
screen->render(0, 0, 1);
return;
}
#endif
EnterCriticalSection(&m_setLevelCS);
if (running) {

View file

@ -137,6 +137,7 @@ public:
// 4J - per player ?
volatile bool pause;
volatile bool exitingWorldRightNow;
Textures* textures;
Font *font, *altFont;

View file

@ -292,7 +292,7 @@ void ClientConnection::handleLogin(std::shared_ptr<LoginPacket> packet) {
minecraft->createPrimaryLocalPlayer(ProfileManager.GetPrimaryPad());
minecraft->player->dimension = packet->dimension;
// minecraft->setScreen(new ReceivingLevelScreen(this));
minecraft->setScreen(new ReceivingLevelScreen(this));
minecraft->player->entityId = packet->clientVersion;
std::uint8_t networkSmallId = getSocket()->getSmallId();
@ -2636,7 +2636,7 @@ void ClientConnection::handleRespawn(std::shared_ptr<RespawnPacket> packet) {
// minecraft->player->dimension = packet->dimension;
minecraft->localplayers[m_userIndex]->dimension = packet->dimension;
// minecraft->setScreen(new ReceivingLevelScreen(this));
minecraft->setScreen(new ReceivingLevelScreen(this));
// minecraft->addPendingLocalConnection(m_userIndex, this);
#ifdef _XBOX

View file

@ -2826,7 +2826,7 @@ void CMinecraftApp::HandleXuiActions(void)
#endif
case eAppAction_ExitWorld:
pMinecraft->exitingWorldRightNow = true;
SetAction(i,eAppAction_Idle);
// If we're already leaving don't exit

View file

@ -627,6 +627,7 @@ void IUIScene_PauseMenu::_ExitWorld(void *lpParameter)
app.SetChangingSessionType(false);
app.SetReallyChangingSessionType(false);
pMinecraft->exitingWorldRightNow = false;
#if defined(_XBOX_ONE) || defined(__ORBIS__)
// Make sure we don't think saving is disabled in the menus

View file

@ -92,7 +92,10 @@ UIScene_PauseMenu::UIScene_PauseMenu(int iPad, void *initData, UILayer *parentLa
XuiSetTimer(m_hObj,IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME);
#endif
if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 )
// TODO: proper fix for pausing
// 4jcraft: replace IsLocalGame() with GetPlayerCount() == 1 due to
// IsLocalGame() issues on Iggy
if( /*g_NetworkManager.IsLocalGame() &&*/ g_NetworkManager.GetPlayerCount() == 1 )
{
app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE);
}
@ -364,8 +367,10 @@ void UIScene_PauseMenu::handleInput(int iPad, int key, bool repeat, bool pressed
#ifdef _DURANGO
//DurangoStatsDebugger::PrintStats(iPad);
#endif
if( iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() )
// TODO: proper fix for pausing
// 4jcraft: replace IsLocalGame() with GetPlayerCount() == 1 due to
// IsLocalGame() issues on Iggy
if( iPad == ProfileManager.GetPrimaryPad() && /*g_NetworkManager.IsLocalGame()*/g_NetworkManager.GetPlayerCount() == 1 )
{
app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE);
}
@ -509,7 +514,10 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId)
switch((int)controlId)
{
case BUTTON_PAUSE_RESUMEGAME:
if( m_iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() )
// TODO: proper fix for pausing
// 4jcraft: replace IsLocalGame() with GetPlayerCount() == 1 due to
// IsLocalGame() issues on Iggy
if( m_iPad == ProfileManager.GetPrimaryPad() && /*g_NetworkManager.IsLocalGame()*/g_NetworkManager.GetPlayerCount() == 1 )
{
app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE);
}

View file

@ -950,7 +950,12 @@ return -1;
pMinecraft->run_middle();
#endif
app.SetAppPaused(
g_NetworkManager.IsLocalGame() &&
// TODO: proper fix for pausing
// 4jcraft: IsLocalGame() doesn't seem to work properly on Iggy
// UI, this should work even in multiplayer scenarios though
// since it checks for the player count anyway
//
// g_NetworkManager.IsLocalGame() &&
g_NetworkManager.GetPlayerCount() == 1 &&
ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad()));
} else {

View file

@ -11,6 +11,7 @@
#include "../../../Minecraft.World/Util/Random.h"
#include "../../MinecraftServer.h"
#include "../../GameState/Options.h"
#include "MessageScreen.h"
#include <string>
CreateWorldScreen::CreateWorldScreen(Screen* lastScreen) {
@ -43,10 +44,8 @@ void CreateWorldScreen::init() {
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"testWorld")); // 4J - test - should be L"selectWorld.newWorld"
nameEdit = new EditBox(this, font, width / 2 - 100, 60, 200, 20,
language->getElement(L"selectWorld.newWorld"));
nameEdit->inFocus = true;
nameEdit->setMaxLength(32);
@ -294,7 +293,11 @@ void CreateWorldScreen::buttonClicked(Button* button) {
loadingParams->completionData = completionData;
ui.NavigateToScene(0, eUIScene_FullscreenProgress, loadingParams);
// 4J Stu - This screen is not used, so removing this to stop the build failing
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);

View file

@ -3,6 +3,7 @@
#include "DeathScreen.h"
#include "../Button.h"
#include "../../Player/MultiPlayerLocalPlayer.h"
#include "PauseScreen.h"
#include "TitleScreen.h"
void DeathScreen::init() {
@ -30,9 +31,11 @@ void DeathScreen::buttonClicked(Button* button) {
// minecraft.setScreen(new NewLevelScreen(this));
}
if (button->id == 2) {
// TODO: proper world exits
// minecraft->setLevel(NULL);
// minecraft->setScreen(new TitleScreen());
// 4jcraft: use the static method from PauseScreen to exit
PauseScreen::exitWorld(minecraft, true);
}
}

View file

@ -0,0 +1,19 @@
#include "../../Platform/stdafx.h"
#include "MessageScreen.h"
MessageScreen::MessageScreen(const std::wstring& message) {
this->message = message;
}
void MessageScreen::keyPressed(char eventCharacter, int eventKey) {}
void MessageScreen::init() { buttons.clear(); }
void MessageScreen::buttonClicked(Button* button) {}
void MessageScreen::render(int xm, int ym, float a) {
renderDirtBackground(0);
drawCenteredString(font, message, width / 2, height / 2 - 50, 0xffffff);
Screen::render(xm, ym, a);
}

View file

@ -0,0 +1,24 @@
#pragma once
#include "../Screen.h"
class MessageScreen : public Screen {
private:
std::wstring message;
public:
MessageScreen(const std::wstring& message);
protected:
using Screen::keyPressed;
virtual void keyPressed(char eventCharacter, int eventKey);
public:
virtual void init();
protected:
virtual void buttonClicked(Button* button);
public:
virtual void render(int xm, int ym, float a);
};

View file

@ -2,6 +2,7 @@
#include "PauseScreen.h"
#include "../Button.h"
#include "../../GameState/StatsCounter.h"
#include "MessageScreen.h"
#include "OptionsScreen.h"
#include "TitleScreen.h"
#include "../../Level/MultiPlayerLevel.h"
@ -21,10 +22,15 @@ void PauseScreen::init() {
saveStep = 0;
buttons.clear();
int yo = -16;
// 4jcraft: solves the issue of client-side only pausing in the java gui
if (g_NetworkManager.IsLocalGame() &&
g_NetworkManager.GetPlayerCount() == 1)
app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),
eXuiServerAction_PauseServer, (void*)TRUE);
buttons.push_back(new Button(1, width / 2 - 100, height / 4 + 24 * 5 + yo,
L"Save and quit to title"));
if (minecraft->isClientSide()) {
buttons[0]->msg = L"Disconnect";
I18n::get(L"menu.returnToMenu")));
if (!g_NetworkManager.IsHost()) {
buttons[0]->msg = I18n::get(L"menu.disconnect");
}
buttons.push_back(new Button(4, width / 2 - 100, height / 4 + 24 * 1 + yo,
@ -48,12 +54,32 @@ void PauseScreen::init() {
*/
}
void PauseScreen::keyPressed(wchar_t eventCharacter, int eventKey) {
if (eventKey == Keyboard::KEY_ESCAPE && g_NetworkManager.IsLocalGame() &&
g_NetworkManager.GetPlayerCount() == 1)
app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),
eXuiServerAction_PauseServer, (void*)FALSE);
Screen::keyPressed(eventCharacter, eventKey);
}
void PauseScreen::exitWorld(Minecraft* minecraft, bool save) {
// 4jcraft: made our own static method for use in the java gui (other
// places such as the deathscreen need this)
MinecraftServer* server = MinecraftServer::getInstance();
minecraft->setScreen(new MessageScreen(L"Leaving world"));
if (g_NetworkManager.IsHost()) {
server->setSaveOnExit(save);
}
app.SetAction(minecraft->player->GetXboxPad(), eAppAction_ExitWorld);
}
void PauseScreen::buttonClicked(Button* button) {
if (button->id == 0) {
minecraft->setScreen(new OptionsScreen(this, minecraft->options));
}
if (button->id == 1) {
// TODO: proper disconnects
// if (minecraft->isClientSide())
// {
// minecraft->level->disconnect();
@ -61,8 +87,13 @@ void PauseScreen::buttonClicked(Button* button) {
// minecraft->setLevel(NULL);
// minecraft->setScreen(new TitleScreen());
// 4jcraft: exit with our new exitWorld method
exitWorld(minecraft, true);
}
if (button->id == 4) {
app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),
eXuiServerAction_PauseServer, (void*)FALSE);
minecraft->setScreen(NULL);
// minecraft->grabMouse(); // 4J - removed
}

View file

@ -9,6 +9,8 @@ private:
public:
PauseScreen(); // 4J added
virtual void init();
virtual void keyPressed(wchar_t eventCharacter, int eventKey);
static void exitWorld(Minecraft* minecraft, bool save);
protected:
using Screen::buttonClicked;

View file

@ -165,6 +165,7 @@ void SelectWorldScreen::confirmResult(bool result, int id) {
void SelectWorldScreen::render(int xm, int ym, float a) {
// fill(0, 0, width, height, 0x40000000);
renderDirtBackground(0);
worldSelectionList->render(xm, ym, a);
drawCenteredString(font, title, width / 2, 20, 0xffffff);

View file

@ -165,21 +165,21 @@ void Achievements::staticCtor() {
// "requires" are ignored on xbox.
Achievements::leaderOfThePack =
(new Achievement(eAward_LeaderOfThePack, L"leaderOfThePack", 0, 0,
Tile::treeTrunk, (Achievement*)buildSword))
Item::bone, (Achievement*)buildSword))
->setAwardLocallyOnly()
->postConstruct();
Achievements::MOARTools =
(new Achievement(eAward_MOARTools, L"MOARTools", 0, 0, Tile::treeTrunk,
(new Achievement(eAward_MOARTools, L"MOARTools", 0, 0, Item::shovel_diamond,
(Achievement*)buildSword))
->setAwardLocallyOnly()
->postConstruct();
Achievements::dispenseWithThis =
(new Achievement(eAward_DispenseWithThis, L"dispenseWithThis", 0, 0,
Tile::treeTrunk, (Achievement*)buildSword))
Tile::dispenser, (Achievement*)buildSword))
->postConstruct();
Achievements::InToTheNether =
(new Achievement(eAward_InToTheNether, L"InToTheNether", 0, 0,
Tile::treeTrunk, (Achievement*)buildSword))
Tile::portalTile, (Achievement*)buildSword))
->postConstruct();
// 4J : WESTY : Added other awards.
@ -196,7 +196,7 @@ void Achievements::staticCtor() {
#ifdef _EXTENDED_ACHIEVEMENTS
Achievements::eatPorkChop =
(new Achievement(eAward_eatPorkChop, L"eatPorkChop", 0, 0,
Tile::treeTrunk, (Achievement*)buildSword))
Item::porkChop_raw, (Achievement*)buildSword))
->setAwardLocallyOnly()
->postConstruct();
#else
@ -298,13 +298,13 @@ void Achievements::staticCtor() {
->postConstruct();
Achievements::repopulation =
(new Achievement(eAward_repopulation, L"repopulation", 0, 0,
Tile::bookshelf, (Achievement*)NULL))
Item::wheat, (Achievement*)NULL))
->postConstruct();
// Achievements::porkChoop // // //
// // // //
Achievements::diamondsToYou =
(new Achievement(eAward_diamondsToYou, L"diamondsToYou", 0, 0,
Tile::bookshelf, (Achievement*)NULL))
Item::diamond, (Achievement*)NULL))
->postConstruct();
// Achievements::passingTheTime = (new
// Achievement(eAward_play100Days, L"passingTheTime",
@ -315,63 +315,63 @@ void Achievements::staticCtor() {
// )->postConstruct();
Achievements::theHaggler =
(new Achievement(eAward_theHaggler, L"theHaggler", 0, 0,
Tile::bookshelf, (Achievement*)NULL))
Item::emerald, (Achievement*)NULL))
->setAwardLocallyOnly()
->postConstruct();
Achievements::potPlanter =
(new Achievement(eAward_potPlanter, L"potPlanter", 0, 0,
Tile::bookshelf, (Achievement*)NULL))
Item::flowerPot, (Achievement*)NULL))
->setAwardLocallyOnly()
->postConstruct();
Achievements::itsASign =
(new Achievement(eAward_itsASign, L"itsASign", 0, 0, Tile::bookshelf,
(new Achievement(eAward_itsASign, L"itsASign", 0, 0, Item::sign,
(Achievement*)NULL))
->setAwardLocallyOnly()
->postConstruct();
Achievements::ironBelly =
(new Achievement(eAward_ironBelly, L"ironBelly", 0, 0, Tile::bookshelf,
(new Achievement(eAward_ironBelly, L"ironBelly", 0, 0, Item::rotten_flesh,
(Achievement*)NULL))
->postConstruct();
Achievements::haveAShearfulDay =
(new Achievement(eAward_haveAShearfulDay, L"haveAShearfulDay", 0, 0,
Tile::bookshelf, (Achievement*)NULL))
Item::shears, (Achievement*)NULL))
->postConstruct();
Achievements::rainbowCollection =
(new Achievement(eAward_rainbowCollection, L"rainbowCollection", 0, 0,
Tile::bookshelf, (Achievement*)NULL))
Tile::cloth, (Achievement*)NULL))
->setAwardLocallyOnly()
->postConstruct();
Achievements::stayinFrosty =
(new Achievement(eAward_stayinFrosty, L"stayingFrosty", 0, 0,
Tile::bookshelf, (Achievement*)NULL))
Tile::ice, (Achievement*)NULL))
->postConstruct();
Achievements::chestfulOfCobblestone =
(new Achievement(eAward_chestfulOfCobblestone, L"chestfulOfCobblestone",
0, 0, Tile::bookshelf, (Achievement*)NULL))
0, 0, Tile::rock, (Achievement*)NULL))
->setAwardLocallyOnly()
->postConstruct();
Achievements::renewableEnergy =
(new Achievement(eAward_renewableEnergy, L"renewableEnergy", 0, 0,
Tile::bookshelf, (Achievement*)NULL))
Item::coal, (Achievement*)NULL))
->postConstruct();
Achievements::musicToMyEars =
(new Achievement(eAward_musicToMyEars, L"musicToMyEars", 0, 0,
Tile::bookshelf, (Achievement*)NULL))
Tile::musicBlock, (Achievement*)NULL))
->postConstruct();
Achievements::bodyGuard =
(new Achievement(eAward_bodyGuard, L"bodyGuard", 0, 0, Tile::bookshelf,
(new Achievement(eAward_bodyGuard, L"bodyGuard", 0, 0, Tile::pumpkin,
(Achievement*)NULL))
->postConstruct();
Achievements::ironMan =
(new Achievement(eAward_ironMan, L"ironMan", 0, 0, Tile::bookshelf,
(new Achievement(eAward_ironMan, L"ironMan", 0, 0, Item::chestplate_iron,
(Achievement*)NULL))
->postConstruct();
Achievements::zombieDoctor =
(new Achievement(eAward_zombieDoctor, L"zombieDoctor", 0, 0,
Tile::bookshelf, (Achievement*)NULL))
Item::apple_gold, (Achievement*)NULL))
->postConstruct();
Achievements::lionTamer =
(new Achievement(eAward_lionTamer, L"lionTamer", 0, 0, Tile::bookshelf,
(new Achievement(eAward_lionTamer, L"lionTamer", 0, 0, Item::fish_raw,
(Achievement*)NULL))
->postConstruct();
#endif