diff --git a/Minecraft.Client/ModLoader.cpp b/Minecraft.Client/ModLoader.cpp index f6a097f0..a44aa99e 100644 --- a/Minecraft.Client/ModLoader.cpp +++ b/Minecraft.Client/ModLoader.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -14,30 +15,28 @@ static HWND g_SplashWnd = NULL; static HWND g_StatusWnd = NULL; static HWND g_CountWnd = NULL; static HWND g_FailWnd = NULL; -static int g_TotalModsFound = 0; -static int g_ModsLoadedCount = 0; -static int g_ModsFailedCount = 0; +static int g_TotalMods = 0; +static int g_LoadedMods = 0; +static int g_FailedMods = 0; static ULONG_PTR g_gdiplusToken; LRESULT CALLBACK SplashWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - switch (msg) { - case WM_PAINT: { + if (msg == WM_PAINT) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); EndPaint(hwnd, &ps); - } return 0; + return 0; } return DefWindowProc(hwnd, msg, wParam, lParam); } void CreateSplash() { - Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&g_gdiplusToken, &gdiplusStartupInput, NULL); - WNDCLASSW wc = { 0 }; + WNDCLASSW wc = {}; wc.lpfnWndProc = SplashWndProc; wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = L"ModLoaderSplash"; @@ -45,74 +44,70 @@ void CreateSplash() { wc.hCursor = LoadCursor(NULL, IDC_ARROW); RegisterClassW(&wc); - int w = 600; - int h = 400; - int x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2; - int y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2; + const int w = 600, h = 400; + const int x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2; + const int y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2; g_SplashWnd = CreateWindowExW(WS_EX_TOPMOST, wc.lpszClassName, L"Faucet", WS_POPUP | WS_BORDER | WS_VISIBLE, x, y, w, h, NULL, NULL, wc.hInstance, NULL); - CreateWindowW(L"STATIC", L"FAUCET", WS_CHILD | WS_VISIBLE | SS_CENTER, + CreateWindowW(L"STATIC", L"FAUCET", + WS_CHILD | WS_VISIBLE | SS_CENTER, 0, 20, w, 40, g_SplashWnd, NULL, wc.hInstance, NULL); HWND hLogo = CreateWindowW(L"STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_CENTERIMAGE, - 100, 70, 400, 150, - g_SplashWnd, NULL, wc.hInstance, NULL); + 100, 70, 400, 150, g_SplashWnd, NULL, wc.hInstance, NULL); wchar_t buffer[MAX_PATH]; GetModuleFileNameW(NULL, buffer, MAX_PATH); - std::wstring exePath = buffer; - std::wstring exeDir = exePath.substr(0, exePath.find_last_of(L"\\/")); - std::wstring fullPath = exeDir + L"\\Common\\Media\\Faucet.png"; + std::wstring exeDir = std::wstring(buffer); + exeDir = exeDir.substr(0, exeDir.find_last_of(L"\\/")); + std::wstring imagePath = exeDir + L"\\Common\\Media\\Faucet.png"; - DWORD dwAttrib = GetFileAttributesW(fullPath.c_str()); - if (dwAttrib == INVALID_FILE_ATTRIBUTES) { - std::wstring errorMsg = L"Image not found at:\n" + fullPath; - MessageBoxW(g_SplashWnd, errorMsg.c_str(), L"File Error", MB_ICONERROR); - } - - Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromFile(fullPath.c_str()); + Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromFile(imagePath.c_str()); if (bitmap && bitmap->GetLastStatus() == Gdiplus::Ok) { HBITMAP hBmp = NULL; - Gdiplus::Status status = bitmap->GetHBITMAP(Gdiplus::Color(255, 255, 255, 255), &hBmp); - - if (status == Gdiplus::Ok && hBmp != NULL) { - SendMessage(hLogo, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp); + if (bitmap->GetHBITMAP(Gdiplus::Color(255, 255, 255, 255), &hBmp) == Gdiplus::Ok && hBmp) { + HBITMAP hOld = (HBITMAP)SendMessage(hLogo, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp); + if (hOld) DeleteObject(hOld); } - delete bitmap; } + delete bitmap; - g_StatusWnd = CreateWindowW(L"STATIC", L"Preparing...", WS_CHILD | WS_VISIBLE | SS_CENTER, + g_StatusWnd = CreateWindowW(L"STATIC", L"Preparing...", + WS_CHILD | WS_VISIBLE | SS_CENTER, 10, 240, 580, 40, g_SplashWnd, NULL, wc.hInstance, NULL); - g_CountWnd = CreateWindowW(L"STATIC", L"0/0 MODS LOADED", WS_CHILD | WS_VISIBLE | SS_LEFT, + g_CountWnd = CreateWindowW(L"STATIC", L"0/0 MODS LOADED", + WS_CHILD | WS_VISIBLE | SS_LEFT, 20, 350, 200, 20, g_SplashWnd, NULL, wc.hInstance, NULL); - g_FailWnd = CreateWindowW(L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_RIGHT, + g_FailWnd = CreateWindowW(L"STATIC", L"", + WS_CHILD | WS_VISIBLE | SS_RIGHT, 380, 350, 200, 20, g_SplashWnd, NULL, wc.hInstance, NULL); UpdateWindow(g_SplashWnd); } void UpdateSplashStatus(const std::wstring& text) { - if (g_StatusWnd) { - SendMessageW(g_StatusWnd, WM_SETTEXT, 0, (LPARAM)text.c_str()); + if (!g_StatusWnd) return; - std::wstring countText = std::to_wstring(g_ModsLoadedCount) + L"/" + std::to_wstring(g_TotalModsFound) + L" MODS LOADED"; - SendMessageW(g_CountWnd, WM_SETTEXT, 0, (LPARAM)countText.c_str()); + SendMessageW(g_StatusWnd, WM_SETTEXT, 0, (LPARAM)text.c_str()); - if (g_ModsFailedCount > 0) { - std::wstring failText = std::to_wstring(g_ModsFailedCount) + L" HAVE FAILED TO LOAD"; - SendMessageW(g_FailWnd, WM_SETTEXT, 0, (LPARAM)failText.c_str()); - } + std::wstring countText = std::to_wstring(g_LoadedMods) + L"/" + + std::to_wstring(g_TotalMods) + L" MODS LOADED"; + SendMessageW(g_CountWnd, WM_SETTEXT, 0, (LPARAM)countText.c_str()); - MSG msg; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } + if (g_FailedMods > 0) { + std::wstring failText = std::to_wstring(g_FailedMods) + L" FAILED TO LOAD"; + SendMessageW(g_FailWnd, WM_SETTEXT, 0, (LPARAM)failText.c_str()); + } + + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); } } @@ -127,15 +122,19 @@ void ModLoader::Initialize() { auto startTime = std::chrono::steady_clock::now(); CreateSplash(); - OpenLogFile(); - Log(L"Faucet ModLoader initializing"); + + Log("=== Faucet ModLoader starting ==="); std::wstring modsDir = GetModsDirectory(); ScanAndLoadMods(modsDir); auto endTime = std::chrono::steady_clock::now(); - auto elapsed = std::chrono::duration_cast(endTime - startTime).count(); + long long elapsed = std::chrono::duration_cast(endTime - startTime).count(); + + Log("Initialization complete — " + std::to_string(g_LoadedMods) + " loaded, " + + std::to_string(g_FailedMods) + " failed, " + + std::to_string(elapsed) + "ms total"); if (elapsed < 1000) { UpdateSplashStatus(L"Finalizing..."); @@ -144,8 +143,8 @@ void ModLoader::Initialize() { if (g_SplashWnd) { DestroyWindow(g_SplashWnd); + g_SplashWnd = NULL; UnregisterClassW(L"ModLoaderSplash", GetModuleHandle(NULL)); - Gdiplus::GdiplusShutdown(g_gdiplusToken); } } @@ -153,39 +152,42 @@ void ModLoader::Initialize() { void ModLoader::NotifyInit() { for (auto& mod : m_mods) { if (!mod.healthy) continue; - const char* id = mod.instance->GetInfo()->id; try { if (!mod.instance->OnInit()) { + Log("OnInit() returned false for: " + std::string(mod.instance->GetInfo()->id)); mod.healthy = false; } } catch (...) { + Log("OnInit() threw for: " + std::string(mod.instance->GetInfo()->id)); mod.healthy = false; } } } void ModLoader::OnLevelLoad() { - Log(L"Level has loaded"); + Log("Level loaded"); for (auto& mod : m_mods) { if (!mod.healthy) continue; try { mod.instance->OnLevelLoad(); } catch (...) { + Log("OnLevelLoad() threw for: " + std::string(mod.instance->GetInfo()->id)); mod.healthy = false; } } } void ModLoader::OnLevelUnload() { - Log(L"Level has unloaded"); + Log("Level unloaded"); for (auto& mod : m_mods) { if (!mod.healthy) continue; try { mod.instance->OnLevelUnload(); } catch (...) { + Log("OnLevelUnload() threw for: " + std::string(mod.instance->GetInfo()->id)); mod.healthy = false; } } @@ -194,26 +196,29 @@ void ModLoader::OnLevelUnload() { void ModLoader::NotifyUpdate(float deltaTime) { for (auto& mod : m_mods) { if (!mod.healthy) continue; - if (mod.instance == nullptr) { + if (!mod.instance) { mod.healthy = false; continue; } try { if (!mod.instance->OnUpdate(deltaTime)) { + Log("OnUpdate() returned false for: " + std::string(mod.instance->GetInfo()->id)); mod.healthy = false; } } catch (...) { + Log("OnUpdate() threw for: " + std::string(mod.instance->GetInfo()->id)); mod.healthy = false; } } } void ModLoader::Shutdown() { - for (int i = static_cast(m_mods.size()) - 1; i >= 0; --i) { + Log("Shutting down ModLoader"); + for (int i = static_cast(m_mods.size()) - 1; i >= 0; --i) UnloadOneMod(m_mods[i]); - } m_mods.clear(); + if (m_logFile != INVALID_HANDLE_VALUE) { CloseHandle(m_logFile); m_logFile = INVALID_HANDLE_VALUE; @@ -223,9 +228,8 @@ void ModLoader::Shutdown() { IMod* ModLoader::FindMod(const std::string& id) const { for (const auto& mod : m_mods) { if (mod.healthy && mod.instance && - std::string(mod.instance->GetInfo()->id) == id) { + std::string(mod.instance->GetInfo()->id) == id) return mod.instance; - } } return nullptr; } @@ -234,34 +238,51 @@ void ModLoader::ScanAndLoadMods(const std::wstring& modsDir) { DWORD dwAttrib = GetFileAttributesW(modsDir.c_str()); if (dwAttrib == INVALID_FILE_ATTRIBUTES || !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) { CreateDirectoryW(modsDir.c_str(), NULL); + Log("Mods directory not found — created it"); return; } + std::vector dllPaths; std::wstring searchPath = modsDir + L"\\*.dll"; WIN32_FIND_DATAW fd; HANDLE hFind = FindFirstFileW(searchPath.c_str(), &fd); - if (hFind != INVALID_HANDLE_VALUE) { do { - if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { - std::wstring fullPath = modsDir + L"\\" + fd.cFileName; - UpdateSplashStatus(L"Loading: " + std::wstring(fd.cFileName)); - LoadOneMod(fullPath); - } + if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + dllPaths.push_back(modsDir + L"\\" + fd.cFileName); } while (FindNextFileW(hFind, &fd)); FindClose(hFind); } + + g_TotalMods = static_cast(dllPaths.size()); + Log("Found " + std::to_string(g_TotalMods) + " mod(s) to load"); + + for (const auto& path : dllPaths) { + std::wstring filename = path.substr(path.find_last_of(L"\\/") + 1); + UpdateSplashStatus(L"Loading: " + filename); + LoadOneMod(path); + } } bool ModLoader::LoadOneMod(const std::wstring& dllPath) { + std::string narrowPath(dllPath.begin(), dllPath.end()); + std::string filename = narrowPath.substr(narrowPath.find_last_of("\\/") + 1); + + auto t0 = std::chrono::steady_clock::now(); + HMODULE hMod = LoadLibraryW(dllPath.c_str()); - if (!hMod) return false; + if (!hMod) { + Log("FAIL [" + filename + "] LoadLibrary failed (error " + std::to_string(GetLastError()) + ")"); + ++g_FailedMods; + return false; + } using CreateModFn = IMod * (*)(); auto createFn = reinterpret_cast(GetProcAddress(hMod, "CreateMod")); - if (!createFn) { + Log("FAIL [" + filename + "] missing CreateMod export"); FreeLibrary(hMod); + ++g_FailedMods; return false; } @@ -270,37 +291,67 @@ bool ModLoader::LoadOneMod(const std::wstring& dllPath) { instance = createFn(); } catch (...) { + Log("FAIL [" + filename + "] CreateMod() threw"); FreeLibrary(hMod); + ++g_FailedMods; return false; } if (!instance) { + Log("FAIL [" + filename + "] CreateMod() returned null"); FreeLibrary(hMod); + ++g_FailedMods; return false; } + const ModInfo* info = instance->GetInfo(); + std::string modId = info ? info->id : "(unknown)"; + std::string modVer = info + ? std::to_string(info->version.major) + "." + + std::to_string(info->version.minor) + "." + + std::to_string(info->version.patch) + : "(unknown)"; + LoadedMod record; record.module = hMod; record.instance = instance; - record.path = std::string(dllPath.begin(), dllPath.end()); + record.path = narrowPath; try { if (!instance->OnLoad()) { + Log("WARN [" + modId + " " + modVer + "] OnLoad() returned false — marking unhealthy"); record.healthy = false; } } catch (...) { + Log("FAIL [" + modId + " " + modVer + "] OnLoad() threw — marking unhealthy"); record.healthy = false; } + auto elapsed = std::chrono::duration_cast( + std::chrono::steady_clock::now() - t0).count(); + + if (record.healthy) { + Log("OK [" + modId + " " + modVer + "] loaded in " + std::to_string(elapsed) + "ms"); + ++g_LoadedMods; + } + else { + ++g_FailedMods; + } + m_mods.push_back(std::move(record)); - return true; + return record.healthy; } void ModLoader::UnloadOneMod(LoadedMod& mod) { if (!mod.instance) return; + + if (mod.instance->GetInfo()) + Log("Unloading: " + std::string(mod.instance->GetInfo()->id)); + delete mod.instance; mod.instance = nullptr; + if (mod.module) { FreeLibrary(mod.module); mod.module = nullptr; @@ -308,30 +359,38 @@ void ModLoader::UnloadOneMod(LoadedMod& mod) { } void ModLoader::OpenLogFile() { - std::wstring dir = GetModsDirectory(); - std::wstring logPath = dir + L"\\modloader.log"; - CreateDirectoryW(dir.c_str(), NULL); + std::wstring logPath = GetModsDirectory() + L"\\modloader.log"; + CreateDirectoryW(GetModsDirectory().c_str(), NULL); m_logFile = CreateFileW(logPath.c_str(), GENERIC_WRITE, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + + if (m_logFile != INVALID_HANDLE_VALUE) { + BYTE bom[3] = { 0xEF, 0xBB, 0xBF }; + DWORD written; + WriteFile(m_logFile, bom, 3, &written, nullptr); + } } -void ModLoader::Log(const std::wstring& msg) { +void ModLoader::Log(const std::string& msg) { auto now = std::chrono::system_clock::now(); std::time_t t = std::chrono::system_clock::to_time_t(now); struct tm buf; localtime_s(&buf, &t); char ts[16]; std::strftime(ts, sizeof(ts), "[%H:%M:%S] ", &buf); - std::wstring line = std::wstring(ts, ts + strlen(ts)) + msg + L"\r\n"; + + std::string line = std::string(ts) + msg + "\r\n"; + if (m_logFile != INVALID_HANDLE_VALUE) { DWORD written; - WriteFile(m_logFile, line.c_str(), static_cast(line.size() * sizeof(wchar_t)), &written, nullptr); + WriteFile(m_logFile, line.c_str(), static_cast(line.size()), &written, nullptr); } - OutputDebugStringW(line.c_str()); + + OutputDebugStringA(line.c_str()); } -void ModLoader::Log(const std::string& msg) { - Log(std::wstring(msg.begin(), msg.end())); +void ModLoader::Log(const std::wstring& msg) { + Log(std::string(msg.begin(), msg.end())); } std::wstring ModLoader::GetModsDirectory() const { diff --git a/Minecraft.Client/x64/Debug/Minecraft.Client.log b/Minecraft.Client/x64/Debug/Minecraft.Client.log index 7dec0124..4216d97a 100644 --- a/Minecraft.Client/x64/Debug/Minecraft.Client.log +++ b/Minecraft.Client/x64/Debug/Minecraft.Client.log @@ -1,4 +1,37 @@ - SDK.cpp + ModLoader.cpp +C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\xutility(4813,18): warning C4244: '=': conversion from 'const wchar_t' to 'char', possible loss of data + (compiling source file '/ModLoader.cpp') + C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\xutility(4813,18): + the template instantiation context (the oldest one first) is + S:\GitHub\Faucet\Minecraft.Client\ModLoader.cpp(285,30): + see reference to function template instantiation 'std::basic_string,std::allocator>::basic_string>>,0>(_Iter,_Iter,const _Alloc &)' being compiled + with + [ + _Elem=wchar_t, + _Iter=std::_String_const_iterator>>, + _Alloc=std::allocator + ] + S:\GitHub\Faucet\Minecraft.Client\ModLoader.cpp(285,17): + see the first reference to 'std::basic_string,std::allocator>::basic_string' in 'ModLoader::LoadOneMod' + C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\xstring(812,17): + see reference to function template instantiation 'void std::basic_string,std::allocator>::_Construct_from_iter(_Iter,const _Sent,_Size)' being compiled + with + [ + _Size_type=unsigned __int64, + _Iter=const wchar_t *, + _Sent=const wchar_t *, + _Size=unsigned __int64 + ] + C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include\xstring(968,18): + see reference to function template instantiation '_OutIt *std::_Copy_n_unchecked4(_InIt,_SizeTy,_OutIt)' being compiled + with + [ + _OutIt=char *, + _Size=unsigned __int64, + _InIt=const wchar_t *, + _SizeTy=unsigned __int64 + ] + Microsoft (R) Incremental Linker Version 14.44.35222.0 Copyright (C) Microsoft Corporation. All rights reserved. "/OUT:S:\GitHub\Faucet\x64\Debug\Faucet.exe" /INCREMENTAL "/ILK:x64\Debug\Faucet.ilk" d3d11.lib ..\Minecraft.World\x64_Debug\Minecraft.World.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib XInput9_1_0.lib ..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib wsock32.lib /MANIFEST "/MANIFESTUAC:level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG "/PDB:S:\GitHub\Faucet\x64\Debug\Minecraft.Client.pdb" /TLBID:1 /DYNAMICBASE /NXCOMPAT "/IMPLIB:S:\GitHub\Faucet\x64\Debug\Faucet.lib" /MACHINE:X64 x64\Debug\MinecraftWindows.res @@ -506,40 +539,6 @@ Windows64\Iggy\lib\iggy_w64.lib Windows64\Miles\lib\mss64.lib x64\Debug\iob_shim.obj -4J_Input_d.lib(4J_Input.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Input_d.lib(4J_Input.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Input_d.lib(INP_Keyboard.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Input_d.lib(INP_Keyboard.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Input_d.lib(INP_Main.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Input_d.lib(INP_Main.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Input_d.lib(stdafx.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Input_d.lib(stdafx.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Input_d.lib(LinkedList.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Input_d.lib(LinkedList.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Input_d.lib(INP_ForceFeedback.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Input_d.lib(INP_ForceFeedback.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(4J_Render.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(4J_Render.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(RendererMatrix.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(RendererMatrix.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(RendererCore.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(RendererCore.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(RendererVertex.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(RendererVertex.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(RendererCBuff.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(RendererCBuff.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(RendererTexture.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(RendererTexture.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(RendererState.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(RendererState.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(stdafx.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(stdafx.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngread.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngread.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngwrite.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngwrite.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(png.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(png.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngrtran.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngrtran.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngtrans.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngtrans.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngrio.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngrio.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngmem.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngmem.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngerror.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngerror.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngset.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngset.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngget.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngget.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngrutil.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngrutil.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngwutil.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngwutil.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngwio.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngwio.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Render_PC_d.lib(pngwtran.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Render_PC_d.lib(pngwtran.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Storage_d.lib(4J_Storage.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Storage_d.lib(4J_Storage.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Storage_d.lib(STO_SaveGame.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Storage_d.lib(STO_SaveGame.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Storage_d.lib(STO_DLC.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Storage_d.lib(STO_DLC.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Storage_d.lib(STO_Main.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Storage_d.lib(STO_Main.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info -4J_Storage_d.lib(stdafx.obj) : warning LNK4099: PDB 'vc110.pdb' was not found with '4J_Storage_d.lib(stdafx.obj)' or at 'S:\GitHub\Faucet\x64\Debug\vc110.pdb'; linking object as if no debug info - Creating library S:\GitHub\Faucet\x64\Debug\Faucet.lib and object S:\GitHub\Faucet\x64\Debug\Faucet.exp Minecraft.Client.vcxproj -> S:\GitHub\Faucet\x64\Debug\Faucet.exe Run post-build script Post-build script started. Output Directory: S:\GitHub\Faucet\x64\Debug\/, Project Directory: S:\GitHub\Faucet\Minecraft.Client\/ diff --git a/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.command.1.tlog b/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.command.1.tlog index 5a46d505..ff745b55 100644 Binary files a/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.command.1.tlog and b/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.command.1.tlog differ diff --git a/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.read.1.tlog b/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.read.1.tlog index 40118881..8e8cce1e 100644 Binary files a/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.read.1.tlog and b/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.read.1.tlog differ diff --git a/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.write.1.tlog b/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.write.1.tlog index aff5e09f..e7e3d625 100644 Binary files a/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.write.1.tlog and b/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/CL.write.1.tlog differ diff --git a/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/link.read.1.tlog b/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/link.read.1.tlog index f663ade1..b1924ac4 100644 Binary files a/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/link.read.1.tlog and b/Minecraft.Client/x64/Debug/Minecraft.Client.tlog/link.read.1.tlog differ diff --git a/Minecraft.Client/x64/Debug/ModLoader.obj b/Minecraft.Client/x64/Debug/ModLoader.obj index 8e02dbdc..f8872977 100644 Binary files a/Minecraft.Client/x64/Debug/ModLoader.obj and b/Minecraft.Client/x64/Debug/ModLoader.obj differ diff --git a/x64/Debug/Faucet.exe b/x64/Debug/Faucet.exe index e3232318..412877d5 100644 Binary files a/x64/Debug/Faucet.exe and b/x64/Debug/Faucet.exe differ diff --git a/x64/Debug/mods/ExampleMod.dll b/x64/Debug/mods/ExampleMod.dll deleted file mode 100644 index 02ebcce5..00000000 Binary files a/x64/Debug/mods/ExampleMod.dll and /dev/null differ diff --git a/x64/Debug/mods/modloader.log b/x64/Debug/mods/modloader.log index 7ce6b505..88a53887 100644 Binary files a/x64/Debug/mods/modloader.log and b/x64/Debug/mods/modloader.log differ