Scooby Docs

COUNTER-STRIKE 2 / LUA

Your tools. Your interface.

Start with a working visual template, make it your own, and keep the CS2 API close by.

HOST 2.4 UI 1.1 · Lua 5.4.7

LUA TEMPLATE Opt-in

Command framework

Build custom target selection, recoil correction and firing in an isolated command worker. Enable command permission and reload; starts disabled.

Download Command framework.lua ↓

LUA TEMPLATE User URL

Download asset

Download binary assets asynchronously into script folders with HTTP and file permission switches.

Download Download asset.lua ↓

LUA TEMPLATE Author configured

Native hooks

A typed Win64 hook recipe with original forwarding, shared controls and automatic script cleanup. Fill in a verified pattern/prototype first.

Download Native hooks.lua ↓

LUA TEMPLATE F10

Visual Studio

A standalone UI with crosshair, speed, health ring, player labels and native ESP controls.

Download ImGui Demo.lua ↓

LUA TEMPLATE No default key

Speed HUD

Horizontal player speed with frame-rate-independent display smoothing.

Download Speed HUD.lua ↓

Run your first script

  1. Open Scripts → Other → Open folder and place the downloaded Lua file there.
  2. Select Refresh, choose the file and click Run. Its button becomes Unload.
  3. Press F9 for Standalone tools or F10 for Visual Studio. Change the open/close key inside the window.
  4. Use Edit to change code, Script UI for custom pages, and Unload to remove its windows and overlays.

Save preferences inside either standalone template to restore its controls on the next run. Native ESP settings changed by a template keep their selected values after unload.

A small health overlay
local enabled = features.add {
    id = "health", label = "My health overlay", default = true, key = "F8"
}
ui.tab("controls", "My overlay", function()
    ui.feature(enabled)
    ui.keybind(enabled, "Toggle key")
end)
ui.overlay("health_overlay", function()
    local player = entity.get_local_player()
    if not features.active(enabled) or not player or not player.alive then return end
    render.text(24, 120, player.name .. "  " .. player.health .. " HP",
                render.theme().accent, 18)
end)