Начало
Octarine
Octarine - приватный чит для Dota 2, Deadlock и CS2, который позволяет создавать собственные скрипты с помощью TypeScript API.
Начало работы
Документация составлена для людей, знающих основы TypeScript / JavaScript и обладающих практическим опытом. Пожалуйста, не обращайтесь в поддержку с вопросами по документации, так как они останутся без ответа.
При возникновении любых вопросов по API пишите на нашем дискорд сервере. Там вы получите ответы непосредственно от разработчиков чита.
Подготовка
- Установите NodeJS.
- Перезапустите Octarine Client.
- Включите режим разработчика на сайте.
- Создайте необходимые папки, как показано ниже:
├── disk or folder:
│ └── github.com
│ ├── octarine-public
│ └── your-login-github
- Клонируйте репозиторий https://github.com/octarine-public/wrapper в папку octarine-public.
- Сделайте копию репозитория https://github.com/octarine-public/example-repo и клонируйте его в папку your-login-github.
- Установите yarn для wrapper и example-repo:
yarn install
Подключение скрипта
Локальные скрипты (рекомендуется для разработки)
8а. Добавьте example-repo на сайте в локальные скрипты, указав путь к папке на диске, например:
C:\github.com\octarine-public\example-repo
Преимущество: изменения применяются сразу при перезагрузке скриптов — без необходимости делать commit/push.
Через Git (для публикации)
8б. Добавьте копию «example-repo» на сайте в локальные скрипты, пример ссылки:
https://github.com/qzore/example-repo@main
Для добавления приватного репозитория используйте GitHub-токен, пример ссылки:
https://qzore:ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/qzore/example-repo@main
В итоге у вас должна получиться следующая структура файлов:
disk or folder:
├─── github.com
│ ├── octarine-public
│ │ └── wrapper
│ └── qzore
│ └── example-repo
│ └── index.ts
│ └── другие файлы и папки...
В example-repo находится файл INSTRUCTIONS.md, содержащий инструкции для ИИ-ассистентов (Claude Code, Cursor и др.). Этот файл помогает ИИ понимать структуру проекта, доступные API и правильно писать скрипты. Рекомендуем сохранить его в своём репозитории и дополнить по мере необходимости.
Для дальнейших действий должен быть запущен Octarine и Dota 2.
-
Необходимо убедиться, что всё сделано корректно и скрипт установлен, для этого нужно открыть консоль. В адресной строке введите
chrome://inspectи выберите «Open dedicated DevTools for Node». Перейдите по ссылке http://localhost:9222/json. Найдите «Main Worker» и перейдите по ссылке «devtoolsFrontendUrl».Если вы все сделали правильно, то при заходе на карту в меню Octarine появится раздел Example с настройками, а на экране отобразится 2D квадрат.
Пример кода (example-repo/index.ts)
import {
Color,
EventsSDK,
GUIInfo,
LocalPlayer,
Menu,
naga_siren_mirror_image,
npc_dota_hero_naga_siren,
Rectangle,
RendererSDK,
TextFlags,
Vector2
} from "github.com/octarine-public/wrapper/index"
new (class ExampleScript {
// Menu
private readonly entry = Menu.AddEntry("Example")
// — Ability section
private readonly abilityTree = this.entry.AddNode("Naga Siren")
private readonly castKey = this.abilityTree.AddKeybind("Cast Mirror Image", "None", "Press to cast Mirror Image")
// — Drawing section
private readonly drawTree = this.entry.AddNode("2D Square Demo")
private readonly drawState = this.drawTree.AddToggle("State", true)
private readonly size = this.drawTree.AddSlider("Square Size", 150, 50, 500)
private readonly rotation = this.drawTree.AddSlider("Rotation", 0, 0, 360)
private readonly opacity = this.drawTree.AddSlider("Opacity", 180, 0, 255)
private readonly borderWidth = this.drawTree.AddSlider("Border Width", 2, 0, 10)
private readonly fillColor = this.drawTree.AddColorPicker("Fill Color", new Color(50, 150, 255))
private readonly borderColor = this.drawTree.AddColorPicker("Border Color", new Color(255, 255, 255))
private readonly showText = this.drawTree.AddToggle("Show Info Text", true)
constructor() {
this.castKey.OnPressed(() => this.CastFirstSpell())
EventsSDK.on("Draw", this.Draw.bind(this))
EventsSDK.on("GameEnded", this.GameEnded.bind(this))
}
// — Ability logic
private CastFirstSpell(): void {
const hero = LocalPlayer?.Hero
if (hero === undefined || !(hero instanceof npc_dota_hero_naga_siren)) {
return
}
const ability = hero.Spells.find(spell => spell instanceof naga_siren_mirror_image)
if (ability === undefined || !ability.CanBeCasted()) {
return
}
hero.CastNoTarget(ability, false, true)
}
// — Drawing logic
private Draw(): void {
if (!this.drawState.value) {
return
}
const screenW = RendererSDK.WindowSize.x
const screenH = RendererSDK.WindowSize.y
const squareSize = GUIInfo.ScaleHeight(this.size.value)
const fill = this.fillColor.SelectedColor.SetA(this.opacity.value)
const pos = new Vector2((screenW - squareSize) / 2, (screenH - squareSize) / 2)
const vecSize = new Vector2(squareSize, squareSize)
RendererSDK.FilledRect(pos, vecSize, fill, this.rotation.value)
if (this.borderWidth.value > 0) {
RendererSDK.OutlinedRect(
pos,
vecSize,
this.borderWidth.value,
this.borderColor.SelectedColor,
this.rotation.value
)
}
if (this.showText.value) {
const textRect = new Rectangle()
const textY = pos.y + squareSize + GUIInfo.ScaleHeight(10)
textRect.pos1.CopyFrom(new Vector2(pos.x, textY))
textRect.pos2.CopyFrom(new Vector2(pos.x + squareSize, textY + GUIInfo.ScaleHeight(30)))
RendererSDK.TextByFlags(
`Size: ${this.size.value} | Rotation: ${this.rotation.value}`,
textRect,
Color.White,
1.2,
TextFlags.Center
)
}
}
private GameEnded(): void {
this.castKey.isPressed = false
}
})()
Применение изменений
- Локальные скрипты: достаточно перезагрузить скрипты через меню Octarine в игре: Настройки -> Перезагрузить скрипты.
- Git: сделать commit, затем перезагрузить скрипты тем же способом.
Чтобы получать уведомления о доступных изменениях и знать, когда можно перезагрузить скрипты, включите опцию Уведомления -> Оповещение об обновлениях.
Если зажать клавишу перезагрузки скриптов при открытом меню, включится режим автоматической перезагрузки. В этом режиме скрипты будут перезагружаться автоматически: при push для Git-скриптов или при изменении файлов для локальных скриптов.
Примеры других скриптов: https://github.com/octarine-public