#include #include #include #include #include #include #include #include #include #include #include #include #include #include using TiltedPhoques::Debug; TiltedOnlineApp::TiltedOnlineApp() { // Set console code page to UTF-8 so console known how to interpret string data SetConsoleOutputCP(CP_UTF8); auto logPath = TiltedPhoques::GetPath() / "logs"; std::error_code ec; create_directory(logPath, ec); auto rotatingLogger = std::make_shared(logPath / "tp_client.log", 1048576 * 5, 3); // rotatingLogger->set_level(spdlog::level::debug); auto console = std::make_shared(); console->set_pattern("%^[%H:%M:%S.%e] [%l] [tid %t] %$ %v"); auto logger = std::make_shared("", spdlog::sinks_init_list{console, rotatingLogger}); set_default_logger(logger); } TiltedOnlineApp::~TiltedOnlineApp() = default; void* TiltedOnlineApp::GetMainAddress() const { POINTER_SKYRIMSE(void, winMain, 36544); return winMain.GetPtr(); } bool TiltedOnlineApp::BeginMain() { World::Create(); World::Get().ctx().at().Init(); World::Get().ctx().emplace(World::Get().ctx().at(), World::Get().ctx().at()); LoadScriptExender(); // TODO: Figure out a way to un-blacklist NvCamera64.dll (see DllBlocklist.cpp). Then this hack can be removed if (IsNvidiaOverlayLoaded()) ApplyNvidiaFix(); return true; } bool TiltedOnlineApp::EndMain() { UninstallHooks(); if (m_pDevice) m_pDevice->Release(); return true; } void TiltedOnlineApp::Update() { // Reverting a change that used to be here to disable bUseFaceGenPreprocessedHeads==true (which is // the default) handling. Extensive testing over months by multiple parties showed that enabling // the flag introduces no issues WITH PROPERLY GENERATED CHARACTERS (in-game character generation // or showracemenu). The shortcut of "coc riverwood" from the main menu skips proper character generation. // // Plus, having it on has some benefits like helping with neck seams. Comment to avoid revisiting. // // There are still some issues to track down, like hair color and maybe face tint not syncing correctly, // but they are unrelated and unchanged by this flag. // // Make sure the window stays active POINTER_SKYRIMSE(uint32_t, bAlwaysActive, 380768); *bAlwaysActive = 1; World::Get().Update(); } bool TiltedOnlineApp::Attach() { TiltedPhoques::Debug::OnAttach(); // TiltedPhoques::Nop(0x1405D3FA1, 6); return true; } bool TiltedOnlineApp::Detach() { TiltedPhoques::Debug::OnDetach(); return true; } void TiltedOnlineApp::InstallHooks2() { TiltedPhoques::Initializer::RunAll(); TiltedPhoques::DInputHook::Install(); } void TiltedOnlineApp::UninstallHooks() { } void TiltedOnlineApp::ApplyNvidiaFix() noexcept { auto d3dFeatureLevelOut = D3D_FEATURE_LEVEL_11_0; HRESULT hr = CreateEarlyDxDevice(&m_pDevice, &d3dFeatureLevelOut); if (FAILED(hr)) spdlog::error("D3D11CreateDevice failed. Detected an NVIDIA GPU, error code={0:x}", hr); if (d3dFeatureLevelOut < D3D_FEATURE_LEVEL_11_0) spdlog::warn("Unexpected D3D11 feature level detected (< 11.0), may cause issues"); }