mirror of
https://github.com/LCEMP/LCEMP.git
synced 2026-04-23 15:33:58 +00:00
wired up keyboard and mouse input for menu navigation, inventory cursor, crafting, and general UI interaction. added WASD movement, mouse look, left ctrl sprint, left shift sneak, and all the keybinds for gameplay. also fixed the sound engine crashing when it cant find a sound asset, and set up the x64 build with proper post-build steps for dlls and redist
349 lines
9.7 KiB
C++
349 lines
9.7 KiB
C++
#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);
|
|
|
|
private:
|
|
static Minecraft *m_instance;
|
|
|
|
public:
|
|
MultiPlayerGameMode *gameMode;
|
|
|
|
private:
|
|
bool fullscreen;
|
|
bool hasCrashed;
|
|
|
|
C4JThread::EventQueue* levelTickEventQueue;
|
|
|
|
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;
|
|
shared_ptr<MultiplayerLocalPlayer> player;
|
|
|
|
MultiPlayerLevelArray levels;
|
|
|
|
shared_ptr<MultiplayerLocalPlayer> localplayers[XUSER_MAX_COUNT];
|
|
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; }
|
|
|
|
shared_ptr<MultiplayerLocalPlayer> createExtraLocalPlayer(int idx, const wstring& name, int pad, int iDimension, ClientConnection *clientConnection = NULL,MultiPlayerLevel *levelpassedin=NULL);
|
|
void createPrimaryLocalPlayer(int iPad);
|
|
bool setLocalPlayerIdx(int idx);
|
|
int getLocalPlayerIdx();
|
|
void removeLocalPlayerIdx(int idx);
|
|
void storeExtraLocalPlayer(int idx);
|
|
void updatePlayerViewportAssignments();
|
|
int unoccupiedQuadrant; // 4J - added
|
|
|
|
shared_ptr<Mob> cameraTargetPlayer;
|
|
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;
|
|
static __int64 frameTimes[frameTimes_length];
|
|
static const int tickTimes_length = 512;
|
|
static __int64 tickTimes[tickTimes_length];
|
|
static int frameTimePos;
|
|
static __int64 warezTime;
|
|
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;
|
|
bool showFpsCounter;
|
|
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();
|
|
|
|
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?
|
|
__int64 lastTimer;
|
|
|
|
void renderFpsMeter(__int64 tickTime);
|
|
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
|
|
//__int64 lastTickTime;
|
|
|
|
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);
|
|
void setLevel(MultiPlayerLevel *level, int message = -1, shared_ptr<Player> forceInsertPlayer = nullptr, bool doForceStatsSave = true,bool bPrimaryPlayerSignedOut=false);
|
|
// 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();
|
|
static __int64 currentTimeMillis();
|
|
|
|
#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
|
|
};
|