Модели
Классы, которые отдаёт чтение мира — Player, Npc, Drop, Skill и остальные — и все их поля.
На этой странице
Всё, что скрипт читает через bot.*, — это объекты описанных здесь классов. Они доступны только на чтение: изменить мир можно командами.
Какое свойство bot какой класс возвращает — в таблице «Чтение мира». Здесь описано, что у этих классов внутри.
Оглавление
oid и idPositionedIdentifiedLiveEntityPlayerNpcCharPetDropSkillInventoryItemStoreItemBuffPetActionPartyMemberPartyPetPacketХелперы списковПеречисленияЧисловые кодыoid и id
oid(object id) — конкретный экземпляр: вот этот моб, вот эта вещь в сумке, вот этот дроп. Выдаётся сервером, живёт пока объект существует, приходит в полях событий.id(template-id) — тип: id моба,itemIdвещи,skillIdумения. Один и тот же у всех орков на карте.
У Npc, Pet, Drop, Skill, PartyPet есть оба: mob.id — «орк вообще», mob.oid — «вот этот орк». Команды принимают и то и другое, см. «id или oid».
Positioned
Интерфейс всего, у чего есть позиция: живые сущности, дроп, участники группы.
| Поле | Тип | Описание |
|---|---|---|
oid | Int | Object id. |
x | Int | Координата X. |
y | Int | Координата Y. |
z | Int | Высота. |
distToSelf | Int | Расстояние до своего персонажа, посчитано при обновлении мира. У самого user равно 0. |
Identified
Интерфейс всего, у чего есть template-id: Npc, Pet, Drop, Skill, PartyPet.
| Поле | Тип | Описание |
|---|---|---|
id | Int | Template-id (тип моба, itemId вещи, skillId умения). |
LiveEntity
Общая база живых сущностей: Player, Npc, Char, Pet. Реализует Positioned.
| Поле | Тип | Описание |
|---|---|---|
name | String | Имя. |
heading | Int | Направление взгляда. |
hp | Int | Текущее HP. |
maxHp | Int | Максимальное HP. |
mp | Int | Текущее MP. |
maxMp | Int | Максимальное MP. |
dead | Boolean | Мёртв. |
running | Boolean | Бежит (а не идёт шагом). |
sitting | Boolean | Сидит. |
inCombat | Boolean | В боевой стойке. |
invisible | Boolean | Невидим. |
attackerOid | Int | Object id того, кого эта сущность бьёт — цель её последней атаки или каста. 0 — неизвестно. Название историческое, смысл именно такой. |
targetOid | Int | Object id выбранной цели. 0 — цели нет. |
engagedOid | Int | Object id объекта, к которому сущность сближается для атаки или каста. 0 — не сближается. |
engagedDist | Int | Дистанция, на которой сущность остановится при сближении с engagedOid. |
title | String | Титул. |
karma | Int | Карма. |
pvp | Boolean | Во флаге PvP. |
buffs | List<Buff> | Активные баффы и эффекты. |
effectIds | List<Int> | Id визуальных эффектов (abnormal), которые сервер отображает на сущности. |
| Свойство | Тип | Описание |
|---|---|---|
target | LiveEntity? | Цель этой сущности, уже разрешённая в объект. null — цели нет или объект не виден. |
hpPercent | Float | Доля HP от 0f до 1f. 0f, если maxHp неизвестен. |
mpPercent | Float | Доля MP от 0f до 1f. |
| Метод | Возвращает | Описание |
|---|---|---|
distTo(px: Int, py: Int, pz: Int) | Int | Расстояние до точки. |
distTo(other: Positioned) | Int | Расстояние до другого объекта. |
inRange(other: Positioned, range: Int) | Boolean | Находится ли объект ближе или ровно на range. |
hasBuff(skillId: Int) | Boolean | Есть ли активный бафф с таким id. |
Player
Свой персонаж — bot.user. Всё из LiveEntity плюс:
| Поле | Тип | Описание |
|---|---|---|
classId | Int | Текущий класс. |
mainClass | Int | Основной класс. |
level | Int | Уровень. |
exp | Long | Опыт. |
sp | Long | SP. |
expPercent | Double | Процент опыта до следующего уровня. |
cp | Int | Текущее CP. |
maxCp | Int | Максимальное CP. |
cpPercent | Float | Доля CP от 0f до 1f. |
castingSkillId | Int | Id умения, которое кастуется сейчас. 0 — не кастует. |
castingTargetOid | Int | Object id цели текущего каста. |
castRemainMs | Long | Остаток текущего каста в миллисекундах. 0 — не кастует. |
isCasting | Boolean | Кастует прямо сейчас. |
charges | Int | Заряды (force). |
souls | Int | Души. |
weightPenalty | Int | Уровень штрафа за перегруз. 0 — штрафа нет. |
weaponPenalty | Int | Уровень штрафа за оружие не по грейду. |
armorPenalty | Int | Уровень штрафа за броню не по грейду. |
deathPenaltyLevel | Int | Уровень штрафа смерти. |
canCrystallize | Boolean | Персонаж умеет кристаллизовать вещи. |
weaponEquipped | Boolean | Оружие надето. |
weight | Int | Текущий вес. |
maxWeight | Int | Предельный вес. |
adena | Long | Адена. |
soulshotEnabled | Boolean | Автошоты включены. |
fishing | Int | Состояние рыбалки. 0 — не рыбачит. |
runSpeed | Int | Скорость бега. |
walkSpeed | Int | Скорость шага. |
skills | List<Skill> | Все умения персонажа. |
inventory | List<InventoryItem> | Обычный инвентарь. |
petItems | List<InventoryItem> | Инвентарь пета. |
questItems | List<InventoryItem> | Квестовые вещи. |
| Метод | Возвращает | Описание |
|---|---|---|
skill(id: Int) | Skill? | Умение по skillId, null — такого нет. |
item(itemId: Int) | InventoryItem? | Первая вещь этого типа в обычном инвентаре, null — нет. |
Npc
Моб или NPC из bot.npcs. Всё из LiveEntity и Identified плюс:
| Поле | Тип | Описание |
|---|---|---|
id | Int | Template-id — тип моба. |
level | Int | Уровень. |
attackable | Boolean | По нему в принципе можно бить (моб, а не мирный NPC). |
sweepable | Boolean | С трупа можно снять споил. |
spoiled | Boolean | Споил наложен. |
spoiledByMe | Boolean | Споил наложен мной. |
spoiledByOther | Boolean | Споил наложен кем-то другим. |
passive | Boolean | Пассивный: сам не нападает. |
isPet | Boolean | Это чужой пет или саммон. |
petType | Int | Тип пета, если isPet. |
ownerOid | Int | Object id владельца, если это пет. 0 — владельца нет. |
owner | LiveEntity? | Владелец, уже разрешённый в объект. null — не пет либо владелец не виден. |
aggro | Boolean | Моб агрится на мою сторону: на меня, на моего пета или на участника моей группы. |
damageDealt | Long | Сколько урона нанёс ему лично мой персонаж. |
hitsDealt | Int | Сколько ударов по нему нанёс лично мой персонаж. |
lastHitTime | Long | Время моего последнего удара по нему. |
runSpeed | Int | Скорость бега. |
walkSpeed | Int | Скорость шага. |
Char
Другой игрок из bot.chars. Всё из LiveEntity плюс:
| Поле | Тип | Описание |
|---|---|---|
sex | Int | Код пола, как в протоколе. |
race | Int | Код расы, см. числовые коды. |
classId | Int | Текущий класс. |
mainClass | Int | Основной класс. |
relation | Int | Битовая маска отношений (группа, клан, альянс, война), как присылает сервер. |
clanId | Int | Id клана. 0 — без клана. |
clanCrestId | Int | Id герба клана. |
allyId | Int | Id альянса. 0 — без альянса. |
allyCrestId | Int | Id герба альянса. |
nameColor | Int | Цвет имени, как присылает сервер. |
titleColor | Int | Цвет титула, как присылает сервер. |
storeType | Int | Тип открытой лавки, см. числовые коды. 0 — лавки нет. |
noble | Boolean | Нобл. |
hero | Boolean | Герой. |
enchantEffect | Int | Уровень свечения заточки. |
cubicCount | Int | Количество кубиков. |
premium | Boolean | Премиум-аккаунт. |
team | Int | Команда на ивенте. 0 — вне команд. |
Pet
Свой пет или саммон из bot.pets. Всё из LiveEntity и Identified плюс:
| Поле | Тип | Описание |
|---|---|---|
id | Int | Template-id пета. |
petType | Int | Тип пета. |
fed | Int | Текущая сытость. |
maxFed | Int | Максимальная сытость. |
level | Int | Уровень. |
exp | Long | Опыт. |
expPercent | Double | Процент опыта до следующего уровня. |
sp | Long | SP. |
actions | List<PetAction> | Доступные действия пета. |
Drop
Вещь на земле из bot.drops. Реализует Positioned и Identified. Живой сущностью не является — HP у неё нет.
| Поле | Тип | Описание |
|---|---|---|
oid | Int | Object id дропа. |
id | Int | Template-id вещи. |
itemId | Int | То же, что id, — привычное имя. |
count | Long | Количество в стопке. |
stackable | Boolean | Вещь стакуется. |
ownerOid | Int | Object id того, за кем закреплён дроп. 0 — ни за кем. |
isMine | Boolean | Дроп закреплён за моей стороной, право подбора есть. |
x, y, z | Int | Координаты. |
distToSelf | Int | Расстояние до моего персонажа. |
Skill
Умение из bot.skills или user.skills. Реализует Identified.
| Поле | Тип | Описание |
|---|---|---|
id | Int | Id умения. |
level | Int | Уровень. |
level2 | Int | Дополнительный уровень (подуровень или заточка), если сервер его присылает. |
passive | Boolean | Пассивное умение — кастовать нельзя. |
disabled | Boolean | Умение временно заблокировано. |
enchanted | Boolean | Умение заточено. |
reuseTime | Int | Полное время перезарядки. |
cdMs | Long | Остаток перезарядки в миллисекундах. 0 — готово. |
onCooldown | Boolean | Перезарядка ещё идёт. |
ready | Boolean | Снято с перезарядки, не пассивное и не заблокированное. Не учитывает MP, реагенты и прочие условия каста. |
InventoryItem
Вещь из bot.inventory, user.petItems, user.questItems.
| Поле | Тип | Описание |
|---|---|---|
oid | Int | Object id конкретной вещи. |
itemId | Int | Template-id — тип вещи. |
count | Long | Количество. |
equipped | Boolean | Надета. |
slot | Int | Слот или категория вещи, как присылает сервер. |
bodyPart | Int | Часть тела, куда вещь надевается. |
enchantLevel | Int | Уровень заточки. |
augmentId | Int | Id аугментации. 0 — нет. |
remainTime | Int | Остаток времени жизни для временных вещей. |
itemType | Int | Тип вещи по классификации сервера. |
isNamed | Boolean | Именная вещь. |
stackable | Boolean | Вещь стакуется. |
StoreItem
Одна позиция из bot.storeItems — товары последней открытой частной лавки.
Это снимок на момент открытия, а не живые цены: когда кто-то выкупит позицию, сервер об этом молчит, и сохранённый список тихо устаревает.
| Поле | Тип | Описание |
|---|---|---|
oid | Int | Object id конкретной вещи. |
itemId | Int | Template-id — тип вещи. |
count | Long | Сколько выставлено на продажу. |
price | Long | Цена продавца за штуку. |
basePrice | Long | Справочная цена предмета: разница price - basePrice показывает, насколько предложение отличается от базового. |
bodyPart | Int | Часть тела, куда вещь надевается. 0 — ненадеваемая. |
Buff
Активный бафф или эффект: entity.buffs, partyMember.effects, partyPet.effects.
| Поле | Тип | Описание |
|---|---|---|
id | Int | Id умения. |
level | Int | Уровень. |
level2 | Int | Дополнительный уровень, если сервер его присылает. |
remainMs | Long | Остаток действия в миллисекундах. -1 — бафф без таймера. |
permanent | Boolean | Бафф без таймера, вечный. Проверяй именно это поле, а не сравнивай remainMs. |
startTime | Long | Время начала действия, как присылает сервер. |
reuseTime | Int | Время перезарядки умения, если сервер его прислал. |
PetAction
Доступное действие пета из pet.actions.
| Поле | Тип | Описание |
|---|---|---|
id | Int | Id действия. |
category | Int | Категория действия. |
PartyMember
Участник группы из bot.party. Реализует Positioned. Это не LiveEntity — сервер присылает по участникам меньше данных.
| Поле | Тип | Описание |
|---|---|---|
oid | Int | Object id участника. |
name | String | Имя. |
classId | Int | Класс. |
level | Int | Уровень. |
x, y, z | Int | Координаты. |
distToSelf | Int | Расстояние до моего персонажа. |
hp | Int | Текущее HP. |
maxHp | Int | Максимальное HP. |
mp | Int | Текущее MP. |
maxMp | Int | Максимальное MP. |
cp | Int | Текущее CP. |
maxCp | Int | Максимальное CP. |
hpPercent | Float | Доля HP от 0f до 1f. |
sex | Int | Код пола. |
race | Int | Код расы, см. числовые коды. |
pets | List<PartyPet> | Петы участника. |
effects | List<Buff> | Эффекты на участнике. |
Чтобы получить участника группы как полноценную сущность (с баффами, целью, боевым состоянием), найди его среди bot.chars по oid:
val member = bot.party.firstOrNull { it.name == "Healer" }
val asChar = member?.let { m -> bot.chars.byOid(m.oid) }PartyPet
Пет участника группы из partyMember.pets. Реализует Identified.
| Поле | Тип | Описание |
|---|---|---|
id | Int | Template-id пета. |
oid | Int | Object id пета. |
ownerOid | Int | Object id владельца. |
petType | Int | Тип пета. |
name | String | Имя. |
hp | Int | Текущее HP. |
maxHp | Int | Максимальное HP. |
mp | Int | Текущее MP. |
maxMp | Int | Максимальное MP. |
effects | List<Buff> | Эффекты на пете. |
Packet
Сырой игровой пакет из bot.packetsIn / bot.packetsOut — см. «Сырой трафик». Не сущность мира: у него нет ни oid, ни позиции, это просто байты с провода.
| Поле | Тип | Описание |
|---|---|---|
hex | String | Байты пакета в hex, верхним регистром, без разделителей. |
bytes | ByteArray | Те же байты. Считаются при первом обращении. |
incoming | Boolean | true — от сервера (packetsIn), false — от клиента (packetsOut). |
opcode | Int | Первый байт — опкод пакета. |
subOpcode | Int | Подкоманда extended-пакета. -1, если пакет не extended. |
size | Int | Длина тела в байтах. |
byteAt(index: Int) | Int | Байт по номеру, или -1 за пределами пакета. |
Направления похожи только формой. Один и тот же байт опкода значит в каждую сторону своё, и признак extended-пакета у них разный — FE у входящих, D0 у исходящих. Поэтому subOpcode и смотрит на incoming, а сравнивать opcode со списком опкодов имеет смысл только зная направление.
Из того же следует: повторить через sendPacket можно только исходящий пакет — его тело и есть то, что принимает эта команда. Отправлять на сервер то, что от сервера пришло, бессмысленно, а обычно ещё и рвёт соединение.
Хелперы списков
Функции-расширения для списков, которые отдаёт bot.*.
| Хелпер | Для чего | Возвращает |
|---|---|---|
list.byOid(oid: Int) | Списки Positioned | Первый объект с таким object id, иначе null. |
list.byId(id: Int) | Списки Identified | Первый объект с таким template-id, иначе null. |
list.allById(id: Int) | Списки Identified | Все объекты с таким template-id. |
list.byName(name: String) | Списки LiveEntity | Первая сущность с таким именем, иначе null. |
list.nearest { … } | Списки Positioned | Ближайший к моему персонажу объект, подходящий под условие. Без условия — просто ближайший. null — подходящих нет. |
inventory.equippedCount(itemId: Int) | List<InventoryItem> | Сколько надето вещей этого типа. |
val mob = bot.npcs.nearest { it.attackable && !it.dead && it.distToSelf <= 1200 }
val boss = bot.npcs.byId(29020)
val ally = bot.chars.byName("Healer")
val myPet = bot.pets.firstOrNull()Перечисления
LootMode
Режим дележа лута для inviteParty.
| Значение | Код | Описание |
|---|---|---|
FINDERS_KEEPERS | 0 | Кто поднял, того и вещь. |
RANDOM | 1 | Случайно между участниками. |
RANDOM_SPOIL | 2 | Случайно, включая споил. |
BY_TURN | 3 | По очереди. |
BY_TURN_SPOIL | 4 | По очереди, включая споил. |
RestartType
Точка возрождения для goHome.
| Значение | Код | Описание |
|---|---|---|
TOWN | 0 | Ближайший город. |
CLAN_HALL | 1 | Кланхолл. |
CASTLE | 2 | Замок. |
FORTRESS | 3 | Форт. |
FLAG | 4 | Флаг осады. |
У обоих перечислений есть поле code: Int с числовым значением из протокола.
Числовые коды
Некоторые поля отдаются числом, как их присылает сервер.
Раса — Char.race, PartyMember.race
| Код | Раса | Код | Раса |
|---|---|---|---|
0 | человек | 4 | гном |
1 | эльф | 5 | камаэль |
2 | тёмный эльф | 6 | эртея |
3 | орк |
Тип лавки — Char.storeType
| Код | Лавка |
|---|---|
0 | нет |
1 | продажа |
2 | продажа пакетом |
3 | скупка |
5 | крафт (гномий) |
8 | крафт (общий) |
10 | настройка продажи |
11 | настройка скупки |
Коды каналов чата — на странице Команды.