Force borderless mode with INI toggle, a workaround for freezing during Bink playback
This commit is contained in:
parent
34e767ca27
commit
afa68ffd25
@ -12,15 +12,16 @@
|
|||||||
- [Scrambled Bugs](https://www.nexusmods.com/skyrimspecialedition/mods/43532)
|
- [Scrambled Bugs](https://www.nexusmods.com/skyrimspecialedition/mods/43532)
|
||||||
- [powerofthree's Tweaks](https://www.nexusmods.com/skyrimspecialedition/mods/51073)
|
- [powerofthree's Tweaks](https://www.nexusmods.com/skyrimspecialedition/mods/51073)
|
||||||
- [Fix Note icon for SkyUI](https://www.nexusmods.com/skyrimspecialedition/mods/32561)
|
- [Fix Note icon for SkyUI](https://www.nexusmods.com/skyrimspecialedition/mods/32561)
|
||||||
- [.NET Script Framework](https://www.nexusmods.com/skyrimspecialedition/mods/21294) (SE) or [Crash Logger](https://www.nexusmods.com/skyrimspecialedition/mods/59596) (AE)
|
- [Crash Logger](https://www.nexusmods.com/skyrimspecialedition/mods/59818) (SE/AE/VR)
|
||||||
|
|
||||||
## How to play
|
## How to run
|
||||||
- Add a new Skyrim SE instance to Mod Organizer 2.
|
- Add a new Skyrim SE instance to Mod Organizer 2.
|
||||||
- Creation Club mods must be moved to a separate mod and disabled.
|
- Creation Club mods must be moved to a separate mod and disabled.
|
||||||
- In MO2, create an empty mod, name it `Enderal SE - Media`, and copy `E - Sounds.bsa`, `L - Voices.bsa`, and the `Video` directory to it.
|
- In MO2, create an empty mod, name it `Enderal SE - Media`, and copy `E - Sounds.bsa`, `L - Voices.bsa`, and the `Video` directory to it.
|
||||||
- This repository uses LFS to store binary files, run `git lfs install` before cloning it.
|
- This repository uses LFS to store binary files, run `git lfs install` before cloning it.
|
||||||
- Clone this repository, move it to `mods` in your MO2 instance.
|
- Clone this repository, move it to `mods` in your MO2 instance.
|
||||||
- You should now have two custom mods in MO2, `Enderal SE - Media` and Enderal itself.
|
- You should now have two custom mods in MO2, `Enderal SE - Media` and Enderal itself.
|
||||||
|
- Build EnderalSE.dll.
|
||||||
- Configure the game through Skyrim Launcher.
|
- Configure the game through Skyrim Launcher.
|
||||||
- Run it with skse64_loader.exe through MO2.
|
- Run it with skse64_loader.exe through MO2.
|
||||||
|
|
||||||
|
@ -3,3 +3,4 @@ StayAtSystemPage = true
|
|||||||
MapMarkerPlacementFixes = true
|
MapMarkerPlacementFixes = true
|
||||||
AchievementFix = true
|
AchievementFix = true
|
||||||
VideoInterruptPatch = true
|
VideoInterruptPatch = true
|
||||||
|
ForceBorderless = true
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "Patches/TweenMenuPatch.h"
|
#include "Patches/TweenMenuPatch.h"
|
||||||
#include "Patches/HeroMenuPatch.h"
|
#include "Patches/HeroMenuPatch.h"
|
||||||
#include "Patches/HUDMenuPatch.h"
|
#include "Patches/HUDMenuPatch.h"
|
||||||
|
#include "Patches/ForceBorderless.h"
|
||||||
|
|
||||||
using namespace SKSE;
|
using namespace SKSE;
|
||||||
|
|
||||||
@ -18,7 +19,8 @@ static std::map<std::string, bool> g_settings{
|
|||||||
{ "StayAtSystemPage", true },
|
{ "StayAtSystemPage", true },
|
||||||
{ "MapMarkerPlacementFixes", true },
|
{ "MapMarkerPlacementFixes", true },
|
||||||
{ "AchievementFix", true },
|
{ "AchievementFix", true },
|
||||||
{ "VideoInterruptPatch", true }
|
{ "VideoInterruptPatch", true },
|
||||||
|
{ "ForceBorderless", true }
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@ -63,9 +65,9 @@ namespace {
|
|||||||
MapMarkerPlacement::Install();
|
MapMarkerPlacement::Install();
|
||||||
}
|
}
|
||||||
} else if (message->type == MessagingInterface::kDataLoaded) {
|
} else if (message->type == MessagingInterface::kDataLoaded) {
|
||||||
if (GetLoadInterface()->RuntimeVersion().minor() > 5) {
|
if (REL::Module::get().version() > REL::Version(1, 5, 97, 0)) {
|
||||||
RE::INIPrefSettingCollection::GetSingleton()->GetSetting("bFreebiesSeen:General")->data.b = true;
|
RE::INIPrefSettingCollection::GetSingleton()->GetSetting("bFreebiesSeen:General")->data.b = true;
|
||||||
if (GetLoadInterface()->RuntimeVersion().minor() > 6 || GetLoadInterface()->RuntimeVersion().patch() >= 1130) {
|
if (REL::Module::get().version() >= REL::Version(1, 6, 1130, 0)) {
|
||||||
RE::INIPrefSettingCollection::GetSingleton()->GetSetting("bUpsellOwned:General")->data.b = true;
|
RE::INIPrefSettingCollection::GetSingleton()->GetSetting("bUpsellOwned:General")->data.b = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -187,6 +189,9 @@ SKSEPluginLoad(const LoadInterface* skse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!REL::Module::IsVR()) {
|
if (!REL::Module::IsVR()) {
|
||||||
|
if (g_settings.at("ForceBorderless")) {
|
||||||
|
ForceBorderless::Install();
|
||||||
|
}
|
||||||
if (g_settings.at("FlatMapMarkers")) {
|
if (g_settings.at("FlatMapMarkers")) {
|
||||||
logger::info("Initializing Flat Map Markers...");
|
logger::info("Initializing Flat Map Markers...");
|
||||||
FlatMapMarkers::Install();
|
FlatMapMarkers::Install();
|
||||||
|
@ -6,7 +6,7 @@ namespace AchievementFix
|
|||||||
{
|
{
|
||||||
REL::Relocation<std::uintptr_t> target;
|
REL::Relocation<std::uintptr_t> target;
|
||||||
|
|
||||||
if (GetLoadInterface()->RuntimeVersion().minor() > 6 || GetLoadInterface()->RuntimeVersion().patch() >= 1130) {
|
if (REL::Module::get().version() >= REL::Version(1, 6, 1130, 0)) {
|
||||||
// Checked: 1.6.1130
|
// Checked: 1.6.1130
|
||||||
target = REL::ID(441528);
|
target = REL::ID(441528);
|
||||||
} else {
|
} else {
|
||||||
|
30
source/Enderal DLL/src/Patches/ForceBorderless.h
Normal file
30
source/Enderal DLL/src/Patches/ForceBorderless.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Bink playback is prone to freezing in bordered window, we enforce borderless mode here
|
||||||
|
namespace ForceBorderless
|
||||||
|
{
|
||||||
|
void Install()
|
||||||
|
{
|
||||||
|
if (REL::Module::IsVR()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::uint8_t code[] = { 0xB8, 0x01, 0x00, 0x00, 0x00, REL::NOP, REL::NOP }; // mov eax,0x1
|
||||||
|
auto version = REL::Module::get().version();
|
||||||
|
|
||||||
|
if (version >= REL::Version(1, 6, 1130, 0) && version <= REL::Version(1, 6, 1170, 0)) {
|
||||||
|
logger::info("Initializing borderless mode...");
|
||||||
|
REL::Relocation<std::uintptr_t> target{ REL::ID(36547), 0xBEA };
|
||||||
|
REL::safe_write(target.address(), code, sizeof(code));
|
||||||
|
|
||||||
|
} else if (version >= REL::Version(1, 5, 97, 0) && version < REL::Version(1, 6, 1130, 0)) {
|
||||||
|
logger::info("Initializing borderless mode...");
|
||||||
|
REL::Relocation<std::uintptr_t> target{ REL::RelocationID(35548, 36547), REL::Relocate(0x83A, version >= REL::Version(1, 6, 342, 0) ? version >= REL::Version(1, 6, 629, 0) ? 0xCFA : 0xCDA : 0xCBB) };
|
||||||
|
REL::safe_write(target.address(), code, sizeof(code));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
logger::info("Untested version of Skyrim, skipping borderless mode...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user