Advertisement
expired6978

main.cpp

Apr 28th, 2013
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.61 KB | None | 0 0
  1. #include "skse/PluginAPI.h"
  2. #include "skse/skse_version.h"
  3. #include "skse/SafeWrite.h"
  4. #include "skse/GameAPI.h"
  5. #include "skse/ScaleformAPI.h"
  6. #include "skse/Utilities.h"
  7. #include "skse/ScaleformCallbacks.h"
  8. #include "skse/GameTypes.h"
  9. #include <shlobj.h>
  10.  
  11. IDebugLog   gLog;
  12.  
  13. PluginHandle    g_pluginHandle = kPluginHandle_Invalid;
  14.  
  15. class IMenu
  16. {
  17. public:
  18.     IMenu() { CALL_MEMBER_FN(this, ctor)(); };
  19.     virtual ~IMenu() { CALL_MEMBER_FN(this, dtor)(); };
  20.  
  21.     virtual void    Add(FxDelegateHandler::CallbackProcessor * processor) { };
  22.     virtual void    InstallCallbacks(FxDelegateHandler::AddCallbackVisitor * visitor) { };
  23.     virtual void    Unk_02(void) { };
  24.     virtual void    Unk_03(void) { };
  25.     virtual UInt32  Unk_04(void * arg) { return CALL_MEMBER_FN(this, unk_04)(arg); };
  26.     virtual void    Unk_05(UInt32 arg0, UInt32 arg1) { return CALL_MEMBER_FN(this, unk_05)(arg0, arg1); };  // CurrentTime
  27.     virtual void    Unk_06(void) { return CALL_MEMBER_FN(this, unk_06)(); };
  28.     virtual void    Unk_07(void) { };
  29.     virtual void    Unk_08(void) { return CALL_MEMBER_FN(this, unk_08)(); };
  30.  
  31.     UInt32          refCount;   // 04
  32.     GFxMovieView    * view;     // 08 - init'd to 0, a class, virtual fn 0x114 called in dtor
  33.     UInt8           unk0C;      // 0C - init'd to 3
  34.     UInt8           pad0D[3];   // 0D
  35.     UInt32          unk10;      // 10 - init'd to 0
  36.     UInt32          unk14;      // 14 - init'd to 0x12
  37.     GRefCountBase   * unk18;    // 18 - holds a reference
  38.  
  39.     MEMBER_FN_PREFIX(IMenu);
  40.     DEFINE_MEMBER_FN(unk_04, UInt32, 0x00A64940, void *);
  41.     DEFINE_MEMBER_FN(unk_05, void, 0x00A64980, UInt32 arg0, UInt32 arg1);
  42.     DEFINE_MEMBER_FN(unk_06, void, 0x00847000);
  43.     DEFINE_MEMBER_FN(unk_08, void, 0x00A64BA0);
  44.     DEFINE_MEMBER_FN(ctor, IMenu *, 0x00A64B70);
  45.     DEFINE_MEMBER_FN(dtor, void, 0x00A64BB0);
  46. };
  47.  
  48. class MenuManager
  49. {
  50. public:
  51.     MEMBER_FN_PREFIX(MenuManager);
  52.     DEFINE_MEMBER_FN(IsMenuOpen, bool, 0x00A5CE90, BSFixedString * menuName);
  53.     DEFINE_MEMBER_FN(Register, void, 0x00A5D2A0, const char * name, void * ctorFunc);
  54.  
  55.     static MenuManager * GetSingleton(void)
  56.     {
  57.         return *((MenuManager **)0x012E3548);
  58.     }
  59. };
  60.  
  61. class GFxMovieManager
  62. {
  63. public:
  64.     MEMBER_FN_PREFIX(GFxMovieManager);
  65.     DEFINE_MEMBER_FN(CreateMovieView, bool, 0x00A60C80, IMenu * menu, GFxMovieView ** view, const char * menuName, UInt32 unk1, UInt32 unk2);
  66.  
  67.     static GFxMovieManager * GetSingleton(void)
  68.     {
  69.         return *((GFxMovieManager **)0x01B2E9B0);
  70.     }
  71. };
  72.  
  73. class CustomMenu : public IMenu
  74. {
  75. public:
  76.     CustomMenu();
  77.  
  78.     static void * operator new(std::size_t size)
  79.     {
  80.         return ScaleformHeap_Allocate(size);
  81.     }
  82.  
  83.     static void * operator new(std::size_t size, const std::nothrow_t &)
  84.     {
  85.         return ScaleformHeap_Allocate(size);
  86.     }
  87.  
  88.     // placement new
  89.     static void * operator new(std::size_t size, void * ptr)
  90.     {
  91.         return ptr;
  92.     }
  93. };
  94.  
  95. IMenu * _cdecl CreateCustomMenu()
  96. {
  97.     //_MESSAGE("Creating custom menu...");
  98.     return (IMenu *)new CustomMenu();
  99. }
  100.  
  101. CustomMenu::CustomMenu()
  102. {
  103.     //_MESSAGE("Loading movie...");
  104.     GFxMovieManager * movieManager = GFxMovieManager::GetSingleton();
  105.     CALL_MEMBER_FN(movieManager, CreateMovieView)(this, &view, "CustomMenu", 3, 0); // 1 - TopMenu, 2 - CursorMenu
  106.     unk10 = 0xA489;
  107.     unk14 = 3;
  108.     unk0C = 0;
  109. }
  110.  
  111. void _stdcall LoadCustomMenu()
  112. {
  113.     _MESSAGE("Registered custom menu");
  114.     CALL_MEMBER_FN(MenuManager::GetSingleton(), Register)("CustomMenu", (void*)CreateCustomMenu);
  115. }
  116.  
  117. static const UInt32 kInstallMenuManagerHook_Base = 0x0087A1BE;
  118. static const UInt32 kInstallMenuManagerHook_Entry_retn = kInstallMenuManagerHook_Base + 0x05;
  119.  
  120. __declspec(naked) void InstallHooks_Entry(void)
  121. {
  122.     __asm
  123.     {
  124.         pushad
  125.         call    LoadCustomMenu  // stdcall so we don't need to do work
  126.         popad
  127.  
  128.         pop     edi
  129.         mov     eax, esi
  130.         pop     esi
  131.         pop     ebp
  132.  
  133.         jmp     [kInstallMenuManagerHook_Entry_retn]
  134.     }
  135. }
  136.  
  137. extern "C"
  138. {
  139.  
  140. bool SKSEPlugin_Query(const SKSEInterface * skse, PluginInfo * info)
  141. {
  142.     gLog.OpenRelative(CSIDL_MYDOCUMENTS, "\\My Games\\Skyrim\\SKSE\\skse_menumanager.log");
  143.     _MESSAGE("skse_menumanager");
  144.  
  145.     // populate info structure
  146.     info->infoVersion = PluginInfo::kInfoVersion;
  147.     info->name =        "menumanager";
  148.     info->version =     1;
  149.  
  150.     // store plugin handle so we can identify ourselves later
  151.     g_pluginHandle = skse->GetPluginHandle();
  152.  
  153.     if(skse->isEditor)
  154.     {
  155.         _MESSAGE("loaded in editor, marking as incompatible");
  156.  
  157.         return false;
  158.     }
  159.     else if(skse->runtimeVersion != RUNTIME_VERSION_1_9_32_0)
  160.     {
  161.         _MESSAGE("unsupported runtime version %08X", skse->runtimeVersion);
  162.  
  163.         return false;
  164.     }
  165.  
  166.     // supported runtime version
  167.     return true;
  168. }
  169.  
  170. bool SKSEPlugin_Load(const SKSEInterface * skse)
  171. {
  172.     _MESSAGE("MenuManager Enabled");
  173.  
  174.     WriteRelJump(kInstallMenuManagerHook_Base, (UInt32)InstallHooks_Entry);
  175.     return true;
  176. }
  177.  
  178. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement