Initial commit - migrate to Forgejo

This commit is contained in:
Azrub 2026-04-15 01:43:52 +02:00
commit 37001f0982
11 changed files with 1338 additions and 0 deletions

122
.gitignore vendored Normal file
View file

@ -0,0 +1,122 @@
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Linker files
*.ilk
# Debugger Files
*.pdb
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
# Debug information files
*.dwo
# Visual Studio specific files
.vs/
*.suo
*.user
*.userosscache
*.sln.docstates
*.vsidx
*.vspscc
*.vssscc
.builds/
*.pidb
*.svclog
*.scc
# Visual Studio additional files
*.vcxproj.user
*.sdf
*.opensdf
*.db
*.opendb
*.idb
*.exp
# Build folders
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
build/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# MSBuild
*.log
*.wrn
*.err
*.unsuccessfulbuild
*.lastbuildstate
*.command.*
*.read.*
*.write.*
link-*
# Backup files
*.bak
*~
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Temporary files
*.tmp
*.temp
# IDE files
*.swp
*.swo
# Package files (vcpkg, NuGet)
packages/
vcpkg_installed/
# Visual Studio Code
.vscode/
# JetBrains IDEs
.idea/
# Resource compiled files
*.aps

28
CursorAnchor.sln Normal file
View file

@ -0,0 +1,28 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.12.35527.113 d17.12
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CursorAnchor", "CursorAnchor\CursorAnchor.vcxproj", "{2C08EE0E-E20C-41E0-8A97-EC2D1FA6FAAE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2C08EE0E-E20C-41E0-8A97-EC2D1FA6FAAE}.Debug|x64.ActiveCfg = Debug|x64
{2C08EE0E-E20C-41E0-8A97-EC2D1FA6FAAE}.Debug|x64.Build.0 = Debug|x64
{2C08EE0E-E20C-41E0-8A97-EC2D1FA6FAAE}.Debug|x86.ActiveCfg = Debug|Win32
{2C08EE0E-E20C-41E0-8A97-EC2D1FA6FAAE}.Debug|x86.Build.0 = Debug|Win32
{2C08EE0E-E20C-41E0-8A97-EC2D1FA6FAAE}.Release|x64.ActiveCfg = Release|x64
{2C08EE0E-E20C-41E0-8A97-EC2D1FA6FAAE}.Release|x64.Build.0 = Release|x64
{2C08EE0E-E20C-41E0-8A97-EC2D1FA6FAAE}.Release|x86.ActiveCfg = Release|Win32
{2C08EE0E-E20C-41E0-8A97-EC2D1FA6FAAE}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,167 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{2c08ee0e-e20c-41e0-8a97-ec2d1fa6faae}</ProjectGuid>
<RootNamespace>CursorAnchor</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;CURSORANCHOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>
</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;CURSORANCHOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>
</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;CURSORANCHOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalIncludeDirectories>
</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;CURSORANCHOR_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>
</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="Dependencies\nexus\Nexus.h" />
<ClInclude Include="framework.h" />
<ClInclude Include="pch.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp" />
<ClCompile Include="pch.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View file

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="File di origine">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="File di intestazione">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="File di risorse">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Dependencies">
<UniqueIdentifier>{02127372-2d70-4bd6-8971-ec8977e0ee4b}</UniqueIdentifier>
</Filter>
<Filter Include="Dependencies\nexus">
<UniqueIdentifier>{b77417b3-3719-455a-b7bf-410b1bef7579}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="pch.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Dependencies\nexus\Nexus.h">
<Filter>Dependencies\nexus</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp">
<Filter>File di origine</Filter>
</ClCompile>
<ClCompile Include="pch.cpp">
<Filter>File di origine</Filter>
</ClCompile>
</ItemGroup>
</Project>

View file

