Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "skse/PluginAPI.h"
- #include "skse/skse_version.h"
- #include "skse/SafeWrite.h"
- #include "skse/GameAPI.h"
- #include "skse/ScaleformAPI.h"
- #include "skse/Utilities.h"
- #include "skse/ScaleformCallbacks.h"
- #include "skse/GameTypes.h"
- #include <shlobj.h>
- IDebugLog gLog;
- PluginHandle g_pluginHandle = kPluginHandle_Invalid;
- class IMenu
- {
- public:
- IMenu() { CALL_MEMBER_FN(this, ctor)(); };
- virtual ~IMenu() { CALL_MEMBER_FN(this, dtor)(); };
- virtual void Add(FxDelegateHandler::CallbackProcessor * processor) { };
- virtual void InstallCallbacks(FxDelegateHandler::AddCallbackVisitor * visitor) { };
- virtual void Unk_02(void) { };
- virtual void Unk_03(void) { };
- virtual UInt32 Unk_04(void * arg) { return CALL_MEMBER_FN(this, unk_04)(arg); };
- virtual void Unk_05(UInt32 arg0, UInt32 arg1) { return CALL_MEMBER_FN(this, unk_05)(arg0, arg1); }; // CurrentTime
- virtual void Unk_06(void) { return CALL_MEMBER_FN(this, unk_06)(); };
- virtual void Unk_07(void) { };
- virtual void Unk_08(void) { return CALL_MEMBER_FN(this, unk_08)(); };
- UInt32 refCount; // 04
- GFxMovieView * view; // 08 - init'd to 0, a class, virtual fn 0x114 called in dtor
- UInt8 unk0C; // 0C - init'd to 3
- UInt8 pad0D[3]; // 0D
- UInt32 unk10; // 10 - init'd to 0
- UInt32 unk14; // 14 - init'd to 0x12
- GRefCountBase * unk18; // 18 - holds a reference
- MEMBER_FN_PREFIX(IMenu);
- DEFINE_MEMBER_FN(unk_04, UInt32, 0x00A64940, void *);
- DEFINE_MEMBER_FN(unk_05, void, 0x00A64980, UInt32 arg0, UInt32 arg1);
- DEFINE_MEMBER_FN(unk_06, void, 0x00847000);
- DEFINE_MEMBER_FN(unk_08, void, 0x00A64BA0);
- DEFINE_MEMBER_FN(ctor, IMenu *, 0x00A64B70);
- DEFINE_MEMBER_FN(dtor, void, 0x00A64BB0);
- };
- class MenuManager
- {
- public:
- MEMBER_FN_PREFIX(MenuManager);
- DEFINE_MEMBER_FN(IsMenuOpen, bool, 0x00A5CE90, BSFixedString * menuName);
- DEFINE_MEMBER_FN(Register, void, 0x00A5D2A0, const char * name, void * ctorFunc);
- static MenuManager * GetSingleton(void)
- {
- return *((MenuManager **)0x012E3548);
- }
- };
- class GFxMovieManager
- {
- public:
- MEMBER_FN_PREFIX(GFxMovieManager);
- DEFINE_MEMBER_FN(CreateMovieView, bool, 0x00A60C80, IMenu * menu, GFxMovieView ** view, const char * menuName, UInt32 unk1, UInt32 unk2);
- static GFxMovieManager * GetSingleton(void)
- {
- return *((GFxMovieManager **)0x01B2E9B0);
- }
- };
- class CustomMenu : public IMenu
- {
- public:
- CustomMenu();
- static void * operator new(std::size_t size)
- {
- return ScaleformHeap_Allocate(size);
- }
- static void * operator new(std::size_t size, const std::nothrow_t &)
- {
- return ScaleformHeap_Allocate(size);
- }
- // placement new
- static void * operator new(std::size_t size, void * ptr)
- {
- return ptr;
- }
- };
- IMenu * _cdecl CreateCustomMenu()
- {
- //_MESSAGE("Creating custom menu...");
- return (IMenu *)new CustomMenu();
- }
- CustomMenu::CustomMenu()
- {
- //_MESSAGE("Loading movie...");
- GFxMovieManager * movieManager = GFxMovieManager::GetSingleton();
- CALL_MEMBER_FN(movieManager, CreateMovieView)(this, &view, "CustomMenu", 3, 0); // 1 - TopMenu, 2 - CursorMenu
- unk10 = 0xA489;
- unk14 = 3;
- unk0C = 0;
- }
- void _stdcall LoadCustomMenu()
- {
- _MESSAGE("Registered custom menu");
- CALL_MEMBER_FN(MenuManager::GetSingleton(), Register)("CustomMenu", (void*)CreateCustomMenu);
- }
- static const UInt32 kInstallMenuManagerHook_Base = 0x0087A1BE;
- static const UInt32 kInstallMenuManagerHook_Entry_retn = kInstallMenuManagerHook_Base + 0x05;
- __declspec(naked) void InstallHooks_Entry(void)
- {
- __asm
- {
- pushad
- call LoadCustomMenu // stdcall so we don't need to do work
- popad
- pop edi
- mov eax, esi
- pop esi
- pop ebp
- jmp [kInstallMenuManagerHook_Entry_retn]
- }
- }
- extern "C"
- {
- bool SKSEPlugin_Query(const SKSEInterface * skse, PluginInfo * info)
- {
- gLog.OpenRelative(CSIDL_MYDOCUMENTS, "\\My Games\\Skyrim\\SKSE\\skse_menumanager.log");
- _MESSAGE("skse_menumanager");
- // populate info structure
- info->infoVersion = PluginInfo::kInfoVersion;
- info->name = "menumanager";
- info->version = 1;
- // store plugin handle so we can identify ourselves later
- g_pluginHandle = skse->GetPluginHandle();
- if(skse->isEditor)
- {
- _MESSAGE("loaded in editor, marking as incompatible");
- return false;
- }
- else if(skse->runtimeVersion != RUNTIME_VERSION_1_9_32_0)
- {
- _MESSAGE("unsupported runtime version %08X", skse->runtimeVersion);
- return false;
- }
- // supported runtime version
- return true;
- }
- bool SKSEPlugin_Load(const SKSEInterface * skse)
- {
- _MESSAGE("MenuManager Enabled");
- WriteRelJump(kInstallMenuManagerHook_Base, (UInt32)InstallHooks_Entry);
- return true;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement