diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0dfcc8e22..9578777cb 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,7 +1,9 @@ # Pull Request +## Note: IF YOUR PR CHANGES THE GAME BEHAVIOR VISIBLY, REMEMBER TO ATTACH A GAMEPLAY FOOTAGE (or at least a screenshot) OF YOU *ACTUALLY* PLAYING THE GAME WITH YOUR CHANGES. Untested PRs are *NOT* welcome. Please don't forget to describe what did you do in each commit in your PR. + ## Description -Briefly describe the changes this PR introduces. +Briefly describe the changes this PR introduces. ## Changes diff --git a/.gitignore b/.gitignore index 0a42b42e5..eef95bde6 100644 --- a/.gitignore +++ b/.gitignore @@ -423,4 +423,10 @@ Minecraft.World/x64_Debug/ Minecraft.World/Release/ Minecraft.World/x64_Release/ -build/* \ No newline at end of file +build/* + +# Existing build output files +!x64/**/Effects.msscmp +!x64/**/iggy_w64.dll +!x64/**/mss64.dll +!x64/**/redist64/ diff --git a/Minecraft.Client/Common/Audio/SoundEngine.cpp b/Minecraft.Client/Common/Audio/SoundEngine.cpp index 1906b1aa7..43d2059d5 100644 --- a/Minecraft.Client/Common/Audio/SoundEngine.cpp +++ b/Minecraft.Client/Common/Audio/SoundEngine.cpp @@ -56,7 +56,7 @@ void SoundEngine::playMusicTick() {}; #else #ifdef _WINDOWS64 -char SoundEngine::m_szSoundPath[]={"Windows64Media\\Sound\\"}; +char SoundEngine::m_szSoundPath[]={"Windows64\\Sound\\"}; char SoundEngine::m_szMusicPath[]={"music\\"}; char SoundEngine::m_szRedistName[]={"redist64"}; #elif defined _DURANGO diff --git a/Minecraft.Client/Common/ConsoleGameMode.cpp b/Minecraft.Client/Common/ConsoleGameMode.cpp index b080e6284..703d3f552 100644 --- a/Minecraft.Client/Common/ConsoleGameMode.cpp +++ b/Minecraft.Client/Common/ConsoleGameMode.cpp @@ -1,9 +1,9 @@ #include "stdafx.h" #include "ConsoleGameMode.h" -#include "..\Common\Tutorial\Tutorial.h" +#include ".\Tutorial\Tutorial.h" ConsoleGameMode::ConsoleGameMode(int iPad, Minecraft *minecraft, ClientConnection *connection) : TutorialMode(iPad, minecraft, connection) { tutorial = new Tutorial(iPad); -} \ No newline at end of file +} diff --git a/Minecraft.Client/Common/ConsoleGameMode.h b/Minecraft.Client/Common/ConsoleGameMode.h index 3e486cbf3..983381b59 100644 --- a/Minecraft.Client/Common/ConsoleGameMode.h +++ b/Minecraft.Client/Common/ConsoleGameMode.h @@ -1,5 +1,5 @@ #pragma once -#include "..\Common\Tutorial\TutorialMode.h" +#include ".\Tutorial\TutorialMode.h" class ConsoleGameMode : public TutorialMode { @@ -7,4 +7,4 @@ public: ConsoleGameMode(int iPad, Minecraft *minecraft, ClientConnection *connection); virtual bool isImplemented() { return true; } -}; \ No newline at end of file +}; diff --git a/Minecraft.Client/Common/Consoles_App.cpp b/Minecraft.Client/Common/Consoles_App.cpp index c20829657..b047f58eb 100644 --- a/Minecraft.Client/Common/Consoles_App.cpp +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -9,12 +9,12 @@ #include "..\MultiPlayerLevel.h" #include "..\GameRenderer.h" #include "..\ProgressRenderer.h" -#include "..\..\Minecraft.Client\LevelRenderer.h" -#include "..\..\Minecraft.Client\MobSkinMemTextureProcessor.h" -#include "..\..\Minecraft.Client\Minecraft.h" +#include "..\LevelRenderer.h" +#include "..\MobSkinMemTextureProcessor.h" +#include "..\Minecraft.h" #include "..\ClientConnection.h" #include "..\MultiPlayerLocalPlayer.h" -#include "..\..\Minecraft.Client\LocalPlayer.h" +#include "..\LocalPlayer.h" #include "..\..\Minecraft.World\Player.h" #include "..\..\Minecraft.World\Inventory.h" #include "..\..\Minecraft.World\Level.h" @@ -22,17 +22,17 @@ #include "..\..\Minecraft.World\Container.h" #include "..\..\Minecraft.World\DispenserTileEntity.h" #include "..\..\Minecraft.World\SignTileEntity.h" -#include "..\..\Minecraft.Client\StatsCounter.h" +#include "..\StatsCounter.h" #include "..\GameMode.h" #include "..\Xbox\Social\SocialManager.h" #include "Tutorial\TutorialMode.h" #if defined _XBOX || defined _WINDOWS64 -#include "..\..\Minecraft.Client\Xbox\XML\ATGXmlParser.h" -#include "..\..\Minecraft.Client\Xbox\XML\xmlFilesCallback.h" +#include "..\Xbox\XML\ATGXmlParser.h" +#include "..\Xbox\XML\xmlFilesCallback.h" #endif #include "Minecraft_Macros.h" -#include "..\..\Minecraft.Client\PlayerList.h" -#include "..\..\Minecraft.Client\ServerPlayer.h" +#include "..\PlayerList.h" +#include "..\ServerPlayer.h" #include "GameRules\ConsoleGameRules.h" #include "GameRules\ConsoleSchematicFile.h" #include "..\..\Minecraft.World\InputOutputStream.h" @@ -40,7 +40,7 @@ #include "..\User.h" #include "..\..\Minecraft.World\LevelData.h" #include "..\..\Minecraft.World\net.minecraft.world.entity.player.h" -#include "..\..\Minecraft.Client\EntityRenderDispatcher.h" +#include "..\EntityRenderDispatcher.h" #include "..\..\Minecraft.World\compression.h" #include "..\TexturePackRepository.h" #include "..\DLCTexturePack.h" diff --git a/Minecraft.Client/Common/Consoles_App.h b/Minecraft.Client/Common/Consoles_App.h index 143560102..110054f22 100644 --- a/Minecraft.Client/Common/Consoles_App.h +++ b/Minecraft.Client/Common/Consoles_App.h @@ -5,11 +5,11 @@ using namespace std; #include "Audio/Consoles_SoundEngine.h" #include -#include "..\Common\Tutorial\TutorialEnum.h" +#include ".\Tutorial\TutorialEnum.h" #ifdef _XBOX -#include "..\Common\XUI\XUI_Helper.h" -#include "..\Common\XUI\XUI_HelpCredits.h" +#include ".\XUI\XUI_Helper.h" +#include ".\XUI\XUI_HelpCredits.h" #endif #include "UI\UIStructs.h" @@ -17,9 +17,9 @@ using namespace std; #include #include "..\StringTable.h" -#include "..\Common\DLC\DLCManager.h" -#include "..\Common\GameRules\ConsoleGameRulesConstants.h" -#include "..\Common\GameRules\GameRuleManager.h" +#include ".\DLC\DLCManager.h" +#include ".\GameRules\ConsoleGameRulesConstants.h" +#include ".\GameRules\GameRuleManager.h" #include "..\SkinBox.h" #include "..\ArchiveFile.h" diff --git a/Minecraft.Client/Common/UI/UILayer.cpp b/Minecraft.Client/Common/UI/UILayer.cpp index e6f87f81b..15bde2fa1 100644 --- a/Minecraft.Client/Common/UI/UILayer.cpp +++ b/Minecraft.Client/Common/UI/UILayer.cpp @@ -313,6 +313,10 @@ bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData) newScene = new UIScene_InGameInfoMenu(iPad, initData, this); break; case eUIScene_InGameHostOptionsMenu: + if (IsSceneInStack(eUIScene_InGameHostOptionsMenu)) { + app.DebugPrintf("Skipped eUIScene_InGameHostOptionsMenu, we have already this tab!"); + return false; + } newScene = new UIScene_InGameHostOptionsMenu(iPad, initData, this); break; case eUIScene_InGamePlayerOptionsMenu: diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp index c909fbc6b..e05b6df8e 100644 --- a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp @@ -335,8 +335,11 @@ void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) signInReturnedFunc = &UIScene_MainMenu::UnlockFullGame_SignInReturned; break; case eControl_Exit: + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + if( ProfileManager.IsFullVersion() ) - { + { UINT uiIDA[2]; uiIDA[0]=IDS_CANCEL; uiIDA[1]=IDS_OK; diff --git a/Minecraft.Client/Input.cpp b/Minecraft.Client/Input.cpp index c1a3bb31a..716f4dfd9 100644 --- a/Minecraft.Client/Input.cpp +++ b/Minecraft.Client/Input.cpp @@ -47,7 +47,7 @@ void Input::tick(LocalPlayer *player) #ifdef _WINDOWS64 // WASD movement (combine with gamepad) - if (iPad == 0) + if (iPad == 0 && KMInput.IsCaptured()) { float kbX = 0.0f, kbY = 0.0f; if (KMInput.IsKeyDown('W')) { kbY += 1.0f; sprintForward += 1.0f; usingKeyboardMovement = true; } @@ -95,7 +95,7 @@ void Input::tick(LocalPlayer *player) #ifdef _WINDOWS64 // Keyboard hold-to-sneak (overrides gamepad toggle) - if (iPad == 0 && KMInput.IsKeyDown(VK_SHIFT) && !player->abilities.flying) + if (iPad == 0 && KMInput.IsCaptured() && KMInput.IsKeyDown(VK_SHIFT) && !player->abilities.flying) sneaking = true; #endif @@ -166,7 +166,7 @@ void Input::tick(LocalPlayer *player) #ifdef _WINDOWS64 // Keyboard jump (Space) - if (iPad == 0 && KMInput.IsKeyDown(VK_SPACE) && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP)) + if (iPad == 0 && KMInput.IsCaptured() && KMInput.IsKeyDown(VK_SPACE) && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP)) jumping = true; #endif diff --git a/Minecraft.Client/Minecraft.Client.vcxproj b/Minecraft.Client/Minecraft.Client.vcxproj index 5e448ab66..4e8d46bec 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj +++ b/Minecraft.Client/Minecraft.Client.vcxproj @@ -1302,14 +1302,8 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" MultiplyDefinedSymbolOnly - Copying sound assets to output directory - xcopy /q /y /i /s /e "$(ProjectDir)Durango\Sound" "$(OutDir)Durango\Sound" -xcopy /q /y /i /s /e "$(ProjectDir)music" "$(OutDir)music" -xcopy /q /y /i /s /e "$(ProjectDir)Windows64\GameHDD" "$(OutDir)Windows64\GameHDD" -xcopy /q /y /i /s /e "$(ProjectDir)Common\Media" "$(OutDir)Common\Media" -xcopy /q /y /i /s /e "$(ProjectDir)Common\res" "$(OutDir)Common\res" -xcopy /q /y /i /s /e "$(ProjectDir)Common\Trial" "$(OutDir)Common\Trial" -xcopy /q /y /i /s /e "$(ProjectDir)Common\Tutorial" "$(OutDir)Common\Tutorial" + Run postbuild script + powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" $(ProjectDir)xbox\xex-dev.xml @@ -1440,25 +1434,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse - Copying game assets to output directory - mkdir "$(OutDir)music" 2>nul -mkdir "$(OutDir)Windows64\GameHDD" 2>nul -mkdir "$(OutDir)Common\Media" 2>nul -mkdir "$(OutDir)Common\res" 2>nul -mkdir "$(OutDir)Common\Trial" 2>nul -mkdir "$(OutDir)Common\Tutorial" 2>nul -mkdir "$(OutDir)Windows64Media" 2>nul - -xcopy /q /y /i /s /e "$(ProjectDir)music" "$(OutDir)music" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Windows64\GameHDD" "$(OutDir)Windows64\GameHDD" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Common\Media" "$(OutDir)Common\Media" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Common\res" "$(OutDir)Common\res" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Common\Trial" "$(OutDir)Common\Trial" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Common\Tutorial" "$(OutDir)Common\Tutorial" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)DurangoMedia" "$(OutDir)Windows64Media" || exit /b 0 -xcopy /q /y /i /s /e "$(ProjectDir)Windows64Media" "$(OutDir)Windows64Media" || exit /b 0 - -exit /b 0 + Run postbuild script + powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" $(ProjectDir)xbox\xex-dev.xml diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.user b/Minecraft.Client/Minecraft.Client.vcxproj.user index cf9782cd0..10dbfa336 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj.user +++ b/Minecraft.Client/Minecraft.Client.vcxproj.user @@ -3,4 +3,12 @@ Debug + + $(SolutionDir)$(Platform)\$(Configuration)\ + WindowsLocalDebugger + + + $(SolutionDir)$(Platform)\$(Configuration)\ + WindowsLocalDebugger + \ No newline at end of file diff --git a/Minecraft.Client/TextureHolder.h b/Minecraft.Client/TextureHolder.h index 304d03e75..6c600d637 100644 --- a/Minecraft.Client/TextureHolder.h +++ b/Minecraft.Client/TextureHolder.h @@ -30,7 +30,8 @@ public: int compareTo(const TextureHolder *other) const; }; -typedef struct +struct TextureHolderLessThan { - bool operator() (const TextureHolder *first, const TextureHolder *second) const { return first->compareTo(second) >= 0; } -} TextureHolderLessThan; \ No newline at end of file + inline bool operator()(const TextureHolder *first, const TextureHolder *second) const + { return first->compareTo(second) >= 0; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Windows64/Sound/Minecraft.msscmp b/Minecraft.Client/Windows64/Sound/Minecraft.msscmp new file mode 100644 index 000000000..13983f6d2 Binary files /dev/null and b/Minecraft.Client/Windows64/Sound/Minecraft.msscmp differ diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp index 540c3c534..d822e9434 100644 --- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp @@ -443,7 +443,7 @@ ATOM MyRegisterClass(HINSTANCE hInstance) wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = "Minecraft"; wcex.lpszClassName = "MinecraftClass"; - wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); + wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_MINECRAFTWINDOWS)); return RegisterClassEx(&wcex); } @@ -716,6 +716,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); + /* // Declare DPI awareness so GetSystemMetrics returns physical pixels SetProcessDPIAware(); g_iScreenWidth = GetSystemMetrics(SM_CXSCREEN); @@ -726,6 +727,8 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, sprintf(buf, "Screen resolution: %dx%d\n", g_iScreenWidth, g_iScreenHeight); OutputDebugStringA(buf); } + */ + if(lpCmdLine) { @@ -1220,7 +1223,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, ToggleFullscreen(); } - // TAB opens host options menu. - Vvis :3 + // TAB opens host options menu. - Vvis :3 if (KMInput.IsKeyPressed(VK_TAB)) { if (Minecraft* pMinecraft = Minecraft::GetInstance()) @@ -1231,6 +1234,33 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, } } +#ifdef _DEBUG_MENUS_ENABLED + // F3 toggles onscreen debug info + if (KMInput.IsKeyPressed(VK_F3)) + { + if (Minecraft* pMinecraft = Minecraft::GetInstance()) + { + if (pMinecraft->options && app.DebugSettingsOn()) + { + pMinecraft->options->renderDebug = !pMinecraft->options->renderDebug; + } + } + } + + // F4 opens debug overlay + if (KMInput.IsKeyPressed(VK_F4)) + { + if (Minecraft* pMinecraft = Minecraft::GetInstance()) + { + if (pMinecraft->options && app.DebugSettingsOn() && + app.GetGameStarted() && !ui.GetMenuDisplayed(0) && pMinecraft->screen == NULL) + { + ui.NavigateToScene(0, eUIScene_DebugOverlay, NULL, eUILayer_Debug); + } + } + } +#endif + #if 0 // has the game defined profile data been changed (by a profile load) if(app.uiGameDefinedDataChangedBitmask!=0) diff --git a/Minecraft.Client/Xbox/MinecraftWindows.ico b/Minecraft.Client/Xbox/MinecraftWindows.ico index 449296f49..f171b2a61 100644 Binary files a/Minecraft.Client/Xbox/MinecraftWindows.ico and b/Minecraft.Client/Xbox/MinecraftWindows.ico differ diff --git a/Minecraft.Client/postbuild.ps1 b/Minecraft.Client/postbuild.ps1 new file mode 100644 index 000000000..1c965758a --- /dev/null +++ b/Minecraft.Client/postbuild.ps1 @@ -0,0 +1,42 @@ +param( + [string]$OutDir, + [string]$ProjectDir +) + +Write-Host "Post-build script started. Output Directory: $OutDir, Project Directory: $ProjectDir" + +$directories = @( + "music", + "Windows64\GameHDD", + "Common\Media", + "Common\res", + "Common\Trial", + "Common\Tutorial", + "Windows64Media" +) + +foreach ($dir in $directories) { + New-Item -ItemType Directory -Path (Join-Path $OutDir $dir) -Force | Out-Null +} + +$copies = @( + @{ Source = "music"; Dest = "music" }, + @{ Source = "Common\Media"; Dest = "Common\Media" }, + @{ Source = "Common\res"; Dest = "Common\res" }, + @{ Source = "Common\Trial"; Dest = "Common\Trial" }, + @{ Source = "Common\Tutorial"; Dest = "Common\Tutorial" }, + @{ Source = "Windows64\GameHDD"; Dest = "Windows64\GameHDD" }, + @{ Source = "Windows64\Sound"; Dest = "Windows64\Sound" }, + @{ Source = "DurangoMedia"; Dest = "Windows64Media" }, + @{ Source = "Windows64Media"; Dest = "Windows64Media" } +) + +foreach ($copy in $copies) { + $src = Join-Path $ProjectDir $copy.Source + $dst = Join-Path $OutDir $copy.Dest + + if (Test-Path $src) { + # Copy the files using xcopy, forcing overwrite and suppressing errors, and only copying if the source is newer than the destination + xcopy /q /y /i /s /e /d "$src" "$dst" 2>$null + } +} diff --git a/Minecraft.World/ChunkPos.h b/Minecraft.World/ChunkPos.h index f1d483c7e..2a3fda02b 100644 --- a/Minecraft.World/ChunkPos.h +++ b/Minecraft.World/ChunkPos.h @@ -28,13 +28,14 @@ public: ChunkPos & operator= (const ChunkPos & other) { x = other.x; z = other.z; return *this; } }; -typedef struct +struct ChunkPosKeyHash { - __int64 operator() (const ChunkPos &k) const { return ChunkPos::hash_fnct(k); } + inline __int64 operator()(const ChunkPos &k) const + { return ChunkPos::hash_fnct(k); } +}; -} ChunkPosKeyHash; - -typedef struct +struct ChunkPosKeyEq { - bool operator() (const ChunkPos &x, const ChunkPos &y) const { return ChunkPos::eq_test(x, y); } -} ChunkPosKeyEq; \ No newline at end of file + inline bool operator()(const ChunkPos &x, const ChunkPos &y) const + { return ChunkPos::eq_test(x, y); } +}; \ No newline at end of file diff --git a/Minecraft.World/File.cpp b/Minecraft.World/File.cpp index ae0cf96ca..1d66bfeb9 100644 --- a/Minecraft.World/File.cpp +++ b/Minecraft.World/File.cpp @@ -12,13 +12,13 @@ const wchar_t File::pathSeparator = L'\\'; #ifdef _XBOX -const wstring File::pathRoot = L"GAME:"; // Path root after pathSeparator has been removed +const std::wstring File::pathRoot = L"GAME:"; // Path root after pathSeparator has been removed #else -const wstring File::pathRoot = L""; // Path root after pathSeparator has been removed +const std::wstring File::pathRoot = L""; // Path root after pathSeparator has been removed #endif //Creates a new File instance from a parent abstract pathname and a child pathname string. -File::File( const File &parent, const wstring& child ) +File::File( const File &parent, const std::wstring& child ) { m_abstractPathName = parent.getPath() + pathSeparator + child; } @@ -67,7 +67,7 @@ File::File( const wstring& pathname ) //: parent( NULL ) */ } -File::File( const wstring& parent, const wstring& child ) //: m_abstractPathName( child ) +File::File( const std::wstring& parent, const std::wstring& child ) //: m_abstractPathName( child ) { m_abstractPathName = pathRoot + pathSeparator + parent + pathSeparator + child; //this->parent = new File( parent ); @@ -149,9 +149,9 @@ bool File::mkdir() const // bool File::mkdirs() const { - vector path = stringSplit( m_abstractPathName, pathSeparator ); + std::vector path = stringSplit( m_abstractPathName, pathSeparator ); - wstring pathToHere = L""; + std::wstring pathToHere = L""; AUTO_VAR(itEnd, path.end()); for( AUTO_VAR(it, path.begin()); it != itEnd; it++ ) { @@ -237,7 +237,7 @@ bool File::renameTo(File dest) // 4J Stu - The wstringtofilename function returns a pointer to the same location in memory every time it is // called, therefore we were getting sourcePath and destPath having the same value. The solution here is to // make a copy of the sourcePath by storing it in a std::string - string sourcePath = wstringtofilename(getPath()); + std::string sourcePath = wstringtofilename(getPath()); const char *destPath = wstringtofilename(dest.getPath()); #ifdef _DURANGO __debugbreak(); // TODO @@ -272,9 +272,9 @@ bool File::renameTo(File dest) //An array of abstract pathnames denoting the files and directories in the directory denoted by this abstract pathname. //The array will be empty if the directory is empty. Returns null if this abstract pathname does not denote a directory, //or if an I/O error occurs. -vector *File::listFiles() const +std::vector *File::listFiles() const { - vector *vOutput = new vector(); + std::vector *vOutput = new vector(); // TODO 4J Stu - Also need to check for I/O errors? if( !isDirectory() ) @@ -386,8 +386,8 @@ vector *File::listFiles() const FindClose( hFind); } #else - char path[MAX_PATH]; - sprintf( path, "%s\\*", wstringtofilename( getPath() ) ); + char path[MAX_PATH] {}; + snprintf( path, MAX_PATH, "%s\\*", wstringtofilename( getPath() ) ); HANDLE hFind = FindFirstFile( path, &wfd); if(hFind != INVALID_HANDLE_VALUE) { @@ -415,13 +415,13 @@ vector *File::listFiles() const //Returns: //An array of abstract pathnames denoting the files and directories in the directory denoted by this abstract pathname. //The array will be empty if the directory is empty. Returns null if this abstract pathname does not denote a directory, or if an I/O error occurs. -vector *File::listFiles(FileFilter *filter) const +std::vector *File::listFiles(FileFilter *filter) const { // TODO 4J Stu - Also need to check for I/O errors? if( !isDirectory() ) return NULL; - vector *vOutput = new vector(); + std::vector *vOutput = new std::vector(); #ifdef __PS3__ const char *lpFileName=wstringtofilename(getPath()); @@ -521,7 +521,7 @@ bool File::isDirectory() const //Returns the length of the file denoted by this abstract pathname. The return value is unspecified if this pathname denotes a directory. //Returns: //The length, in bytes, of the file denoted by this abstract pathname, or 0L if the file does not exist -__int64 File::length() +int64_t File::length() { #ifdef __PS3__ //extern const char* getPS3HomePath(); @@ -624,7 +624,7 @@ __int64 File::length() //Returns: //A long value representing the time the file was last modified, measured in milliseconds since the epoch (00:00:00 GMT, January 1, 1970), //or 0L if the file does not exist or if an I/O error occurs -__int64 File::lastModified() +int64_t File::lastModified() { WIN32_FILE_ATTRIBUTE_DATA fileInfoBuffer; #ifdef _UNICODE @@ -657,7 +657,7 @@ __int64 File::lastModified() } } -const wstring File::getPath() const +const std::wstring File::getPath() const { /* wstring path; @@ -672,7 +672,7 @@ const wstring File::getPath() const return m_abstractPathName; } -wstring File::getName() const +std::wstring File::getName() const { unsigned int sep = (unsigned int )(m_abstractPathName.find_last_of( this->pathSeparator )); return m_abstractPathName.substr( sep + 1, m_abstractPathName.length() ); @@ -700,3 +700,9 @@ int File::hash_fnct(const File &k) return (int) hashCode; } + +int FileKeyHash::operator() (const File &k) const +{ return File::hash_fnct(k); } + +bool FileKeyEq::operator() (const File &x, const File &y) const +{ return File::eq_test(x,y); } \ No newline at end of file diff --git a/Minecraft.World/File.h b/Minecraft.World/File.h index 0b710cd46..ae07a4b7f 100644 --- a/Minecraft.World/File.h +++ b/Minecraft.World/File.h @@ -1,5 +1,9 @@ #pragma once -using namespace std; + +#include +#include +#include + // 4J Stu - Represents java standard library class class FileFilter; @@ -24,11 +28,11 @@ public: bool exists() const; bool isFile() const; bool renameTo(File dest); - vector *listFiles() const; // Array - vector *listFiles(FileFilter *filter) const; + std::vector *listFiles() const; // Array + std::vector *listFiles(FileFilter *filter) const; bool isDirectory() const; - __int64 length(); - __int64 lastModified(); + int64_t length(); + int64_t lastModified(); const wstring getPath() const; // 4J Jev: TODO wstring getName() const; @@ -43,14 +47,12 @@ private: //File(vector *path); }; -typedef struct +struct FileKeyHash { - int operator() (const File &k) const { return File::hash_fnct(k); } + int operator() (const File &k) const; +}; -} FileKeyHash; - -typedef struct +struct FileKeyEq { - bool operator() (const File &x, const File &y) const {return File::eq_test(x,y); } - -} FileKeyEq; \ No newline at end of file + bool operator() (const File &x, const File &y) const; +}; \ No newline at end of file diff --git a/Minecraft.World/JavaIntHash.h b/Minecraft.World/JavaIntHash.h index 447b8052a..fe6084699 100644 --- a/Minecraft.World/JavaIntHash.h +++ b/Minecraft.World/JavaIntHash.h @@ -1,13 +1,15 @@ #pragma once +#include + // Java doesn't have a default hash value for ints, however, the hashmap itself does some "supplemental" hashing, so // our ints actually get hashed by code as implemented below. std templates *do* have a standard hash for ints, but it // would appear to be a bit expensive so matching the java one for now anyway. This code implements the supplemental // hashing that happens in java so we can match what their maps are doing with ints. -typedef struct +struct IntKeyHash { - int operator() (const int &k) const + inline int operator()(const int &k) const { int h = k; h += ~(h << 9); @@ -16,62 +18,64 @@ typedef struct h ^= (((unsigned int)h) >> 10); return h; } +}; -} IntKeyHash; - -typedef struct +struct IntKeyEq { - bool operator() (const int &x, const int &y) const { return x==y; } -} IntKeyEq; - + inline bool operator()(const int &x, const int &y) const + { return x==y; } +}; // This hash functor is taken from the IntHashMap java class used by the game, so that we can use a standard std hashmap with this hash rather // than implement the class itself -typedef struct +struct IntKeyHash2 { - int operator() (const int &k) const + inline int operator()(const int &k) const { - unsigned int h = (unsigned int)k; + unsigned int h = static_cast(k); h ^= (h >> 20) ^ (h >> 12); - return (int)(h ^ (h >> 7) ^ (h >> 4)); + return static_cast(h ^ (h >> 7) ^ (h >> 4)); } -} IntKeyHash2; +}; // This hash functor is taken from the LongHashMap java class used by the game, so that we can use a standard std hashmap with this hash rather // than implement the class itself -typedef struct +struct LongKeyHash { - int hash(const int &k) const + inline int hash(const int &k) const { - unsigned int h = (unsigned int)k; + unsigned int h = static_cast(k); h ^= (h >> 20) ^ (h >> 12); - return (int)(h ^ (h >> 7) ^ (h >> 4)); + return static_cast(h ^ (h >> 7) ^ (h >> 4)); } - int operator() (const __int64 &k) const + inline int operator()(const int64_t &k) const { - return hash((int) ( k ^ (((__uint64)k) >> 32 ))); + return hash(static_cast(k ^ ((static_cast(k)) >> 32))); } -} LongKeyHash; +}; -typedef struct +struct LongKeyEq { - bool operator() (const __int64 &x, const __int64 &y) const { return x==y; } -} LongKeyEq; + inline bool operator() (const int64_t &x, const int64_t &y) const + { return x == y; } +}; -typedef struct +enum eINSTANCEOF; +struct eINSTANCEOFKeyHash { - int operator() (const eINSTANCEOF &k) const + int operator()(const eINSTANCEOF &k) const { - unsigned int h = (unsigned int)k; + unsigned int h = static_cast(k); h ^= (h >> 20) ^ (h >> 12); - return (int)(h ^ (h >> 7) ^ (h >> 4)); + return static_cast(h ^ (h >> 7) ^ (h >> 4)); } -} eINSTANCEOFKeyHash; +}; -typedef struct +struct eINSTANCEOFKeyEq { - bool operator() (const eINSTANCEOF &x, const eINSTANCEOF &y) const { return x==y; } -} eINSTANCEOFKeyEq; + inline bool operator()(const eINSTANCEOF &x, const eINSTANCEOF &y) const + { return x == y; } +}; diff --git a/Minecraft.World/Player.h b/Minecraft.World/Player.h index c323bf05c..185a70a7c 100644 --- a/Minecraft.World/Player.h +++ b/Minecraft.World/Player.h @@ -539,13 +539,15 @@ private: #endif }; -typedef struct +struct PlayerKeyHash { - int operator() (const shared_ptr k) const { return Player::hash_fnct (k); } + inline int operator() (const shared_ptr k) const + { return Player::hash_fnct (k); } +}; -} PlayerKeyHash; - -typedef struct +struct PlayerKeyEq { - bool operator() (const shared_ptr x, const shared_ptr y) const { return Player::eq_test (x, y); } -} PlayerKeyEq; + inline bool operator() (const shared_ptr x, const shared_ptr y) const + { return Player::eq_test (x, y); } +}; + diff --git a/Minecraft.World/TickNextTickData.cpp b/Minecraft.World/TickNextTickData.cpp index 95cab285e..96771be13 100644 --- a/Minecraft.World/TickNextTickData.cpp +++ b/Minecraft.World/TickNextTickData.cpp @@ -2,7 +2,7 @@ #include "TickNextTickData.h" -__int64 TickNextTickData::C = 0; +int64_t TickNextTickData::C = 0; TickNextTickData::TickNextTickData(int x, int y, int z, int tileId) { @@ -33,7 +33,7 @@ int TickNextTickData::hashCode() const return (((x * 1024 * 1024) + (z * 1024) + y) * 256) + tileId; } -TickNextTickData *TickNextTickData::delay(__int64 l) +TickNextTickData *TickNextTickData::delay(int64_t l) { this->m_delay = l; return this; diff --git a/Minecraft.World/TickNextTickData.h b/Minecraft.World/TickNextTickData.h index 41ee99da1..c83f69936 100644 --- a/Minecraft.World/TickNextTickData.h +++ b/Minecraft.World/TickNextTickData.h @@ -1,26 +1,28 @@ #pragma once +#include + // 4J Stu - In Java TickNextTickData implements Comparable // We don't need to do that as it is only as helper for the java sdk sorting operations class TickNextTickData { private: - static __int64 C; + static int64_t C; public: int x, y, z, tileId; - __int64 m_delay; + int64_t m_delay; private: - __int64 c; + int64_t c; public: TickNextTickData(int x, int y, int z, int tileId); bool equals(const void *o) const; int hashCode() const; - TickNextTickData *delay(__int64 l); + TickNextTickData *delay(int64_t l); int compareTo(const TickNextTickData *tnd) const; static bool compare_fnct(const TickNextTickData &x, const TickNextTickData &y); @@ -28,19 +30,21 @@ public: static bool eq_test(const TickNextTickData &x, const TickNextTickData &y); }; -typedef struct +struct TickNextTickDataKeyHash { - int operator() (const TickNextTickData &k) const { return TickNextTickData::hash_fnct (k); } + int operator() (const TickNextTickData &k) const + { return TickNextTickData::hash_fnct (k); } +}; -} TickNextTickDataKeyHash; - -typedef struct +struct TickNextTickDataKeyEq { - bool operator() (const TickNextTickData &x, const TickNextTickData &y) const { return TickNextTickData::eq_test (x, y); } -} TickNextTickDataKeyEq; + bool operator() (const TickNextTickData &x, const TickNextTickData &y) const + { return TickNextTickData::eq_test (x, y); } +}; -typedef struct +struct TickNextTickDataKeyCompare { - bool operator() (const TickNextTickData &x, const TickNextTickData &y) const { return TickNextTickData::compare_fnct (x, y); } + bool operator() (const TickNextTickData &x, const TickNextTickData &y) const + { return TickNextTickData::compare_fnct (x, y); } -} TickNextTickDataKeyCompare; \ No newline at end of file +}; \ No newline at end of file diff --git a/Minecraft.World/TilePos.h b/Minecraft.World/TilePos.h index d4a3e84eb..04804066a 100644 --- a/Minecraft.World/TilePos.h +++ b/Minecraft.World/TilePos.h @@ -14,14 +14,15 @@ public: static bool eq_test(const TilePos &x, const TilePos &y); }; -typedef struct +struct TilePosKeyHash { - int operator() (const TilePos &k) const { return TilePos::hash_fnct (k); } + inline int operator()(const TilePos &k) const + { return TilePos::hash_fnct (k); } +}; -} TilePosKeyHash; - -typedef struct +struct TilePosKeyEq { - bool operator() (const TilePos &x, const TilePos &y) const { return TilePos::eq_test (x, y); } -} TilePosKeyEq; + inline bool operator()(const TilePos &x, const TilePos &y) const + { return TilePos::eq_test (x, y); } +}; diff --git a/README.md b/README.md index 4a35d5001..a7196d387 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # MinecraftConsoles +# [DOWNLOAD THE GAME](https://github.com/smartcmd/MinecraftConsoles/releases/tag/nightly) + [![Discord](https://img.shields.io/badge/Discord-Join%20Server-5865F2?logo=discord&logoColor=white)](https://discord.gg/5CSzhc9t) ![img.png](.github/IMG_8725.png) @@ -14,8 +16,6 @@ This project contains the source code of Minecraft Legacy Console Edition v1.3.0 - Added support for keyboard and mouse input - Added fullscreen mode support (toggle using F11) - Disabled V-Sync for better performance -- Auto-detect native monitor resolution with DPI awareness, resulting in sharper visuals on high-resolution displays -- Full support for keyboard and mouse input ## Controls (Keyboard & Mouse) @@ -35,6 +35,8 @@ This project contains the source code of Minecraft Legacy Console Edition v1.3.0 - **Select Item**: `Mouse Wheel` or keys `1` to `9` - **Accept or Decline Tutorial hints**: `Enter` to accept and `B` to decline - **Host Options**: `TAB` +- **Toggle Debug Info**: `F3` +- **Open Debug Overlay**: `F4` ## Build & Run