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

Начало

Octarine

Octarine - приватный чит для Dota 2, Deadlock, который позволяет создавать собственные скрипты с помощью 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