Перейти к основному содержимому

Начало

Octarine​

Octarine - приватный чит для Dota 2, Deadlock и CS2, который позволяет создавать собственные скрипты с помощью TypeScript API.

Начало работы​

warning

Документация составлена для людей, знающих основы TypeScript / JavaScript и обладающих практическим опытом. Пожалуйста, не обращайтесь в поддержку с вопросами по документации, так как они останутся без ответа.

При возникновении любых вопросов по API пишите на нашем дискорд сервере. Там вы получите ответы непосредственно от разработчиков чита.

Подготовка​

  1. Установите NodeJS.
  2. Перезапустите Octarine Client.
  3. Включите режим разработчика на сайте.
  4. Создайте необходимые папки, как показано ниже:
├── disk or folder:
│ └── github.com
│ ├── octarine-public
│ └── your-login-github
  1. Клонируйте репозиторий https://github.com/octarine-public/wrapper в папку octarine-public.
  2. Сделайте копию репозитория https://github.com/octarine-public/example-repo и клонируйте его в папку your-login-github.
  3. Установите 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.

  1. Необходимо убедиться, что всё сделано корректно и скрипт установлен, для этого нужно открыть консоль. В адресной строке введите chrome://inspect и выберите «Open dedicated DevTools for Node». Перейдите по ссылке http://localhost:9222/json. Найдите «Main Worker» и перейдите по ссылке «devtoolsFrontendUrl».

    Если вы все сделали правильно, то при заходе на карту в меню Octarine появится раздел Example с настройками, а на экране отобразится 2D квадрат.

Пример кода (example-repo/index.ts)
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