# Examples

## Examples:

### Calling virtual functions

```lua
-- Get the interface address
local IVEngineClient = utils.find_interface("engine.dll", "VEngineClient014") or error("Engine client is invalid")

-- Cast to a pointer that can be dereferenced
local IVEngineClientPtr = ffi.cast("void***", IVEngineClient)

-- Dereference to get the vtable 
local IVEngineClientVtable = IVEngineClientPtr[0]

-- Get virtual function ptr
local ClientCmdPtr = IVEngineClientVtable[108]

-- Cast the address to the function type
local ClientCmd = ffi.cast(ffi.typeof("void(__thiscall*)(void*, const char*)"), ClientCmdPtr)

-- Call the virtual function with the interface ptr as the first argument
ClientCmd(IVEngineClientPtr, "say Hello from lua-ffi")

-------------------------------------------------
-- All of this can be compacted into one function
-------------------------------------------------

local function vtable_bind(interface, type, index)
    local this = ffi.cast("void***", interface)
    return function (...)
        return ffi.cast(ffi.typeof(type), this[0][index])(this, ...)
    end
end
--                                       Interface       Function type                            Virtual index
local ClientCmd_AltVersion = vtable_bind(IVEngineClient, "void(__thiscall*)(void*, const char*)", 108)
```

### Watermark

```lua
-- Create a gui element
local CheckboxItem = gui.add_checkbox("Example Watermark", "Visuals>Misc>Various")

-- Get our font 
local Font = render.create_font("verdana.ttf", 14)

-- Set how many pixels of spacing we want 
local Spacing = {30, 30}
local Padding = {6, 2}
local WatermarkName = "Fatality.win"

-- Use the paint callback
function on_paint()
    -- Check if our checkbox is active (get_bool() == true) 
    -- If not then do nothing and return
    if not CheckboxItem:get_bool() then
        return
    end
    -- Get our screensize
    local ScreenSize = {render.get_screen_size()}
    -- Calculate the text size of the cheat name
    local TextSize = {render.get_text_size(Font, WatermarkName)}

    -- Calculate our text size with spacing
    local Size      = {TextSize[1] + (Padding[1] * 2), TextSize[2] + (Padding[2] * 2)}
    local Position  = {ScreenSize[1] - Size[1] - Spacing[1], Spacing[2]}

    -- Render background
    render.rect_filled(Position[1], Position[2], Position[1] + Size[1], Position[2] + Size[2], render.color(58, 36, 107, 255))
    render.rect(Position[1], Position[2], Position[1] + Size[1], Position[2] + Size[2], render.color(26, 22, 64, 200))

    -- Render our text
    render.text(Font, Position[1] + Padding[1], Position[2] + Size[2] / 2, WatermarkName, render.color("#FFFFFF"), render.align_left, render.align_center)
end
```

### Accessing callbacks

```lua
-- define a function with the name of the callback you want to use
-- here i will use create_move

-- add any parameters that are passed into the callback (read the callbacks page to see what is passed in each callback)
-- for example events from their callbacks are accessed like this function on_item_pickup(event <- here)
function on_create_move(user_cmd)
    
    -- here you can access the data inside of the current user command (user_cmd datatype)
    user_cmd:get_buttons()
end
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://fecality-api.gitbook.io/docs/getting-started/examples.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
