Map marker placement fixes:
- Allow placing map markers on discovered locations (from po3's Tweaks) - Place map markers on undiscovered locations without asking
This commit is contained in:
parent
14d17f233e
commit
9d84b0bb74
BIN
SKSE/Plugins/EnderalSE.dll
(Stored with Git LFS)
BIN
SKSE/Plugins/EnderalSE.dll
(Stored with Git LFS)
Binary file not shown.
@ -1,2 +1,3 @@
|
||||
FlatMapMarkers = true
|
||||
StayAtSystemPage = true
|
||||
MapMarkerPlacementFixes = true
|
||||
|
@ -14,6 +14,7 @@ namespace FlatMapMarkers
|
||||
inline void Install()
|
||||
{
|
||||
REL::Relocation<std::uintptr_t> offset{ RELOCATION_ID(52224, 53111), IsSE() ? 0x22F : 0x21F };
|
||||
SKSE::AllocTrampoline(14);
|
||||
auto& trampoline = SKSE::GetTrampoline();
|
||||
trampoline.write_call<5>(offset.address(), &Hook_WorldPtToScreenPt3);
|
||||
}
|
||||
|
@ -3,12 +3,14 @@
|
||||
#include "Papyrus.h"
|
||||
#include "FlatMapMarkers.h"
|
||||
#include "StayAtSystemPage.h"
|
||||
#include "MapMarkerPlacement.h"
|
||||
|
||||
using namespace SKSE;
|
||||
|
||||
static std::map<std::string, bool> g_settings{
|
||||
{ "FlatMapMarkers", true },
|
||||
{ "StayAtSystemPage", true }
|
||||
{ "StayAtSystemPage", true },
|
||||
{ "MapMarkerPlacementFixes", true }
|
||||
};
|
||||
|
||||
namespace {
|
||||
@ -48,7 +50,10 @@ namespace {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
if (g_settings.at("MapMarkerPlacementFixes")) {
|
||||
logger::info("Initializing map market placement fixes...");
|
||||
MapMarkerPlacement::Install();
|
||||
}
|
||||
} else if (message->type == MessagingInterface::kDataLoaded) {
|
||||
const auto dataHandler = RE::TESDataHandler::GetSingleton();
|
||||
if (dataHandler) {
|
||||
@ -148,7 +153,6 @@ SKSEPluginLoad(const LoadInterface* skse) {
|
||||
if (!IsVR()) {
|
||||
if (g_settings.at("FlatMapMarkers")) {
|
||||
logger::info("Initializing Flat Map Markers...");
|
||||
SKSE::AllocTrampoline(1 << 4);
|
||||
FlatMapMarkers::Install();
|
||||
}
|
||||
if (g_settings.at("StayAtSystemPage")) {
|
||||
|
67
source/Enderal DLL/src/MapMarkerPlacement.h
Normal file
67
source/Enderal DLL/src/MapMarkerPlacement.h
Normal file
@ -0,0 +1,67 @@
|
||||
#pragma once
|
||||
|
||||
// Based on powerofthree's Tweaks 1.8.1 by powerofthree (MIT)
|
||||
namespace MapMarkerPlacement
|
||||
{
|
||||
constexpr std::uint8_t NOP{ 0x90 };
|
||||
|
||||
struct IsFastTravelEnabled
|
||||
{
|
||||
static bool thunk(RE::PlayerCharacter* a_this, bool a_hideNotification)
|
||||
{
|
||||
const auto enabled = func(a_this, a_hideNotification);
|
||||
if (!enabled) {
|
||||
if (const auto mapMenu = RE::UI::GetSingleton()->GetMenu<RE::MapMenu>(); mapMenu) {
|
||||
mapMenu->PlaceMarker();
|
||||
}
|
||||
}
|
||||
return enabled;
|
||||
}
|
||||
static inline REL::Relocation<decltype(thunk)> func;
|
||||
};
|
||||
|
||||
void InstallPlacementDiscoveredFix()
|
||||
{
|
||||
// Place a marker, if a location has been discovered and fast travel is disabled
|
||||
|
||||
REL::Relocation<std::uintptr_t> target{ REL::RelocationID(52208, 53095), REL::Relocate(0x2C5, 0x328, 0x358) };
|
||||
auto& trampoline = SKSE::GetTrampoline();
|
||||
|
||||
SKSE::AllocTrampoline(14);
|
||||
IsFastTravelEnabled::func = trampoline.write_call<5>(target.address(), IsFastTravelEnabled::thunk);
|
||||
|
||||
logger::info("Applied discovered map marker placement fix"sv);
|
||||
}
|
||||
|
||||
void InstallPlacementUndiscoveredFix()
|
||||
{
|
||||
// Place a marker without asking, if a location isn't discovered yet
|
||||
|
||||
REL::Relocation<std::uintptr_t> target2{ REL::RelocationID(52208, 53095), REL::Relocate(0x17A, 0x183) };
|
||||
std::uint8_t code[] = { 0xB0, 0x01, NOP, NOP, NOP };
|
||||
REL::safe_write(target2.address(), code, 5);
|
||||
|
||||
logger::info("Applied undiscovered map marker placement fix"sv);
|
||||
}
|
||||
|
||||
void Install()
|
||||
{
|
||||
if (GetLoadInterface()->GetPluginInfo("DisableFastTravel")) {
|
||||
logger::info("Detected Disable Fast Travel SKSE, skipping discovered map marker placement fix");
|
||||
} else if (!GetLoadInterface()->GetPluginInfo("po3_Tweaks")) {
|
||||
InstallPlacementDiscoveredFix();
|
||||
} else if (std::filesystem::exists("Data/SKSE/Plugins/po3_Tweaks.ini")) {
|
||||
CSimpleIniA ini;
|
||||
ini.SetMultiKey(false);
|
||||
ini.LoadFile("Data/SKSE/Plugins/po3_Tweaks.ini");
|
||||
if (!ini.GetBoolValue("Fixes", "Map Marker Placement Fix", false)) {
|
||||
logger::info("Detected po3's Tweaks with disabled discovered Map Marker Placement Fix");
|
||||
InstallPlacementDiscoveredFix();
|
||||
} else {
|
||||
logger::info("Detected po3's Tweaks with enabled discovered Map Marker Placement Fix");
|
||||
}
|
||||
}
|
||||
|
||||
InstallPlacementUndiscoveredFix();
|
||||
}
|
||||
}
|
@ -1,15 +1,20 @@
|
||||
{
|
||||
"registries": [
|
||||
{
|
||||
"kind": "git",
|
||||
"repository": "https://gitlab.com/colorglass/vcpkg-colorglass",
|
||||
"baseline": "6309841a1ce770409708a67a9ba5c26c537d2937",
|
||||
"packages": [
|
||||
"commonlibsse-ng",
|
||||
"gluino",
|
||||
"script-extender-common",
|
||||
"skse"
|
||||
]
|
||||
}
|
||||
]
|
||||
"default-registry": {
|
||||
"kind": "git",
|
||||
"repository": "https://github.com/microsoft/vcpkg.git",
|
||||
"baseline": "08c4e71048eb54733d9b180a28b9b1d7ce637454"
|
||||
},
|
||||
"registries": [
|
||||
{
|
||||
"kind": "git",
|
||||
"repository": "https://gitlab.com/colorglass/vcpkg-colorglass",
|
||||
"baseline": "6309841a1ce770409708a67a9ba5c26c537d2937",
|
||||
"packages": [
|
||||
"commonlibsse-ng",
|
||||
"gluino",
|
||||
"script-extender-common",
|
||||
"skse"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user