@ -0,0 +1,795 @@
#ifndef NEXUS_H
#define NEXUS_H
#include <windows.h>
#ifndef __cplusplus
#include <stdbool.h>
#endif
#define NEXUS_API_VERSION 6
typedef enum ERenderType
{
ERenderType_PreRender,
ERenderType_Render,
ERenderType_PostRender,
ERenderType_OptionsRender
} ERenderType;
///----------------------------------------------------------------------------------------------------
/// GUI_RENDER:
/// Render callback signature.
///----------------------------------------------------------------------------------------------------
typedef void (*GUI_RENDER) (void);
typedef void (*GUI_ADDRENDER) (ERenderType aRenderType, GUI_RENDER aRenderCallback);
typedef void (*GUI_REMRENDER) (GUI_RENDER aRenderCallback);
typedef void (*GUI_REGISTERCLOSEONESCAPE)(const char* aWindowName, bool* aIsVisible);
typedef void (*GUI_DEREGISTERCLOSEONESCAPE)(const char* aWindowName);
typedef void (*UPDATER_REQUESTUPDATE)(signed int aSignature, const char* aUpdateURL);
typedef const char* (*PATHS_GETGAMEDIR)(void);
typedef const char* (*PATHS_GETADDONDIR)(const char* aName);
typedef const char* (*PATHS_GETCOMMONDIR)(void);
typedef enum EMHStatus
{
MH_UNKNOWN = -1,
MH_OK = 0,
MH_ERROR_ALREADY_INITIALIZED,
MH_ERROR_NOT_INITIALIZED,
MH_ERROR_ALREADY_CREATED,
MH_ERROR_NOT_CREATED,
MH_ERROR_ENABLED,
MH_ERROR_DISABLED,
MH_ERROR_NOT_EXECUTABLE,
MH_ERROR_UNSUPPORTED_FUNCTION,
MH_ERROR_MEMORY_ALLOC,
MH_ERROR_MEMORY_PROTECT,
MH_ERROR_MODULE_NOT_FOUND,
MH_ERROR_FUNCTION_NOT_FOUND
} EMHStatus;
typedef EMHStatus(__stdcall* MINHOOK_CREATE)(LPVOID pTarget, LPVOID pDetour, LPVOID* ppOriginal);
typedef EMHStatus(__stdcall* MINHOOK_REMOVE)(LPVOID pTarget);
typedef EMHStatus(__stdcall* MINHOOK_ENABLE)(LPVOID pTarget);
typedef EMHStatus(__stdcall* MINHOOK_DISABLE)(LPVOID pTarget);
typedef enum ELogLevel
{
ELogLevel_OFF = 0,
ELogLevel_CRITICAL = 1,
ELogLevel_WARNING = 2,
ELogLevel_INFO = 3,
ELogLevel_DEBUG = 4,
ELogLevel_TRACE = 5,
ELogLevel_ALL
} ELogLevel;
typedef void (*LOGGER_LOG2)(ELogLevel aLogLevel, const char* aChannel, const char* aStr);
typedef void (*ALERTS_NOTIFY)(const char* aMessage);
///----------------------------------------------------------------------------------------------------
/// EVENT_CONSUME:
/// Event consume callback signature.
/// aEventArgs is payload and should be known to consumer.
///----------------------------------------------------------------------------------------------------
typedef void (*EVENT_CONSUME)(void* aEventArgs);
typedef void (*EVENTS_RAISE)(const char* aIdentifier, void* aEventData);
typedef void (*EVENTS_RAISENOTIFICATION)(const char* aIdentifier);
typedef void (*EVENTS_RAISE_TARGETED)(signed int aSignature, const char* aIdentifier, void* aEventData);
typedef void (*EVENTS_RAISENOTIFICATION_TARGETED)(signed int aSignature, const char* aIdentifier);
typedef void (*EVENTS_SUBSCRIBE)(const char* aIdentifier, EVENT_CONSUME aConsumeEventCallback);
///----------------------------------------------------------------------------------------------------
/// WNDPROC_CALLBACK:
/// Slightly different WndProc signature.
/// Return 0 if your addon handled it and you don't want it to be passed to the game.
///----------------------------------------------------------------------------------------------------
typedef UINT(*WNDPROC_CALLBACK)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
typedef void (*WNDPROC_ADDREM)(WNDPROC_CALLBACK aWndProcCallback);
typedef LRESULT(*WNDPROC_SENDTOGAME)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
typedef struct Keybind
{
unsigned short Key;
bool Alt;
bool Ctrl;
bool Shift;
} Keybind;
///----------------------------------------------------------------------------------------------------
/// KEYBINDS_PROCESS:
/// KeybindHandler callback signature.
/// aIsRelease will be true if the keybind is released.
///----------------------------------------------------------------------------------------------------
typedef void (*KEYBINDS_PROCESS)(const char* aIdentifier, bool aIsRelease);
typedef void (*KEYBINDS_INVOKE)(const char* aIdentifier, bool aIsRelease);
typedef void (*KEYBINDS_REGISTERWITHSTRING)(const char* aIdentifier, KEYBINDS_PROCESS aKeybindHandler, const char* aKeybind);
typedef void (*KEYBINDS_REGISTERWITHSTRUCT)(const char* aIdentifier, KEYBINDS_PROCESS aKeybindHandler, Keybind aKeybind);
typedef void (*KEYBINDS_DEREGISTER)(const char* aIdentifier);
typedef enum EGameBinds
{
// Movement
EGameBinds_MoveForward = 0,
EGameBinds_MoveBackward = 1,
EGameBinds_MoveLeft = 2,
EGameBinds_MoveRight = 3,
EGameBinds_MoveTurnLeft = 4,
EGameBinds_MoveTurnRight = 5,
EGameBinds_MoveDodge = 6,
EGameBinds_MoveAutoRun = 7,
EGameBinds_MoveWalk = 8,
EGameBinds_MoveJump = 9,
EGameBinds_MoveSwimUp = 10,
EGameBinds_MoveSwimDown = 11,
EGameBinds_MoveAboutFace = 12,
// Skills
EGameBinds_SkillWeaponSwap = 17,
EGameBinds_SkillWeapon1 = 18,
EGameBinds_SkillWeapon2 = 19,
EGameBinds_SkillWeapon3 = 20,
EGameBinds_SkillWeapon4 = 21,
EGameBinds_SkillWeapon5 = 22,
EGameBinds_SkillHeal = 23,
EGameBinds_SkillUtility1 = 24,
EGameBinds_SkillUtility2 = 25,
EGameBinds_SkillUtility3 = 26,
EGameBinds_SkillElite = 27,
EGameBinds_SkillProfession1 = 28,
EGameBinds_SkillProfession2 = 29,
EGameBinds_SkillProfession3 = 30,
EGameBinds_SkillProfession4 = 31,
EGameBinds_SkillProfession5 = 79,
EGameBinds_SkillProfession6 = 201,
EGameBinds_SkillProfession7 = 202,
EGameBinds_SkillSpecialAction = 82,
// Targeting
EGameBinds_TargetAlert = 131,
EGameBinds_TargetCall = 32,
EGameBinds_TargetTake = 33,
EGameBinds_TargetCallLocal = 199,
EGameBinds_TargetTakeLocal = 200,
EGameBinds_TargetEnemyNearest = 34,
EGameBinds_TargetEnemyNext = 35,
EGameBinds_TargetEnemyPrev = 36,
EGameBinds_TargetAllyNearest = 37,
EGameBinds_TargetAllyNext = 38,
EGameBinds_TargetAllyPrev = 39,
EGameBinds_TargetLock = 40,
EGameBinds_TargetSnapGroundTarget = 80,
EGameBinds_TargetSnapGroundTargetToggle = 115,
EGameBinds_TargetAutoTargetingDisable = 116,
EGameBinds_TargetAutoTargetingToggle = 117,
EGameBinds_TargetAllyTargetingMode = 197,
EGameBinds_TargetAllyTargetingModeToggle = 198,
// UI Binds
EGameBinds_UiCommerce = 41, // TradingPost
EGameBinds_UiContacts = 42,
EGameBinds_UiGuild = 43,
EGameBinds_UiHero = 44,
EGameBinds_UiInventory = 45,
EGameBinds_UiKennel = 46, // Pets
EGameBinds_UiLogout = 47,
EGameBinds_UiMail = 71,
EGameBinds_UiOptions = 48,
EGameBinds_UiParty = 49,
EGameBinds_UiPvp = 73,
EGameBinds_UiPvpBuild = 75,
EGameBinds_UiScoreboard = 50,
EGameBinds_UiSeasonalObjectivesShop = 209, // Wizard's Vault
EGameBinds_UiInformation = 51,
EGameBinds_UiChatToggle = 70,
EGameBinds_UiChatCommand = 52,
EGameBinds_UiChatFocus = 53,
EGameBinds_UiChatReply = 54,
EGameBinds_UiToggle = 55,
EGameBinds_UiSquadBroadcastChatToggle = 85,
EGameBinds_UiSquadBroadcastChatCommand = 83,
EGameBinds_UiSquadBroadcastChatFocus = 84,
// Camera
EGameBinds_CameraFree = 13,
EGameBinds_CameraZoomIn = 14,
EGameBinds_CameraZoomOut = 15,
EGameBinds_CameraReverse = 16,
EGameBinds_CameraActionMode = 78,
EGameBinds_CameraActionModeDisable = 114,
// Screenshots
EGameBinds_ScreenshotNormal = 56,
EGameBinds_ScreenshotStereoscopic = 57,
// Map
EGameBinds_MapToggle = 59,
EGameBinds_MapFocusPlayer = 60,
EGameBinds_MapFloorDown = 61,
EGameBinds_MapFloorUp = 62,
EGameBinds_MapZoomIn = 63,
EGameBinds_MapZoomOut = 64,
// Mounts
EGameBinds_SpumoniToggle = 152,
EGameBinds_SpumoniMovement = 130,
EGameBinds_SpumoniSecondaryMovement = 153,
EGameBinds_SpumoniMAM01 = 155, // Raptor
EGameBinds_SpumoniMAM02 = 156, // Springer
EGameBinds_SpumoniMAM03 = 157, // Skimmer
EGameBinds_SpumoniMAM04 = 158, // Jackal
EGameBinds_SpumoniMAM05 = 159, // Griffon
EGameBinds_SpumoniMAM06 = 161, // RollerBeetle
EGameBinds_SpumoniMAM07 = 169, // Warclaw
EGameBinds_SpumoniMAM08 = 170, // Skyscale
EGameBinds_SpumoniMAM09 = 203, // SiegeTurtle
// Spectator Binds
EGameBinds_SpectatorNearestFixed = 102,
EGameBinds_SpectatorNearestPlayer = 103,
EGameBinds_SpectatorPlayerRed1 = 104,
EGameBinds_SpectatorPlayerRed2 = 105,
EGameBinds_SpectatorPlayerRed3 = 106,
EGameBinds_SpectatorPlayerRed4 = 107,
EGameBinds_SpectatorPlayerRed5 = 108,
EGameBinds_SpectatorPlayerBlue1 = 109,
EGameBinds_SpectatorPlayerBlue2 = 110,
EGameBinds_SpectatorPlayerBlue3 = 111,
EGameBinds_SpectatorPlayerBlue4 = 112,
EGameBinds_SpectatorPlayerBlue5 = 113,
EGameBinds_SpectatorFreeCamera = 120,
EGameBinds_SpectatorFreeCameraMode = 127,
EGameBinds_SpectatorFreeMoveForward = 121,
EGameBinds_SpectatorFreeMoveBackward = 122,
EGameBinds_SpectatorFreeMoveLeft = 123,
EGameBinds_SpectatorFreeMoveRight = 124,
EGameBinds_SpectatorFreeMoveUp = 125,
EGameBinds_SpectatorFreeMoveDown = 126,
// Squad Markers
EGameBinds_SquadMarkerPlaceWorld1 = 86, // Arrow
EGameBinds_SquadMarkerPlaceWorld2 = 87, // Circle
EGameBinds_SquadMarkerPlaceWorld3 = 88, // Heart
EGameBinds_SquadMarkerPlaceWorld4 = 89, // Square
EGameBinds_SquadMarkerPlaceWorld5 = 90, // Star
EGameBinds_SquadMarkerPlaceWorld6 = 91, // Swirl
EGameBinds_SquadMarkerPlaceWorld7 = 92, // Triangle
EGameBinds_SquadMarkerPlaceWorld8 = 93, // Cross
EGameBinds_SquadMarkerClearAllWorld = 119,
EGameBinds_SquadMarkerSetAgent1 = 94, // Arrow
EGameBinds_SquadMarkerSetAgent2 = 95, // Circle
EGameBinds_SquadMarkerSetAgent3 = 96, // Heart
EGameBinds_SquadMarkerSetAgent4 = 97, // Square
EGameBinds_SquadMarkerSetAgent5 = 98, // Star
EGameBinds_SquadMarkerSetAgent6 = 99, // Swirl
EGameBinds_SquadMarkerSetAgent7 = 100, // Triangle
EGameBinds_SquadMarkerSetAgent8 = 101, // Cross
EGameBinds_SquadMarkerClearAllAgent = 118,
// Mastery Skills
EGameBinds_MasteryAccess = 196,
EGameBinds_MasteryAccess01 = 204, // Fishing
EGameBinds_MasteryAccess02 = 205, // Skiff
EGameBinds_MasteryAccess03 = 206, // Jade Bot Waypoint
EGameBinds_MasteryAccess04 = 207, // Rift Scan
EGameBinds_MasteryAccess05 = 208, // Skyscale
EGameBinds_MasteryAccess06 = 211, // Homestead Doorway
// Miscellaneous Binds
EGameBinds_MiscAoELoot = 74,
EGameBinds_MiscInteract = 65,
EGameBinds_MiscShowEnemies = 66,
EGameBinds_MiscShowAllies = 67,
EGameBinds_MiscCombatStance = 68, // Stow/Draw
EGameBinds_MiscToggleLanguage = 69,
EGameBinds_MiscTogglePetCombat = 76,
EGameBinds_MiscToggleFullScreen = 160,
EGameBinds_MiscToggleDecorationMode = 210, // DecorateMode
// Toys/Novelties
EGameBinds_ToyUseDefault = 162,
EGameBinds_ToyUseSlot1 = 163, // Chair
EGameBinds_ToyUseSlot2 = 164, // Instrument
EGameBinds_ToyUseSlot3 = 165, // Held Item
EGameBinds_ToyUseSlot4 = 166, // Toy
EGameBinds_ToyUseSlot5 = 167, // Tonic
//ToyUseSlot6 unused
// Build Templates
EGameBinds_Loadout1 = 171,
EGameBinds_Loadout2 = 172,
EGameBinds_Loadout3 = 173,
EGameBinds_Loadout4 = 174,
EGameBinds_Loadout5 = 175,
EGameBinds_Loadout6 = 176,
EGameBinds_Loadout7 = 177,
EGameBinds_Loadout8 = 178,
// Equipment Templates
EGameBinds_GearLoadout1 = 182,
EGameBinds_GearLoadout2 = 183,
EGameBinds_GearLoadout3 = 184,
EGameBinds_GearLoadout4 = 185,
EGameBinds_GearLoadout5 = 186,
EGameBinds_GearLoadout6 = 187,
EGameBinds_GearLoadout7 = 188,
EGameBinds_GearLoadout8 = 189
} EGameBinds;
typedef void (*GAMEBINDS_PRESSASYNC)(EGameBinds aGameBind);
typedef void (*GAMEBINDS_RELEASEASYNC)(EGameBinds aGameBind);
typedef void (*GAMEBINDS_INVOKEASYNC)(EGameBinds aGameBind, int aDuration);
typedef void (*GAMEBINDS_PRESS)(EGameBinds aGameBind);
typedef void (*GAMEBINDS_RELEASE)(EGameBinds aGameBind);
typedef bool (*GAMEBINDS_ISBOUND)(EGameBinds aGameBind);
typedef void* (*DATALINK_GETRESOURCE)(const char* aIdentifier);
typedef void* (*DATALINK_SHARERESOURCE)(const char* aIdentifier, size_t aResourceSize);
typedef struct Texture
{
unsigned Width;
unsigned Height;
void* Resource; // ID3D11ShaderResourceView*
} Texture;
///----------------------------------------------------------------------------------------------------
/// TEXTURES_RECEIVECALLBACK:
/// TextureReceiver callback signature.
///----------------------------------------------------------------------------------------------------
typedef void (*TEXTURES_RECEIVECALLBACK)(const char* aIdentifier, Texture* aTexture);
typedef Texture* (*TEXTURES_GET)(const char* aIdentifier);
typedef Texture* (*TEXTURES_GETORCREATEFROMFILE)(const char* aIdentifier, const char* aFilename);
typedef Texture* (*TEXTURES_GETORCREATEFROMRESOURCE)(const char* aIdentifier, unsigned aResourceID, HMODULE aModule);
typedef Texture* (*TEXTURES_GETORCREATEFROMURL)(const char* aIdentifier, const char* aRemote, const char* aEndpoint);
typedef Texture* (*TEXTURES_GETORCREATEFROMMEMORY)(const char* aIdentifier, void* aData, size_t aSize);
typedef void (*TEXTURES_LOADFROMFILE)(const char* aIdentifier, const char* aFilename, TEXTURES_RECEIVECALLBACK aCallback);
typedef void (*TEXTURES_LOADFROMRESOURCE)(const char* aIdentifier, unsigned aResourceID, HMODULE aModule, TEXTURES_RECEIVECALLBACK aCallback);
typedef void (*TEXTURES_LOADFROMURL)(const char* aIdentifier, const char* aRemote, const char* aEndpoint, TEXTURES_RECEIVECALLBACK aCallback);
typedef void (*TEXTURES_LOADFROMMEMORY)(const char* aIdentifier, void* aData, size_t aSize, TEXTURES_RECEIVECALLBACK aCallback);
typedef void (*QUICKACCESS_ADDSHORTCUT) (const char* aIdentifier, const char* aTextureIdentifier, const char* aTextureHoverIdentifier, const char* aKeybindIdentifier, const char* aTooltipText);
typedef void (*QUICKACCESS_ADDSIMPLE) (const char* aIdentifier, GUI_RENDER aShortcutRenderCallback);
typedef void (*QUICKACCESS_ADDSIMPLE2) (const char* aIdentifier, const char* aTargetShortcutIdentifier, GUI_RENDER aShortcutRenderCallback);
typedef void (*QUICKACCESS_GENERIC) (const char* aIdentifier);
typedef const char* (*LOCALIZATION_TRANSLATE)(const char* aIdentifier);
typedef const char* (*LOCALIZATION_TRANSLATETO)(const char* aIdentifier, const char* aLanguageIdentifier);
typedef void (*LOCALIZATION_SET)(const char* aIdentifier, const char* aLanguageIdentifier, const char* aString);
///----------------------------------------------------------------------------------------------------
/// FONTS_RECEIVECALLBACK:
/// FontReceiver callback signature.
/// aFont = ImFont*
///----------------------------------------------------------------------------------------------------
typedef void (*FONTS_RECEIVECALLBACK)(const char* aIdentifier, void* aFont);
///----------------------------------------------------------------------------------------------------
/// FONTS_GETRELEASE:
/// Signature to get and release fonts.
///----------------------------------------------------------------------------------------------------
typedef void (*FONTS_GETRELEASE)(const char* aIdentifier, FONTS_RECEIVECALLBACK aCallback);
typedef void (*FONTS_ADDFROMFILE)(const char* aIdentifier, float aFontSize, const char* aFilename, FONTS_RECEIVECALLBACK aCallback, void* aConfig);
typedef void (*FONTS_ADDFROMRESOURCE)(const char* aIdentifier, float aFontSize, unsigned aResourceID, HMODULE aModule, FONTS_RECEIVECALLBACK aCallback, void* aConfig);
typedef void (*FONTS_ADDFROMMEMORY)(const char* aIdentifier, float aFontSize, void* aData, size_t aSize, FONTS_RECEIVECALLBACK aCallback, void* aConfig);
typedef void (*FONTS_RESIZE)(const char* aIdentifier, float aFontSize);
typedef struct NexusLinkData
{
unsigned Width;
unsigned Height;
float Scaling;
bool IsMoving;
bool IsCameraMoving;
bool IsGameplay;
void* Font; // ImFont*
void* FontBig; // ImFont*
void* FontUI; // ImFont*
} NexusLinkData;
typedef struct AddonAPI
{
/* Renderer */
void* SwapChain;
void* ImguiContext;
void* ImguiMalloc;
void* ImguiFree;
struct RendererVT
{
///----------------------------------------------------------------------------------------------------
/// Register:
/// Registers a render callback, ERenderType is either Pre, Present, Post or Options,
/// callback should be of void func().
///----------------------------------------------------------------------------------------------------
GUI_ADDRENDER Register;
///----------------------------------------------------------------------------------------------------
/// Deregister:
/// Removes the registered render callback that is passed.
///----------------------------------------------------------------------------------------------------
GUI_REMRENDER Deregister;
};
RendererVT Renderer;
///----------------------------------------------------------------------------------------------------
/// RequestUpdate:
/// Downloads the addon available at remote without checking its version.
/// The addon already did that.
/// I hope.
///----------------------------------------------------------------------------------------------------
UPDATER_REQUESTUPDATE RequestUpdate;
/* Logging */
LOGGER_LOG2 Log;
/* User Interface */
struct UIVT
{
///----------------------------------------------------------------------------------------------------
/// SendAlert:
/// Sends a text alert to the user visible for a short amount of time.
///----------------------------------------------------------------------------------------------------
ALERTS_NOTIFY SendAlert;
///----------------------------------------------------------------------------------------------------
/// RegisterCloseOnEscape:
/// Registers a window name to get its bool toggled when escape is pressed.
///----------------------------------------------------------------------------------------------------
GUI_REGISTERCLOSEONESCAPE RegisterCloseOnEscape;
///----------------------------------------------------------------------------------------------------
/// DeregisterCloseOnEscape:
/// Deregisters a window name to listen to on escape.
///----------------------------------------------------------------------------------------------------
GUI_DEREGISTERCLOSEONESCAPE DeregisterCloseOnEscape;
};
UIVT UI;
/* Paths */
struct PathsVT
{
PATHS_GETGAMEDIR GetGameDirectory;
PATHS_GETADDONDIR GetAddonDirectory;
PATHS_GETCOMMONDIR GetCommonDirectory;
};
PathsVT Paths;
/* Minhook */
struct MinHookVT
{
MINHOOK_CREATE Create;
MINHOOK_REMOVE Remove;
MINHOOK_ENABLE Enable;
MINHOOK_DISABLE Disable;
};
MinHookVT MinHook;
struct EventsVT
{
///----------------------------------------------------------------------------------------------------
/// Raise:
/// Raises an event to all subscribing addons.
/// aEventData is a pointer to the data you want to share or nullptr.
/// Addons are responsible for knowing how to interpret this data.
///----------------------------------------------------------------------------------------------------
EVENTS_RAISE Raise;
///----------------------------------------------------------------------------------------------------
/// RaiseNotification:
/// Raises an event without a payload.
/// Synonymous with RaiseEvent("EV_FOO", nullptr);
///----------------------------------------------------------------------------------------------------
EVENTS_RAISENOTIFICATION RaiseNotification;
///----------------------------------------------------------------------------------------------------
/// RaiseTargeted:
/// Raises an event targeted at a specific subscriber.
///----------------------------------------------------------------------------------------------------
EVENTS_RAISE_TARGETED RaiseTargeted;
///----------------------------------------------------------------------------------------------------
/// RaiseNotificationTargeted:
/// Raises a notification (event without payload) targeted at a specific subscriber.
///----------------------------------------------------------------------------------------------------
EVENTS_RAISENOTIFICATION_TARGETED RaiseNotificationTargeted;
///----------------------------------------------------------------------------------------------------
/// Subscribe:
/// Registers an event callback.
///----------------------------------------------------------------------------------------------------
EVENTS_SUBSCRIBE Subscribe;
///----------------------------------------------------------------------------------------------------
/// Unsubscribe:
/// Deregisters an event callback.
///----------------------------------------------------------------------------------------------------
EVENTS_SUBSCRIBE Unsubscribe;
};
EventsVT Events;
/* WndProc */
struct WndProcVT
{
///----------------------------------------------------------------------------------------------------
/// Register:
/// Registers/Deregisters a WndProc callback.
///----------------------------------------------------------------------------------------------------
WNDPROC_ADDREM Register;
///----------------------------------------------------------------------------------------------------
/// Deregister:
/// Registers/Deregisters a WndProc callback.
///----------------------------------------------------------------------------------------------------
WNDPROC_ADDREM Deregister;
///----------------------------------------------------------------------------------------------------
/// SendToGameOnly:
/// Sends a WndProc to the game only and bypasses all other hooks.
///----------------------------------------------------------------------------------------------------
WNDPROC_SENDTOGAME SendToGameOnly;
};
WndProcVT WndProc;
/* InputBinds */
struct InputBindsVT
{
///----------------------------------------------------------------------------------------------------
/// Invoke:
/// Trigger a keybind programmatically.
///----------------------------------------------------------------------------------------------------
KEYBINDS_INVOKE Invoke;
///----------------------------------------------------------------------------------------------------
/// RegisterWithString:
/// Registers a KeybindHandler callback for a given named keybind.
/// aKeybind is the default if not yet defined. Use as "ALT+CTRL+SHIFT+Q", "ALT+SHIFT+T", etc.
///----------------------------------------------------------------------------------------------------
KEYBINDS_REGISTERWITHSTRING RegisterWithString;
///----------------------------------------------------------------------------------------------------
/// RegisterWithStruct:
/// Same as KEYBINDS_REGISTERWITHSTRING except you pass a Nexus Keybind struct as a default bind.
///----------------------------------------------------------------------------------------------------
KEYBINDS_REGISTERWITHSTRUCT RegisterWithStruct;
///----------------------------------------------------------------------------------------------------
/// Deregister:
/// Deregisters a KeybindHandler callback.
///----------------------------------------------------------------------------------------------------
KEYBINDS_DEREGISTER Deregister;
};
InputBindsVT InputBinds;
/* GameBinds */
struct GameBindsVT
{
///----------------------------------------------------------------------------------------------------
/// Deregister:
/// Presses the keys of a given bind
///----------------------------------------------------------------------------------------------------
GAMEBINDS_PRESSASYNC PressAsync;
///----------------------------------------------------------------------------------------------------
/// ReleaseAsync:
/// Releases the keypresses of a given bind.
///----------------------------------------------------------------------------------------------------
GAMEBINDS_RELEASEASYNC ReleaseAsync;
///----------------------------------------------------------------------------------------------------
/// InvokeAsync:
/// Sends the keys of a given bind and then releases them after a given duration.
///----------------------------------------------------------------------------------------------------
GAMEBINDS_INVOKEASYNC InvokeAsync;
///----------------------------------------------------------------------------------------------------
/// Press:
/// Presses the keys of a given bind
///----------------------------------------------------------------------------------------------------
GAMEBINDS_PRESS Press;
///----------------------------------------------------------------------------------------------------
/// Release:
/// Releases the keypresses of a given bind.
///----------------------------------------------------------------------------------------------------
GAMEBINDS_RELEASE Release;
///----------------------------------------------------------------------------------------------------
/// IsBound:
/// Returns if a given game bind is set.
///----------------------------------------------------------------------------------------------------
GAMEBINDS_ISBOUND IsBound;
};
GameBindsVT GameBinds;
/* DataLink */
struct DataLinkVT
{
///----------------------------------------------------------------------------------------------------
/// Get:
/// Returns a pointer to the requested resource or nullptr if not existing.
///----------------------------------------------------------------------------------------------------
DATALINK_GETRESOURCE Get;
///----------------------------------------------------------------------------------------------------
/// Share:
/// Allocates a shared resource of given size and returns a pointer to it for writing.
///----------------------------------------------------------------------------------------------------
DATALINK_SHARERESOURCE Share;
};
DataLinkVT DataLink;
/* Textures */
struct TexturesVT
{
///----------------------------------------------------------------------------------------------------
/// Get:
/// Returns a Texture* or nullptr if it doesn't exist.
///----------------------------------------------------------------------------------------------------
TEXTURES_GET Get;
///----------------------------------------------------------------------------------------------------
/// GetOrCreateFromFile:
/// Returns a Texture* or if it doesn't exist yet creates it from file.
///----------------------------------------------------------------------------------------------------
TEXTURES_GETORCREATEFROMFILE GetOrCreateFromFile;
///----------------------------------------------------------------------------------------------------
/// GetOrCreateFromResource:
/// Returns a Texture* or if it doesn't exist yet creates it from resource.
///----------------------------------------------------------------------------------------------------
TEXTURES_GETORCREATEFROMRESOURCE GetOrCreateFromResource;
///----------------------------------------------------------------------------------------------------
/// GetOrCreateFromURL:
/// Returns a Texture* or if it doesn't exist yet creates it from URL.
///----------------------------------------------------------------------------------------------------
TEXTURES_GETORCREATEFROMURL GetOrCreateFromURL;
///----------------------------------------------------------------------------------------------------
/// GetOrCreateFromMemory:
/// Returns a Texture* or if it doesn't exist yet creates it from memory.
///----------------------------------------------------------------------------------------------------
TEXTURES_GETORCREATEFROMMEMORY GetOrCreateFromMemory;
///----------------------------------------------------------------------------------------------------
/// LoadFromFile:
/// Creates a texture from file and passes it to the TextureReceiver callback when finished.
///----------------------------------------------------------------------------------------------------
TEXTURES_LOADFROMFILE LoadFromFile;
///----------------------------------------------------------------------------------------------------
/// LoadFromResource:
/// Creates a texture from resource and passes it to the TextureReceiver callback when finished.
///----------------------------------------------------------------------------------------------------
TEXTURES_LOADFROMRESOURCE LoadFromResource;
///----------------------------------------------------------------------------------------------------
/// LoadFromURL:
/// Creates a texture from URL and passes it to the TextureReceiver callback when finished.
///----------------------------------------------------------------------------------------------------
TEXTURES_LOADFROMURL LoadFromURL;
///----------------------------------------------------------------------------------------------------
/// LoadFromMemory:
/// Creates a texture from memory and passes it to the TextureReceiver callback when finished.
///----------------------------------------------------------------------------------------------------
TEXTURES_LOADFROMMEMORY LoadFromMemory;
};
TexturesVT Textures;
/* Shortcuts */
struct QuickAccessVT
{
///----------------------------------------------------------------------------------------------------
/// Add:
/// Adds a shortcut icon to the QuickAccess with given texture identifiers.
/// When clicked aKeybindIdentifier will be invoked.
///----------------------------------------------------------------------------------------------------
QUICKACCESS_ADDSHORTCUT Add;
///----------------------------------------------------------------------------------------------------
/// Remove:
/// Removes a shortcut with the given identifier from Quick Access.
///----------------------------------------------------------------------------------------------------
QUICKACCESS_GENERIC Remove;
///----------------------------------------------------------------------------------------------------
/// Notify:
/// Sends a notification icon to the given shortcut.
///----------------------------------------------------------------------------------------------------
QUICKACCESS_GENERIC Notify;
///----------------------------------------------------------------------------------------------------
/// AddContextMenu:
/// Appends ImGui callback when right-clicking a shortcut icon.
///----------------------------------------------------------------------------------------------------
QUICKACCESS_ADDSIMPLE2 AddContextMenu;
///----------------------------------------------------------------------------------------------------
/// RemoveContextMenu:
/// Removes a simple shortcut / context item with the given identifier from Quick Access.
///----------------------------------------------------------------------------------------------------
QUICKACCESS_GENERIC RemoveContextMenu;
};
QuickAccessVT QuickAccess;
/* Localization */
struct LocalizationVT
{
///----------------------------------------------------------------------------------------------------
/// Translate:
/// Translates aIdentifier into current active language or returns aIdentifier if not available.
///----------------------------------------------------------------------------------------------------
LOCALIZATION_TRANSLATE Translate;
///----------------------------------------------------------------------------------------------------
/// TranslateTo:
/// Same as Translate except you can pass which language you want to translate to.
///----------------------------------------------------------------------------------------------------
LOCALIZATION_TRANSLATETO TranslateTo;
///----------------------------------------------------------------------------------------------------
/// Set:
/// Set a translated string at runtime.
///----------------------------------------------------------------------------------------------------
LOCALIZATION_SET Set;
};
LocalizationVT Localization;
/* Fonts */
struct FontsVT
{
///----------------------------------------------------------------------------------------------------
/// Get:
/// Requests a font to be sent to the given callback/receiver.
///----------------------------------------------------------------------------------------------------
FONTS_GETRELEASE Get;
///----------------------------------------------------------------------------------------------------
/// Release:
/// Releases a callback/receiver from a specific font.
///----------------------------------------------------------------------------------------------------
FONTS_GETRELEASE Release;
///----------------------------------------------------------------------------------------------------
/// AddFromFile:
/// Adds a font from disk and sends updates to the callback.
///----------------------------------------------------------------------------------------------------
FONTS_ADDFROMFILE AddFromFile;
///----------------------------------------------------------------------------------------------------
/// AddFromResource:
/// Adds a font from an embedded resource and sends updates to the callback.
///----------------------------------------------------------------------------------------------------
FONTS_ADDFROMRESOURCE AddFromResource;
///----------------------------------------------------------------------------------------------------
/// AddFromMemory:
/// Adds a font from memory and sends updates to the callback.
///----------------------------------------------------------------------------------------------------
FONTS_ADDFROMMEMORY AddFromMemory;
///----------------------------------------------------------------------------------------------------
/// Resize:
/// Resizes a font and sends updates to the callback.
///----------------------------------------------------------------------------------------------------
FONTS_RESIZE Resize;
};
FontsVT Fonts;
} AddonAPI;
typedef void (*ADDON_LOAD) (AddonAPI* aAPI);
typedef void (*ADDON_UNLOAD) (void);
typedef struct AddonVersion
{
signed short Major;
signed short Minor;
signed short Build;
signed short Revision;
} AddonVersion;
typedef enum EAddonFlags
{
EAddonFlags_None = 0,
EAddonFlags_IsVolatile = 1, /* is hooking functions or doing anything else that's volatile and game build dependant */
EAddonFlags_DisableHotloading = 2, /* prevents unloading at runtime, aka. will require a restart if updated, etc. */
EAddonFlags_OnlyLoadDuringGameLaunchSequence = 4 /* prevents loading the addon later than the initial character select */
} EAddonFlags;
typedef enum EUpdateProvider
{
EUpdateProvider_None = 0, /* Does not support auto updating */
EUpdateProvider_Raidcore = 1, /* Provider is Raidcore (via API) */
EUpdateProvider_GitHub = 2, /* Provider is GitHub Releases */
EUpdateProvider_Direct = 3, /* Provider is direct file link */
EUpdateProvider_Self = 4 /* Provider is self check, addon has to request manually and version will not be verified */
} EUpdateProvider;
typedef struct AddonDefinition
{
/* required */
signed int Signature; /* Raidcore Addon ID, set to random unqiue negative integer if not on Raidcore */
signed int APIVersion; /* Determines which AddonAPI struct revision the Loader will pass, use the NEXUS_API_VERSION define from Nexus.h */
const char* Name; /* Name of the addon as shown in the library */
AddonVersion Version;
const char* Author; /* Author of the addon */
const char* Description; /* Short description */
ADDON_LOAD Load; /* Pointer to Load Function of the addon */
ADDON_UNLOAD Unload; /* Pointer to Unload Function of the addon. Not required if EAddonFlags::DisableHotloading is set. */
EAddonFlags Flags; /* Information about the addon */
/* update fallback */
EUpdateProvider Provider; /* What platform is the the addon hosted on */
const char* UpdateLink; /* Link to the update resource */
} AddonDefinition;
#endif

