GUI: Split gui to interface, potentially new ui interface is possible

This commit is contained in:
Er2
2023-12-09 13:58:05 +03:00
parent 7b5f2b61f9
commit 5e311cbbb3
31 changed files with 460 additions and 202 deletions

View File

@@ -1,6 +1,8 @@
add_library(reminecraftpe-client STATIC
app/App.cpp app/App.hpp
app/AppPlatform.cpp app/AppPlatform.hpp
app/IGui.cpp app/IGui.hpp
app/IScreen.cpp app/IScreen.hpp
app/Minecraft.cpp app/Minecraft.hpp
app/NinecraftApp.cpp app/NinecraftApp.hpp
model/ChickenModel.cpp model/ChickenModel.hpp

View File

@@ -0,0 +1,87 @@
/********************************************************************
Minecraft: Pocket Edition - Decompilation Project
Copyright (C) 2023 iProgramInCpp
The following code is licensed under the BSD 1 clause license.
SPDX-License-Identifier: BSD-1-Clause
********************************************************************/
#include "IGui.hpp"
#include "Minecraft.hpp"
IGui::IGui(Minecraft* pMinecraft)
{
#ifdef ENH_USE_GUI_SCALE_2
scale = 1.0f / 2.0f;
#else
scale = 1.0f / 3.0f;
#endif
m_bRenderChatMessages = true;
m_pMinecraft = pMinecraft;
}
void IGui::addMessage(const std::string& s)
{
}
void IGui::onInventoryUpdated()
{
}
void IGui::tick()
{
}
void IGui::render(float f, bool bHaveScreen, int mouseX, int mouseY)
{
}
bool IGui::isInside(int mouseX, int mouseY)
{
return false;
}
void IGui::handleClick(int clickID, int mouseX, int mouseY)
{
}
void IGui::handleKeyPressed(int keyCode)
{
}
void IGui::renderChatMessages(bool bShowAll)
{
}
int IGui::getNumSlots()
{
return 0;
}
int IGui::getNumUsableSlots()
{
return getNumSlots() - m_pMinecraft->isTouchscreen();
}
// screens
IScreen* IGui::screenMain()
{
return nullptr;
}
IScreen* IGui::screenDeath()
{
return nullptr;
}
IScreen* IGui::screenPause()
{
return nullptr;
}
IScreen* IGui::screenSaveWorld(bool bCopyMap, Entity *pEnt)
{
return nullptr;
}
IScreen* IGui::screenRenameMPWorld(std::string name)
{
return nullptr;
}

View File

@@ -0,0 +1,42 @@
/********************************************************************
Minecraft: Pocket Edition - Decompilation Project
Copyright (C) 2023 iProgramInCpp
The following code is licensed under the BSD 1 clause license.
SPDX-License-Identifier: BSD-1-Clause
********************************************************************/
#pragma once
#include "App.hpp"
class Minecraft;
class Entity;
class IScreen;
class IGui
{
public:
IGui(Minecraft* pMinecraft);
virtual void addMessage(const std::string& str);
virtual void onInventoryUpdated();
virtual void tick();
virtual void render(float f, bool bHaveScreen, int mouseX, int mouseY);
virtual bool isInside(int mx, int my);
virtual void handleClick(int id, int mx, int my);
virtual void handleKeyPressed(int keyCode);
virtual void renderChatMessages(bool bShowAll);
virtual int getNumSlots(); // Gets the number of slots in the inventory. Includes the '...' if in touch mode.
virtual int getNumUsableSlots(); // Gets the number of usable slots in the inventory. Does not include the '...' if in touch mode.
virtual IScreen* screenMain();
virtual IScreen* screenDeath();
virtual IScreen* screenPause();
virtual IScreen* screenSaveWorld(bool bCopyMap, Entity *pEnt);
virtual IScreen* screenRenameMPWorld(std::string name);
float scale;
bool m_bRenderChatMessages;
Minecraft* m_pMinecraft;
};

View File

@@ -0,0 +1,99 @@
/********************************************************************
Minecraft: Pocket Edition - Decompilation Project
Copyright (C) 2023 iProgramInCpp
The following code is licensed under the BSD 1 clause license.
SPDX-License-Identifier: BSD-1-Clause
********************************************************************/
#include "IScreen.hpp"
IScreen::IScreen()
{
m_width = 1;
m_height = 1;
m_bIgnore = false;
}
void IScreen::init(Minecraft* pMinecraft, int a3, int a4)
{
m_width = a3;
m_height = a4;
m_pMinecraft = pMinecraft;
init();
}
void IScreen::init()
{
}
void IScreen::setSize(int width, int height)
{
m_width = width;
m_height = height;
}
void IScreen::onRender(int mouseX, int mouseY, float f)
{
}
int IScreen::getYOffset()
{
return 0;
}
void IScreen::render(int xPos, int yPos, float unused)
{
}
void IScreen::onEvents()
{
}
void IScreen::mouseEvent()
{
}
void IScreen::keyboardEvent()
{
}
void IScreen::tick()
{
}
void IScreen::removed()
{
}
bool IScreen::handleBackEvent(bool b)
{
return false;
}
void IScreen::renderBackground()
{
}
bool IScreen::isPauseScreen()
{
return true;
}
bool IScreen::isErrorScreen()
{
return false;
}
bool IScreen::isInGameScreen()
{
return true;
}
void IScreen::confirmResult(bool b, int i)
{
}
void IScreen::charInput(char ch)
{
}

View File

@@ -0,0 +1,47 @@
/********************************************************************
Minecraft: Pocket Edition - Decompilation Project
Copyright (C) 2023 iProgramInCpp
The following code is licensed under the BSD 1 clause license.
SPDX-License-Identifier: BSD-1-Clause
********************************************************************/
#pragma once
class Minecraft;
class IScreen
{
public:
IScreen();
virtual ~IScreen() = default;
virtual void init(Minecraft*, int, int);
virtual void init();
//virtual void updateTabButtonSelection();
virtual void setSize(int width, int height);
virtual void onRender(int mouseX, int mouseY, float f);
virtual int getYOffset();
virtual void render(int, int, float);
virtual void onEvents();
virtual void mouseEvent();
virtual void keyboardEvent();
virtual bool handleBackEvent(bool);
virtual void tick();
virtual void removed();
virtual void renderBackground();
virtual bool isPauseScreen();
virtual bool isErrorScreen();
virtual bool isInGameScreen();
virtual void confirmResult(bool, int);
virtual void charInput(char);
// ported from 0.8
//virtual void renderMenuBackground(float f);
int m_width;
int m_height;
bool m_bIgnore;
Minecraft *m_pMinecraft;
};

View File

@@ -7,16 +7,12 @@
********************************************************************/
#include "client/app/Minecraft.hpp"
#include "client/gui/screens/PauseScreen.hpp"
#include "client/gui/screens/StartMenuScreen.hpp"
#include "client/gui/screens/RenameMPLevelScreen.hpp"
#include "client/gui/screens/SavingWorldScreen.hpp"
#include "client/gui/screens/DeathScreen.hpp"
#include "network/ServerSideNetworkHandler.hpp"
#include "client/network/ClientSideNetworkHandler.hpp"
#include "world/gamemode/SurvivalMode.hpp"
#include "world/gamemode/CreativeMode.hpp"
#include "client/gui/Gui.hpp"
#include "client/player/input/ControllerTurnInput.hpp"
#include "client/player/input/MouseTurnInput.hpp"
@@ -25,6 +21,7 @@
#include "client/player/input/CustomInputHolder.hpp"
#include "client/player/input/TouchInputHolder.hpp"
#include "client/player/input/Multitouch.hpp"
#include "client/player/input/Keyboard.hpp"
#include "world/tile/SandTile.hpp"
@@ -52,9 +49,10 @@ const char* Minecraft::progressMessages[] =
"Saving chunks",
};
Minecraft::Minecraft() :
m_gui(this)
Minecraft::Minecraft()
{
// TODO: Gui selection?
m_pGui = new Gui(this);
m_options = nullptr;
field_18 = false;
field_288 = false;
@@ -134,7 +132,7 @@ void Minecraft::grabMouse()
platform()->setMouseGrabbed(!isTouchscreen());
}
void Minecraft::setScreen(Screen* pScreen)
void Minecraft::setScreen(IScreen* pScreen)
{
#ifndef ORIGINAL_CODE
if (pScreen == nullptr && !isLevelGenerated())
@@ -167,7 +165,7 @@ void Minecraft::setScreen(Screen* pScreen)
if (pScreen)
{
releaseMouse();
pScreen->init(this, int(width * Gui::InvGuiScale), int(height * Gui::InvGuiScale));
pScreen->init(this, std::ceil(width * m_pGui->scale), std::ceil(height * m_pGui->scale));
}
else
{
@@ -338,6 +336,7 @@ void Minecraft::handleBuildAction(BuildActionIntention* pAction)
hitSide = HitResult::MINY;
}
if (!m_pRakNetInstance) return; // throw std::exception()?
m_pRakNetInstance->send(new PlaceBlockPacket(m_pLocalPlayer->m_EntityID, dx, dy, dz, uint8_t(pItem->m_itemID), hitSide));
}
}
@@ -376,10 +375,10 @@ void Minecraft::tickInput()
{
if (m_pScreen)
{
if (!m_pScreen->field_10)
if (!m_pScreen->m_bIgnore)
{
m_bUsingScreen = true;
m_pScreen->updateEvents();
m_pScreen->onEvents();
m_bUsingScreen = false;
if (m_bHasQueuedScreen)
@@ -395,7 +394,7 @@ void Minecraft::tickInput()
if (!m_pLocalPlayer)
return;
bool bIsInGUI = m_gui.isInside(Mouse::getX(), Mouse::getY());
bool bIsInGUI = m_pGui->isInside(Mouse::getX(), Mouse::getY());
while (Mouse::next())
{
@@ -403,7 +402,7 @@ void Minecraft::tickInput()
continue;
if (Mouse::isButtonDown(BUTTON_LEFT))
m_gui.handleClick(1, Mouse::getX(), Mouse::getY());
m_pGui->handleClick(1, Mouse::getX(), Mouse::getY());
if (!bIsInGUI && getOptions()->field_19)
{
@@ -422,7 +421,7 @@ void Minecraft::tickInput()
{
int slot = m_pLocalPlayer->m_pInventory->m_SelectedHotbarSlot;
int maxItems = m_gui.getNumSlots() - 1;
int maxItems = m_pGui->getNumSlots() - 1;
if (isTouchscreen())
maxItems--;
@@ -456,9 +455,9 @@ void Minecraft::tickInput()
if (bPressed)
{
m_gui.handleKeyPressed(keyCode);
m_pGui->handleKeyPressed(keyCode);
for (int i = 0; i < m_gui.getNumSlots(); i++)
for (int i = 0; i < m_pGui->getNumSlots(); i++)
{
if (getOptions()->isKey(eKeyMappingIndex(KM_SLOT_1 + i), keyCode))
m_pLocalPlayer->m_pInventory->selectSlot(i);
@@ -576,7 +575,7 @@ void Minecraft::sendMessage(const std::string& message)
if (m_pRakNetInstance)
m_pRakNetInstance->send(new MessagePacket(message));
else
m_gui.addMessage("You aren't actually playing multiplayer!");
m_pGui->addMessage("You aren't actually playing multiplayer!");
}
else
{
@@ -585,7 +584,7 @@ void Minecraft::sendMessage(const std::string& message)
if (m_pNetEventCallback && m_pRakNetInstance)
m_pNetEventCallback->handle(m_pRakNetInstance->m_pRakPeerInterface->GetMyGUID(), &mp);
else
m_gui.addMessage("You aren't hosting a multiplayer server!");
m_pGui->addMessage("You aren't hosting a multiplayer server!");
}
}
@@ -680,13 +679,13 @@ void Minecraft::tick()
{
if (m_pLocalPlayer && m_pLocalPlayer->m_health <= 0)
{
setScreen(new DeathScreen);
setScreen(m_pGui->screenDeath());
}
}
tickInput();
m_gui.tick();
m_pGui->tick();
// if the level has been prepared, delete the prep thread
if (!m_bPreparingLevel)
@@ -967,10 +966,10 @@ void Minecraft::prepareLevel(const std::string& unused)
void Minecraft::sizeUpdate(int newWidth, int newHeight)
{
// re-calculate the GUI scale.
Gui::InvGuiScale = getBestScaleForThisScreenSize(newWidth, newHeight) / guiScaleMultiplier;
m_pGui->scale = getBestScaleForThisScreenSize(newWidth, newHeight) / guiScaleMultiplier;
if (m_pScreen)
m_pScreen->setSize(int(Minecraft::width * Gui::InvGuiScale), int(Minecraft::height * Gui::InvGuiScale));
m_pScreen->setSize(std::ceil(Minecraft::width * m_pGui->scale), std::ceil(Minecraft::height * m_pGui->scale));
if (m_pInputHolder)
m_pInputHolder->setScreenSize(newWidth * guiScaleMultiplier, newHeight * guiScaleMultiplier);
@@ -1067,7 +1066,7 @@ void Minecraft::pauseGame()
{
if (m_pScreen) return;
m_pLevel->savePlayerData();
setScreen(new PauseScreen);
setScreen(m_pGui->screenPause());
}
void Minecraft::setLevel(Level* pLevel, const std::string& text, LocalPlayer* pLocalPlayer)
@@ -1163,7 +1162,7 @@ void Minecraft::leaveGame(bool bCopyMap)
#ifdef ENH_IMPROVED_SAVING
field_288 = true;
setScreen(new SavingWorldScreen(bCopyMap, m_pLocalPlayer));
setScreen(m_pGui->screenSaveWorld(bCopyMap, m_pLocalPlayer));
#else
if (m_pLevel)
{
@@ -1188,9 +1187,9 @@ void Minecraft::leaveGame(bool bCopyMap)
SAFE_DELETE(m_pLocalPlayer);
if (bCopyMap)
setScreen(new RenameMPLevelScreen("_LastJoinedServer"));
setScreen(m_pGui->screenRenameMPWorld("_LastJoinedServer"));
else
setScreen(new StartMenuScreen);
setScreen(m_pGui->screenMain());
#endif
}

View File

@@ -9,11 +9,11 @@
#pragma once
#include "App.hpp"
#include "IGui.hpp"
#include "IScreen.hpp"
#include "common/CThread.hpp"
#include "common/Mth.hpp"
#include "common/Timer.hpp"
#include "client/gui/Gui.hpp"
#include "client/gui/Screen.hpp"
#include "network/RakNetInstance.hpp"
#include "network/NetEventCallback.hpp"
#include "client/player/LocalPlayer.hpp"
@@ -28,8 +28,6 @@
#include "world/gamemode/GameMode.hpp"
#include "world/particle/ParticleEngine.hpp"
class Screen; // in case we're included from Screen.hpp
class Minecraft : public App
{
public:
@@ -37,7 +35,7 @@ public:
virtual ~Minecraft();
int getLicenseId();
void setScreen(Screen * pScreen);
void setScreen(IScreen * pScreen);
void releaseMouse();
void grabMouse();
void tick();
@@ -119,10 +117,10 @@ public:
Level* m_pLevel;
LocalPlayer* m_pLocalPlayer;
Mob* m_pMobPersp; // why is there a duplicate?
Gui m_gui;
IGui *m_pGui;
int field_D0C;
CThread* m_pPrepThread;
Screen* m_pScreen;
IScreen* m_pScreen;
int field_D18;
IInputHolder* m_pInputHolder;
MouseHandler m_mouseHandler;
@@ -141,11 +139,13 @@ public:
int field_DAC;
bool m_bUsingScreen;
bool m_bHasQueuedScreen;
Screen* m_pQueuedScreen;
IScreen* m_pQueuedScreen;
int m_licenseID;
ItemInstance m_CurrItemInstance;
// in 0.8. Offset 3368
double m_fDeltaTime, m_fLastUpdated;
float m_breakProgress;
};

View File

@@ -9,7 +9,6 @@
#include "NinecraftApp.hpp"
#include "world/item/Item.hpp"
#include "client/player/input/Multitouch.hpp"
#include "client/gui/screens/StartMenuScreen.hpp"
#ifdef DEMO
#include "world/level/storage/MemoryLevelStorageSource.hpp"
@@ -94,7 +93,7 @@ void NinecraftApp::init()
field_D9C = 0;
setScreen(new StartMenuScreen);
setScreen(m_pGui->screenMain());
}
void NinecraftApp::onGraphicsReset()

View File

@@ -6,23 +6,19 @@
SPDX-License-Identifier: BSD-1-Clause
********************************************************************/
#include "Gui.hpp"
#include "screens/IngameBlockSelectionScreen.hpp"
#include "screens/ChatScreen.hpp"
#include "client/app/Minecraft.hpp"
#include "client/gui/screens/IngameBlockSelectionScreen.hpp"
#include "client/gui/screens/ChatScreen.hpp"
#include "client/renderer/entity/ItemRenderer.hpp"
#ifdef _WIN32
#pragma warning(disable : 4244)
#endif
#ifdef ENH_USE_GUI_SCALE_2
float Gui::InvGuiScale = 1.0f / 2.0f;
#else
float Gui::InvGuiScale = 1.0f / 3.0f;
#endif
Gui::Gui(Minecraft* pMinecraft)
Gui::Gui(Minecraft* pMinecraft) : IGui(pMinecraft)
{
/*
field_8 = 0;
field_C = "";
field_24 = 0;
@@ -32,11 +28,9 @@ Gui::Gui(Minecraft* pMinecraft)
field_A00 = "";
field_A18 = 0;
field_A1C = false;
field_A20 = 1.0f;
field_A3C = true;
m_bRenderMessages = true;
m_pMinecraft = pMinecraft;
*/
m_vignetteColor = 1.0f;
//field_A3C = true; // unused
xglGenBuffers(1, &m_renderChunk.field_0);
}
@@ -81,12 +75,14 @@ void Gui::addMessage(const std::string& s)
m_guiMessages.insert(m_guiMessages.begin(), GuiMessage(str, 0));
}
/* for jukebox
void Gui::setNowPlaying(const std::string& str)
{
field_A00 = "Now playing: " + str;
field_A18 = 60;
field_A1C = true;
}
*/
void Gui::renderVignette(float a2, int a3, int a4)
{
@@ -96,11 +92,11 @@ void Gui::renderVignette(float a2, int a3, int a4)
if (a2 < 0.0f)
a2 = 0.0f;
field_A20 += ((a2 - field_A20) * 0.01f);
m_vignetteColor += ((a2 - m_vignetteColor) * 0.01f);
glDisable(GL_DEPTH_TEST);
glDepthMask(false);
glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
glColor4f(field_A20, field_A20, field_A20, 1.0f);
glColor4f(m_vignetteColor, m_vignetteColor, m_vignetteColor, 1.0f);
//! @BUG: No misc/vignette.png to be found in the original.
//! This function is unused anyways
@@ -120,9 +116,10 @@ void Gui::renderVignette(float a2, int a3, int a4)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
void Gui::inventoryUpdated()
void Gui::onInventoryUpdated()
{
field_A3C = true;
// unused
//field_A3C = true;
}
void Gui::render(float f, bool bHaveScreen, int mouseX, int mouseY)
@@ -148,8 +145,8 @@ void Gui::render(float f, bool bHaveScreen, int mouseX, int mouseY)
field_4 = -90.0f;
int width = Minecraft::width * InvGuiScale,
height = Minecraft::height * InvGuiScale;
int width = Minecraft::width * scale,
height = Minecraft::height * scale;
#ifdef ENH_TRANSPARENT_HOTBAR
glEnable(GL_BLEND);
@@ -189,7 +186,7 @@ void Gui::render(float f, bool bHaveScreen, int mouseX, int mouseY)
// NOTE: real Minecraft PE takes it directly from the gamemode as "current progress" and
// "last progress". Well guess what? The game mode in question updates our field_8 with
// the pre-interpolated break progress! Isn't that awesome?!
float breakProgress = field_8;
float breakProgress = 0.0f; //field_8;
// don't know about this if-structure, it feels like it'd be like
// if (field_C >= 0.0f && breakProgress <= 0.0f)
@@ -207,7 +204,7 @@ void Gui::render(float f, bool bHaveScreen, int mouseX, int mouseY)
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
blit(InvGuiScale * xPos - 44.0f, InvGuiScale * yPos - 44.0f, 0, 0, 88, 88, 256, 256);
blit(scale * xPos - 44.0f, scale * yPos - 44.0f, 0, 0, 88, 88, 256, 256);
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR);
m_pMinecraft->m_pTextures->loadAndBindTexture("gui/feedback_fill.png");
@@ -215,7 +212,7 @@ void Gui::render(float f, bool bHaveScreen, int mouseX, int mouseY)
// note: scale starts from 4.0f
float halfWidth = (40.0f * breakProgress + 48.0f) / 2.0f;
blit(InvGuiScale * xPos - halfWidth, InvGuiScale * yPos - halfWidth, 0, 0, halfWidth * 2, halfWidth * 2, 256, 256);
blit(scale * xPos - halfWidth, scale * yPos - halfWidth, 0, 0, halfWidth * 2, halfWidth * 2, 256, 256);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glDisable(GL_BLEND);
@@ -230,7 +227,7 @@ void Gui::render(float f, bool bHaveScreen, int mouseX, int mouseY)
glColor4f(1.0f, 1.0f, 1.0f, Mth::Min(1.0f, m_pMinecraft->m_pInputHolder->m_feedbackAlpha));
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
blit(InvGuiScale * xPos - 44.0f, InvGuiScale * yPos - 44.0f, 0, 0, 88, 88, 256, 256);
blit(scale * xPos - 44.0f, scale * yPos - 44.0f, 0, 0, 88, 88, 256, 256);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glDisable(GL_BLEND);
}
@@ -245,7 +242,7 @@ void Gui::render(float f, bool bHaveScreen, int mouseX, int mouseY)
LocalPlayer* pLP = m_pMinecraft->m_pLocalPlayer;
// why??
m_random.init_genrand(312871 * field_9FC);
m_random.init_genrand(312871 * m_pMinecraft->m_timer.m_ticks);
int emptyHeartX = 16;
bool b1 = false;
@@ -341,9 +338,7 @@ void Gui::render(float f, bool bHaveScreen, int mouseX, int mouseY)
slotX += 20;
}
#undef DIFF
field_A3C = false;
//field_A3C = false;
// blit the "more items" button
if (m->isTouchscreen())
@@ -353,18 +348,18 @@ void Gui::render(float f, bool bHaveScreen, int mouseX, int mouseY)
}
// render messages
if (m_bRenderMessages)
if (m_bRenderChatMessages)
{
renderMessages(false);
renderChatMessages(false);
}
}
void Gui::tick()
{
/*
if (field_A18 > 0)
field_A18--;
field_9FC++;
*/
for (int i = 0; i < int(m_guiMessages.size()); i++)
{
@@ -403,8 +398,8 @@ void Gui::renderSlotOverlay(int slot, int x, int y, float f)
int Gui::getSlotIdAt(int mouseX, int mouseY)
{
int scaledY = int(InvGuiScale * mouseY);
int scaledHeight = int(InvGuiScale * Minecraft::height);
int scaledY = int(scale * mouseY);
int scaledHeight = int(scale * Minecraft::height);
if (scaledY >= scaledHeight)
return -1;
@@ -413,7 +408,7 @@ int Gui::getSlotIdAt(int mouseX, int mouseY)
int hotbarOffset = getNumSlots() * 20 / 2 - 2;
int slotX = (int(InvGuiScale * mouseX) - int(InvGuiScale * Minecraft::width) / 2 + hotbarOffset + 20) / 20;
int slotX = (int(scale * mouseX) - int(scale * Minecraft::width) / 2 + hotbarOffset + 20) / 20;
if (slotX >= 0)
slotX--;
@@ -485,10 +480,10 @@ void Gui::handleKeyPressed(int keyCode)
}
}
void Gui::renderMessages(bool bShowAll)
void Gui::renderChatMessages(bool bShowAll)
{
//int width = Minecraft::width * InvGuiScale,
int height = Minecraft::height * InvGuiScale;
//int width = Minecraft::width * scale,
int height = Minecraft::height * scale;
int topEdge = height - 49;
@@ -537,18 +532,29 @@ int Gui::getNumSlots()
return 9;
}
int Gui::getNumUsableSlots()
// screens
#include "screens/PauseScreen.hpp"
#include "screens/StartMenuScreen.hpp"
#include "screens/RenameMPLevelScreen.hpp"
#include "screens/SavingWorldScreen.hpp"
#include "screens/DeathScreen.hpp"
IScreen* Gui::screenMain()
{
return getNumSlots() - m_pMinecraft->isTouchscreen();
return new StartMenuScreen();
}
RectangleArea Gui::getRectangleArea(bool b)
IScreen* Gui::screenDeath()
{
float centerX = Minecraft::width / 2;
float hotbarWidthHalf = (10 * getNumSlots() + 5) / InvGuiScale;
return RectangleArea(
b ? (centerX - hotbarWidthHalf) : 0,
Minecraft::height - 24.0f / InvGuiScale,
centerX + hotbarWidthHalf,
Minecraft::height);
return new DeathScreen();
}
IScreen* Gui::screenPause()
{
return new PauseScreen();
}
IScreen* Gui::screenSaveWorld(bool bCopyMap, Entity *pEnt)
{
return new SavingWorldScreen(bCopyMap, pEnt);
}
IScreen* Gui::screenRenameMPWorld(std::string name)
{
return new RenameMPLevelScreen(name);
}

View File

@@ -24,47 +24,53 @@ struct GuiMessage
GuiMessage(const std::string& x, int a) : msg(x), field_18(a) {}
};
class Gui : public GuiComponent
class Gui : public GuiComponent, public IGui
{
public:
Gui(Minecraft* pMinecraft);
// screens
IScreen* screenMain();
IScreen* screenDeath();
IScreen* screenPause();
IScreen* screenSaveWorld(bool bCopyMap, Entity *pEnt);
IScreen* screenRenameMPWorld(std::string name);
void addMessage(const std::string& str);
void inventoryUpdated();
void renderVignette(float, int, int);
void setNowPlaying(const std::string& str);
void render(float f, bool bHaveScreen, int mouseX, int mouseY);
void onInventoryUpdated();
void tick();
void renderSlot(int slot, int x, int y, float f);
void renderSlotOverlay(int slot, int x, int y, float f);
int getSlotIdAt(int mx, int my);
void render(float f, bool bHaveScreen, int mouseX, int mouseY);
bool isInside(int mx, int my);
void handleClick(int id, int mx, int my);
void handleKeyPressed(int keyCode);
void renderMessages(bool bShowAll);
void renderChatMessages(bool bShowAll);
int getNumSlots(); // Gets the number of slots in the inventory. Includes the '...' if in touch mode.
int getNumUsableSlots(); // Gets the number of usable slots in the inventory. Does not include the '...' if in touch mode.
RectangleArea getRectangleArea(bool b);
public:
static float InvGuiScale;
void renderVignette(float a2, int a3, int a4);
void renderSlot(int slot, int x, int y, float f);
void renderSlotOverlay(int slot, int x, int y, float f);
int getSlotIdAt(int mouseX, int mouseY);
std::vector<GuiMessage> m_guiMessages;
//Minecraft* m_pMinecraft;
Random m_random;
RenderChunk m_renderChunk;
float m_vignetteColor;
// bool field_A3c; // unused
/*
public:
float field_8;
std::string field_C;
std::vector<GuiMessage> m_guiMessages;
int field_24;
int field_28;
int field_2C;
Random m_random;
Minecraft* m_pMinecraft;
int field_9FC;
std::string field_A00;
int field_A18;
bool field_A1C;
float field_A20;
RenderChunk m_renderChunk;
bool field_A3C;
bool m_bRenderMessages;
*/
};

View File

@@ -8,11 +8,8 @@
#include "Screen.hpp"
Screen::Screen()
Screen::Screen() : IScreen()
{
m_width = 1;
m_height = 1;
field_10 = false;
m_tabButtonIndex = 0;
m_pClickedButton = 0;
m_yOffset = -1;
@@ -26,47 +23,18 @@ Screen::~Screen()
void Screen::init(Minecraft* pMinecraft, int a3, int a4)
{
m_width = a3;
m_height = a4;
m_pMinecraft = pMinecraft;
m_pFont = pMinecraft->m_pFont;
IScreen::init(pMinecraft, a3, a4);
init();
updateTabButtonSelection();
}
void Screen::init()
{
}
void Screen::buttonClicked(Button* pButton)
{
}
void Screen::confirmResult(bool b, int i)
{
}
bool Screen::handleBackEvent(bool b)
{
return false;
}
bool Screen::isPauseScreen()
{
return true;
}
bool Screen::isErrorScreen()
{
return false;
}
bool Screen::isInGameScreen()
{
return true;
}
void Screen::keyPressed(int key)
@@ -310,11 +278,6 @@ void Screen::tick()
g_panoramaAngle++;
}
void Screen::removed()
{
}
void Screen::setSize(int width, int height)
{
m_width = width;
@@ -358,7 +321,7 @@ int Screen::getYOffset()
if (!pBox->m_bFocused)
continue;
int heightLeft = m_height - int(float(keybOffset) * Gui::InvGuiScale);
int heightLeft = m_height - int(float(keybOffset) * m_pMinecraft->m_pGui->scale);
// we want to keep the center of the text box in the center of the screen
int textCenterY = pBox->m_yPos + pBox->m_height / 2;
@@ -379,9 +342,9 @@ int Screen::getYOffset()
return offset;
}
void Screen::updateEvents()
void Screen::onEvents()
{
if (field_10) return;
if (m_bIgnore) return;
while (Mouse::next())
mouseEvent();

View File

@@ -8,6 +8,7 @@
#pragma once
#include "client/app/IGui.hpp"
#include "client/player/input/Mouse.hpp"
#include "client/player/input/Keyboard.hpp"
#include "components/Button.hpp"
@@ -16,7 +17,7 @@
class Button;
class TextInputBox;
class Screen : public GuiComponent
class Screen : public GuiComponent, public IScreen
{
public:
Screen();
@@ -30,19 +31,13 @@ public:
virtual void render(int, int, float);
virtual void init();
virtual void updateEvents();
virtual void onEvents();
virtual void mouseEvent();
virtual void keyboardEvent();
virtual bool handleBackEvent(bool);
virtual void tick();
virtual void removed();
virtual void renderBackground(int);
virtual void renderBackground();
virtual void renderDirtBackground(int);
virtual bool isPauseScreen();
virtual bool isErrorScreen();
virtual bool isInGameScreen();
virtual void confirmResult(bool, int);
virtual void buttonClicked(Button*);
virtual void mouseClicked(int, int, int);
virtual void mouseReleased(int, int, int);
@@ -53,10 +48,6 @@ public:
virtual void renderMenuBackground(float f);
public:
int m_width;
int m_height;
bool field_10;
Minecraft* m_pMinecraft;
std::vector<Button*> m_buttons;
std::vector<Button*> m_buttonTabList;
int m_tabButtonIndex;

View File

@@ -242,7 +242,7 @@ void OptionList::renderItem(int index, int x, int y, int height, Tesselator& t)
void OptionList::renderBackground(float f)
{
if (!m_pMinecraft->isLevelGenerated())
m_pMinecraft->m_pScreen->renderMenuBackground(f);
m_pMinecraft->m_pScreen->renderBackground(); //renderMenuBackground(f);
}
void OptionList::renderHoleBackground(float a, float b, int c, int d)

View File

@@ -6,6 +6,7 @@
SPDX-License-Identifier: BSD-1-Clause
********************************************************************/
#include "../Screen.hpp"
#include "RolledSelectionList.hpp"
static float g_RolledSelectionListUnk, g_RolledSelectionListUnk2;

View File

@@ -8,6 +8,7 @@
#pragma once
#include "../Screen.hpp"
#include "../GuiComponent.hpp"
#include "client/app/Minecraft.hpp"

View File

@@ -175,8 +175,8 @@ void ScrolledSelectionList::render(int mouseX, int mouseY, float f)
renderHeader(itemX, scrollY, t);
// Note, X/Y are the lower left's X/Y coordinates, not the upper left's.
int lowerY = Minecraft::height - int(field_10 / Gui::InvGuiScale);
int upperY = Minecraft::height - int(field_C / Gui::InvGuiScale);
int lowerY = Minecraft::height - int(field_10 / m_pMinecraft->m_pGui->scale);
int upperY = Minecraft::height - int(field_C / m_pMinecraft->m_pGui->scale);
glScissor(0, lowerY, Minecraft::width, upperY - lowerY);
glEnable(GL_SCISSOR_TEST);

View File

@@ -8,7 +8,9 @@
#pragma once
#include "../Gui.hpp"
#include "../GuiComponent.hpp"
#include "../Screen.hpp"
#include "client/app/Minecraft.hpp"
#define C_SCROLLED_LIST_ITEM_WIDTH (220)

View File

@@ -44,7 +44,7 @@ void ChatScreen::init()
void ChatScreen::removed()
{
// Now let them be rendered.
m_pMinecraft->m_gui.m_bRenderMessages = true;
m_pMinecraft->m_pGui->m_bRenderChatMessages = true;
}
void ChatScreen::render(int mouseX, int mouseY, float f)
@@ -52,8 +52,7 @@ void ChatScreen::render(int mouseX, int mouseY, float f)
renderBackground();
// override the default behavior of rendering chat messages
m_pMinecraft->m_gui.m_bRenderMessages = false;
m_pMinecraft->m_gui.renderMessages(true);
m_pMinecraft->m_pGui->m_bRenderChatMessages = true;
Screen::render(mouseX, mouseY, f);
}

View File

@@ -172,14 +172,14 @@ void IngameBlockSelectionScreen::mouseReleased(int x, int y, int type)
void IngameBlockSelectionScreen::removed()
{
m_pMinecraft->m_gui.inventoryUpdated();
m_pMinecraft->m_pGui->onInventoryUpdated();
}
void IngameBlockSelectionScreen::selectSlotAndClose()
{
Inventory* pInv = getInventory();
pInv->selectItem(m_selectedSlot, m_pMinecraft->m_gui.getNumUsableSlots());
pInv->selectItem(m_selectedSlot, m_pMinecraft->m_pGui->getNumUsableSlots());
m_pMinecraft->m_pSoundEngine->play("random.click");
m_pMinecraft->setScreen(nullptr);

View File

@@ -23,8 +23,8 @@ void ProgressScreen::render(int a, int b, float c)
m_pMinecraft->m_pTextures->loadAndBindTexture("gui/background.png");
//! why not use the screen stuff
int x_width = int(Minecraft::width * Gui::InvGuiScale);
int x_height = int(Minecraft::height * Gui::InvGuiScale);
int x_width = int(Minecraft::width * m_pMinecraft->m_pGui->scale);
int x_height = int(Minecraft::height * m_pMinecraft->m_pGui->scale);
Tesselator& t = Tesselator::instance;
t.begin();
@@ -79,7 +79,7 @@ void ProgressScreen::render(int a, int b, float c)
#endif
}
void ProgressScreen::updateEvents()
void ProgressScreen::onEvents()
{
if (m_pMinecraft->isLevelGenerated())
{
@@ -87,5 +87,5 @@ void ProgressScreen::updateEvents()
return;
}
Screen::updateEvents();
Screen::onEvents();
}

View File

@@ -14,7 +14,7 @@ class ProgressScreen : public Screen
{
public:
void render(int, int, float) override;
void updateEvents() override;
void onEvents() override;
bool isInGameScreen() override;
};

View File

@@ -23,8 +23,9 @@ void SavingWorldScreen::render(int mouseX, int mouseY, float f)
{
renderDirtBackground(0);
int x_width = int(Minecraft::width * Gui::InvGuiScale);
int x_height = int(Minecraft::height * Gui::InvGuiScale);
//! why not use the screen stuff
int x_width = int(Minecraft::width * m_pMinecraft->m_pGui->scale);
int x_height = int(Minecraft::height * m_pMinecraft->m_pGui->scale);
int yPos = x_height / 2;
int width = m_pFont->width("Saving chunks");

View File

@@ -9,7 +9,6 @@
#include <RakPeer.h>
#include "ClientSideNetworkHandler.hpp"
#include "common/Utils.hpp"
#include "client/gui/screens/StartMenuScreen.hpp"
// This lets you make the client shut up and not log events in the debug console.
#define VERBOSE_CLIENT
@@ -65,7 +64,7 @@ void ClientSideNetworkHandler::onUnableToConnect()
}
// throw to the start menu for now
m_pMinecraft->setScreen(new StartMenuScreen);
m_pMinecraft->m_pGui->screenMain();
}
void ClientSideNetworkHandler::onDisconnect(const RakNet::RakNetGUID& rakGuid)
@@ -75,14 +74,14 @@ void ClientSideNetworkHandler::onDisconnect(const RakNet::RakNetGUID& rakGuid)
if (m_pLevel)
m_pLevel->m_bIsMultiplayer = false;
m_pMinecraft->m_gui.addMessage("Disconnected from server");
m_pMinecraft->m_pGui->addMessage("Disconnected from server");
}
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& rakGuid, MessagePacket* pMsgPkt)
{
puts_ignorable("MessagePacket");
m_pMinecraft->m_gui.addMessage(pMsgPkt->m_str.C_String());
m_pMinecraft->m_pGui->addMessage(pMsgPkt->m_str.C_String());
}
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& rakGuid, StartGamePacket* pStartGamePkt)
@@ -141,7 +140,7 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& rakGuid, AddPlay
pPlayer->m_pInventory->prepareCreativeInventory();
m_pMinecraft->m_gui.addMessage(pPlayer->m_name + " joined the game");
m_pMinecraft->m_pGui->addMessage(pPlayer->m_name + " joined the game");
}
void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& rakGuid, RemoveEntityPacket* pRemoveEntityPkt)

