F4MP/tiltedcode/Code/client/TiltedOnlineApp.cpp

133 lines
3.6 KiB
C++
Raw Normal View History

#include <TiltedOnlinePCH.h>
#include <TiltedOnlineApp.h>
#include <DInputHook.hpp>
#include <WindowsHook.hpp>
#include <World.h>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <Systems/RenderSystemD3D11.h>
#include <Services/OverlayService.h>
#include <Services/ImguiService.h>
#include <Services/DiscordService.h>
#include <ScriptExtender.h>
#include <NvidiaUtil.h>
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<spdlog::sinks::rotating_file_sink_mt>(logPath / "tp_client.log", 1048576 * 5, 3);
// rotatingLogger->set_level(spdlog::level::debug);
auto console = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
console->set_pattern("%^[%H:%M:%S.%e] [%l] [tid %t] %$ %v");
auto logger = std::make_shared<spdlog::logger>("", 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<DiscordService>().Init();
World::Get().ctx().emplace<RenderSystemD3D11>(World::Get().ctx().at<OverlayService>(), World::Get().ctx().at<ImguiService>());
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");
}