# Table of Contents - [Welcome | VEN Documentation](#welcome-ven-documentation) - [Getting Started | VEN Documentation](#getting-started-ven-documentation) - [Logging | VEN Documentation](#logging-ven-documentation) - [Hud Manager | VEN Documentation](#hud-manager-ven-documentation) - [Object Manager | VEN Documentation](#object-manager-ven-documentation) - [Events | VEN Documentation](#events-ven-documentation) - [Menu | VEN Documentation](#menu-ven-documentation) - [Clock Facade | VEN Documentation](#clock-facade-ven-documentation) - [Net Client | VEN Documentation](#net-client-ven-documentation) - [Renderer | VEN Documentation](#renderer-ven-documentation) - [Game Info | VEN Documentation](#game-info-ven-documentation) - [Nav Mesh | VEN Documentation](#nav-mesh-ven-documentation) - [Game GUI | VEN Documentation](#game-gui-ven-documentation) - [Setup | VEN Documentation](#setup-ven-documentation) - [Target Selector | VEN Documentation](#target-selector-ven-documentation) - [Orbwalker | VEN Documentation](#orbwalker-ven-documentation) - [Health Prediction | VEN Documentation](#health-prediction-ven-documentation) - [Spell Manager | VEN Documentation](#spell-manager-ven-documentation) - [Evade | VEN Documentation](#evade-ven-documentation) - [Damage | VEN Documentation](#damage-ven-documentation) - [Infotab | VEN Documentation](#infotab-ven-documentation) - [Prediction | VEN Documentation](#prediction-ven-documentation) - [Notification | VEN Documentation](#notification-ven-documentation) - [Shaders | VEN Documentation](#shaders-ven-documentation) - [Benchmark | VEN Documentation](#benchmark-ven-documentation) --- # Welcome | VEN Documentation [Skip to content](https://docs.ven.pub/#VPContent) Return to top Welcome [​](https://docs.ven.pub/#welcome) =========================================== * * * Welcome to the documentation of VEN SDK - here you will find all the required information to start writing modules for VEN. Next page will cover all the information related to the setup of the module project. --- # Getting Started | VEN Documentation [Skip to content](https://docs.ven.pub/getting-started.html#VPContent) On this page On this page Getting Started [​](https://docs.ven.pub/getting-started.html#getting-started) =============================================================================== Information to help you setup the module project Requirements [​](https://docs.ven.pub/getting-started.html#requirements) ------------------------------------------------------------------------- Visual Studio 2022 [VEN SDK](https://ven.pub/dl/sdk.zip) Creating New Project [​](https://docs.ven.pub/getting-started.html#creating-new-project) ----------------------------------------------------------------------------------------- 1. Start **Visual Studio 2022** and press "**Create a new project**" ![](https://docs.ven.pub/assets/create-new-project.e4b0e4aa.png) 2. Select "**C++ Empty Project**" and press "**Next**" ![](https://docs.ven.pub/assets/create-new-project2.1dfa71e6.png) 3. Change the name and location of the project and press "**Create**" ![](https://docs.ven.pub/assets/create-new-project3.2df1469d.png) 4. Right click on the created project and press "**Add -> New Item**" ![](https://docs.ven.pub/assets/create-new-project4.327b7c3f.png) 5. Enter the desired name of the file that will contain the entry point of the module (f.e. "**main.cpp**") ![](https://docs.ven.pub/assets/create-new-project5.f02f107e.png) Configuring the Project [​](https://docs.ven.pub/getting-started.html#configuring-the-project) ----------------------------------------------------------------------------------------------- 1. Right click on the project name and press "**Properties**" ![](https://docs.ven.pub/assets/configuring-the-project.50e6f148.png) 2. Select "**General**" and change the following settings to: * "**Output Directory**": `$(LOCALAPPDATA)\VEN\League\Modules\` * "**Configuration Type**": `Dynamic Library (.dll)` * "**C++ Language Standard**": `ISO C++20 Standard (/std:c++20)` ![](https://docs.ven.pub/assets/configuring-the-project2.5cd2854f.png) 3. Select "**C/C++ -> All Options**" and change the following settings to: * "**Runtime Library**": `Multi-threaded (/MT)` * "**SDL checks**": `No (/sdl-)` ![](https://docs.ven.pub/assets/configuring-the-project3.7864b1d1.png) 4. Copy the "**sdk**" directory from the downloaded [**VEN SDK**](https://docs.ven.pub/getting-started.html#requirements) archive to the project root directory 5. Select "**VC++ Directories**" and change "**Include Directories**" to `$(ProjectDir)sdk;$(IncludePath)` ![](https://docs.ven.pub/assets/configuring-the-project4.0c896566.png) Module Properties [​](https://docs.ven.pub/getting-started.html#module-properties) ----------------------------------------------------------------------------------- Export properties that core can read and load the module properly cpp extern "C" __declspec( dllexport ) int SDKVersion = SDK_VERSION; extern "C" __declspec( dllexport ) int SDKVersion = SDK_VERSION; Load Callback [​](https://docs.ven.pub/getting-started.html#load-callback) --------------------------------------------------------------------------- Register "**PluginLoad**" callback that triggers whenever core loads the module cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } Unload Callback [​](https://docs.ven.pub/getting-started.html#unload-callback) ------------------------------------------------------------------------------- Register "**PluginUnload**" callback that triggers whenever core unloads the module cpp extern "C" __declspec( dllexport ) void PluginUnload() { g_sdk->log_console( "[-] ExampleModule unloaded!" ); } extern "C" __declspec( dllexport ) void PluginUnload() { g_sdk->log_console( "[-] ExampleModule unloaded!" ); } Example main.cpp [​](https://docs.ven.pub/getting-started.html#example-main-cpp) --------------------------------------------------------------------------------- Example file declaring module load & unload callbacks cpp #include #include "sdk.hpp" extern "C" __declspec( dllexport ) int SDKVersion = SDK_VERSION; extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } extern "C" __declspec( dllexport ) void PluginUnload() { g_sdk->log_console( "[-] ExampleModule unloaded!" ); } #include #include "sdk.hpp" extern "C" __declspec( dllexport ) int SDKVersion = SDK_VERSION; extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } extern "C" __declspec( dllexport ) void PluginUnload() { g_sdk->log_console( "[-] ExampleModule unloaded!" ); } Additional Information for External Orbwalker, Prediction and Evade Coding [​](https://docs.ven.pub/getting-started.html#additional-information-for-external-orbwalker-prediction-and-evade-coding) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Any of those modules must add **one** of the following lines inside the **main.cpp** - depending on the module type - so the core can process them accordingly: cpp extern "C" __declspec( dllexport ) module_type Type = module_type::orb; extern "C" __declspec( dllexport ) module_type Type = module_type::pred; extern "C" __declspec( dllexport ) module_type Type = module_type::evade; extern "C" __declspec( dllexport ) module_type Type = module_type::orb; extern "C" __declspec( dllexport ) module_type Type = module_type::pred; extern "C" __declspec( dllexport ) module_type Type = module_type::evade; You will be able to select them in the Modules menu to replace Orbwalker, Prediction or Evade depending on the chosen type Summary [​](https://docs.ven.pub/getting-started.html#summary) --------------------------------------------------------------- Now that we setup the module project, we can go in game and run it. On next page, we will dive deeper into the SDK with functionalities such as registering and unregistering from events. --- # Logging | VEN Documentation [Skip to content](https://docs.ven.pub/logging.html#VPContent) On this page On this page Logging [​](https://docs.ven.pub/logging.html#logging) ======================================================= INFO ![]() As you can see, there are 3 types of prefixes that change the color of the log: `ANY` - Info `[!]` - Error `[?]` - Warning Info [​](https://docs.ven.pub/logging.html#info) ------------------------------------------------- cpp g_sdk->log_console( "Hello from logger!" ); g_sdk->log_console( "Hello from logger!" ); Error [​](https://docs.ven.pub/logging.html#error) --------------------------------------------------- cpp g_sdk->log_console( "[!] Hello from logger!" ); g_sdk->log_console( "[!] Hello from logger!" ); Warning [​](https://docs.ven.pub/logging.html#warning) ------------------------------------------------------- cpp g_sdk->log_console( "[?] Hello from logger!" ); g_sdk->log_console( "[?] Hello from logger!" ); --- # Hud Manager | VEN Documentation [Skip to content](https://docs.ven.pub/hud-manager.html#VPContent) On this page On this page Hud Manager [​](https://docs.ven.pub/hud-manager.html#hud-manager) =================================================================== Getting Current Cursor Position [​](https://docs.ven.pub/hud-manager.html#getting-current-cursor-position) ----------------------------------------------------------------------------------------------------------- INFO This function returns the position in 3D world coordinates `math::vector3 g_sdk->hud_manager->get_cursor_position()` Example cpp void __fastcall draw_world() { auto cursor_position = g_sdk->hud_manager->get_cursor_position(); g_sdk->renderer->add_circle_3d( cursor_position, 50.f, 1.f, 0xFFFFFFFF ); } void __fastcall draw_world() { auto cursor_position = g_sdk->hud_manager->get_cursor_position(); g_sdk->renderer->add_circle_3d( cursor_position, 50.f, 1.f, 0xFFFFFFFF ); } Getting Currently Hovered Target [​](https://docs.ven.pub/hud-manager.html#getting-currently-hovered-target) ------------------------------------------------------------------------------------------------------------- INFO This function returns the currently hovered target `game_object* g_sdk->hud_manager->get_hovered_target()` Example cpp void __fastcall game_update() { auto target = g_sdk->hud_manager->get_hovered_target(); if ( target && target->is_hero() ) { g_sdk->log_console( "[+] Currently hovering %s", target->get_char_name().c_str() ); } } void __fastcall game_update() { auto target = g_sdk->hud_manager->get_hovered_target(); if ( target && target->is_hero() ) { g_sdk->log_console( "[+] Currently hovering %s", target->get_char_name().c_str() ); } } --- # Object Manager | VEN Documentation [Skip to content](https://docs.ven.pub/object-manager.html#VPContent) On this page On this page Object Manager [​](https://docs.ven.pub/object-manager.html#object-manager) ============================================================================ Getting Local Player [​](https://docs.ven.pub/object-manager.html#getting-local-player) ---------------------------------------------------------------------------------------- INFO While in replay mode - this function returns the currently selected player; otherwise returns the controlled player `game_object* g_sdk->object_manager->get_local_player()` Example cpp const auto player = g_sdk->object_manager->get_local_player(); g_sdk->log_console( "[+] Player champion name: %s", player->get_char_name().c_str() ); const auto player = g_sdk->object_manager->get_local_player(); g_sdk->log_console( "[+] Player champion name: %s", player->get_char_name().c_str() ); Getting Objects by Type [​](https://docs.ven.pub/object-manager.html#getting-objects-by-type) ---------------------------------------------------------------------------------------------- `std::span< game_object* > g_sdk->object_manager->get_turrets()` `std::span< game_object* > g_sdk->object_manager->get_heroes()` `std::span< game_object* > g_sdk->object_manager->get_minions()` `std::span< game_object* > g_sdk->object_manager->get_nexuses()` `std::span< game_object* > g_sdk->object_manager->get_inhibitors()` `std::span< game_object* > g_sdk->object_manager->get_monsters()` `std::span< game_object* > g_sdk->object_manager->get_traps()` `std::span< game_object* > g_sdk->object_manager->get_wards()` `std::span< game_object* > g_sdk->object_manager->get_plants()` Example cpp for ( const auto& hero : g_sdk->object_manager->get_heroes() ) { if ( hero->is_valid() ) g_sdk->log_console( "[+] %s is on team %d", hero->get_char_name().c_str(), hero->get_team_id() ); } for ( const auto& hero : g_sdk->object_manager->get_heroes() ) { if ( hero->is_valid() ) g_sdk->log_console( "[+] %s is on team %d", hero->get_char_name().c_str(), hero->get_team_id() ); } Getting Object by Network Id [​](https://docs.ven.pub/object-manager.html#getting-object-by-network-id) -------------------------------------------------------------------------------------------------------- `game_object* get_object_by_network_id( uint32_t network_id )` --- # Events | VEN Documentation [Skip to content](https://docs.ven.pub/events.html#VPContent) On this page On this page Events [​](https://docs.ven.pub/events.html#events) ==================================================== Event Registering [​](https://docs.ven.pub/events.html#event-registering) -------------------------------------------------------------------------- In order to register to a game event, `g_sdk->event_manager->register_callback` must be called inside `PluginLoad` Example: cpp void __fastcall present() { g_sdk->log_console( "[+] Presenting the frame!" ); } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->event_manager->register_callback( event_manager::event::present, reinterpret_cast< void* >( present ) ); g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } void __fastcall present() { g_sdk->log_console( "[+] Presenting the frame!" ); } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->event_manager->register_callback( event_manager::event::present, reinterpret_cast< void* >( present ) ); g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } Event Unregistering [​](https://docs.ven.pub/events.html#event-unregistering) ------------------------------------------------------------------------------ In order to unregister from a game event, `g_sdk->event_manager->unregister_callback` must be called inside `PluginUnload` cpp extern "C" __declspec( dllexport ) void PluginUnload() { g_sdk->event_manager->unregister_callback( event_manager::event::present, reinterpret_cast< void* >( present ) ); g_sdk->log_console( "[-] ExampleModule unloaded!" ); } extern "C" __declspec( dllexport ) void PluginUnload() { g_sdk->event_manager->unregister_callback( event_manager::event::present, reinterpret_cast< void* >( present ) ); g_sdk->log_console( "[-] ExampleModule unloaded!" ); } event::present [​](https://docs.ven.pub/events.html#event-present) ------------------------------------------------------------------- INFO Triggers every rendering frame - should only be used for **UI drawings** TIP The following example draws a white circle in the middle of the screen cpp void __fastcall present() { const auto width = g_sdk->renderer->get_window_width(); const auto height = g_sdk->renderer->get_window_height(); math::vector2 screen_center { static_cast< float >( width ) * 0.5f , static_cast< float >( height ) * 0.5f }; g_sdk->renderer->add_circle_2d( screen_center, 20.f, 1.f, 0xFFFFFFFF ); } void __fastcall present() { const auto width = g_sdk->renderer->get_window_width(); const auto height = g_sdk->renderer->get_window_height(); math::vector2 screen_center { static_cast< float >( width ) * 0.5f , static_cast< float >( height ) * 0.5f }; g_sdk->renderer->add_circle_2d( screen_center, 20.f, 1.f, 0xFFFFFFFF ); } event::draw\_environment [​](https://docs.ven.pub/events.html#event-draw-environment) -------------------------------------------------------------------------------------- INFO Triggers every rendering frame - should only be used for **UI drawings under the environment** TIP The following example draws a circle under the environment cpp void __fastcall draw_environment() { auto player = g_sdk->object_manager->get_local_player(); if( player ) g_sdk->renderer->add_circle_3d( player->get_position(), 20.f, 1.f, 0xFFFFFFFF ); } void __fastcall draw_environment() { auto player = g_sdk->object_manager->get_local_player(); if( player ) g_sdk->renderer->add_circle_3d( player->get_position(), 20.f, 1.f, 0xFFFFFFFF ); } event::wndproc [​](https://docs.ven.pub/events.html#event-wndproc) ------------------------------------------------------------------- INFO Triggers when the game receives a window message [More info](https://learn.microsoft.com/en-us/windows/win32/api/winuser/nc-winuser-wndproc) TIP The following example prints a console message whenever LMB is pressed cpp void __fastcall wndproc( uint32_t msg, uint32_t wparam, uint32_t lparam ) { if ( msg == WM_LBUTTONDOWN ) { g_sdk->log_console( "[+] LMB was pressed" ); } } void __fastcall wndproc( uint32_t msg, uint32_t wparam, uint32_t lparam ) { if ( msg == WM_LBUTTONDOWN ) { g_sdk->log_console( "[+] LMB was pressed" ); } } event::game\_update [​](https://docs.ven.pub/events.html#event-game-update) ---------------------------------------------------------------------------- INFO Triggers every game frame - should only be used for **module logic** TIP The following example prints a console message while the player is moving cpp void __fastcall game_update() { const auto player = g_sdk->object_manager->get_local_player(); if ( player && player->is_moving() ) { g_sdk->log_console( "[+] Moving!" ); } } void __fastcall game_update() { const auto player = g_sdk->object_manager->get_local_player(); if ( player && player->is_moving() ) { g_sdk->log_console( "[+] Moving!" ); } } event::create\_object [​](https://docs.ven.pub/events.html#event-create-object) -------------------------------------------------------------------------------- INFO Triggers for each object creation TIP The following example logs the name of the created object cpp void __fastcall create_object( game_object* object ) { g_sdk->log_console( "[+] Object %s created", object->get_name().c_str() ); } void __fastcall create_object( game_object* object ) { g_sdk->log_console( "[+] Object %s created", object->get_name().c_str() ); } event::delete\_object [​](https://docs.ven.pub/events.html#event-delete-object) -------------------------------------------------------------------------------- INFO Triggers for each object deletion TIP The following example logs the name of the deleted object cpp void __fastcall delete_object( game_object* object ) { g_sdk->log_console( "[-] Object %s deleted", object->get_name().c_str() ); } void __fastcall delete_object( game_object* object ) { g_sdk->log_console( "[-] Object %s deleted", object->get_name().c_str() ); } event::create\_missile [​](https://docs.ven.pub/events.html#event-create-missile) ---------------------------------------------------------------------------------- INFO Triggers for each missile creation TIP The following example logs the name and the attack id of the cast linked to the missile cpp void __fastcall create_missile( game_object* missile ) { const auto spell_cast = missile->get_missile_spell_cast(); if ( spell_cast ) { const auto attack_id = spell_cast->get_attack_id(); const auto name = spell_cast->get_spell_data()->get_static_data()->get_name(); g_sdk->log_console( "[+] Missile linked to attack id %d created - name: %s", attack_id, name ); } } void __fastcall create_missile( game_object* missile ) { const auto spell_cast = missile->get_missile_spell_cast(); if ( spell_cast ) { const auto attack_id = spell_cast->get_attack_id(); const auto name = spell_cast->get_spell_data()->get_static_data()->get_name(); g_sdk->log_console( "[+] Missile linked to attack id %d created - name: %s", attack_id, name ); } } event::basic\_attack [​](https://docs.ven.pub/events.html#event-basic-attack) ------------------------------------------------------------------------------ INFO Triggers when an AI object starts the cast of a basic attack TIP The following example logs the names of both the source and the target of the attack cpp void __fastcall basic_attack( game_object* object, game_object* target, spell_cast* cast ) { g_sdk->log_console( "[+] %s started attacking %s", object->get_name().c_str(), target->get_name().c_str() ); } void __fastcall basic_attack( game_object* object, game_object* target, spell_cast* cast ) { g_sdk->log_console( "[+] %s started attacking %s", object->get_name().c_str(), target->get_name().c_str() ); } event::stop\_cast [​](https://docs.ven.pub/events.html#event-stop-cast) ------------------------------------------------------------------------ INFO Triggers when an AI stops the cast TIP The following example logs the name of the cast that got stopped cpp void __fastcall stop_cast( game_object* object, spell_cast* cast, bool was_attack_processed ) { const auto name = cast->get_spell_data()->get_static_data()->get_name(); g_sdk->log_console( "[+] %s stopped the cast %s (processed: %d)", object->get_name().c_str(), name, was_attack_processed ); } void __fastcall stop_cast( game_object* object, spell_cast* cast, bool was_attack_processed ) { const auto name = cast->get_spell_data()->get_static_data()->get_name(); g_sdk->log_console( "[+] %s stopped the cast %s (processed: %d)", object->get_name().c_str(), name, was_attack_processed ); } event::process\_cast [​](https://docs.ven.pub/events.html#event-process-cast) ------------------------------------------------------------------------------ INFO Triggers when an AI starts the cast of a spell TIP The following example logs the name of the cast that was started cpp void __fastcall process_cast( game_object* object, spell_cast* cast ) { const auto name = cast->get_spell_data()->get_static_data()->get_name(); g_sdk->log_console( "[+] %s started casting %s", object->get_name().c_str(), name ); } void __fastcall process_cast( game_object* object, spell_cast* cast ) { const auto name = cast->get_spell_data()->get_static_data()->get_name(); g_sdk->log_console( "[+] %s started casting %s", object->get_name().c_str(), name ); } event::buff\_gain [​](https://docs.ven.pub/events.html#event-buff-gain) ------------------------------------------------------------------------ INFO Triggers when an AI gains a buff TIP The following example logs the name of the gained buff cpp void __fastcall buff_gain( game_object* object, buff_instance* buff ) { g_sdk->log_console( "[+] %s gained buff %s", object->get_name().c_str(), buff->get_name().c_str() ); } void __fastcall buff_gain( game_object* object, buff_instance* buff ) { g_sdk->log_console( "[+] %s gained buff %s", object->get_name().c_str(), buff->get_name().c_str() ); } event::buff\_loss [​](https://docs.ven.pub/events.html#event-buff-loss) ------------------------------------------------------------------------ INFO Triggers when an AI loses a buff TIP The following example logs the name of the lost buff cpp void __fastcall buff_loss( game_object* object, buff_instance* buff ) { g_sdk->log_console( "[+] %s lost buff %s", object->get_name().c_str(), buff->get_name().c_str() ); } void __fastcall buff_loss( game_object* object, buff_instance* buff ) { g_sdk->log_console( "[+] %s lost buff %s", object->get_name().c_str(), buff->get_name().c_str() ); } event::draw\_world [​](https://docs.ven.pub/events.html#event-draw-world) -------------------------------------------------------------------------- INFO Triggers every world rendering frame - should only be used for **world layer drawings** TIP The following example draws a 3D white circle around the player cpp void __fastcall draw_world() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { auto position = player->get_position(); g_sdk->renderer->add_circle_3d( position, player->get_bounding_radius(), 1.f, 0xFFFFFFFF ); } } void __fastcall draw_world() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { auto position = player->get_position(); g_sdk->renderer->add_circle_3d( position, player->get_bounding_radius(), 1.f, 0xFFFFFFFF ); } } event::neutral\_minion\_kill [​](https://docs.ven.pub/events.html#event-neutral-minion-kill) --------------------------------------------------------------------------------------------- INFO Triggers every time a jungle camp monster gets killed TIP The following example logs information about the killed monster cpp void __fastcall neutral_minion_kill( game_object* object, game_object* minion, int camp_side_team_id ) { const auto ally_camp = camp_side_team_id == object->get_team_id(); g_sdk->log_console( "[+] %s killed a monster (%s) from an %s camp", object->get_name().c_str(), minion->get_name().c_str(), ally_camp ? "allied" : "enemy" ); } void __fastcall neutral_minion_kill( game_object* object, game_object* minion, int camp_side_team_id ) { const auto ally_camp = camp_side_team_id == object->get_team_id(); g_sdk->log_console( "[+] %s killed a monster (%s) from an %s camp", object->get_name().c_str(), minion->get_name().c_str(), ally_camp ? "allied" : "enemy" ); } event::new\_path [​](https://docs.ven.pub/events.html#event-new-path) ---------------------------------------------------------------------- INFO Triggers every time an AI changes its path TIP The following example logs the speed of the dash when an AI dashes cpp void __fastcall new_path( game_object* object, bool is_dash, float dash_speed ) { if ( is_dash ) { g_sdk->log_console( "[+] %s has dashed with %.02f speed", object->get_name().c_str(), dash_speed ); } } void __fastcall new_path( game_object* object, bool is_dash, float dash_speed ) { if ( is_dash ) { g_sdk->log_console( "[+] %s has dashed with %.02f speed", object->get_name().c_str(), dash_speed ); } } event::execute\_cast [​](https://docs.ven.pub/events.html#event-execute-cast) ------------------------------------------------------------------------------ INFO Triggers when an AI finishes the active cast TIP The following example logs the name of the cast that was finished cpp void __fastcall execute_cast( game_object* object, spell_cast* cast ) { const auto name = cast->get_spell_data()->get_static_data()->get_name(); g_sdk->log_console( "[+] %s finished casting %s", object->get_name().c_str(), name ); } void __fastcall execute_cast( game_object* object, spell_cast* cast ) { const auto name = cast->get_spell_data()->get_static_data()->get_name(); g_sdk->log_console( "[+] %s finished casting %s", object->get_name().c_str(), name ); } event::issue\_order [​](https://docs.ven.pub/events.html#event-issue-order) ---------------------------------------------------------------------------- DANGER This event does not trigger for `issue_order` called from modules (including `Orbwalker`) WARNING This is a preventable event, the return value determines whether the order will be allowed or not INFO Triggers when the local player tries to issue an order TIP The following example prevents `game_object_order::stop` orders from being executed cpp bool __fastcall issue_order( game_object* object, game_object_order order_type, math::vector3 position, game_object* target, bool move_pet ) { if ( order_type == game_object_order::stop ) { g_sdk->log_console( "[+] Stop order prevented!" ); return false; } return true; } bool __fastcall issue_order( game_object* object, game_object_order order_type, math::vector3 position, game_object* target, bool move_pet ) { if ( order_type == game_object_order::stop ) { g_sdk->log_console( "[+] Stop order prevented!" ); return false; } return true; } event::cast\_spell [​](https://docs.ven.pub/events.html#event-cast-spell) -------------------------------------------------------------------------- DANGER This event does not trigger for `cast_spell` called from modules WARNING This is a preventable event, the return value determines whether the cast will be allowed or not INFO Triggers when the local player tries to cast a spell TIP The following example prevents the spell on slot `0` from being casted cpp bool __fastcall cast_spell( game_object* object, int spell_slot, math::vector3 position, game_object* target ) { if ( spell_slot == 0 ) { g_sdk->log_console( "[+] Prevented the cast of spell 0!" ); return false; } return true; } bool __fastcall cast_spell( game_object* object, int spell_slot, math::vector3 position, game_object* target ) { if ( spell_slot == 0 ) { g_sdk->log_console( "[+] Prevented the cast of spell 0!" ); return false; } return true; } event::packet [​](https://docs.ven.pub/events.html#event-packet) ----------------------------------------------------------------- WARNING This event is only enabled on `DEVELOPER` builds INFO Triggers when the client receives a network packet TIP The following example logs the opcode of the received packet cpp void __fastcall packet( uint16_t packet_opcode, uint64_t packet_data, uint32_t rpc_network_id ) { g_sdk->log_console( "[+] Received packet with opcode 0x%x", packet_opcode ); } void __fastcall packet( uint16_t packet_opcode, uint64_t packet_data, uint32_t rpc_network_id ) { g_sdk->log_console( "[+] Received packet with opcode 0x%x", packet_opcode ); } event::animation [​](https://docs.ven.pub/events.html#event-animation) ----------------------------------------------------------------------- INFO Triggers when an AI plays an animation TIP The following example logs the hash of the played animation cpp void __fastcall animation( game_object* object, uint32_t animation_hash ) { g_sdk->log_console( "[+] %s plays animation 0x%x", object->get_name().c_str(), animation_hash ); } void __fastcall animation( game_object* object, uint32_t animation_hash ) { g_sdk->log_console( "[+] %s plays animation 0x%x", object->get_name().c_str(), animation_hash ); } event::cast\_heal [​](https://docs.ven.pub/events.html#event-cast-heal) ------------------------------------------------------------------------ INFO Triggers when an AI object casts heal TIP The following example logs the source, the target and the amount of heal that was casted cpp void __fastcall cast_heal( game_object* object, game_object* target, float amount ) { g_sdk->log_console( "[+] %s casted heal on %s (amount: %.02f)", object->get_name().c_str(), target->get_name().c_str(), amount ); } void __fastcall cast_heal( game_object* object, game_object* target, float amount ) { g_sdk->log_console( "[+] %s casted heal on %s (amount: %.02f)", object->get_name().c_str(), target->get_name().c_str(), amount ); } event::spell\_hit [​](https://docs.ven.pub/events.html#event-spell-hit) ------------------------------------------------------------------------ INFO Triggers when a spell has been hit cpp void __fastcall spell_hit( game_object* object, spell_cast* cast ) { g_sdk->log_console( "[+] %s hit spell slot %d", object->get_name().c_str(), cast->get_spell_slot() ); } void __fastcall spell_hit( game_object* object, spell_cast* cast ) { g_sdk->log_console( "[+] %s hit spell slot %d", object->get_name().c_str(), cast->get_spell_slot() ); } --- # Menu | VEN Documentation [Skip to content](https://docs.ven.pub/menu.html#VPContent) On this page On this page Menu [​](https://docs.ven.pub/menu.html#menu) ============================================== INFO Callbacks passed to the menu elements are called when their value changes As an extra - they are also called when they are being created for initialization purpose Creating a New Menu [​](https://docs.ven.pub/menu.html#creating-a-new-menu) ---------------------------------------------------------------------------- First things first, a category needs to be created, so we're gonna use `menu_category* g_sdk->menu_manager->add_category( std::string const& name, std::string const& display_name )` `name` must be unique so config won't be accidentally shared with other modules `display_name` will be the name of the category that will be displayed in the menu Example cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); return true; } Adding a Label [​](https://docs.ven.pub/menu.html#adding-a-label) ------------------------------------------------------------------ INFO This function adds a label in a category/sub-category `void menu_category::add_label( std::string const& text )` Example cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_label( "Test label" ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_label( "Test label" ); return true; } Adding a Checkbox [​](https://docs.ven.pub/menu.html#adding-a-checkbox) ------------------------------------------------------------------------ INFO This function adds a checkbox in a category/sub-category `void menu_category::add_checkbox( std::string const& element_name, std::string const& element_display_name, bool default_value, std::function< void( bool ) > const& callback )` Example cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_checkbox( "example_checkbox", "Example Checkbox", false, []( bool value ) { if ( value ) g_sdk->log_console( "[+] Checkbox toggled on" ); else g_sdk->log_console( "[+] Checkbox toggled off" ); } ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_checkbox( "example_checkbox", "Example Checkbox", false, []( bool value ) { if ( value ) g_sdk->log_console( "[+] Checkbox toggled on" ); else g_sdk->log_console( "[+] Checkbox toggled off" ); } ); return true; } Adding a Hotkey [​](https://docs.ven.pub/menu.html#adding-a-hotkey) -------------------------------------------------------------------- INFO This function adds a hotkey in a category/sub-category `void menu_category::add_hotkey( std::string const& element_name, std::string const& element_display_name, unsigned char default_key, bool default_value = false, bool toggle = false, std::function< void( std::string*, bool ) > const& callback = nullptr )` Example cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_hotkey( "example_hotkey", "Example Hotkey", VK_F5, false, false, []( std::string*, bool value ) { if ( value ) g_sdk->log_console( "[+] F5 pressed!" ); } ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_hotkey( "example_hotkey", "Example Hotkey", VK_F5, false, false, []( std::string*, bool value ) { if ( value ) g_sdk->log_console( "[+] F5 pressed!" ); } ); return true; } Adding a Separator [​](https://docs.ven.pub/menu.html#adding-a-separator) -------------------------------------------------------------------------- INFO This function adds a separator in a category/sub-category `void menu_category::add_separator()` Example cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_separator(); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_separator(); return true; } Adding a Slider Int [​](https://docs.ven.pub/menu.html#adding-a-slider-int) ---------------------------------------------------------------------------- INFO This function adds a slider int in a category/sub-category `void menu_category::add_slider_int( std::string const& element_name, std::string const& element_display_name, int min, int max, int step, int default_value, std::function< void( int ) > const& callback = nullptr )` Example cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_slider_int( "example_slider_int", "Example Slider Int", 0, 100, 1, 70, []( int value ) { if ( value > 70 ) g_sdk->log_console( "[!] Value is %d", value ); else if ( value > 40 ) g_sdk->log_console( "[?] Value is %d", value ); else g_sdk->log_console( "[+] Value is %d", value ); } ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_slider_int( "example_slider_int", "Example Slider Int", 0, 100, 1, 70, []( int value ) { if ( value > 70 ) g_sdk->log_console( "[!] Value is %d", value ); else if ( value > 40 ) g_sdk->log_console( "[?] Value is %d", value ); else g_sdk->log_console( "[+] Value is %d", value ); } ); return true; } Adding a Slider Float [​](https://docs.ven.pub/menu.html#adding-a-slider-float) -------------------------------------------------------------------------------- INFO This function adds a slider float in a category/sub-category `void menu_category::add_slider_float( std::string const& element_name, std::string const& element_display_name, float min, float max, float step, float default_value, std::function< void( float ) > const& callback = nullptr )` Example cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_slider_float( "example_slider_float", "Example Slider Float", 0.f, 1.f, 0.01f, 0.7f, []( float value ) { if ( value > 0.7f ) g_sdk->log_console( "[!] Value is %.02f", value ); else if ( value > 0.4f ) g_sdk->log_console( "[?] Value is %.02f", value ); else g_sdk->log_console( "[+] Value is %.02f", value ); } ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_slider_float( "example_slider_float", "Example Slider Float", 0.f, 1.f, 0.01f, 0.7f, []( float value ) { if ( value > 0.7f ) g_sdk->log_console( "[!] Value is %.02f", value ); else if ( value > 0.4f ) g_sdk->log_console( "[?] Value is %.02f", value ); else g_sdk->log_console( "[+] Value is %.02f", value ); } ); return true; } Adding a Combo [​](https://docs.ven.pub/menu.html#adding-a-combo) ------------------------------------------------------------------ INFO This function adds a combo in a category/sub-category `void menu_category::add_combo( std::string const& element_name, std::string const& element_display_name, std::vector< std::string > const& items, int default_value, const std::function< void( int ) >& callback = nullptr )` Example cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_combo( "example_combo", "Example Combo", { "Info" , "Warning" , "Error" }, 1, []( int value ) { if ( value == 0 ) g_sdk->log_console( "[+] Logged as info" ); else if ( value == 1 ) g_sdk->log_console( "[?] Logged as warning" ); else if ( value == 2 ) g_sdk->log_console( "[!] Logged as error" ); } ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_combo( "example_combo", "Example Combo", { "Info" , "Warning" , "Error" }, 1, []( int value ) { if ( value == 0 ) g_sdk->log_console( "[+] Logged as info" ); else if ( value == 1 ) g_sdk->log_console( "[?] Logged as warning" ); else if ( value == 2 ) g_sdk->log_console( "[!] Logged as error" ); } ); return true; } Adding a Colorpicker [​](https://docs.ven.pub/menu.html#adding-a-colorpicker) ------------------------------------------------------------------------------ INFO This function adds a colorpicker in a category/sub-category `void menu_category::add_colorpicker( std::string const& element_name, std::string const& element_display_name, uint32_t default_color, std::function< void( uint32_t ) > const& callback = nullptr )` Example cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_colorpicker( "example_colorpicker", "Example Colorpicker", 0xFFFFFFFF, []( uint32_t color ) { g_sdk->log_console( "[+] Color changed to %x", color ); } ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_colorpicker( "example_colorpicker", "Example Colorpicker", 0xFFFFFFFF, []( uint32_t color ) { g_sdk->log_console( "[+] Color changed to %x", color ); } ); return true; } Adding a Sub-category [​](https://docs.ven.pub/menu.html#adding-a-sub-category) -------------------------------------------------------------------------------- INFO This function adds a sub-category in a category/sub-category `menu_category* menu_category::add_sub_category( std::string const& element_name, std::string const& element_display_name )` Example cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_sub_category( "example_sub_category", "Example Sub-category" ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; g_sdk->log_console( "[+] ExampleModule loaded!" ); const auto category = g_sdk->menu_manager->add_category( "example_module", "ExampleModule" ); category->add_sub_category( "example_sub_category", "Example Sub-category" ); return true; } --- # Clock Facade | VEN Documentation [Skip to content](https://docs.ven.pub/clock-facade.html#VPContent) On this page On this page Clock Facade [​](https://docs.ven.pub/clock-facade.html#clock-facade) ====================================================================== Getting Current Game Time [​](https://docs.ven.pub/clock-facade.html#getting-current-game-time) ------------------------------------------------------------------------------------------------ INFO This function returns the game time in **seconds** `float g_sdk->clock_facade->get_game_time()` --- # Net Client | VEN Documentation [Skip to content](https://docs.ven.pub/net-client.html#VPContent) On this page On this page Net Client [​](https://docs.ven.pub/net-client.html#net-client) ================================================================ Getting the Ping [​](https://docs.ven.pub/net-client.html#getting-the-ping) ---------------------------------------------------------------------------- INFO This function returns the current ping in **milliseconds** `int g_sdk->net_client->get_ping()` Example cpp void __fastcall game_update() { const auto ping = g_sdk->net_client->get_ping(); g_sdk->log_console( "[+] Current ping is %dms", ping ); } void __fastcall game_update() { const auto ping = g_sdk->net_client->get_ping(); g_sdk->log_console( "[+] Current ping is %dms", ping ); } --- # Renderer | VEN Documentation [Skip to content](https://docs.ven.pub/renderer.html#VPContent) On this page On this page Renderer [​](https://docs.ven.pub/renderer.html#renderer) ========================================================== Adding a 2D Circle [​](https://docs.ven.pub/renderer.html#adding-a-2d-circle) ------------------------------------------------------------------------------ INFO This function adds a 2D circle of a specified radius, thickness and color at a screen position `void g_sdk->renderer->add_circle_2d( math::vector2& position, float radius, float thickness, uint32_t color )` Example cpp void __fastcall present() { const auto width = g_sdk->renderer->get_window_width(); const auto height = g_sdk->renderer->get_window_height(); math::vector2 screen_center { static_cast< float >( width ) * 0.5f , static_cast< float >( height ) * 0.5f }; g_sdk->renderer->add_circle_2d( screen_center, 20.f, 1.f, 0xFFFFFFFF ); } void __fastcall present() { const auto width = g_sdk->renderer->get_window_width(); const auto height = g_sdk->renderer->get_window_height(); math::vector2 screen_center { static_cast< float >( width ) * 0.5f , static_cast< float >( height ) * 0.5f }; g_sdk->renderer->add_circle_2d( screen_center, 20.f, 1.f, 0xFFFFFFFF ); } Adding a Filled 2D Circle [​](https://docs.ven.pub/renderer.html#adding-a-filled-2d-circle) -------------------------------------------------------------------------------------------- INFO This function adds a filled 2D circle of a specified radius and color at a screen position `void g_sdk->renderer->add_circle_filled_2d( math::vector2& position, float radius, uint32_t color )` Example cpp void __fastcall present() { const auto width = g_sdk->renderer->get_window_width(); const auto height = g_sdk->renderer->get_window_height(); math::vector2 screen_center { static_cast< float >( width ) * 0.5f , static_cast< float >( height ) * 0.5f }; g_sdk->renderer->add_circle_filled_2d( screen_center, 20.f, 0xFFFFFFFF ); } void __fastcall present() { const auto width = g_sdk->renderer->get_window_width(); const auto height = g_sdk->renderer->get_window_height(); math::vector2 screen_center { static_cast< float >( width ) * 0.5f , static_cast< float >( height ) * 0.5f }; g_sdk->renderer->add_circle_filled_2d( screen_center, 20.f, 0xFFFFFFFF ); } Adding a 3D Circle [​](https://docs.ven.pub/renderer.html#adding-a-3d-circle) ------------------------------------------------------------------------------ INFO This function adds a 3D circle of a specified radius, thickness and color at a world position `void g_sdk->renderer->add_circle_3d( math::vector3& position, float radius, float thickness, uint32_t color )` Example cpp void __fastcall draw_world() { auto cursor_position = g_sdk->hud_manager->get_cursor_position(); g_sdk->renderer->add_circle_3d( cursor_position, 50.f, 1.f, 0xFFFFFFFF ); } void __fastcall draw_world() { auto cursor_position = g_sdk->hud_manager->get_cursor_position(); g_sdk->renderer->add_circle_3d( cursor_position, 50.f, 1.f, 0xFFFFFFFF ); } Adding a Rectangle [​](https://docs.ven.pub/renderer.html#adding-a-rectangle) ------------------------------------------------------------------------------ INFO This function adds a rectangle of a specified color and thickness `void g_sdk->renderer->add_rectangle( math::rect const& rectangle, uint32_t color, float thickness )` Adding a Filled Rectangle [​](https://docs.ven.pub/renderer.html#adding-a-filled-rectangle) -------------------------------------------------------------------------------------------- INFO This function adds a filled rectangle of a specified color `void g_sdk->renderer->add_rectangle_filled( math::rect const& rectangle, uint32_t color )` Adding Text [​](https://docs.ven.pub/renderer.html#adding-text) ---------------------------------------------------------------- INFO This function adds text of specified size and color at a 2D screen position Available flags: `1` - Centered Text `void g_sdk->renderer->add_text( std::string const& text, float size, math::vector2 position, uint32_t flags, uint32_t color )` Example cpp void __fastcall present() { const auto width = g_sdk->renderer->get_window_width(); const auto height = g_sdk->renderer->get_window_height(); math::vector2 screen_center { static_cast< float >( width ) * 0.5f , static_cast< float >( height ) * 0.5f }; g_sdk->renderer->add_text( "Hello!", 12.f, screen_center, 1, 0xFFFFFFFF ); } void __fastcall present() { const auto width = g_sdk->renderer->get_window_width(); const auto height = g_sdk->renderer->get_window_height(); math::vector2 screen_center { static_cast< float >( width ) * 0.5f , static_cast< float >( height ) * 0.5f }; g_sdk->renderer->add_text( "Hello!", 12.f, screen_center, 1, 0xFFFFFFFF ); } Adding a 2D Line [​](https://docs.ven.pub/renderer.html#adding-a-2d-line) -------------------------------------------------------------------------- INFO This function adds a 2D line of a specified thickness and color from one screen point to another `void g_sdk->renderer->add_line_2d( math::vector2& point1, math::vector2& point2, float thickness, uint32_t color )` Adding a Sprite [​](https://docs.ven.pub/renderer.html#adding-a-sprite) ------------------------------------------------------------------------ INFO This function adds a sprite at a screen position Color should be `0xFFFFFFFF` for the sprite to maintain the original color `void g_sdk->renderer->add_sprite( void* sprite, math::vector2 const& position, uint32_t color, math::vector2 const& scale = { 1.f , 1.f } )` Example cpp void __fastcall present() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { const auto icon = player->get_icon_square(); if ( icon ) { const auto width = g_sdk->renderer->get_window_width(); const auto height = g_sdk->renderer->get_window_height(); const math::vector2 screen_center { static_cast< float >( width ) * 0.5f , static_cast< float >( height ) * 0.5f }; g_sdk->renderer->add_sprite( icon, screen_center, 0xFFFFFFFF ); } } } void __fastcall present() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { const auto icon = player->get_icon_square(); if ( icon ) { const auto width = g_sdk->renderer->get_window_width(); const auto height = g_sdk->renderer->get_window_height(); const math::vector2 screen_center { static_cast< float >( width ) * 0.5f , static_cast< float >( height ) * 0.5f }; g_sdk->renderer->add_sprite( icon, screen_center, 0xFFFFFFFF ); } } } Adding a Minimap Circle [​](https://docs.ven.pub/renderer.html#adding-a-minimap-circle) ---------------------------------------------------------------------------------------- INFO This function adds a circle on the minimap at a world position `void g_sdk->renderer->add_circle_minimap( math::vector3 const& position, float radius, float thickness, uint32_t color )` Example cpp void __fastcall present() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { g_sdk->renderer->add_circle_minimap( player->get_position(), 30.f, 1.f, 0xFFFFFFFF ); } } void __fastcall present() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { g_sdk->renderer->add_circle_minimap( player->get_position(), 30.f, 1.f, 0xFFFFFFFF ); } } Translating World Position to Screen [​](https://docs.ven.pub/renderer.html#translating-world-position-to-screen) ------------------------------------------------------------------------------------------------------------------ INFO This function returns the input world position translated into screen coordinates `math::vector2 g_sdk->renderer->world_to_screen( math::vector3 world_position )` Translating World Position to Minimap [​](https://docs.ven.pub/renderer.html#translating-world-position-to-minimap) -------------------------------------------------------------------------------------------------------------------- INFO This function returns the input world position translated into minimap screen coordinates `math::vector2 g_sdk->renderer->world_to_minimap( math::vector3 world_position )` Adding Damage/Heal/Shield Indicator [​](https://docs.ven.pub/renderer.html#adding-damage-heal-shield-indicator) ---------------------------------------------------------------------------------------------------------------- INFO The argument must be the actual damage/heal/shield value cpp void g_sdk->renderer->add_damage_indicator( game_object* object, float damage ); void g_sdk->renderer->add_heal_indicator( game_object* object, float heal ); void g_sdk->renderer->add_shield_indicator( game_object* object, float shield ); void g_sdk->renderer->add_damage_indicator( game_object* object, float damage ); void g_sdk->renderer->add_heal_indicator( game_object* object, float heal ); void g_sdk->renderer->add_shield_indicator( game_object* object, float shield ); --- # Game Info | VEN Documentation [Skip to content](https://docs.ven.pub/game-info.html#VPContent) On this page On this page Game Info [​](https://docs.ven.pub/game-info.html#game-info) ============================================================= Getting the Game Mode [​](https://docs.ven.pub/game-info.html#getting-the-game-mode) ------------------------------------------------------------------------------------- INFO This function returns the name of the current game mode `char* g_sdk->game_info->get_game_mode()` --- # Nav Mesh | VEN Documentation [Skip to content](https://docs.ven.pub/nav-mesh.html#VPContent) On this page On this page Nav Mesh [​](https://docs.ven.pub/nav-mesh.html#nav-mesh) ========================================================== Checking if Terrain is Pathable [​](https://docs.ven.pub/nav-mesh.html#checking-if-terrain-is-pathable) -------------------------------------------------------------------------------------------------------- INFO This function returns whether or not a terrain position is a valid path target `bool g_sdk->nav_mesh->is_pathable( math::vector3& position )` Example cpp void __fastcall game_update() { auto cursor_position = g_sdk->hud_manager->get_cursor_position(); if ( !g_sdk->nav_mesh->is_pathable( cursor_position ) ) { g_sdk->log_console( "[+] You cannot path here!" ); } } void __fastcall game_update() { auto cursor_position = g_sdk->hud_manager->get_cursor_position(); if ( !g_sdk->nav_mesh->is_pathable( cursor_position ) ) { g_sdk->log_console( "[+] You cannot path here!" ); } } Checking if Position is in FOW [​](https://docs.ven.pub/nav-mesh.html#checking-if-position-is-in-fow) ------------------------------------------------------------------------------------------------------ INFO This function returns whether or not a world position is in Fog of War `bool g_sdk->nav_mesh->is_in_fow( math::vector3& position )` Example cpp void __fastcall game_update() { auto cursor_position = g_sdk->hud_manager->get_cursor_position(); if ( g_sdk->nav_mesh->is_in_fow( cursor_position ) ) { g_sdk->log_console( "[+] Position is in FOW" ); } } void __fastcall game_update() { auto cursor_position = g_sdk->hud_manager->get_cursor_position(); if ( g_sdk->nav_mesh->is_in_fow( cursor_position ) ) { g_sdk->log_console( "[+] Position is in FOW" ); } } Checking if Position is in FOW for a specific team [​](https://docs.ven.pub/nav-mesh.html#checking-if-position-is-in-fow-for-a-specific-team) ---------------------------------------------------------------------------------------------------------------------------------------------- INFO This function returns whether or not a world position is in Fog of War for X team `bool g_sdk->nav_mesh->is_in_fow_for_team( math::vector3 const& position, int team_id )` `bool g_sdk->nav_mesh->is_in_fow_ex( math::vector3 const& position, int team_id, bool skip_minions, bool skip_heroes )` Example cpp void __fastcall game_update() { auto cursor_position = g_sdk->hud_manager->get_cursor_position(); if ( g_sdk->nav_mesh->is_in_fow_for_team( cursor_position, 100 ) ) { g_sdk->log_console( "[+] Position is in FOW" ); } } void __fastcall game_update() { auto cursor_position = g_sdk->hud_manager->get_cursor_position(); if ( g_sdk->nav_mesh->is_in_fow_for_team( cursor_position, 100 ) ) { g_sdk->log_console( "[+] Position is in FOW" ); } } --- # Game GUI | VEN Documentation [Skip to content](https://docs.ven.pub/game-gui.html#VPContent) On this page On this page Game GUI [​](https://docs.ven.pub/game-gui.html#game-gui) ========================================================== Sending a Chat Message [​](https://docs.ven.pub/game-gui.html#sending-a-chat-message) -------------------------------------------------------------------------------------- INFO This function sends a chat message `void g_sdk->game_gui->send_chat( std::string const& message )` Sending a Map / Minimap Ping [​](https://docs.ven.pub/game-gui.html#sending-a-map-minimap-ping) ------------------------------------------------------------------------------------------------ INFO These functions send a map / minimap ping cpp enum class map_ping_type : uint8_t { ping = 1, old_caution = 2, enemy_missing = 3, on_my_way = 4, caution = 5, assist_me = 6, enemy_has_vision = 7, invisible_assist_me_yellow = 8, invisible_assist_me_red = 9, game_mode_info = 10, game_mode_important = 11, game_mode_warning = 12, enemy_has_no_vision = 13, ask_for_vision = 14, push_forward = 15, all_in = 16, reset = 17, retreat = 18, bait = 19, hold_the_area = 20 }; enum class map_ping_type : uint8_t { ping = 1, old_caution = 2, enemy_missing = 3, on_my_way = 4, caution = 5, assist_me = 6, enemy_has_vision = 7, invisible_assist_me_yellow = 8, invisible_assist_me_red = 9, game_mode_info = 10, game_mode_important = 11, game_mode_warning = 12, enemy_has_no_vision = 13, ask_for_vision = 14, push_forward = 15, all_in = 16, reset = 17, retreat = 18, bait = 19, hold_the_area = 20 }; `void g_sdk->game_gui->send_map_ping( math::vector3 const& position, map_ping_type type )` `void g_sdk->game_gui->send_map_ping( game_object* target, map_ping_type type )` --- # Setup | VEN Documentation [Skip to content](https://docs.ven.pub/setup.html#VPContent) On this page On this page Setup [​](https://docs.ven.pub/setup.html#setup) ================================================= Loading the Dependencies [​](https://docs.ven.pub/setup.html#loading-the-dependencies) --------------------------------------------------------------------------------------- For every interface you want to use you need to instantiate it inside `PluginLoad` using `sdk_init::` - for example: cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; if ( !sdk_init::orbwalker() ) return false; g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; if ( !sdk_init::orbwalker() ) return false; g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } This example instantiates the pointer sdk::orbwalker which can be found on [this page](https://docs.ven.pub/orbwalker.html) INFO Every `sdk_init::` function returns a `bool` - the function will return `false` if the dependency failed to load --- # Target Selector | VEN Documentation [Skip to content](https://docs.ven.pub/target-selector.html#VPContent) On this page On this page Target Selector [​](https://docs.ven.pub/target-selector.html#target-selector) =============================================================================== Using Target Selector SDK [​](https://docs.ven.pub/target-selector.html#using-target-selector-sdk) --------------------------------------------------------------------------------------------------- WARNING Before using the SDK you need to instantiate it using `sdk_init::target_selector()` - example provided on [this page](https://docs.ven.pub/setup.html) Getting an Enemy Hero Target [​](https://docs.ven.pub/target-selector.html#getting-an-enemy-hero-target) --------------------------------------------------------------------------------------------------------- To get an enemy hero target you may use the function `game_object* sdk::target_selector->get_hero_target( std::function< bool( game_object* ) > fn = {} )` INFO You can filter targets according to the lambda function you pass as argument If no argument is passed to the function, the function checks by default `hero->is_visible() && hero->is_targetable()` Example finding a target 600 units around the player cpp void __fastcall game_update() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { const auto player_pos = player->get_position(); const auto target = sdk::target_selector->get_hero_target( [ &player_pos ]( game_object* hero ) { return hero->is_valid() && hero->is_visible() && hero->is_targetable() && hero->get_position().distance( player_pos ) <= 600.f; } ); if ( target ) { g_sdk->log_console( "Enemy Target found: %s", target->get_char_name().c_str() ); } } } void __fastcall game_update() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { const auto player_pos = player->get_position(); const auto target = sdk::target_selector->get_hero_target( [ &player_pos ]( game_object* hero ) { return hero->is_valid() && hero->is_visible() && hero->is_targetable() && hero->get_position().distance( player_pos ) <= 600.f; } ); if ( target ) { g_sdk->log_console( "Enemy Target found: %s", target->get_char_name().c_str() ); } } } Getting an Ally Hero Target [​](https://docs.ven.pub/target-selector.html#getting-an-ally-hero-target) ------------------------------------------------------------------------------------------------------- To get an ally hero target you may use the function `game_object* sdk::target_selector->get_ally_hero_target( std::function< bool( game_object* ) > fn = {} )` INFO You can filter targets according to the lambda function you pass as argument If no argument is passed to the function, the function checks by default `hero->is_visible() && hero->is_targetable()` Example finding a target 600 units around the player cpp void __fastcall game_update() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { const auto player_pos = player->get_position(); const auto target = sdk::target_selector->get_ally_hero_target( [ &player_pos ]( game_object* hero ) { return hero->is_valid() && hero->is_visible() && hero->is_targetable() && hero->get_position().distance( player_pos ) <= 600.f; } ); if ( target ) { g_sdk->log_console( "Ally Target found: %s", target->get_char_name().c_str() ); } } } void __fastcall game_update() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { const auto player_pos = player->get_position(); const auto target = sdk::target_selector->get_ally_hero_target( [ &player_pos ]( game_object* hero ) { return hero->is_valid() && hero->is_visible() && hero->is_targetable() && hero->get_position().distance( player_pos ) <= 600.f; } ); if ( target ) { g_sdk->log_console( "Ally Target found: %s", target->get_char_name().c_str() ); } } } Getting a Monster Target [​](https://docs.ven.pub/target-selector.html#getting-a-monster-target) ------------------------------------------------------------------------------------------------- To get a monster target you may use the function `game_object* sdk::target_selector->get_monster_target( std::function< bool( game_object* ) > fn = {} )` INFO You can filter targets according to the lambda function you pass as argument If no argument is passed to the function, the function checks by default `monster->is_visible() && monster->is_targetable()` Example finding a target 600 units around the player cpp void __fastcall game_update() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { const auto player_pos = player->get_position(); const auto target = sdk::target_selector->get_monster_target( [ &player_pos ]( game_object* monster ) { return monster->is_valid() && monster->is_visible() && monster->is_targetable() && monster->get_position().distance( player_pos ) <= 600.f; } ); if ( target ) { g_sdk->log_console( "Ally Target found: %s", target->get_char_name().c_str() ); } } } void __fastcall game_update() { const auto player = g_sdk->object_manager->get_local_player(); if ( player ) { const auto player_pos = player->get_position(); const auto target = sdk::target_selector->get_monster_target( [ &player_pos ]( game_object* monster ) { return monster->is_valid() && monster->is_visible() && monster->is_targetable() && monster->get_position().distance( player_pos ) <= 600.f; } ); if ( target ) { g_sdk->log_console( "Ally Target found: %s", target->get_char_name().c_str() ); } } } Getting the Forced Target [​](https://docs.ven.pub/target-selector.html#getting-the-forced-target) --------------------------------------------------------------------------------------------------- To get the forced target you may use this function `game_object* sdk::target_selector->get_forced_target()` Example cpp void __fastcall game_update() { const auto forced_target = sdk::target_selector->get_forced_target(); if ( forced_target ) { g_sdk->log_console( "Forced target is: %s", forced_target->get_char_name().c_str() ); } } void __fastcall game_update() { const auto forced_target = sdk::target_selector->get_forced_target(); if ( forced_target ) { g_sdk->log_console( "Forced target is: %s", forced_target->get_char_name().c_str() ); } } Getting the Manual Targetting Mode [​](https://docs.ven.pub/target-selector.html#getting-the-manual-targetting-mode) --------------------------------------------------------------------------------------------------------------------- To get the manual targetting mode you may use this function `int sdk::target_selector->get_manual_target_mode()` Example cpp void __fastcall game_update() { g_sdk->log_console( "Manual targetting mode: %d", sdk::target_selector->get_manual_target_mode() ); } void __fastcall game_update() { g_sdk->log_console( "Manual targetting mode: %d", sdk::target_selector->get_manual_target_mode() ); } Getting Sorted Heroes [​](https://docs.ven.pub/target-selector.html#getting-sorted-heroes) ------------------------------------------------------------------------------------------- To get the sorted heroes you may use this function `const std::span< game_object* >& sdk::target_selector->get_sorted_heroes()` Getting Sorted Monsters [​](https://docs.ven.pub/target-selector.html#getting-sorted-monsters) ----------------------------------------------------------------------------------------------- To get the sorted monsers you may use this function `const std::span< game_object* >& sdk::target_selector->get_sorted_monsters()` --- # Orbwalker | VEN Documentation [Skip to content](https://docs.ven.pub/orbwalker.html#VPContent) On this page On this page Orbwalker [​](https://docs.ven.pub/orbwalker.html#orbwalker) ============================================================= Using Orbwalker SDK [​](https://docs.ven.pub/orbwalker.html#using-orbwalker-sdk) --------------------------------------------------------------------------------- WARNING Before using the SDK you need to instantiate it using `sdk_init::orbwalker()` - example provided on [this page](https://docs.ven.pub/setup.html) Modes [​](https://docs.ven.pub/orbwalker.html#modes) ----------------------------------------------------- Below are all the modes that orbwalker uses: cpp bool sdk::orbwalker->combo() bool sdk::orbwalker->harass() bool sdk::orbwalker->clear() bool sdk::orbwalker->lasthit() bool sdk::orbwalker->flee() bool sdk::orbwalker->freeze() bool sdk::orbwalker->fast_clear() bool sdk::orbwalker->combo() bool sdk::orbwalker->harass() bool sdk::orbwalker->clear() bool sdk::orbwalker->lasthit() bool sdk::orbwalker->flee() bool sdk::orbwalker->freeze() bool sdk::orbwalker->fast_clear() Example cpp void __fastcall game_update() { if ( sdk::orbwalker->combo() ) { g_sdk->log_console( "In Orbwalker combo mode" ); } } void __fastcall game_update() { if ( sdk::orbwalker->combo() ) { g_sdk->log_console( "In Orbwalker combo mode" ); } } Spell Weaving [​](https://docs.ven.pub/orbwalker.html#spell-weaving) --------------------------------------------------------------------- To do proper spell weaving you may use the function `bool sdk::orbwalker->can_spell( game_object* target, const float time = 0.f )` INFO The target argument is required The time is not but it's **recommended** to put the **spell cast delay** for perfect weaving WARNING Note that if your attack will come back faster than the spell cast delay, the spell will not be casted which may lead to a behaviour that you did not want If you are just trying to avoid cancelling auto attacks, take a look at how to [avoid cancelling attacks](https://docs.ven.pub/orbwalker.html#avoid-cancelling-attacks) Example cpp void __fastcall game_update() { const auto hovered_target = g_sdk->hud_manager->get_hovered_target(); if ( hovered_target && sdk::orbwalker->can_spell( hovered_target, 0.25f ) ) { g_sdk->log_console( "Can cast spell on hovered target" ); } } void __fastcall game_update() { const auto hovered_target = g_sdk->hud_manager->get_hovered_target(); if ( hovered_target && sdk::orbwalker->can_spell( hovered_target, 0.25f ) ) { g_sdk->log_console( "Can cast spell on hovered target" ); } } Attack is Ready [​](https://docs.ven.pub/orbwalker.html#attack-is-ready) ------------------------------------------------------------------------- To know if the attack will be ready (now or later) you may use the function `bool sdk::orbwalker->is_attack_ready_in( const float time )` INFO The time argument is required, it takes the time in seconds - you can also pass 0.f if you want to know if the attack is ready **now** Example cpp void __fastcall game_update() { if ( sdk::orbwalker->is_attack_ready_in( 0.5f ) ) { g_sdk->log_console( "Attack is ready or will be ready in 0.5 seconds" ); } } void __fastcall game_update() { if ( sdk::orbwalker->is_attack_ready_in( 0.5f ) ) { g_sdk->log_console( "Attack is ready or will be ready in 0.5 seconds" ); } } Avoid Cancelling Attacks [​](https://docs.ven.pub/orbwalker.html#avoid-cancelling-attacks) ------------------------------------------------------------------------------------------- To avoid cancelling attacks you may use the function `bool sdk::orbwalker->would_cancel_attack()` Example cpp void __fastcall game_update() { if ( sdk::orbwalker->would_cancel_attack() ) { g_sdk->log_console( "Doing an action now will cancel the ongoing attack" ); } } void __fastcall game_update() { if ( sdk::orbwalker->would_cancel_attack() ) { g_sdk->log_console( "Doing an action now will cancel the ongoing attack" ); } } Getting the Attack Cast End Time [​](https://docs.ven.pub/orbwalker.html#getting-the-attack-cast-end-time) ----------------------------------------------------------------------------------------------------------- To get the attack cast end time you may use the function `float sdk::orbwalker->get_attack_cast_end_time()` INFO The returned time is in seconds from the start of the game - like [g\_sdk->clock\_facade->get\_game\_time()](https://docs.ven.pub/clock-facade.html#getting-current-game-time) Getting a Target in Attack Range [​](https://docs.ven.pub/orbwalker.html#getting-a-target-in-attack-range) ----------------------------------------------------------------------------------------------------------- To get a target in attack range using the orbwalker you may use the function `game_object* sdk::orbwalker->get_target_in_attack_range()` WARNING This function only return **heroes** target Example cpp void __fastcall game_update() { const auto target = sdk::orbwalker->get_target_in_attack_range(); if ( target ) { g_sdk->log_console( "The selected hero in attack range is: %s", target->get_char_name().c_str() ); } } void __fastcall game_update() { const auto target = sdk::orbwalker->get_target_in_attack_range(); if ( target ) { g_sdk->log_console( "The selected hero in attack range is: %s", target->get_char_name().c_str() ); } } Is Target in Attack Range [​](https://docs.ven.pub/orbwalker.html#is-target-in-attack-range) --------------------------------------------------------------------------------------------- To know if a target is in attack range you may use the function `bool sdk::orbwalker->is_in_auto_attack_range( game_object* source, game_object* target, float offset = 0.f )` INFO The **source** and **target** arguments are required, **source** is often the [player](https://docs.ven.pub/object-manager.html#getting-local-player) The **offset** argument is optional, it will add the radius to the attack range Example cpp void __fastcall game_update() { const auto hovered_target = g_sdk->hud_manager->get_hovered_target(); if ( hovered_target && sdk::orbwalker->is_in_auto_attack_range( g_sdk->object_manager->get_local_player(), hovered_target ) ) { g_sdk->log_console( "The hovered target is in attack range" ); } } void __fastcall game_update() { const auto hovered_target = g_sdk->hud_manager->get_hovered_target(); if ( hovered_target && sdk::orbwalker->is_in_auto_attack_range( g_sdk->object_manager->get_local_player(), hovered_target ) ) { g_sdk->log_console( "The hovered target is in attack range" ); } } Is Position in Attack Range [​](https://docs.ven.pub/orbwalker.html#is-position-in-attack-range) ------------------------------------------------------------------------------------------------- To know if a target is in the position's attack range you may use the function `bool sdk::orbwalker->is_in_auto_attack_range( game_object* source, const math::vector3& source_position, game_object* target, float offset = 0.f )` INFO This is meant to be used for predictions purposes, example checking if using Caitlyn E towards target will bring you in attack range The **source** and **target** arguments are required, **source** is often the [player](https://docs.ven.pub/object-manager.html#getting-local-player) The **offset** argument is optional, it will add the radius to the attack range Example cpp void __fastcall game_update() { const auto hovered_target = g_sdk->hud_manager->get_hovered_target(); if ( hovered_target && sdk::orbwalker->is_in_auto_attack_range( g_sdk->object_manager->get_local_player(), g_sdk->hud_manager->get_cursor_position(), hovered_target ) ) { g_sdk->log_console( "The hovered target is in attack range" ); } } void __fastcall game_update() { const auto hovered_target = g_sdk->hud_manager->get_hovered_target(); if ( hovered_target && sdk::orbwalker->is_in_auto_attack_range( g_sdk->object_manager->get_local_player(), g_sdk->hud_manager->get_cursor_position(), hovered_target ) ) { g_sdk->log_console( "The hovered target is in attack range" ); } } Is Target in Attack Range (Future) [​](https://docs.ven.pub/orbwalker.html#is-target-in-attack-range-future) ------------------------------------------------------------------------------------------------------------- To know if a target is in attack range at a specific position you may use the function `bool sdk::orbwalker->is_in_auto_attack_range( game_object* source, const math::vector3& source_position, game_object* target, float offset = 0.f );` INFO The **offset** argument is optional, it will add the radius to the attack range Spell Farming [​](https://docs.ven.pub/orbwalker.html#spell-farming) --------------------------------------------------------------------- To spell farm you may use the function `pred_sdk::pred_data sdk::orbwalker->spell_farm( pred_sdk::spell_data spell_data, const int aoe_hits_needed, const spell_farm_flag flags = spell_farm_flag::none, const dmg_sdk::damage_type damage_type = dmg_sdk::damage_type::physical )` INFO The **spell\_data** argument is a [prediction spell data](https://docs.ven.pub/prediction.html#spell-data) The **aoe\_hits\_needed** argument is how many hits are needed to cast the spell (note: -1 will try to find the maximum amount of hits possible) The **flags** argument takes a [spell\_farm\_flag](https://docs.ven.pub/orbwalker.html#spell-farming-related-enums) The **damage\_type** argument takes a [damage\_type](https://docs.ven.pub/orbwalker.html#spell-farming-related-enums) is optional, defaults to physical damage Return is [pred\_data](https://docs.ven.pub/prediction.html#prediction-data) INFO The following example showcases how to last hit objects with the desired spell while the player's attack is not ready WARNING The example is not compilable due to the lack of the **q\_pred\_data** variable, it is supposed to be a showcase on how to use it within your module Example using Ezreal Q cpp void __fastcall game_update() { // make sure we are in lasthit mode and we will not cancel an ongoing attack if ( sdk::orbwalker->lasthit() && !sdk::orbwalker->would_cancel_attack() ) { const auto pred = sdk::orbwalker->spell_farm( q_pred_data, 1, static_cast< spell_farm_flag >( spell_farm_flag::lasthit | spell_farm_flag::when_attack_not_ready ), dmg_sdk::damage_type::physical ); if ( pred.is_valid ) { util::cast_spell( 0, pred.cast_position ); } } } void __fastcall game_update() { // make sure we are in lasthit mode and we will not cancel an ongoing attack if ( sdk::orbwalker->lasthit() && !sdk::orbwalker->would_cancel_attack() ) { const auto pred = sdk::orbwalker->spell_farm( q_pred_data, 1, static_cast< spell_farm_flag >( spell_farm_flag::lasthit | spell_farm_flag::when_attack_not_ready ), dmg_sdk::damage_type::physical ); if ( pred.is_valid ) { util::cast_spell( 0, pred.cast_position ); } } } Spell Farming Related Enums [​](https://docs.ven.pub/orbwalker.html#spell-farming-related-enums) ------------------------------------------------------------------------------------------------- cpp enum spell_farm_flag: uint8_t { none = 0, outside_of_attack_range = 1, lasthit = 2, when_attack_not_ready = 4, }; enum class damage_type { physical = 0, magical, }; enum spell_farm_flag: uint8_t { none = 0, outside_of_attack_range = 1, lasthit = 2, when_attack_not_ready = 4, }; enum class damage_type { physical = 0, magical, }; Is Spell Farm Enabled [​](https://docs.ven.pub/orbwalker.html#is-spell-farm-enabled) ------------------------------------------------------------------------------------- To know if spell farming is enabled by the player you may use the function `bool sdk::orbwalker->is_spell_farm_enabled()` NOTE The function `sdk::orbwalker->spell_farm` already checks this variable internally Example cpp void __fastcall game_update() { g_sdk->log_console( "Spell farm is %s", sdk::orbwalker->is_spell_farm_enabled() ? "enabled" : "disabled" ); } void __fastcall game_update() { g_sdk->log_console( "Spell farm is %s", sdk::orbwalker->is_spell_farm_enabled() ? "enabled" : "disabled" ); } Is Spell Farm Lasthit Enabled [​](https://docs.ven.pub/orbwalker.html#is-spell-farm-lasthit-enabled) ----------------------------------------------------------------------------------------------------- To know if spell farming is enabled by the player you may use the function `bool sdk::orbwalker->is_spell_farm_lasthit_enabled()` NOTE The function `sdk::orbwalker->spell_farm` already checks this variable internally Example cpp void __fastcall game_update() { g_sdk->log_console( "Spell farm lasthit is %s", sdk::orbwalker->is_spell_farm_lasthit_enabled() ? "enabled" : "disabled" ); } void __fastcall game_update() { g_sdk->log_console( "Spell farm lasthit is %s", sdk::orbwalker->is_spell_farm_lasthit_enabled() ? "enabled" : "disabled" ); } Is Spell Farm Lasthit Enabled [​](https://docs.ven.pub/orbwalker.html#is-spell-farm-lasthit-enabled-1) ------------------------------------------------------------------------------------------------------- To know if spell farming lasthit is enabled by the player you may use the function `bool sdk::orbwalker->is_spell_farm_lasthit_enabled()` Example cpp void __fastcall game_update() { g_sdk->log_console( "Spell farm lasthit is %s", sdk::orbwalker->is_spell_farm_lasthit_enabled() ? "enabled" : "disabled" ); } void __fastcall game_update() { g_sdk->log_console( "Spell farm lasthit is %s", sdk::orbwalker->is_spell_farm_lasthit_enabled() ? "enabled" : "disabled" ); } Getting Current Target [​](https://docs.ven.pub/orbwalker.html#getting-current-target) --------------------------------------------------------------------------------------- To get the current orbwalker target you may use the function `game_object* sdk::orbwalker->get_current_target()` Example cpp void __fastcall game_update() { auto target = sdk::orbwalker->get_current_target(); if( target ) g_sdk->log_console( "Current target: %s", target->get_char_name().c_str() ); } void __fastcall game_update() { auto target = sdk::orbwalker->get_current_target(); if( target ) g_sdk->log_console( "Current target: %s", target->get_char_name().c_str() ); } Forcing an Attack [​](https://docs.ven.pub/orbwalker.html#forcing-an-attack) ----------------------------------------------------------------------------- To force an attack on an object you may use the function `bool sdk::orbwalker->attack( game_object* target )` DANGER This may break kiting for one attack if used incorrectly WARNING The example is not compilable due to the lack of the **util::get\_hero\_target** and **util::cast\_spell** functions (core utility), it is supposed to be a showcase on how to use it within your module Example using Kog'Maw W Once we casted Kog'Maw W client-side, the server will not instantly update our range but we are able to send an attack along side the spell cast in order to buffer it and makes us gain precious time instead of waiting for the range update before attacking cpp void __fastcall game_update() { auto target = util::get_hero_target( player->get_server_position(), w_spell.pred_data.range ); if ( !target ) return; if ( sdk::orbwalker->would_cancel_attack() ) return; if ( sdk::orbwalker->is_attack_ready_in( 0.f ) && util::cast_spell( w_spell.pred_data.spell_slot ) ) sdk::orbwalker->attack( target ); } void __fastcall game_update() { auto target = util::get_hero_target( player->get_server_position(), w_spell.pred_data.range ); if ( !target ) return; if ( sdk::orbwalker->would_cancel_attack() ) return; if ( sdk::orbwalker->is_attack_ready_in( 0.f ) && util::cast_spell( w_spell.pred_data.spell_slot ) ) sdk::orbwalker->attack( target ); } Orbwalker Event Registering [​](https://docs.ven.pub/orbwalker.html#orbwalker-event-registering) ------------------------------------------------------------------------------------------------- In order to register to an orbwalker event, `sdk::orbwalker->register_callback` must be called inside `PluginLoad` Example: cpp bool before_attack( orb_sdk::event_data* data ) { if ( data.target ) g_sdk->log_console( "Orbwalker will attack target: %s", data.target->get_char_name().c_str() ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; if ( !sdk_init::orbwalker() ) return false; sdk::orbwalker->register_callback( orb_sdk::before_attack, reinterpret_cast< void* >( before_attack ) ); g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } bool before_attack( orb_sdk::event_data* data ) { if ( data.target ) g_sdk->log_console( "Orbwalker will attack target: %s", data.target->get_char_name().c_str() ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; if ( !sdk_init::orbwalker() ) return false; sdk::orbwalker->register_callback( orb_sdk::before_attack, reinterpret_cast< void* >( before_attack ) ); g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } Orbwalker Event Unregistering [​](https://docs.ven.pub/orbwalker.html#orbwalker-event-unregistering) ----------------------------------------------------------------------------------------------------- In order to unregister from an orbwalker event, `sdk::orbwalker->unregister_callback` must be called inside `PluginUnload` cpp extern "C" __declspec( dllexport ) void PluginUnload() { sdk::orbwalker->unregister_callback( orb_sdk::before_attack, reinterpret_cast< void* >( before_attack ) ); g_sdk->log_console( "[-] ExampleModule unloaded!" ); } extern "C" __declspec( dllexport ) void PluginUnload() { sdk::orbwalker->unregister_callback( orb_sdk::before_attack, reinterpret_cast< void* >( before_attack ) ); g_sdk->log_console( "[-] ExampleModule unloaded!" ); } Orbwalker Events [​](https://docs.ven.pub/orbwalker.html#orbwalker-events) --------------------------------------------------------------------------- cpp enum event_type: uint8_t { before_attack = 0, before_move, }; enum event_type: uint8_t { before_attack = 0, before_move, }; INFO The `before_move` event does not contain any target The return value should be `false` if we want to block the attack/move Both events are defined the same way: cpp class event_data { public: game_object* target{}; }; class event_data { public: game_object* target{}; }; cpp bool before_attack( orb_sdk::event_data* data ) { if ( data.target ) g_sdk->log_console( "Orbwalker will attack target: %s", data.target->get_char_name().c_str() ); return true; } bool before_move( orb_sdk::event_data* data ) { g_sdk->log_console( "Orbwalker before move" ); return true; } bool before_attack( orb_sdk::event_data* data ) { if ( data.target ) g_sdk->log_console( "Orbwalker will attack target: %s", data.target->get_char_name().c_str() ); return true; } bool before_move( orb_sdk::event_data* data ) { g_sdk->log_console( "Orbwalker before move" ); return true; } --- # Health Prediction | VEN Documentation [Skip to content](https://docs.ven.pub/health-prediction.html#VPContent) On this page On this page Health Prediction [​](https://docs.ven.pub/health-prediction.html#health-prediction) ===================================================================================== Using Health Prediction SDK [​](https://docs.ven.pub/health-prediction.html#using-health-prediction-sdk) --------------------------------------------------------------------------------------------------------- WARNING Before using the SDK you need to instantiate it using `sdk_init::health_prediction()` - example provided on [this page](https://docs.ven.pub/setup.html) Predict Object Health [​](https://docs.ven.pub/health-prediction.html#predict-object-health) --------------------------------------------------------------------------------------------- `float sdk::health_prediction->get_predicted_health( game_object* target, const float time )` INFO The `time` argument is in seconds from the start of the game - like [g\_sdk->clock\_facade->get\_game\_time()](https://docs.ven.pub/clock-facade.html#getting-current-game-time) Example predicting hovered target health in 0.25 seconds cpp const auto hovered_target = g_sdk->hud_manager->get_hovered_target(); if ( hovered_target ) { const auto game_time = g_sdk->clock_facade->get_game_time(); const auto predicted_health = sdk::health_prediction->get_predicted_health( hovered_target, game_time + 0.25f ); g_sdk->log_console( "%s health will be %.2f (currently %.2f)", hovered_target->get_char_name().c_str(), predicted_health, hovered_target->get_hp() ); } const auto hovered_target = g_sdk->hud_manager->get_hovered_target(); if ( hovered_target ) { const auto game_time = g_sdk->clock_facade->get_game_time(); const auto predicted_health = sdk::health_prediction->get_predicted_health( hovered_target, game_time + 0.25f ); g_sdk->log_console( "%s health will be %.2f (currently %.2f)", hovered_target->get_char_name().c_str(), predicted_health, hovered_target->get_hp() ); } Getting an Ally Minion Focus [​](https://docs.ven.pub/health-prediction.html#getting-an-ally-minion-focus) ----------------------------------------------------------------------------------------------------------- To get the ally minion focus you may use the function `game_object* sdk::health_prediction->get_minion_focus( game_object* source )` --- # Spell Manager | VEN Documentation [Skip to content](https://docs.ven.pub/spell-manager.html#VPContent) On this page On this page Spell Manager [​](https://docs.ven.pub/spell-manager.html#spell-manager) ========================================================================= Using Spell Manager SDK [​](https://docs.ven.pub/spell-manager.html#using-spell-manager-sdk) --------------------------------------------------------------------------------------------- WARNING Before using the SDK you need to instantiate it using `sdk_init::spell_manager()` - example provided on [this page](https://docs.ven.pub/setup.html) Spell Manager Enums [​](https://docs.ven.pub/spell-manager.html#spell-manager-enums) ------------------------------------------------------------------------------------- cpp enum class spell_iteration: uint8_t { all = 0, ally = 1, enemy = 2, }; enum class spell_type: uint8_t { unsupported = 0, linear = 1, circular = 2, }; enum class spell_iteration: uint8_t { all = 0, ally = 1, enemy = 2, }; enum class spell_type: uint8_t { unsupported = 0, linear = 1, circular = 2, }; Spell Class [​](https://docs.ven.pub/spell-manager.html#spell-class) --------------------------------------------------------------------- WARNING This class is likely to change in the future DANGER Those variables should NEVER be written to, else it will create exception/issues !! cpp class spell { public: bool operator==( const spell& a ) { return a.owner == this->owner && a.slot == this->slot; } int id{}; // Unique Spell ID created by Spell manager game_object* owner{}; // Spell caster game_object* target{}; // Target (for skills like Fizz R, Hwei R and in the future targetted spells) game_object* missile{}; // Missile if exists (can be nullptr) game_object* particle{}; // Particle if exists (can be nullptr) math::vector3 start_pos{}; // Spell start position math::vector3 end_pos{}; // Spell end position int slot{}; // Spell slot spell_type type{}; // Spell type int team_id{}; // Caster Team ID bool is_drawing_only{}; // Is drawing only bool is_cc{}; // Is CC bool is_particle_on_ground{}; // Is particle on ground bool has_projectile{}; // If the spell will create a projectile (Does not mean it has an active missile!!) bool missile_created{}; // If the missile has been created uint32_t missile_effect_key{}; // Spell hash float radius{}; float projectile_speed{}; // If the spell has a projectile speed, otherwise 0 or FLT_MAX float travel_time{}; // If the spell has a static travel time, otherwise 0 or FLT_MAX float cast_delay{}; // Spell cast delay (not always set !) float cast_end_time{}; // Spell cast end time in game time float deletion_time{}; // Spell deletion time in game time float creation_time{}; // Spell creation time in game time std::string missile_name{}; // Spell missile name spell* parent_spell{}; // Parent spell (can be nullptr) std::vector< spell* > additional_spells{}; // Additional spells example for Leona R (center CC) or Return spells such as Swain E, Sivir Q, Ahri Q.. bool from_fow{}; // If the spell was casted in Fog of War bool allow_missile_positions = true; // For internal use bool delete_on_missile_deletion = true; // For internal use bool pending_deletion{}; // For internal use color color{}; // For internal use uint8_t previous_alpha = 0; // For internal use }; class spell { public: bool operator==( const spell& a ) { return a.owner == this->owner && a.slot == this->slot; } int id{}; // Unique Spell ID created by Spell manager game_object* owner{}; // Spell caster game_object* target{}; // Target (for skills like Fizz R, Hwei R and in the future targetted spells) game_object* missile{}; // Missile if exists (can be nullptr) game_object* particle{}; // Particle if exists (can be nullptr) math::vector3 start_pos{}; // Spell start position math::vector3 end_pos{}; // Spell end position int slot{}; // Spell slot spell_type type{}; // Spell type int team_id{}; // Caster Team ID bool is_drawing_only{}; // Is drawing only bool is_cc{}; // Is CC bool is_particle_on_ground{}; // Is particle on ground bool has_projectile{}; // If the spell will create a projectile (Does not mean it has an active missile!!) bool missile_created{}; // If the missile has been created uint32_t missile_effect_key{}; // Spell hash float radius{}; float projectile_speed{}; // If the spell has a projectile speed, otherwise 0 or FLT_MAX float travel_time{}; // If the spell has a static travel time, otherwise 0 or FLT_MAX float cast_delay{}; // Spell cast delay (not always set !) float cast_end_time{}; // Spell cast end time in game time float deletion_time{}; // Spell deletion time in game time float creation_time{}; // Spell creation time in game time std::string missile_name{}; // Spell missile name spell* parent_spell{}; // Parent spell (can be nullptr) std::vector< spell* > additional_spells{}; // Additional spells example for Leona R (center CC) or Return spells such as Swain E, Sivir Q, Ahri Q.. bool from_fow{}; // If the spell was casted in Fog of War bool allow_missile_positions = true; // For internal use bool delete_on_missile_deletion = true; // For internal use bool pending_deletion{}; // For internal use color color{}; // For internal use uint8_t previous_alpha = 0; // For internal use }; Iterating Spells [​](https://docs.ven.pub/spell-manager.html#iterating-spells) ------------------------------------------------------------------------------- INFO This function iterates all the hero spells currently casting/travelling in the game `void sdk::spell_manager->iterate_spells( sm_sdk::spell_iteration iter, const std::function< bool( sm_sdk::spell* spell ) >& fn )` Example cpp sdk::spell_manager->iterate_spells( sm_sdk::spell_iteration::enemy, [ & ]( sm_sdk::spell* spell ) { g_sdk->log_console( "Spell caster: %s | Slot: %d", spell->owner->get_char_name().c_str(), spell->slot ); } ); sdk::spell_manager->iterate_spells( sm_sdk::spell_iteration::enemy, [ & ]( sm_sdk::spell* spell ) { g_sdk->log_console( "Spell caster: %s | Slot: %d", spell->owner->get_char_name().c_str(), spell->slot ); } ); Getting Spells Static Data [​](https://docs.ven.pub/spell-manager.html#getting-spells-static-data) --------------------------------------------------------------------------------------------------- INFO This function returns an array with sm\_sdk::static\_data of all spells from a specific hero DANGER This function should ONLY be called in `PluginLoad` You may cache the results yourself if needed for later use in events `std::array< sm_sdk::static_data, 64 > sdk::spell_manager->get_spells_static_data( game_object* hero )` Getting a Spell Missile Position [​](https://docs.ven.pub/spell-manager.html#getting-a-spell-missile-position) --------------------------------------------------------------------------------------------------------------- INFO This function returns the world position of the spell missile This can only be called on spells that have projectiles (`spell->has_projectile`) `math::vector3 sdk::spell_manager->get_missile_position( sm_sdk::spell* spell )` Example cpp sdk::spell_manager->iterate_spells( sm_sdk::spell_iteration::enemy, [ & ]( sm_sdk::spell* spell ) { if( spell->has_projectile ) g_sdk->log_console( "Spell at position: %s", sdk::spell_manager->get_missile_position( spell ).to_string().c_str() ); } ); sdk::spell_manager->iterate_spells( sm_sdk::spell_iteration::enemy, [ & ]( sm_sdk::spell* spell ) { if( spell->has_projectile ) g_sdk->log_console( "Spell at position: %s", sdk::spell_manager->get_missile_position( spell ).to_string().c_str() ); } ); Knowing if the Spell got casted [​](https://docs.ven.pub/spell-manager.html#knowing-if-the-spell-got-casted) ------------------------------------------------------------------------------------------------------------- INFO This function returns true if the spell has been casted `bool sdk::spell_manager->is_casted( sm_sdk::spell* spell )` Example cpp sdk::spell_manager->iterate_spells( sm_sdk::spell_iteration::enemy, [ & ]( sm_sdk::spell* spell ) { g_sdk->log_console( "Is spell casted: %d", sdk::spell_manager->is_casted( spell ) ); } ); sdk::spell_manager->iterate_spells( sm_sdk::spell_iteration::enemy, [ & ]( sm_sdk::spell* spell ) { g_sdk->log_console( "Is spell casted: %d", sdk::spell_manager->is_casted( spell ) ); } ); Getting Spells Count [​](https://docs.ven.pub/spell-manager.html#getting-spells-count) --------------------------------------------------------------------------------------- INFO This function returns the amount of active spells from the iterator `int sdk::spell_manager->get_spells_count( sm_sdk::spell_iteration iter )` Example cpp g_sdk->log_console( "Active enemy spells: %d", sdk::spell_manager->get_spells_count( sm_sdk::spell_iteration::enemy ) ); g_sdk->log_console( "Active enemy spells: %d", sdk::spell_manager->get_spells_count( sm_sdk::spell_iteration::enemy ) ); --- # Evade | VEN Documentation [Skip to content](https://docs.ven.pub/evade.html#VPContent) On this page On this page Evade [​](https://docs.ven.pub/evade.html#evade) ================================================= Using Evade SDK [​](https://docs.ven.pub/evade.html#using-evade-sdk) --------------------------------------------------------------------- WARNING Before using the SDK you need to instantiate it using `sdk_init::evade()` - example provided on [this page](https://docs.ven.pub/setup.html) Getting Evade State [​](https://docs.ven.pub/evade.html#getting-evade-state) ----------------------------------------------------------------------------- INFO This function returns true if Evade is currently evading `bool sdk::evade->is_evading()` Example cpp void __fastcall game_update() { g_sdk->log_console( "Evading: %d", sdk::evade->is_evading() ); } void __fastcall game_update() { g_sdk->log_console( "Evading: %d", sdk::evade->is_evading() ); } Cast Safely [​](https://docs.ven.pub/evade.html#cast-safely) ------------------------------------------------------------- INFO This function returns true if the spell cast will not interfere with evading `bool sdk::evade->can_spell( int spell_slot, float cast_time )` Dash Safely [​](https://docs.ven.pub/evade.html#dash-safely) ------------------------------------------------------------- INFO This function returns true if the dash will not interfere with evading `bool sdk::evade->can_dash( const math::vector3& pos, float dash_speed, float cast_time = 0.f )` Knowing if Position is Safe [​](https://docs.ven.pub/evade.html#knowing-if-position-is-safe) --------------------------------------------------------------------------------------------- INFO This function returns true if the world position is outside a spell `bool sdk::evade->is_position_safe( const math::vector3& pos )` Knowing if a Spell is dangerous [​](https://docs.ven.pub/evade.html#knowing-if-a-spell-is-dangerous) ----------------------------------------------------------------------------------------------------- INFO This function returns true if the Spell is dangerous This requires a sm\_sdk::spell\* from [Spell Manager](https://docs.ven.pub/spell-manager.html) `bool sdk::evade->is_dangerous_spell( sm_sdk::spell* spell )` Example cpp sdk::spell_manager->iterate_spells( sm_sdk::spell_iteration::enemy, [ & ]( sm_sdk::spell* spell ) { g_sdk->log_console( "Spell is dangerous %d", sdk::evade->is_dangerous_spell( spell ) ); } ); sdk::spell_manager->iterate_spells( sm_sdk::spell_iteration::enemy, [ & ]( sm_sdk::spell* spell ) { g_sdk->log_console( "Spell is dangerous %d", sdk::evade->is_dangerous_spell( spell ) ); } ); Knowing if the Player is inside a Dangerous Spell [​](https://docs.ven.pub/evade.html#knowing-if-the-player-is-inside-a-dangerous-spell) ----------------------------------------------------------------------------------------------------------------------------------------- INFO This function returns true if the Player is in a Dangerous Spell `bool sdk::evade->is_player_inside_dangerous_spell()` Example cpp void __fastcall game_update() { g_sdk->log_console( "Player is inside dangerous spell: %d", sdk::evade->is_player_inside_dangerous_spell() ); } void __fastcall game_update() { g_sdk->log_console( "Player is inside dangerous spell: %d", sdk::evade->is_player_inside_dangerous_spell() ); } Getting Spell Intersection Time [​](https://docs.ven.pub/evade.html#getting-spell-intersection-time) ----------------------------------------------------------------------------------------------------- INFO This function returns the spell intersection time This requires a sm\_sdk::spell\* from [Spell Manager](https://docs.ven.pub/spell-manager.html) WARNING The function returns -1.f if the spell will never collide `float sdk::evade->get_spell_intersection_time( const math::vector3& start_pos, const math::vector3& end_pos, float speed, sm_sdk::spell* spell )` Example cpp const auto player = g_sdk->object_manager->get_local_player(); const auto player_speed = player->get_move_speed(); const auto player_pos = player->get_position(); const auto cursor_pos = g_sdk->hud_manager->get_cursor_position(); sdk::spell_manager->iterate_spells( sm_sdk::spell_iteration::enemy, [ & ]( sm_sdk::spell* spell ) { const auto intersection_time = sdk::evade->get_spell_intersection_time( player_pos, cursor_pos, player_speed, spell ); g_sdk->log_console( "Spell will hit player in: %.2f", intersection_time ); } ); const auto player = g_sdk->object_manager->get_local_player(); const auto player_speed = player->get_move_speed(); const auto player_pos = player->get_position(); const auto cursor_pos = g_sdk->hud_manager->get_cursor_position(); sdk::spell_manager->iterate_spells( sm_sdk::spell_iteration::enemy, [ & ]( sm_sdk::spell* spell ) { const auto intersection_time = sdk::evade->get_spell_intersection_time( player_pos, cursor_pos, player_speed, spell ); g_sdk->log_console( "Spell will hit player in: %.2f", intersection_time ); } ); Evade Event Registering [​](https://docs.ven.pub/evade.html#evade-event-registering) ------------------------------------------------------------------------------------- In order to register to an evade event, `sdk::evade->register_callback` must be called inside `PluginLoad` Example: cpp bool before_move() { g_sdk->log_console( "Evade is going to issue a move order" ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; if ( !sdk_init::evade() ) return false; sdk::evade->register_callback( evade_sdk::before_move, reinterpret_cast< void* >( before_move ) ); g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } bool before_move() { g_sdk->log_console( "Evade is going to issue a move order" ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; if ( !sdk_init::evade() ) return false; sdk::evade->register_callback( evade_sdk::before_move, reinterpret_cast< void* >( before_move ) ); g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } Evade Event Unregistering [​](https://docs.ven.pub/evade.html#evade-event-unregistering) ----------------------------------------------------------------------------------------- In order to unregister from an evade event, `sdk::evade->unregister_callback` must be called inside `PluginUnload` cpp extern "C" __declspec( dllexport ) void PluginUnload() { sdk::evade->unregister_callback( evade_sdk::before_move, reinterpret_cast< void* >( before_move ) ); g_sdk->log_console( "[-] ExampleModule unloaded!" ); } extern "C" __declspec( dllexport ) void PluginUnload() { sdk::evade->unregister_callback( evade_sdk::before_move, reinterpret_cast< void* >( before_move ) ); g_sdk->log_console( "[-] ExampleModule unloaded!" ); } Evade Events [​](https://docs.ven.pub/evade.html#evade-events) --------------------------------------------------------------- cpp enum event_type: uint8_t { before_move = 0, }; enum event_type: uint8_t { before_move = 0, }; INFO The return value should be `false` if we want to block move --- # Damage | VEN Documentation [Skip to content](https://docs.ven.pub/damage.html#VPContent) On this page On this page Damage [​](https://docs.ven.pub/damage.html#damage) ==================================================== Using Damage SDK [​](https://docs.ven.pub/damage.html#using-damage-sdk) ------------------------------------------------------------------------ WARNING Before using the SDK you need to instantiate it using `sdk_init::damage()` - example provided on [this page](https://docs.ven.pub/setup.html) WARNING This part of the SDK is prone to change and not completely supported yet Damage Enums [​](https://docs.ven.pub/damage.html#damage-enums) ---------------------------------------------------------------- cpp enum class damage_type { physical = 0, magical, }; enum class damage_type { physical = 0, magical, }; Getting Spell Damage [​](https://docs.ven.pub/damage.html#getting-spell-damage) -------------------------------------------------------------------------------- Spells that do not scale on target `float sdk::damage->get_spell_damage( game_object* hero, int spell_slot )` Spells that scale on target `float sdk::damage->get_spell_damage( game_object* source, game_object* target, int spell_slot )` Getting Auto Attack Damage [​](https://docs.ven.pub/damage.html#getting-auto-attack-damage) -------------------------------------------------------------------------------------------- `float sdk::damage->get_aa_damage( game_object* source, game_object* target, bool next_attack = false )` Calculating Damage [​](https://docs.ven.pub/damage.html#calculating-damage) ---------------------------------------------------------------------------- `float sdk::damage->calc_damage( damage_type type, game_object* source, game_object* target, float damage )` --- # Infotab | VEN Documentation [Skip to content](https://docs.ven.pub/infotab.html#VPContent) On this page On this page Infotab [​](https://docs.ven.pub/infotab.html#infotab) ======================================================= Using Infotab SDK [​](https://docs.ven.pub/infotab.html#using-infotab-sdk) --------------------------------------------------------------------------- WARNING Before using the SDK you need to instantiate it using `sdk_init::infotab()` - example provided on [this page](https://docs.ven.pub/setup.html) Adding an Infotab Display Entry [​](https://docs.ven.pub/infotab.html#adding-an-infotab-display-entry) ------------------------------------------------------------------------------------------------------- `uint32_t sdk::infotab->add_text( const infotab_sdk::text_entry& title, const std::function< infotab_sdk::text_entry() >& fn )` WARNING This function should only be used in `PluginLoad` You must call `sdk::infotab->remove_text` on `PluginUnload` using the ID returned by this function Example cpp infotab_id = sdk::infotab->add_text( { "Test" }, [ ]() -> infotab_sdk::text_entry { infotab_sdk::text_entry entry{}; entry.text = "HEY"; entry.color = 0xFFFF0000; return entry; } ); infotab_id = sdk::infotab->add_text( { "Test" }, [ ]() -> infotab_sdk::text_entry { infotab_sdk::text_entry entry{}; entry.text = "HEY"; entry.color = 0xFFFF0000; return entry; } ); Adding an Infotab Hotkey Entry [​](https://docs.ven.pub/infotab.html#adding-an-infotab-hotkey-entry) ----------------------------------------------------------------------------------------------------- `uint32_t sdk::infotab->add_hotkey_text( std::string* hotkey, const infotab_sdk::text_entry& title, const std::function< infotab_sdk::text_entry() >& fn );` WARNING This function should only be used in `PluginLoad` You must call `sdk::infotab->remove_text` on `PluginUnload` using the ID returned by this function Example cpp infotab_id = sdk::infotab->add_text( orb::spell_farm_key, { "Spellfarm" }, [ ]() -> infotab_sdk::text_entry { infotab_sdk::text_entry entry{}; if( orb::allow_spell_farm ) { entry.text = "ON"; entry.color = 0xFF00FF00; } else { entry.text = "OFF"; entry.color = 0xFFFF0000; } return entry; } ); infotab_id = sdk::infotab->add_text( orb::spell_farm_key, { "Spellfarm" }, [ ]() -> infotab_sdk::text_entry { infotab_sdk::text_entry entry{}; if( orb::allow_spell_farm ) { entry.text = "ON"; entry.color = 0xFF00FF00; } else { entry.text = "OFF"; entry.color = 0xFFFF0000; } return entry; } ); Removing an Infotab Entry [​](https://docs.ven.pub/infotab.html#removing-an-infotab-entry) ------------------------------------------------------------------------------------------- `void sdk::infotab->remove_text( uint32_t id )` WARNING This function should only be used in `PluginUnload` The `id` argument must be the one that returned from the `sdk::infotab->add_text` function Example cpp extern "C" __declspec(dllexport) void __fastcall PluginUnload() { sdk::infotab->remove_text( infotab_id ); } extern "C" __declspec(dllexport) void __fastcall PluginUnload() { sdk::infotab->remove_text( infotab_id ); } --- # Prediction | VEN Documentation [Skip to content](https://docs.ven.pub/prediction.html#VPContent) On this page On this page Prediction [​](https://docs.ven.pub/prediction.html#prediction) ================================================================ Using Prediction SDK [​](https://docs.ven.pub/prediction.html#using-prediction-sdk) ------------------------------------------------------------------------------------ WARNING Before using the SDK you need to instantiate it using `sdk_init::prediction()` - example provided on [this page](https://docs.ven.pub/setup.html) Prediction Enums [​](https://docs.ven.pub/prediction.html#prediction-enums) ---------------------------------------------------------------------------- cpp enum hitchance: int { automatic = -1, any = 0, low = 30, medium = 50, high = 70, very_high = 85, guaranteed_hit = 100, }; enum class hit_type: uint8_t { normal = 0, undodgeable, cast, zhonyas, cc, cc_hard, dash, }; enum class spell_type: uint8_t { linear = 0, targetted, circular, vector, }; /* basic attack range from edge to edge targeted skill range from center to center (mainly not always) skillshot range from center to edge (mainly not always) and the range of self-centered area of effects are from the center of the source (blitz R, diana R..) */ enum class targetting_type: uint8_t { center = 0, center_to_edge, edge_to_edge, }; enum class collision_type: uint8_t { unit = 0, hero, turret, terrain, yasuo_wall, braum_wall, }; enum hitchance: int { automatic = -1, any = 0, low = 30, medium = 50, high = 70, very_high = 85, guaranteed_hit = 100, }; enum class hit_type: uint8_t { normal = 0, undodgeable, cast, zhonyas, cc, cc_hard, dash, }; enum class spell_type: uint8_t { linear = 0, targetted, circular, vector, }; /* basic attack range from edge to edge targeted skill range from center to center (mainly not always) skillshot range from center to edge (mainly not always) and the range of self-centered area of effects are from the center of the source (blitz R, diana R..) */ enum class targetting_type: uint8_t { center = 0, center_to_edge, edge_to_edge, }; enum class collision_type: uint8_t { unit = 0, hero, turret, terrain, yasuo_wall, braum_wall, }; Spell Data [​](https://docs.ven.pub/prediction.html#spell-data) ---------------------------------------------------------------- INFO This is the data that needs to be fed to most prediction functions cpp class spell_data { public: spell_type spell_type{}; targetting_type targetting_type{}; int expected_hitchance = hitchance::automatic; // the expected hitchance game_object* source{}; // source object, if none player will be taken math::vector3 source_position{}; // position where the skillshot originates from, if none player position will be taken bool bypass_anti_buffering{}; // allows casting spells while other spells are being casted (allow spell buffering) int spell_slot = -1; // will be used to check for CD if expected_hitchance is automatic, if the CD of the spell is low we can spam it more float range{}; // max range of the spell float radius{}; // circle is the same as linear, use * 0.5f of the TOTAL radius (so only distance from player to one side) float cast_range{}; // the cast range of the spell for vector types: viktor E, ruble R.. float delay{}; // cast delay float proc_delay{}; // delay until the spell hits, for example syndra Q is static 0.6 float projectile_speed = FLT_MAX; // projectile speed if any, FLT_MAX if the spell has no projectiles float extension_override{}; // if we want to override the prediction extension std::vector< collision_type > forbidden_collisions{}; // things we dont want to skillshot to collide with std::vector< hit_type > expected_hit_types{}; // if we want special hit types only, fill them in here std::function< bool( game_object* ) > additional_target_selection_checks{}; // custom function for target selection checks, example: target with specific buff(s) only }; class spell_data { public: spell_type spell_type{}; targetting_type targetting_type{}; int expected_hitchance = hitchance::automatic; // the expected hitchance game_object* source{}; // source object, if none player will be taken math::vector3 source_position{}; // position where the skillshot originates from, if none player position will be taken bool bypass_anti_buffering{}; // allows casting spells while other spells are being casted (allow spell buffering) int spell_slot = -1; // will be used to check for CD if expected_hitchance is automatic, if the CD of the spell is low we can spam it more float range{}; // max range of the spell float radius{}; // circle is the same as linear, use * 0.5f of the TOTAL radius (so only distance from player to one side) float cast_range{}; // the cast range of the spell for vector types: viktor E, ruble R.. float delay{}; // cast delay float proc_delay{}; // delay until the spell hits, for example syndra Q is static 0.6 float projectile_speed = FLT_MAX; // projectile speed if any, FLT_MAX if the spell has no projectiles float extension_override{}; // if we want to override the prediction extension std::vector< collision_type > forbidden_collisions{}; // things we dont want to skillshot to collide with std::vector< hit_type > expected_hit_types{}; // if we want special hit types only, fill them in here std::function< bool( game_object* ) > additional_target_selection_checks{}; // custom function for target selection checks, example: target with specific buff(s) only }; Prediction Data [​](https://docs.ven.pub/prediction.html#prediction-data) -------------------------------------------------------------------------- INFO This is the data returned by most prediction functions cpp struct collision_data { game_object* object{}; math::vector3 collided_position{}; }; struct collision_ret { bool collided{}; std::vector< collision_data > collided_units{}; }; class pred_data { public: bool is_valid{}; // if this is true, prediction was successful we are assured that we can use all the members game_object* target{}; // the target prediction is aiming at int hitchance{}; // use expected_hitchance field inside spell_data if you only want to check > hitchance math::vector3 predicted_position{}; // predicted position of the target **use cast_position** if you want to cast a spell math::vector3 predicted_dodge_position{}; // predicted dodge position (usually on the side of the target) math::vector3 cast_position{}; // position to use when casting the spell (second cast if vector type) math::vector3 first_cast_position{}; // for vector types: viktor E, ruble R.. float intersection_time{}; // time until the skillshot will hit the player math::vector3 collision_pos{}; // the point where the spell collided std::vector< collision_data > collided_units{}; // the forbidden_collisions that the spell collided with pred_data() {}; pred_data( game_object* target ) { this->target = target; } }; struct collision_data { game_object* object{}; math::vector3 collided_position{}; }; struct collision_ret { bool collided{}; std::vector< collision_data > collided_units{}; }; class pred_data { public: bool is_valid{}; // if this is true, prediction was successful we are assured that we can use all the members game_object* target{}; // the target prediction is aiming at int hitchance{}; // use expected_hitchance field inside spell_data if you only want to check > hitchance math::vector3 predicted_position{}; // predicted position of the target **use cast_position** if you want to cast a spell math::vector3 predicted_dodge_position{}; // predicted dodge position (usually on the side of the target) math::vector3 cast_position{}; // position to use when casting the spell (second cast if vector type) math::vector3 first_cast_position{}; // for vector types: viktor E, ruble R.. float intersection_time{}; // time until the skillshot will hit the player math::vector3 collision_pos{}; // the point where the spell collided std::vector< collision_data > collided_units{}; // the forbidden_collisions that the spell collided with pred_data() {}; pred_data( game_object* target ) { this->target = target; } }; Predicting [​](https://docs.ven.pub/prediction.html#predicting) ---------------------------------------------------------------- There are multiple functions you can use depending on your need: Find a target and predict it `pred_sdk::pred_data sdk::prediction->predict( pred_sdk::spell_data spell_data )` Predicts a specific target `pred_sdk::pred_data sdk::prediction->predict( game_object* obj, pred_sdk::spell_data spell_data )` Finds a target and predicts it (for targetted spells only, used to account for wall collisions) `pred_sdk::pred_data sdk::prediction->targetted( pred_sdk::spell_data spell_data )` Getting the collision position If you want to check if the spell collided during prediction you can do so using this example: cpp pred_sdk::spell_data q_data{}; q_data.spell_type = pred_sdk::spell_type::linear; q_data.targetting_type = pred_sdk::targetting_type::center; q_data.expected_hitchance = 45; // pred_sdk::hitchance::automatic is possible q_data.spell_slot = 0; q_data.range = 1150.f; q_data.radius = 60.f; q_data.delay = 0.25f; q_data.projectile_speed = 2000.f; q_data.forbidden_collisions = { pred_sdk::collision_type::unit, pred_sdk::collision_type::hero, pred_sdk::collision_type::yasuo_wall, pred_sdk::collision_type::braum_wall, }; const auto pred = sdk::prediction->predict( q_data ); if( !pred.is_valid && pred.collision_pos != math::vector3{} ) { g_sdk->log_console( "Spell collided at %s", pred.collision_pos.to_string().c_str() ); } pred_sdk::spell_data q_data{}; q_data.spell_type = pred_sdk::spell_type::linear; q_data.targetting_type = pred_sdk::targetting_type::center; q_data.expected_hitchance = 45; // pred_sdk::hitchance::automatic is possible q_data.spell_slot = 0; q_data.range = 1150.f; q_data.radius = 60.f; q_data.delay = 0.25f; q_data.projectile_speed = 2000.f; q_data.forbidden_collisions = { pred_sdk::collision_type::unit, pred_sdk::collision_type::hero, pred_sdk::collision_type::yasuo_wall, pred_sdk::collision_type::braum_wall, }; const auto pred = sdk::prediction->predict( q_data ); if( !pred.is_valid && pred.collision_pos != math::vector3{} ) { g_sdk->log_console( "Spell collided at %s", pred.collision_pos.to_string().c_str() ); } Example using Ezreal Q cpp pred_sdk::spell_data q_data{}; q_data.spell_type = pred_sdk::spell_type::linear; q_data.targetting_type = pred_sdk::targetting_type::center; q_data.expected_hitchance = 45; // pred_sdk::hitchance::automatic is possible q_data.spell_slot = 0; q_data.range = 1150.f; q_data.radius = 60.f; q_data.delay = 0.25f; q_data.projectile_speed = 2000.f; q_data.forbidden_collisions = { pred_sdk::collision_type::unit, pred_sdk::collision_type::hero, pred_sdk::collision_type::yasuo_wall, pred_sdk::collision_type::braum_wall, }; const auto pred = sdk::prediction->predict( q_data ); if ( pred.is_valid ) { g_sdk->log_console( "Casting spell at %s | hitchance %d", pred.target->get_char_name().c_str(), pred.hitchance ); util::cast_spell( q_data.spell_slot, pred.cast_position ); } pred_sdk::spell_data q_data{}; q_data.spell_type = pred_sdk::spell_type::linear; q_data.targetting_type = pred_sdk::targetting_type::center; q_data.expected_hitchance = 45; // pred_sdk::hitchance::automatic is possible q_data.spell_slot = 0; q_data.range = 1150.f; q_data.radius = 60.f; q_data.delay = 0.25f; q_data.projectile_speed = 2000.f; q_data.forbidden_collisions = { pred_sdk::collision_type::unit, pred_sdk::collision_type::hero, pred_sdk::collision_type::yasuo_wall, pred_sdk::collision_type::braum_wall, }; const auto pred = sdk::prediction->predict( q_data ); if ( pred.is_valid ) { g_sdk->log_console( "Casting spell at %s | hitchance %d", pred.target->get_char_name().c_str(), pred.hitchance ); util::cast_spell( q_data.spell_slot, pred.cast_position ); } Predicting on Path [​](https://docs.ven.pub/prediction.html#predicting-on-path) -------------------------------------------------------------------------------- WARNING Only use this function if you cannot achieve what you want with the functions [above](https://docs.ven.pub/prediction.html#predicting) `math::vector3 sdk::prediction->predict_on_path( game_object* obj, float time, bool use_server_pos = true )` INFO The `time` argument takes seconds The `use_server_pos` argument lets you choose between client predicted position or server position Collision [​](https://docs.ven.pub/prediction.html#collision) -------------------------------------------------------------- To check whether a spell collides with any forbidden\_collisions you may use the function cpp struct collision_data { game_object* object{}; math::vector3 collided_position{}; }; struct collision_ret { bool collided{}; std::vector< collision_data > collided_units{}; }; struct collision_data { game_object* object{}; math::vector3 collided_position{}; }; struct collision_ret { bool collided{}; std::vector< collision_data > collided_units{}; }; `collision_ret sdk::prediction->collides( const math::vector3& end_point, pred_sdk::spell_data spell_data, const game_object* target )` INFO This is used internally inside the [predicting functions](https://docs.ven.pub/prediction.html#predicting) Prediction Utilities [​](https://docs.ven.pub/prediction.html#prediction-utilities) ------------------------------------------------------------------------------------ cpp float sdk::prediction->util()->get_spell_range( pred_sdk::spell_data& data, game_object* target, game_object* source ) bool sdk::prediction->util()->is_in_range( pred_sdk::spell_data& data, math::vector3 cast_position, game_object* target ) float sdk::prediction->util()->get_spell_hit_time( pred_sdk::spell_data& data, math::vector3 pos, game_object* target = nullptr ) float sdk::prediction->util()->get_spell_escape_time( pred_sdk::spell_data& data, game_object* target ) float sdk::prediction->util()->get_spell_range( pred_sdk::spell_data& data, game_object* target, game_object* source ) bool sdk::prediction->util()->is_in_range( pred_sdk::spell_data& data, math::vector3 cast_position, game_object* target ) float sdk::prediction->util()->get_spell_hit_time( pred_sdk::spell_data& data, math::vector3 pos, game_object* target = nullptr ) float sdk::prediction->util()->get_spell_escape_time( pred_sdk::spell_data& data, game_object* target ) Example cpp const auto cursor_pos = g_sdk->hud_manager->get_cursor_position(); g_sdk->log_console( "Time until spells hit cursor position %.2f", sdk::prediction->util()->get_spell_hit_time( q_data, cursor_pos ) ); const auto cursor_pos = g_sdk->hud_manager->get_cursor_position(); g_sdk->log_console( "Time until spells hit cursor position %.2f", sdk::prediction->util()->get_spell_hit_time( q_data, cursor_pos ) ); --- # Notification | VEN Documentation [Skip to content](https://docs.ven.pub/notification.html#VPContent) On this page On this page Notification [​](https://docs.ven.pub/notification.html#notification) ====================================================================== Using Notification SDK [​](https://docs.ven.pub/notification.html#using-notification-sdk) ------------------------------------------------------------------------------------------ WARNING Before using the SDK you need to instantiate it using `sdk_init::notification()` - example provided on [this page](https://docs.ven.pub/setup.html) Displaying Notification [​](https://docs.ven.pub/notification.html#displaying-notification) -------------------------------------------------------------------------------------------- `void sdk::notification->add( const std::string& title, const std::string& content, const color& clr = 0xfff0e6d2 )` Example cpp extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; if ( !sdk_init::notification() ) return false; sdk::notification->add( "Test title", "Test content" ); g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } extern "C" __declspec( dllexport ) bool PluginLoad( core_sdk* sdk, void** custom_sdk ) { g_sdk = sdk; if ( !sdk_init::notification() ) return false; sdk::notification->add( "Test title", "Test content" ); g_sdk->log_console( "[+] ExampleModule loaded!" ); return true; } --- # Shaders | VEN Documentation [Skip to content](https://docs.ven.pub/shaders.html#VPContent) On this page On this page Shaders [​](https://docs.ven.pub/shaders.html#shaders) ======================================================= Using Shaders SDK [​](https://docs.ven.pub/shaders.html#using-shaders-sdk) --------------------------------------------------------------------------- WARNING Before using the SDK you need to instantiate it using `sdk_init::shaders()` - example provided on [this page](https://docs.ven.pub/setup.html) Shaders Functions [​](https://docs.ven.pub/shaders.html#shaders-functions) --------------------------------------------------------------------------- cpp enum world_circle_style : int { normal = 0, rgb, }; virtual void draw_shadow_circle( const math::vector2& pos, float radius, color clr = {}, float blur = 0.11f ) = 0; virtual void draw_world_circle( const math::vector3& pos, float radius, float thickness, color clr, shaders_sdk::world_circle_style style = normal ) = 0; virtual void draw_world_circle_filled( const math::vector3& pos, float radius, color clr ) = 0; virtual void draw_world_segment( const math::vector3& start, const math::vector3& end, float thickness, color clr, uint8_t rounding_style ) = 0; virtual void draw_percentage_circle( const math::vector2& pos, float radius, float thickness, float percent, color clr ) = 0; virtual std::shared_ptr get_vision_manager( int team_id ) = 0; virtual void draw_vision_texture( color clr, void* texture ) = 0; virtual void draw_world_circle_segment( const math::vector3& pos, float radius, float thickness, float start, float end, color clr, shaders_sdk::world_circle_style style = normal ) = 0; virtual void draw_world_circle_segment( const math::vector3& pos, float radius, float thickness, const math::vector3& pos2, float radius2, color clr, shaders_sdk::world_circle_style style = normal ) = 0; virtual void draw_filled_world_segment( const math::vector3& start, const math::vector3& end, float thickness, color clr, uint8_t rounding_style, float center_alpha ) = 0; enum world_circle_style : int { normal = 0, rgb, }; virtual void draw_shadow_circle( const math::vector2& pos, float radius, color clr = {}, float blur = 0.11f ) = 0; virtual void draw_world_circle( const math::vector3& pos, float radius, float thickness, color clr, shaders_sdk::world_circle_style style = normal ) = 0; virtual void draw_world_circle_filled( const math::vector3& pos, float radius, color clr ) = 0; virtual void draw_world_segment( const math::vector3& start, const math::vector3& end, float thickness, color clr, uint8_t rounding_style ) = 0; virtual void draw_percentage_circle( const math::vector2& pos, float radius, float thickness, float percent, color clr ) = 0; virtual std::shared_ptr get_vision_manager( int team_id ) = 0; virtual void draw_vision_texture( color clr, void* texture ) = 0; virtual void draw_world_circle_segment( const math::vector3& pos, float radius, float thickness, float start, float end, color clr, shaders_sdk::world_circle_style style = normal ) = 0; virtual void draw_world_circle_segment( const math::vector3& pos, float radius, float thickness, const math::vector3& pos2, float radius2, color clr, shaders_sdk::world_circle_style style = normal ) = 0; virtual void draw_filled_world_segment( const math::vector3& start, const math::vector3& end, float thickness, color clr, uint8_t rounding_style, float center_alpha ) = 0; --- # Benchmark | VEN Documentation [Skip to content](https://docs.ven.pub/benchmark.html#VPContent) On this page On this page Benchmark [​](https://docs.ven.pub/benchmark.html#benchmark) ============================================================= Using Benchmark SDK [​](https://docs.ven.pub/benchmark.html#using-benchmark-sdk) --------------------------------------------------------------------------------- WARNING Before using the SDK you need to instantiate it using `sdk_init::benchmark()` - example provided on [this page](https://docs.ven.pub/setup.html) Benchmarking [​](https://docs.ven.pub/benchmark.html#benchmarking) ------------------------------------------------------------------- WARNING Do not keep the benchmark in release builds Benchmarking is only available to verified developers account TIP Preferably you want to add an #ifdef to remove benchmarking completely from release builds There is a macro defined to add a new benchmark (BENCHMARK\_ADD) cpp #define BENCHMARK void __fastcall draw_world() { #ifdef BENCHMARK BENCHMARK_ADD( "awareness_draw_world" ); benchmark->start(); #endif world::heroes::draw(); world::towers::draw(); world::traps::draw(); for( auto& hero_info : awareness_heroes ) spell_hud::draw( hero_info ); #ifdef BENCHMARK benchmark->stop(); #endif } #define BENCHMARK void __fastcall draw_world() { #ifdef BENCHMARK BENCHMARK_ADD( "awareness_draw_world" ); benchmark->start(); #endif world::heroes::draw(); world::towers::draw(); world::traps::draw(); for( auto& hero_info : awareness_heroes ) spell_hud::draw( hero_info ); #ifdef BENCHMARK benchmark->stop(); #endif } ---