View File

@@ -8,6 +8,7 @@
#include "LocalPlayer.hpp"
#include "client/app/Minecraft.hpp"
#include "input/Keyboard.hpp"
int dword_250ADC, dword_250AE0;

View File

@@ -58,6 +58,6 @@ void TouchInputHolder::setScreenSize(int width, int height)
{
m_touchScreenInput.setScreenSize(width, height);
m_unifiedTurnBuild.field_40 = m_touchScreenInput.getRectangleArea();
m_unifiedTurnBuild.field_58 = m_pMinecraft->m_gui.getRectangleArea(false);
m_unifiedTurnBuild.field_58 = getRectangleArea(m_pMinecraft->m_pGui, false);
m_unifiedTurnBuild.setScreenSize(width, height);
}

View File

@@ -8,6 +8,7 @@
#pragma once
#include "client/app/Minecraft.hpp"
#include "IInputHolder.hpp"
#include "TouchscreenInput_TestFps.hpp"
#include "UnifiedTurnBuild.hpp"
@@ -15,6 +16,17 @@
class Minecraft;
class Options;
static inline RectangleArea getRectangleArea(IGui *gui, bool b)
{
float centerX = Minecraft::width / 2;
float hotbarWidthHalf = (10 * gui->getNumSlots() + 5) / gui->scale;
return RectangleArea(
b ? (centerX - hotbarWidthHalf) : 0,
Minecraft::height - 24.0f / gui->scale,
centerX + hotbarWidthHalf,
Minecraft::height);
}
class TouchInputHolder : public IInputHolder
{
public:

View File

@@ -221,7 +221,7 @@ void TouchscreenInput_TestFps::tick(Player* pPlayer)
}
}
static void RenderTouchButton(Tesselator* t, PolygonArea* pArea, int srcX, int srcY)
static void RenderTouchButton(Tesselator* t, PolygonArea* pArea, int srcX, int srcY, float scale)
{
float tc[8];
@@ -237,8 +237,8 @@ static void RenderTouchButton(Tesselator* t, PolygonArea* pArea, int srcX, int s
for (int i = 0; i < pArea->m_count; i++)
{
t->vertexUV(
Gui::InvGuiScale * pArea->m_xPos[i],
Gui::InvGuiScale * pArea->m_yPos[i],
scale * pArea->m_xPos[i],
scale * pArea->m_yPos[i],
0.0f,
tc[(2 * i) % 8],
tc[(2 * i + 1) % 8]
@@ -253,24 +253,25 @@ void TouchscreenInput_TestFps::render(float f)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
m_pMinecraft->m_pTextures->loadAndBindTexture("gui/gui.png");
float scale = m_pMinecraft->m_pGui->scale;
Tesselator& t = Tesselator::instance;
t.begin();
t.color(isButtonDown(100 + INPUT_LEFT) ? 0xC0C0C0 : 0xFFFFFF, 0x80);
RenderTouchButton(&t, m_pAreaLeft, 64, 112);
RenderTouchButton(&t, m_pAreaLeft, 64, 112, scale);
t.color(isButtonDown(100 + INPUT_RIGHT) ? 0xC0C0C0 : 0xFFFFFF, 0x80);
RenderTouchButton(&t, m_pAreaRight, 192, 112);
RenderTouchButton(&t, m_pAreaRight, 192, 112, scale);
t.color(isButtonDown(100 + INPUT_FORWARD) ? 0xC0C0C0 : 0xFFFFFF, 0x80);
RenderTouchButton(&t, m_pAreaForward, 0, 112);
RenderTouchButton(&t, m_pAreaForward, 0, 112, scale);
t.color(isButtonDown(100 + INPUT_BACKWARD) ? 0xC0C0C0 : 0xFFFFFF, 0x80);
RenderTouchButton(&t, m_pAreaBackward, 128, 112);
RenderTouchButton(&t, m_pAreaBackward, 128, 112, scale);
t.color(isButtonDown(100 + INPUT_JUMP) ? 0xC0C0C0 : 0xFFFFFF, 0x80);
RenderTouchButton(&t, m_pAreaJump, 0, 176);
RenderTouchButton(&t, m_pAreaJump, 0, 176, scale);
t.draw();

View File

@@ -214,8 +214,8 @@ void GameRenderer::saveMatrices()
void GameRenderer::setupGuiScreen()
{
float x = Gui::InvGuiScale * Minecraft::width;
float y = Gui::InvGuiScale * Minecraft::height;
float x = m_pMinecraft->m_pGui->scale * Minecraft::width;
float y = m_pMinecraft->m_pGui->scale * Minecraft::height;
glClear(GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
@@ -612,8 +612,8 @@ void GameRenderer::render(float f)
pMC->m_pLocalPlayer->turn(diff_field_84 * field_7C, diff_field_84 * multPitch * field_80);
}
int mouseX = int(Mouse::getX() * Gui::InvGuiScale);
int mouseY = int(Mouse::getY() * Gui::InvGuiScale);
int mouseX = int(Mouse::getX() * m_pMinecraft->m_pGui->scale);
int mouseY = int(Mouse::getY() * m_pMinecraft->m_pGui->scale);
if (m_pMinecraft->isTouchscreen())
{
@@ -625,8 +625,8 @@ void GameRenderer::render(float f)
}
else
{
mouseX = int(float(Multitouch::getX(pointerId)) * Gui::InvGuiScale);
mouseY = int(float(Multitouch::getY(pointerId)) * Gui::InvGuiScale);
mouseX = int(float(Multitouch::getX(pointerId)) * m_pMinecraft->m_pGui->scale);
mouseY = int(float(Multitouch::getY(pointerId)) * m_pMinecraft->m_pGui->scale);
}
}
@@ -641,7 +641,7 @@ void GameRenderer::render(float f)
return;
}
m_pMinecraft->m_gui.render(f, m_pMinecraft->m_pScreen != nullptr, mouseX, mouseY);
m_pMinecraft->m_pGui->render(f, m_pMinecraft->m_pScreen != nullptr, mouseX, mouseY);
}
}
else

View File

@@ -122,7 +122,7 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& guid, LoginPacke
sgp.m_version = 2;
sgp.m_time = m_pLevel->getTime();
RakNet::BitStream *sgpbs;
RakNet::BitStream *sgpbs = nullptr;
sgp.write(sgpbs);
m_pRakNetPeer->Send(sgpbs, HIGH_PRIORITY, RELIABLE_ORDERED, 0, guid, false);
@@ -143,7 +143,7 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& guid, LoginPacke
else
pPlayer->m_pInventory->prepareSurvivalInventory();
m_pMinecraft->m_gui.addMessage(pPlayer->m_name + " joined the game");
m_pMinecraft->m_pGui->addMessage(pPlayer->m_name + " joined the game");
AddPlayerPacket app(guid, RakNet::RakString(pPlayer->m_name.c_str()), pPlayer->m_EntityID, pPlayer->m_pos.x, pPlayer->m_pos.y - pPlayer->field_84, pPlayer->m_pos.z);
RakNet::BitStream appbs;
@@ -360,7 +360,7 @@ void ServerSideNetworkHandler::allowIncomingConnections(bool b)
void ServerSideNetworkHandler::displayGameMessage(const std::string& msg)
{
m_pMinecraft->m_gui.addMessage(msg);
m_pMinecraft->m_pGui->addMessage(msg);
m_pRakNetInstance->send(new MessagePacket(msg));
}
@@ -368,7 +368,7 @@ void ServerSideNetworkHandler::sendMessage(const RakNet::RakNetGUID& guid, const
{
if (m_pRakNetPeer->GetMyGUID() == guid)
{
m_pMinecraft->m_gui.addMessage(msg);
m_pMinecraft->m_pGui->addMessage(msg);
return;
}

View File

@@ -133,13 +133,13 @@ void CreativeMode::render(float f)
{
if (m_destroyProgress <= 0.0f)
{
m_pMinecraft->m_gui.field_8 = 0.0f;
m_pMinecraft->m_breakProgress= 0.0f;
m_pMinecraft->m_pLevelRenderer->field_10 = 0.0f;
}
else
{
float x = m_lastDestroyProgress + (m_destroyProgress - m_lastDestroyProgress) * f;
m_pMinecraft->m_gui.field_8 = x;
m_pMinecraft->m_breakProgress = x;
m_pMinecraft->m_pLevelRenderer->field_10 = x;
}
}

View File

@@ -135,13 +135,13 @@ void SurvivalMode::render(float f)
{
if (m_destroyProgress <= 0.0f)
{
m_pMinecraft->m_gui.field_8 = 0.0f;
m_pMinecraft->m_breakProgress = 0.0f;
m_pMinecraft->m_pLevelRenderer->field_10 = 0.0f;
}
else
{
float x = m_lastDestroyProgress + (m_destroyProgress - m_lastDestroyProgress) * f;
m_pMinecraft->m_gui.field_8 = x;
m_pMinecraft->m_breakProgress = x;
m_pMinecraft->m_pLevelRenderer->field_10 = x;
}
}