2026-03-01 12:16:08 +08:00
# pragma once
class Timer ;
class MultiPlayerLevel ;
class LevelRenderer ;
class MultiplayerLocalPlayer ;
class Player ;
class Mob ;
class ParticleEngine ;
class User ;
class Canvas ;
class Textures ;
class Font ;
class Screen ;
class ProgressRenderer ;
class GameRenderer ;
class BackgroundDownloader ;
class HumanoidModel ;
class HitResult ;
class Options ;
class SoundEngine ;
class MinecraftApplet ;
class MouseHandler ;
class TexturePackRepository ;
class File ;
class LevelStorageSource ;
class StatsCounter ;
class Component ;
class Entity ;
class AchievementPopup ;
class WaterTexture ;
class LavaTexture ;
class Gui ;
class ClientConnection ;
class ConsoleSaveFile ;
class ItemInHandRenderer ;
class LevelSettings ;
class ColourTable ;
class MultiPlayerGameMode ;
class PsPlusUpsellWrapper ;
# include "..\Minecraft.World\File.h"
# include "..\Minecraft.World\DisconnectPacket.h"
# include "..\Minecraft.World\C4JThread.h"
using namespace std ;
class Minecraft
{
private :
enum OS {
linux , solaris , windows , macos , unknown , xbox
} ;
public :
static const wstring VERSION_STRING ;
Minecraft ( Component * mouseComponent , Canvas * parent , MinecraftApplet * minecraftApplet , int width , int height , bool fullscreen ) ;
void init ( ) ;
// 4J - removed
// void crash(CrashReport crash);
// public abstract void onCrash(CrashReport crash);
2026-03-02 17:37:12 +07:00
private :
2026-03-01 12:16:08 +08:00
static Minecraft * m_instance ;
2026-03-02 17:37:12 +07:00
public :
2026-03-01 12:16:08 +08:00
MultiPlayerGameMode * gameMode ;
private :
bool fullscreen ;
bool hasCrashed ;
C4JThread : : EventQueue * levelTickEventQueue ;
2026-03-02 15:53:32 +07:00
2026-03-01 12:16:08 +08:00
static void levelTickUpdateFunc ( void * pParam ) ;
static void levelTickThreadInitFunc ( ) ;
public :
int width , height ;
int width_phys , height_phys ; // 4J - added
// private OpenGLCapabilities openGLCapabilities;
private :
Timer * timer ;
bool reloadTextures ;
public :
Level * oldLevel ; // 4J Stu added to keep a handle on an old level so we can delete it
//HANDLE m_hPlayerRespawned; // 4J Added so we can wait in menus until it is done (for async in multiplayer)
public :
MultiPlayerLevel * level ;
LevelRenderer * levelRenderer ;
2026-03-02 17:37:16 +07:00
shared_ptr < MultiplayerLocalPlayer > player ;
2026-03-01 12:16:08 +08:00
MultiPlayerLevelArray levels ;
2026-03-02 17:37:16 +07:00
shared_ptr < MultiplayerLocalPlayer > localplayers [ XUSER_MAX_COUNT ] ;
2026-03-01 12:16:08 +08:00
MultiPlayerGameMode * localgameModes [ XUSER_MAX_COUNT ] ;
int localPlayerIdx ;
ItemInHandRenderer * localitemInHandRenderers [ XUSER_MAX_COUNT ] ;
// 4J-PB - so we can have debugoptions in the server
unsigned int uiDebugOptionsA [ XUSER_MAX_COUNT ] ;
// 4J Stu - Added these so that we can show a Xui scene while connecting
bool m_connectionFailed [ XUSER_MAX_COUNT ] ;
DisconnectPacket : : eDisconnectReason m_connectionFailedReason [ XUSER_MAX_COUNT ] ;
ClientConnection * m_pendingLocalConnections [ XUSER_MAX_COUNT ] ;
bool addLocalPlayer ( int idx ) ; // Re-arrange the screen and start the connection
void addPendingLocalConnection ( int idx , ClientConnection * connection ) ;
void connectionDisconnected ( int idx , DisconnectPacket : : eDisconnectReason reason ) { m_connectionFailed [ idx ] = true ; m_connectionFailedReason [ idx ] = reason ; }
2026-03-02 17:37:16 +07:00
shared_ptr < MultiplayerLocalPlayer > createExtraLocalPlayer ( int idx , const wstring & name , int pad , int iDimension , ClientConnection * clientConnection = NULL , MultiPlayerLevel * levelpassedin = NULL ) ;
2026-03-01 12:16:08 +08:00
void createPrimaryLocalPlayer ( int iPad ) ;
bool setLocalPlayerIdx ( int idx ) ;
int getLocalPlayerIdx ( ) ;
void removeLocalPlayerIdx ( int idx ) ;
void storeExtraLocalPlayer ( int idx ) ;
void updatePlayerViewportAssignments ( ) ;
int unoccupiedQuadrant ; // 4J - added
2026-03-02 17:37:16 +07:00
shared_ptr < Mob > cameraTargetPlayer ;
2026-03-01 12:16:08 +08:00
ParticleEngine * particleEngine ;
User * user ;
wstring serverDomain ;
Canvas * parent ;
bool appletMode ;
// 4J - per player ?
volatile bool pause ;
Textures * textures ;
Font * font , * altFont ;
Screen * screen ;
ProgressRenderer * progressRenderer ;
GameRenderer * gameRenderer ;
private :
BackgroundDownloader * bgLoader ;
int ticks ;
// 4J-PB - moved to per player
//int missTime;
int orgWidth , orgHeight ;
public :
AchievementPopup * achievementPopup ;
public :
Gui * gui ;
// 4J - move to the per player structure?
bool noRender ;
HumanoidModel * humanoidModel ;
HitResult * hitResult ;
Options * options ;
protected :
MinecraftApplet * minecraftApplet ;
public :
SoundEngine * soundEngine ;
MouseHandler * mouseHandler ;
public :
TexturePackRepository * skins ;
File workingDirectory ;
private :
LevelStorageSource * levelSource ;
public :
static const int frameTimes_length = 512 ;
2026-03-02 15:53:32 +07:00
static int64_t frameTimes [ frameTimes_length ] ;
2026-03-01 12:16:08 +08:00
static const int tickTimes_length = 512 ;
2026-03-02 15:53:32 +07:00
static int64_t tickTimes [ tickTimes_length ] ;
2026-03-01 12:16:08 +08:00
static int frameTimePos ;
2026-03-02 15:53:32 +07:00
static int64_t warezTime ;
2026-03-01 12:16:08 +08:00
private :
int rightClickDelay ;
public :
// 4J- this should really be in localplayer
StatsCounter * stats [ 4 ] ;
private :
wstring connectToIp ;
int connectToPort ;
public :
void clearConnectionFailed ( ) ;
void connectTo ( const wstring & server , int port ) ;
private :
void renderLoadingScreen ( ) ;
public :
void blit ( int x , int y , int sx , int sy , int w , int h ) ;
private :
static File workDir ;
public :
static File getWorkingDirectory ( ) ;
static File getWorkingDirectory ( const wstring & applicationName ) ;
private :
static OS getPlatform ( ) ;
public :
LevelStorageSource * getLevelSource ( ) ;
void setScreen ( Screen * screen ) ;
private :
void checkGlError ( const wstring & string ) ;
# ifdef __ORBIS__
PsPlusUpsellWrapper * m_pPsPlusUpsell ;
# endif
public :
void destroy ( ) ;
volatile bool running ;
wstring fpsString ;
void run ( ) ;
// 4J-PB - split the run into 3 parts so we can run it from our xbox game loop
static Minecraft * GetInstance ( ) ;
void run_middle ( ) ;
void run_end ( ) ;
2026-03-01 21:50:44 +08:00
# ifdef _WINDOWS64
void applyFrameMouseLook ( ) ; // Per-frame mouse look to reduce input latency
# endif
2026-03-01 12:16:08 +08:00
void emergencySave ( ) ;
// 4J - removed
//bool wasDown ;
private :
// void checkScreenshot(); // 4J - removed
// String grabHugeScreenshot(File workDir2, int width, int height, int ssWidth, int ssHeight); // 4J - removed
// 4J - per player thing?
2026-03-02 15:53:32 +07:00
int64_t lastTimer ;
2026-03-01 12:16:08 +08:00
2026-03-02 15:53:32 +07:00
void renderFpsMeter ( int64_t tickTime ) ;
2026-03-01 12:16:08 +08:00
public :
void stop ( ) ;
// 4J removed
// bool mouseGrabbed;
// void grabMouse();
// void releaseMouse();
// 4J-PB - moved these into localplayer
//void handleMouseDown(int button, bool down);
//void handleMouseClick(int button);
void pauseGame ( ) ;
// void toggleFullScreen(); // 4J - removed
private :
void resize ( int width , int height ) ;
public :
// 4J - Moved to per player
//bool isRaining ;
// 4J - Moved to per player
2026-03-02 15:53:32 +07:00
//int64_t lastTickTime;
2026-03-01 12:16:08 +08:00
private :
// 4J- per player?
int recheckPlayerIn ;
void verify ( ) ;
public :
// 4J - added bFirst parameter, which is true for the first active viewport in splitscreen
// 4J - added bUpdateTextures, which is true if the actual renderer textures are to be updated - this will be true for the last time this tick runs with bFirst true
void tick ( bool bFirst , bool bUpdateTextures ) ;
private :
void reloadSound ( ) ;
public :
bool isClientSide ( ) ;
void selectLevel ( ConsoleSaveFile * saveFile , const wstring & levelId , const wstring & levelName , LevelSettings * levelSettings ) ;
//void toggleDimension(int targetDimension);
bool saveSlot ( int slot , const wstring & name ) ;
bool loadSlot ( const wstring & userName , int slot ) ;
void releaseLevel ( int message ) ;
// 4J Stu - Added the doForceStatsSave param
//void setLevel(Level *level, bool doForceStatsSave = true);
//void setLevel(Level *level, const wstring& message, bool doForceStatsSave = true);
2026-03-02 17:37:16 +07:00
void setLevel ( MultiPlayerLevel * level , int message = - 1 , shared_ptr < Player > forceInsertPlayer = nullptr , bool doForceStatsSave = true , bool bPrimaryPlayerSignedOut = false ) ;
2026-03-01 12:16:08 +08:00
// 4J-PB - added to force in the 'other' level when the main player creates the level at game load time
void forceaddLevel ( MultiPlayerLevel * level ) ;
void prepareLevel ( int title ) ; // 4J - changed to public
void fileDownloaded ( const wstring & name , File * file ) ;
// OpenGLCapabilities getOpenGLCapabilities(); // 4J - removed
wstring gatherStats1 ( ) ;
wstring gatherStats2 ( ) ;
wstring gatherStats3 ( ) ;
wstring gatherStats4 ( ) ;
void respawnPlayer ( int iPad , int dimension , int newEntityId ) ;
static void start ( const wstring & name , const wstring & sid ) ;
static void startAndConnectTo ( const wstring & name , const wstring & sid , const wstring & url ) ;
ClientConnection * getConnection ( int iPad ) ; // 4J Stu added iPad param
static void main ( ) ;
static bool renderNames ( ) ;
static bool useFancyGraphics ( ) ;
static bool useAmbientOcclusion ( ) ;
static bool renderDebug ( ) ;
bool handleClientSideCommand ( const wstring & chatMessage ) ;
static int maxSupportedTextureSize ( ) ;
void delayTextureReload ( ) ;
2026-03-02 15:53:32 +07:00
static int64_t currentTimeMillis ( ) ;
2026-03-01 12:16:08 +08:00
# ifdef _DURANGO
static void inGameSignInCheckAllPrivilegesCallback ( LPVOID lpParam , bool hasPrivileges , int iPad ) ;
# endif
static int InGame_SignInReturned ( void * pParam , bool bContinue , int iPad ) ;
// 4J-PB
Screen * getScreen ( ) ;
// 4J Stu
void forceStatsSave ( int idx ) ;
CRITICAL_SECTION m_setLevelCS ;
private :
// A bit field that store whether a particular quadrant is in the full tutorial or not
BYTE m_inFullTutorialBits ;
public :
bool isTutorial ( ) ;
void playerStartedTutorial ( int iPad ) ;
void playerLeftTutorial ( int iPad ) ;
// 4J Added
MultiPlayerLevel * getLevel ( int dimension ) ;
void tickAllConnections ( ) ;
Level * animateTickLevel ; // 4J added
// 4J - When a client requests a texture, it should add it to here while we are waiting for it
vector < wstring > m_pendingTextureRequests ;
vector < wstring > m_pendingGeometryRequests ; // additional skin box geometry
// 4J Added
bool addPendingClientTextureRequest ( const wstring & textureName ) ;
void handleClientTextureReceived ( const wstring & textureName ) ;
void clearPendingClientTextureRequests ( ) { m_pendingTextureRequests . clear ( ) ; }
bool addPendingClientGeometryRequest ( const wstring & textureName ) ;
void handleClientGeometryReceived ( const wstring & textureName ) ;
void clearPendingClientGeometryRequests ( ) { m_pendingGeometryRequests . clear ( ) ; }
unsigned int getCurrentTexturePackId ( ) ;
ColourTable * getColourTable ( ) ;
# if defined __ORBIS__
static int MustSignInReturnedPSN ( void * pParam , int iPad , C4JStorage : : EMessageResult result ) ;
# endif
} ;