#include "EventListener.h" #include "Util.h" #include "Papyrus.h" #include "FlatMapMarkers.h" #include "StayAtSystemPage.h" #include "LockableDialogs.h" using namespace SKSE; static std::map g_settings{ { "FlatMapMarkers", true }, { "StayAtSystemPage", true } }; namespace { void InitializeLogging() { auto path = logger::log_directory(); if (!path) { SKSE::stl::report_and_fail("Failed to find standard logging directory"sv); } *path /= "EnderalSE.log"sv; auto sink = std::make_shared(path->string(), true); auto log = std::make_shared("global log"s, std::move(sink)); log->set_level(spdlog::level::info); log->flush_on(spdlog::level::info); spdlog::set_default_logger(std::move(log)); spdlog::set_pattern("[%l] %v"s); } void InitializeMessaging() { GetMessagingInterface()->RegisterListener([](MessagingInterface::Message* message) { if (message->type == MessagingInterface::kPostLoad) { if ((std::filesystem::exists("Data\\Dawnguard.esm") && std::filesystem::file_size("Data\\Dawnguard.esm") > 1000000) || (std::filesystem::exists("Data\\Dragonborn.esm") && std::filesystem::file_size("Data\\Dragonborn.esm") > 1000000) || (std::filesystem::exists("Data\\HearthFires.esm") && std::filesystem::file_size("Data\\HearthFires.esm") > 1000000) || (std::filesystem::exists("Data\\Update.esm") && std::filesystem::file_size("Data\\Update.esm") > 1000000)) { MessageBoxW(NULL, L"Skyrim DLCs are incompatible with Enderal.", L"Error", MB_OK | MB_ICONERROR); exit(EXIT_FAILURE); } if (std::filesystem::exists("Data\\Unofficial Skyrim Special Edition Patch.esp")) { MessageBoxW(NULL, L"Unofficial Skyrim Special Edition Patch is incompatible with Enderal.", L"Error", MB_OK | MB_ICONERROR); exit(EXIT_FAILURE); } if (std::filesystem::exists("Data\\ccBGSSSE001-Fish.esm") || std::filesystem::exists("Data\\ccBGSSSE025-AdvDSGS.esm") || std::filesystem::exists("Data\\ccBGSSSE037-Curios.esl") || std::filesystem::exists("Data\\ccQDRSSE001-SurvivalMode.esl")) { MessageBoxW(NULL, L"Creation Club mods are incompatible with Enderal.", L"Error", MB_OK | MB_ICONERROR); exit(EXIT_FAILURE); } if (g_settings.at("StayAtSystemPage")) { if (const auto pluginInfo = GetLoadInterface()->GetPluginInfo("StayAtSystemPage"); pluginInfo) { MessageBoxW(NULL, L"Stay At The System Page is already included in Enderal, please, disable it.", L"Error", MB_OK | MB_ICONERROR); exit(EXIT_FAILURE); } } if (g_settings.at("FlatMapMarkers")) { if (const auto pluginInfo = GetLoadInterface()->GetPluginInfo("FlatMapMarkersSSE"); pluginInfo) { MessageBoxW(NULL, L"Flat Map Markers is already included in Enderal, please, disable it (remove file Data\\SKSE\\Plugins\\FlatMapMarkersSSE.dll).", L"Error", MB_OK | MB_ICONERROR); exit(EXIT_FAILURE); } } SetINISettings(); EventListener::Install(); } else if (message->type == MessagingInterface::kPostPostLoad) { SKSE::GetModCallbackEventSource()->AddEventSink(EventListener::GetSingleton()); } else if (message->type == MessagingInterface::kDataLoaded) { const auto dataHandler = RE::TESDataHandler::GetSingleton(); if (dataHandler) { if (!dataHandler->LookupLoadedModByName("Update.esm")) { MessageBoxW(NULL, L"Update.esm is not loaded!", L"Error", MB_OK | MB_ICONERROR); exit(EXIT_FAILURE); } if (!dataHandler->LookupLoadedModByName("Enderal - Forgotten Stories.esm")) { MessageBoxW(NULL, L"Enderal - Forgotten Stories.esm is not loaded!", L"Error", MB_OK | MB_ICONERROR); exit(EXIT_FAILURE); } } const auto vm = RE::BSScript::Internal::VirtualMachine::GetSingleton(); if (!vm->TypeIsValid("_00e_questfunctions")) { MessageBoxW(NULL, L"One or more of Enderal's BSA archives are not loaded. Make sure Enderal - Forgotten Stories.esm is enabled and revalidate your files.", L"Error", MB_OK | MB_ICONERROR); exit(EXIT_FAILURE); } CheckIncompatibleMods(); } else if (message->type == MessagingInterface::kPreLoadGame) { // } else if ((message->type == MessagingInterface::kPostLoadGame && message->data) || message->type == MessagingInterface::kNewGame) { NewGameCount(true); } }); } } SKSEPluginLoad(const LoadInterface* skse) { GetLoadInterface(skse); InitializeLogging(); auto* plugin = PluginDeclaration::GetSingleton(); auto version = plugin->GetVersion(); logger::info("{} {} is loading...", plugin->GetName(), version); LoadINI(&g_settings, "Data/SKSE/Plugins/EnderalSE.ini"); Init(skse); InitializeMessaging(); GetPapyrusInterface()->Register(Papyrus::Bind); if (skse->RuntimeVersion() != RUNTIME_VR_1_4_15 && skse->RuntimeVersion() != RUNTIME_LATEST_VR && g_settings.at("FlatMapMarkers")) { logger::info("Initializing Flat Map Markers..."); SKSE::AllocTrampoline(1 << 4); FlatMapMarkers::Install(); } if (g_settings.at("StayAtSystemPage")) { logger::info("Initializing Stay At The System Page..."); JournalMenuEx::InstallHooks(); } //LockableDialogs::LockableDialogsEx::Install(); logger::info("{} has finished loading.", plugin->GetName()); return true; }