Compare commits
3 Commits
ff965bc21d
...
18ac89e171
Author | SHA1 | Date | |
---|---|---|---|
18ac89e171 | |||
09f7922554 | |||
c428861029 |
|
@ -6,9 +6,10 @@ See https://en.wiki.sureai.net/Enderal:Patch for the list of official patches up
|
||||||
Beware, spoilers ahead!
|
Beware, spoilers ahead!
|
||||||
|
|
||||||
|
|
||||||
2.0.12.4 (TBD)
|
2.0.12.4 (2022-09-30)
|
||||||
- Skyrim SE 1.6.640 support.
|
- Skyrim SE 1.6.640 (Steam) and 1.6.659 (GOG) support.
|
||||||
- Fixed the dialog quit popup appearing in non-locked conversations.
|
- Fixed the dialog quit popup appearing in non-locked conversations.
|
||||||
|
- Fixed swapped objectives in Call of the Hunt.
|
||||||
|
|
||||||
|
|
||||||
2.0.12.3 (2022-09-16)
|
2.0.12.3 (2022-09-16)
|
||||||
|
|
BIN
SKSE/Plugins/EnderalSE.dll
(Stored with Git LFS)
BIN
SKSE/Plugins/EnderalSE.dll
(Stored with Git LFS)
Binary file not shown.
BIN
SKSE/Plugins/versionlib-1-6-659-0.bin
(Stored with Git LFS)
Normal file
BIN
SKSE/Plugins/versionlib-1-6-659-0.bin
(Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -1,6 +1,6 @@
|
||||||
Enderal Credits.txt
|
Enderal Credits.txt
|
||||||
Report a bug in Enderal SE.url
|
Report a bug in Enderal SE.url
|
||||||
Enderal SE v2.0.12.3 Changelog.txt
|
Enderal SE v2.0.12.4 Changelog.txt
|
||||||
Enderal - Forgotten Stories.esm
|
Enderal - Forgotten Stories.esm
|
||||||
Enderal - Forgotten Stories.ini
|
Enderal - Forgotten Stories.ini
|
||||||
E - Update.bsa
|
E - Update.bsa
|
||||||
|
@ -33,6 +33,8 @@ SKSE\Plugins\EnderalSE.ini
|
||||||
SKSE\Plugins\EnderalVersion.ini
|
SKSE\Plugins\EnderalVersion.ini
|
||||||
SKSE\Plugins\version-1-5-97-0.bin
|
SKSE\Plugins\version-1-5-97-0.bin
|
||||||
SKSE\Plugins\versionlib-1-6-353-0.bin
|
SKSE\Plugins\versionlib-1-6-353-0.bin
|
||||||
|
SKSE\Plugins\versionlib-1-6-640-0.bin
|
||||||
|
SKSE\Plugins\versionlib-1-6-659-0.bin
|
||||||
SKSE\SKSE.ini
|
SKSE\SKSE.ini
|
||||||
Skyrim.esm
|
Skyrim.esm
|
||||||
Update.esm
|
Update.esm
|
||||||
|
|
Binary file not shown.
|
@ -6,7 +6,7 @@ message("Using toolchain file ${CMAKE_TOOLCHAIN_FILE}.")
|
||||||
########################################################################################################################
|
########################################################################################################################
|
||||||
project(
|
project(
|
||||||
EnderalSE
|
EnderalSE
|
||||||
VERSION 1.0.0
|
VERSION 1.1.0
|
||||||
DESCRIPTION "Enderal SE DLL"
|
DESCRIPTION "Enderal SE DLL"
|
||||||
LANGUAGES CXX)
|
LANGUAGES CXX)
|
||||||
set(CMAKE_CXX_STANDARD 23)
|
set(CMAKE_CXX_STANDARD 23)
|
||||||
|
|
|
@ -1331,3 +1331,217 @@ inline void CheckEnderalNPCs()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void CheckEnderalActivators()
|
||||||
|
{
|
||||||
|
// Base forms of Enderal activators, having collisions with Skyrim
|
||||||
|
uint32_t formids[46] = {
|
||||||
|
0x20A1C,
|
||||||
|
0x23AB1,
|
||||||
|
0x36739,
|
||||||
|
0x3BCA5,
|
||||||
|
0x3BCB3,
|
||||||
|
0x3C570,
|
||||||
|
0x3C57F,
|
||||||
|
0x43BEB,
|
||||||
|
0x43BEE,
|
||||||
|
0x447D3,
|
||||||
|
0x469F6,
|
||||||
|
0x469F8,
|
||||||
|
0x469FA,
|
||||||
|
0x469FC,
|
||||||
|
0x46ADE,
|
||||||
|
0x46AEA,
|
||||||
|
0x69F89,
|
||||||
|
0x69F8C,
|
||||||
|
0x6A00D,
|
||||||
|
0x6A00E,
|
||||||
|
0x6A00F,
|
||||||
|
0x6A010,
|
||||||
|
0x6A011,
|
||||||
|
0x6A013,
|
||||||
|
0x6A016,
|
||||||
|
0x6A024,
|
||||||
|
0x6A025,
|
||||||
|
0x6A026,
|
||||||
|
0x6A027,
|
||||||
|
0x6A029,
|
||||||
|
0x6A02A,
|
||||||
|
0x6A02B,
|
||||||
|
0x6A02C,
|
||||||
|
0x6A02D,
|
||||||
|
0x6A02E,
|
||||||
|
0x6A030,
|
||||||
|
0x6A032,
|
||||||
|
0x6A033,
|
||||||
|
0x77358,
|
||||||
|
0xADC71,
|
||||||
|
0xB35AB,
|
||||||
|
0xB35B4,
|
||||||
|
0xB35B5,
|
||||||
|
0xB6282,
|
||||||
|
0x106644,
|
||||||
|
0x1080DA
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int i = 0; i < 46; i++) {
|
||||||
|
const auto* form = RE::TESForm::LookupByID(formids[i]);
|
||||||
|
if (!form || !form->Is(RE::FormType::Activator)) {
|
||||||
|
logger::warn("Detected invalid activator: {:08X}", formids[i]);
|
||||||
|
NotifyInvalidForm(form);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CheckEnderalStatics()
|
||||||
|
{
|
||||||
|
// Base forms of Enderal statics, having collisions with Skyrim
|
||||||
|
uint32_t formids[138] = {
|
||||||
|
0x15C6F,
|
||||||
|
0x1725C,
|
||||||
|
0x20BC9,
|
||||||
|
0x20BDF,
|
||||||
|
0x23E46,
|
||||||
|
0x2E6F8,
|
||||||
|
0x2EC26,
|
||||||
|
0x2EE3F,
|
||||||
|
0x31949,
|
||||||
|
0x3194B,
|
||||||
|
0x3195B,
|
||||||
|
0x31974,
|
||||||
|
0x327AD,
|
||||||
|
0x328D7,
|
||||||
|
0x33F45,
|
||||||
|
0x34944,
|
||||||
|
0x34946,
|
||||||
|
0x34BCD,
|
||||||
|
0x36747,
|
||||||
|
0x36775,
|
||||||
|
0x36779,
|
||||||
|
0x3700B,
|
||||||
|
0x3742A,
|
||||||
|
0x37667,
|
||||||
|
0x37668,
|
||||||
|
0x37C01,
|
||||||
|
0x3A1C2,
|
||||||
|
0x3BCE3,
|
||||||
|
0x3BCE7,
|
||||||
|
0x3C58A,
|
||||||
|
0x3ECAA,
|
||||||
|
0x41449,
|
||||||
|
0x4B258,
|
||||||
|
0x4B25A,
|
||||||
|
0x565F0,
|
||||||
|
0x6717B,
|
||||||
|
0x6717C,
|
||||||
|
0x6717D,
|
||||||
|
0x69524,
|
||||||
|
0x69525,
|
||||||
|
0x69526,
|
||||||
|
0x69527,
|
||||||
|
0x6A034,
|
||||||
|
0x6A035,
|
||||||
|
0x6A036,
|
||||||
|
0x6A037,
|
||||||
|
0x6A038,
|
||||||
|
0x6A039,
|
||||||
|
0x6A03A,
|
||||||
|
0x6A03B,
|
||||||
|
0x6A03C,
|
||||||
|
0x6A03D,
|
||||||
|
0x6A03E,
|
||||||
|
0x6A03F,
|
||||||
|
0x6A040,
|
||||||
|
0x6A041,
|
||||||
|
0x6A042,
|
||||||
|
0x6A045,
|
||||||
|
0x6A046,
|
||||||
|
0x6A047,
|
||||||
|
0x6A048,
|
||||||
|
0x6A049,
|
||||||
|
0x6A04A,
|
||||||
|
0x6A04B,
|
||||||
|
0x6A04C,
|
||||||
|
0x6A04D,
|
||||||
|
0x6A04F,
|
||||||
|
0x6A050,
|
||||||
|
0x6A051,
|
||||||
|
0x6A052,
|
||||||
|
0x6A053,
|
||||||
|
0x6A054,
|
||||||
|
0x6A057,
|
||||||
|
0x6A058,
|
||||||
|
0x6A059,
|
||||||
|
0x6A05A,
|
||||||
|
0x6A094,
|
||||||
|
0x6D230,
|
||||||
|
0x6D233,
|
||||||
|
0x6D235,
|
||||||
|
0x6D23F,
|
||||||
|
0x6D24D,
|
||||||
|
0x6D253,
|
||||||
|
0x6D257,
|
||||||
|
0x6FEEA,
|
||||||
|
0x6FEED,
|
||||||
|
0x6FEEE,
|
||||||
|
0x6FEEF,
|
||||||
|
0x6FEF0,
|
||||||
|
0x6FEF1,
|
||||||
|
0x6FEF2,
|
||||||
|
0x6FEF3,
|
||||||
|
0x6FEF4,
|
||||||
|
0x6FEF5,
|
||||||
|
0x6FEF6,
|
||||||
|
0x6FEF7,
|
||||||
|
0x6FEF8,
|
||||||
|
0x6FEF9,
|
||||||
|
0x6FEFA,
|
||||||
|
0x6FEFD,
|
||||||
|
0x904B1,
|
||||||
|
0x904B2,
|
||||||
|
0x904B3,
|
||||||
|
0x904B4,
|
||||||
|
0x904B5,
|
||||||
|
0x904B6,
|
||||||
|
0x904B7,
|
||||||
|
0x904B8,
|
||||||
|
0x904B9,
|
||||||
|
0x904BA,
|
||||||
|
0x904BB,
|
||||||
|
0x904BC,
|
||||||
|
0x904BD,
|
||||||
|
0x904BE,
|
||||||
|
0x904BF,
|
||||||
|
0x904C0,
|
||||||
|
0xDAAF3,
|
||||||
|
0xDAAF5,
|
||||||
|
0xDAAF8,
|
||||||
|
0xDAAFC,
|
||||||
|
0xDAAFE,
|
||||||
|
0xDAB01,
|
||||||
|
0xE49F3,
|
||||||
|
0xE4A12,
|
||||||
|
0xE77BF,
|
||||||
|
0xE77C0,
|
||||||
|
0xE77C1,
|
||||||
|
0xE77C2,
|
||||||
|
0xE77C3,
|
||||||
|
0xE77C4,
|
||||||
|
0xE77C5,
|
||||||
|
0xE77C6,
|
||||||
|
0xE77C7,
|
||||||
|
0xE77C8,
|
||||||
|
0xE77C9,
|
||||||
|
0xE77CA,
|
||||||
|
0xE77CB,
|
||||||
|
0xE77CF
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int i = 0; i < 138; i++) {
|
||||||
|
const auto* form = RE::TESForm::LookupByID(formids[i]);
|
||||||
|
if (!form || !form->Is(RE::FormType::Static)) {
|
||||||
|
logger::warn("Detected invalid static: {:08X}", formids[i]);
|
||||||
|
NotifyInvalidForm(form);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -34,18 +34,8 @@ namespace {
|
||||||
void InitializeMessaging()
|
void InitializeMessaging()
|
||||||
{
|
{
|
||||||
GetMessagingInterface()->RegisterListener([](MessagingInterface::Message* message) {
|
GetMessagingInterface()->RegisterListener([](MessagingInterface::Message* message) {
|
||||||
|
|
||||||
if (message->type == MessagingInterface::kPostLoad) {
|
if (message->type == MessagingInterface::kPostLoad) {
|
||||||
if (DataFileExists("Dawnguard.esm") || DataFileExists("Dragonborn.esm") || DataFileExists("HearthFires.esm") || DataFileExists("Update.esm")) {
|
|
||||||
MessageBoxW(NULL, L"Skyrim DLCs are incompatible with Enderal.", L"Error", MB_OK | MB_ICONERROR);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
if (DataFileExists("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);
|
|
||||||
}
|
|
||||||
|
|
||||||
CheckCCMods();
|
|
||||||
|
|
||||||
if (g_settings.at("StayAtSystemPage")) {
|
if (g_settings.at("StayAtSystemPage")) {
|
||||||
if (const auto pluginInfo = GetLoadInterface()->GetPluginInfo("StayAtSystemPage"); pluginInfo) {
|
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);
|
MessageBoxW(NULL, L"Stay At The System Page is already included in Enderal, please, disable it.", L"Error", MB_OK | MB_ICONERROR);
|
||||||
|
@ -59,11 +49,6 @@ namespace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SetINISettings();
|
|
||||||
EventListener::Install();
|
|
||||||
|
|
||||||
} else if (message->type == MessagingInterface::kPostPostLoad) {
|
|
||||||
SKSE::GetModCallbackEventSource()->AddEventSink(EventListener::GetSingleton());
|
|
||||||
} else if (message->type == MessagingInterface::kDataLoaded) {
|
} else if (message->type == MessagingInterface::kDataLoaded) {
|
||||||
const auto dataHandler = RE::TESDataHandler::GetSingleton();
|
const auto dataHandler = RE::TESDataHandler::GetSingleton();
|
||||||
if (dataHandler) {
|
if (dataHandler) {
|
||||||
|
@ -77,21 +62,37 @@ namespace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!RE::BSScript::Internal::VirtualMachine::GetSingleton()->TypeIsValid("UI")) {
|
||||||
|
RE::DebugMessageBox("Unable to detect SKSE scripts, make sure SKSE is properly installed.");
|
||||||
|
}
|
||||||
|
|
||||||
bool bScripts = RE::BSScript::Internal::VirtualMachine::GetSingleton()->TypeIsValid("PRKF__00E_CraftQuestPotionPe_0300146D");
|
bool bScripts = RE::BSScript::Internal::VirtualMachine::GetSingleton()->TypeIsValid("PRKF__00E_CraftQuestPotionPe_0300146D");
|
||||||
bool bSounds = RE::BSResourceNiBinaryStream("sound/fx/enderal/laughingchild.wav").good();
|
|
||||||
bool bVoices = RE::BSResourceNiBinaryStream("sound/voice/enderal - forgotten stories.esm/vt_calia/fs_mq18c__0002a4ed_1.fuz").good();
|
|
||||||
bool bMeshes = RE::BSResourceNiBinaryStream("meshes/enderal/loadscreenart/loadscreenundercity.nif").good();
|
|
||||||
bool bTextures = RE::BSResourceNiBinaryStream("textures/enderal/forgottenstories/theriantrophist/theriantrophistrecipe.dds").good();
|
|
||||||
bool bInterface = RE::BSResourceNiBinaryStream("interface/00e_heromenu.swf").good();
|
bool bInterface = RE::BSResourceNiBinaryStream("interface/00e_heromenu.swf").good();
|
||||||
|
|
||||||
if (!bScripts || !bSounds || !bVoices || !bMeshes || !bTextures || !bInterface) {
|
if (!bScripts || !bInterface) {
|
||||||
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);
|
RE::DebugMessageBox("E - Misc.bsa is not loaded or is outdated. Make sure Enderal - Forgotten Stories.esm is enabled and revalidate your files.");
|
||||||
exit(EXIT_FAILURE);
|
}
|
||||||
|
|
||||||
|
bool bSounds = RE::BSResourceNiBinaryStream("sound/fx/enderal/laughingchild.wav").good();
|
||||||
|
|
||||||
|
if (!bSounds) {
|
||||||
|
RE::DebugMessageBox("E - Sounds.bsa is not loaded. Make sure Enderal - Forgotten Stories.esm is enabled and revalidate your files.");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool bVoices = RE::BSResourceNiBinaryStream("sound/voice/enderal - forgotten stories.esm/vt_calia/fs_mq18c__0002a4ed_1.fuz").good();
|
||||||
|
|
||||||
|
if (!bVoices) {
|
||||||
|
RE::DebugMessageBox("L - Voices.bsa is not loaded. Make sure Enderal - Forgotten Stories.esm is enabled and revalidate your files.");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool bMeshes = RE::BSResourceNiBinaryStream("meshes/enderal/loadscreenart/loadscreenundercity.nif").good();
|
||||||
|
|
||||||
|
if (!bMeshes) {
|
||||||
|
RE::DebugMessageBox("E - Meshes.bsa is not loaded. Make sure Enderal - Forgotten Stories.esm is enabled and revalidate your files.");
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckIncompatibleMods();
|
CheckIncompatibleMods();
|
||||||
} else if (message->type == MessagingInterface::kPreLoadGame) {
|
|
||||||
//
|
|
||||||
} else if ((message->type == MessagingInterface::kPostLoadGame && message->data) || message->type == MessagingInterface::kNewGame) {
|
} else if ((message->type == MessagingInterface::kPostLoadGame && message->data) || message->type == MessagingInterface::kNewGame) {
|
||||||
NewGameCount(true);
|
NewGameCount(true);
|
||||||
}
|
}
|
||||||
|
@ -101,6 +102,18 @@ namespace {
|
||||||
|
|
||||||
SKSEPluginLoad(const LoadInterface* skse) {
|
SKSEPluginLoad(const LoadInterface* skse) {
|
||||||
|
|
||||||
|
if (DataFileExists("Dawnguard.esm") || DataFileExists("Dragonborn.esm") || DataFileExists("HearthFires.esm") || DataFileExists("Update.esm")) {
|
||||||
|
MessageBoxW(NULL, L"Skyrim DLCs are incompatible with Enderal.", L"Error", MB_OK | MB_ICONERROR);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DataFileExists("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);
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckCCMods();
|
||||||
|
|
||||||
GetLoadInterface(skse);
|
GetLoadInterface(skse);
|
||||||
|
|
||||||
InitializeLogging();
|
InitializeLogging();
|
||||||
|
@ -114,6 +127,8 @@ SKSEPluginLoad(const LoadInterface* skse) {
|
||||||
Init(skse);
|
Init(skse);
|
||||||
InitializeMessaging();
|
InitializeMessaging();
|
||||||
|
|
||||||
|
SKSE::GetModCallbackEventSource()->AddEventSink(EventListener::GetSingleton());
|
||||||
|
|
||||||
GetPapyrusInterface()->Register(Papyrus::Bind);
|
GetPapyrusInterface()->Register(Papyrus::Bind);
|
||||||
|
|
||||||
if (!IsVR()) {
|
if (!IsVR()) {
|
||||||
|
|
|
@ -34,27 +34,6 @@ inline bool IsVR()
|
||||||
return GetLoadInterface()->RuntimeVersion() == SKSE::RUNTIME_VR_1_4_15 || GetLoadInterface()->RuntimeVersion() == SKSE::RUNTIME_LATEST_VR;
|
return GetLoadInterface()->RuntimeVersion() == SKSE::RUNTIME_VR_1_4_15 || GetLoadInterface()->RuntimeVersion() == SKSE::RUNTIME_LATEST_VR;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void SetINISettings()
|
|
||||||
{
|
|
||||||
auto* setting = RE::INIPrefSettingCollection::GetSingleton()->GetSetting("bFreebiesSeen:General");
|
|
||||||
if (setting && !setting->GetBool()) {
|
|
||||||
setting->data.b = true;
|
|
||||||
RE::INIPrefSettingCollection::GetSingleton()->WriteSetting(setting);
|
|
||||||
}
|
|
||||||
|
|
||||||
setting = RE::INISettingCollection::GetSingleton()->GetSetting("bInvalidateOlderFiles:Archive");
|
|
||||||
if (setting && !setting->GetBool()) {
|
|
||||||
setting->data.b = true;
|
|
||||||
RE::INISettingCollection::GetSingleton()->WriteSetting(setting);
|
|
||||||
}
|
|
||||||
|
|
||||||
setting = RE::INISettingCollection::GetSingleton()->GetSetting("bModManagerMenuEnabled:General");
|
|
||||||
if (setting && setting->GetBool()) {
|
|
||||||
setting->data.b = false;
|
|
||||||
RE::INISettingCollection::GetSingleton()->WriteSetting(setting);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void CheckIncompatibleMods()
|
inline void CheckIncompatibleMods()
|
||||||
{
|
{
|
||||||
bool bPrinted = false;
|
bool bPrinted = false;
|
||||||
|
@ -82,6 +61,8 @@ inline void CheckIncompatibleMods()
|
||||||
CheckEnderalCells();
|
CheckEnderalCells();
|
||||||
CheckEnderalContainers();
|
CheckEnderalContainers();
|
||||||
CheckEnderalNPCs();
|
CheckEnderalNPCs();
|
||||||
|
CheckEnderalActivators();
|
||||||
|
CheckEnderalStatics();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void LoadINI(std::map<std::string, bool>* settings, const char* iniPath)
|
inline void LoadINI(std::map<std::string, bool>* settings, const char* iniPath)
|
||||||
|
|
|
@ -381,9 +381,9 @@ Function _UpdateNQ11(Potion newPotion)
|
||||||
|
|
||||||
If bDoneChymikum && bDoneDarkBlood
|
If bDoneChymikum && bDoneDarkBlood
|
||||||
_SetNewStageNQ11(17)
|
_SetNewStageNQ11(17)
|
||||||
ElseIf bDoneChymikum
|
|
||||||
_SetNewStageNQ11(15)
|
|
||||||
ElseIf bDoneDarkBlood
|
ElseIf bDoneDarkBlood
|
||||||
|
_SetNewStageNQ11(15)
|
||||||
|
ElseIf bDoneChymikum
|
||||||
_SetNewStageNQ11(16)
|
_SetNewStageNQ11(16)
|
||||||
EndIf
|
EndIf
|
||||||
EndIf
|
EndIf
|
||||||
|
|
Loading…
Reference in New Issue
Block a user