95
CursorAnchor/dllmain.cpp Normal file
View file

@ -0,0 +1,95 @@
#include "pch.h"
#include "Dependencies/nexus/Nexus.h"
#include <Windows.h>
AddonAPI* g_api = nullptr;
struct {
bool enabled = false;
} g_state;
void HandleKeybind(const char* identifier, bool isRelease) {
if (!isRelease && g_state.enabled) {
POINT currentPos;
GetCursorPos(&currentPos);
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
int centerX = screenWidth / 2;
int centerY = screenHeight / 2;
if (currentPos.x != centerX || currentPos.y != centerY) {
BlockInput(TRUE);
SetCursorPos(centerX, centerY);
Sleep(1);
BlockInput(FALSE);
}
if (g_api) {
g_api->GameBinds.InvokeAsync(EGameBinds_CameraActionMode, 50);
}
}
}
void Load(AddonAPI* api) {
g_api = api;
g_state.enabled = true;
if (g_api) {
g_api->Log(ELogLevel_INFO, "CursorAnchor", "Loading addon...");
Keybind kb;
kb.Key = 0;
kb.Alt = false;
kb.Ctrl = false;
kb.Shift = false;
g_api->InputBinds.RegisterWithStruct("CursorAnchor.Center", HandleKeybind, kb);
g_api->Log(ELogLevel_INFO, "CursorAnchor", "Addon loaded successfully");
}
}
void Unload() {
if (g_api) {
g_api->InputBinds.Deregister("CursorAnchor.Center");
g_api->Log(ELogLevel_INFO, "CursorAnchor", "Addon unloaded successfully");
g_api = nullptr;
}
g_state.enabled = false;
}
extern "C" __declspec(dllexport) AddonDefinition* GetAddonDef() {
static AddonDefinition def;
def.Signature = -424242;
def.APIVersion = NEXUS_API_VERSION;
def.Name = "CursorAnchor";
def.Version.Major = 1;
def.Version.Minor = 0;
def.Version.Build = 0;
def.Version.Revision = 0;
def.Author = "Azrub";
def.Description = "Centers cursor when toggling action camera";
def.Load = Load;
def.Unload = Unload;
def.Flags = EAddonFlags_None;
def.Provider = EUpdateProvider_Direct;
def.UpdateLink = "https://git.azrub.dev/azrub/CursorAnchor/releases/download/latest/CursorAnchor.dll";
return &def;
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

5
CursorAnchor/framework.h Normal file
View file

@ -0,0 +1,5 @@
#pragma once
#define WIN32_LEAN_AND_MEAN // Escludere gli elementi usati raramente dalle intestazioni di Windows
// File di intestazione di Windows
#include <windows.h>

5
CursorAnchor/pch.cpp Normal file
View file

@ -0,0 +1,5 @@
// pch.cpp: file di origine corrispondente all'intestazione precompilata
#include "pch.h"
// Quando si usano intestazioni precompilate, questo file è necessario per la riuscita della compilazione.

13
CursorAnchor/pch.h Normal file
View file

@ -0,0 +1,13 @@
// pch.h: questo è un file di intestazione precompilata.
// I file elencati di seguito vengono compilati una sola volta, in modo da migliorare le prestazioni per le compilazioni successive.
// Questa impostazione influisce anche sulle prestazioni di IntelliSense, incluso il completamento codice e molte altre funzionalità di esplorazione del codice.
// I file elencati qui vengono però TUTTI ricompilati se uno di essi viene aggiornato da una compilazione all'altra.
// Non aggiungere qui file soggetti a frequenti aggiornamenti; in caso contrario si perderanno i vantaggi offerti in termini di prestazioni.
#ifndef PCH_H
#define PCH_H
// aggiungere qui le intestazioni da precompilare
#include "framework.h"
#endif //PCH_H

21
LICENSE Normal file
View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2024 Azrub
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

45
README.md Normal file
View file

@ -0,0 +1,45 @@
# CursorAnchor
A Guild Wars 2 addon for [Nexus](https://github.com/RaidcoreGG/Nexus) that automatically centers your cursor when toggling between target and action camera modes.
## Description
CursorAnchor solves a common annoyance in Guild Wars 2: when switching between camera modes, the game remembers your cursor position, which can be problematic if you moved your cursor far away or to a second monitor. This addon ensures your cursor is always centered when toggling camera modes.
Particularly useful for players who:
- Primarily use action camera but occasionally need target camera for specific skills
- Use multiple monitors
- Want to avoid losing track of their cursor position
## Installation
1. Install [Nexus Addon Loader](https://github.com/RaidcoreGG/Nexus)
2. Download `CursorAnchor.dll` from the [latest release](https://github.com/Azrub/CursorAnchor/releases)
3. Place the DLL in your `Guild Wars 2/addons` folder
4. Start the game
5. Keep or change your existing action camera toggle keybind in your game settings
6. In Nexus keybinds, set up the same action camera toggle key that you use in-game
7. Configure a different key for this addon (what you are actually going to use to change camera)
## Building from Source
### Requirements
- Visual Studio 2022
- Windows SDK
- C++17 or later
### Steps
1. Clone the repository
2. Open the solution in Visual Studio
3. Build the solution in Release mode
4. The compiled DLL will be in `x64/Release/CursorAnchor.dll`
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## Acknowledgments
- Thanks to the Nexus team for providing the addon framework.
- Originally created as an AutoHotkey script by me for personal use, this addon has been rewritten in C++ to leverage Nexus addon loader's capabilities for better performance and smoother integration with Guild Wars 2.