Ikar BotHardShiftПланыКонтактыСкачать
Модели

Модели

Классы, которые отдаёт чтение мира — Player, Npc, Drop, Skill и остальные — и все их поля.

На этой странице

Всё, что скрипт читает через bot.*, — это объекты описанных здесь классов. Они доступны только на чтение: изменить мир можно командами.

Какое свойство bot какой класс возвращает — в таблице «Чтение мира». Здесь описано, что у этих классов внутри.

Оглавление

oid и id

  • oid (object id) — конкретный экземпляр: вот этот моб, вот эта вещь в сумке, вот этот дроп. Выдаётся сервером, живёт пока объект существует, приходит в полях событий.
  • id (template-id) — тип: id моба, itemId вещи, skillId умения. Один и тот же у всех орков на карте.

У Npc, Pet, Drop, Skill, PartyPet есть оба: mob.id — «орк вообще», mob.oid — «вот этот орк». Команды принимают и то и другое, см. «id или oid».

Positioned

Интерфейс всего, у чего есть позиция: живые сущности, дроп, участники группы.

ПолеТипОписание
oidIntObject id.
xIntКоордината X.
yIntКоордината Y.
zIntВысота.
distToSelfIntРасстояние до своего персонажа, посчитано при обновлении мира. У самого user равно 0.

Identified

Интерфейс всего, у чего есть template-id: Npc, Pet, Drop, Skill, PartyPet.

ПолеТипОписание
idIntTemplate-id (тип моба, itemId вещи, skillId умения).

LiveEntity

Общая база живых сущностей: Player, Npc, Char, Pet. Реализует Positioned.

ПолеТипОписание
nameStringИмя.
headingIntНаправление взгляда.
hpIntТекущее HP.
maxHpIntМаксимальное HP.
mpIntТекущее MP.
maxMpIntМаксимальное MP.
deadBooleanМёртв.
runningBooleanБежит (а не идёт шагом).
sittingBooleanСидит.
inCombatBooleanВ боевой стойке.
invisibleBooleanНевидим.
attackerOidIntObject id того, кого эта сущность бьёт — цель её последней атаки или каста. 0 — неизвестно. Название историческое, смысл именно такой.
targetOidIntObject id выбранной цели. 0 — цели нет.
engagedOidIntObject id объекта, к которому сущность сближается для атаки или каста. 0 — не сближается.
engagedDistIntДистанция, на которой сущность остановится при сближении с engagedOid.
titleStringТитул.
karmaIntКарма.
pvpBooleanВо флаге PvP.
buffsList<Buff>Активные баффы и эффекты.
effectIdsList<Int>Id визуальных эффектов (abnormal), которые сервер отображает на сущности.
СвойствоТипОписание
targetLiveEntity?Цель этой сущности, уже разрешённая в объект. null — цели нет или объект не виден.
hpPercentFloatДоля HP от 0f до 1f. 0f, если maxHp неизвестен.
mpPercentFloatДоля 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 плюс:

ПолеТипОписание
classIdIntТекущий класс.
mainClassIntОсновной класс.
levelIntУровень.
expLongОпыт.
spLongSP.
expPercentDoubleПроцент опыта до следующего уровня.
cpIntТекущее CP.
maxCpIntМаксимальное CP.
cpPercentFloatДоля CP от 0f до 1f.
castingSkillIdIntId умения, которое кастуется сейчас. 0 — не кастует.
castingTargetOidIntObject id цели текущего каста.
castRemainMsLongОстаток текущего каста в миллисекундах. 0 — не кастует.
isCastingBooleanКастует прямо сейчас.
chargesIntЗаряды (force).
soulsIntДуши.
weightPenaltyIntУровень штрафа за перегруз. 0 — штрафа нет.
weaponPenaltyIntУровень штрафа за оружие не по грейду.
armorPenaltyIntУровень штрафа за броню не по грейду.
deathPenaltyLevelIntУровень штрафа смерти.
canCrystallizeBooleanПерсонаж умеет кристаллизовать вещи.
weaponEquippedBooleanОружие надето.
weightIntТекущий вес.
maxWeightIntПредельный вес.
adenaLongАдена.
soulshotEnabledBooleanАвтошоты включены.
fishingIntСостояние рыбалки. 0 — не рыбачит.
runSpeedIntСкорость бега.
walkSpeedIntСкорость шага.
skillsList<Skill>Все умения персонажа.
inventoryList<InventoryItem>Обычный инвентарь.
petItemsList<InventoryItem>Инвентарь пета.
questItemsList<InventoryItem>Квестовые вещи.
МетодВозвращаетОписание
skill(id: Int)Skill?Умение по skillId, null — такого нет.
item(itemId: Int)InventoryItem?Первая вещь этого типа в обычном инвентаре, null — нет.

Npc

Моб или NPC из bot.npcs. Всё из LiveEntity и Identified плюс:

ПолеТипОписание
idIntTemplate-id — тип моба.
levelIntУровень.
attackableBooleanПо нему в принципе можно бить (моб, а не мирный NPC).
sweepableBooleanС трупа можно снять споил.
spoiledBooleanСпоил наложен.
spoiledByMeBooleanСпоил наложен мной.
spoiledByOtherBooleanСпоил наложен кем-то другим.
passiveBooleanПассивный: сам не нападает.
isPetBooleanЭто чужой пет или саммон.
petTypeIntТип пета, если isPet.
ownerOidIntObject id владельца, если это пет. 0 — владельца нет.
ownerLiveEntity?Владелец, уже разрешённый в объект. null — не пет либо владелец не виден.
aggroBooleanМоб агрится на мою сторону: на меня, на моего пета или на участника моей группы.
damageDealtLongСколько урона нанёс ему лично мой персонаж.
hitsDealtIntСколько ударов по нему нанёс лично мой персонаж.
lastHitTimeLongВремя моего последнего удара по нему.
runSpeedIntСкорость бега.
walkSpeedIntСкорость шага.

Char

Другой игрок из bot.chars. Всё из LiveEntity плюс:

ПолеТипОписание
sexIntКод пола, как в протоколе.
raceIntКод расы, см. числовые коды.
classIdIntТекущий класс.
mainClassIntОсновной класс.
relationIntБитовая маска отношений (группа, клан, альянс, война), как присылает сервер.
clanIdIntId клана. 0 — без клана.
clanCrestIdIntId герба клана.
allyIdIntId альянса. 0 — без альянса.
allyCrestIdIntId герба альянса.
nameColorIntЦвет имени, как присылает сервер.
titleColorIntЦвет титула, как присылает сервер.
storeTypeIntТип открытой лавки, см. числовые коды. 0 — лавки нет.
nobleBooleanНобл.
heroBooleanГерой.
enchantEffectIntУровень свечения заточки.
cubicCountIntКоличество кубиков.
premiumBooleanПремиум-аккаунт.
teamIntКоманда на ивенте. 0 — вне команд.

Pet

Свой пет или саммон из bot.pets. Всё из LiveEntity и Identified плюс:

ПолеТипОписание
idIntTemplate-id пета.
petTypeIntТип пета.
fedIntТекущая сытость.
maxFedIntМаксимальная сытость.
levelIntУровень.
expLongОпыт.
expPercentDoubleПроцент опыта до следующего уровня.
spLongSP.
actionsList<PetAction>Доступные действия пета.

Drop

Вещь на земле из bot.drops. Реализует Positioned и Identified. Живой сущностью не является — HP у неё нет.

ПолеТипОписание
oidIntObject id дропа.
idIntTemplate-id вещи.
itemIdIntТо же, что id, — привычное имя.
countLongКоличество в стопке.
stackableBooleanВещь стакуется.
ownerOidIntObject id того, за кем закреплён дроп. 0 — ни за кем.
isMineBooleanДроп закреплён за моей стороной, право подбора есть.
x, y, zIntКоординаты.
distToSelfIntРасстояние до моего персонажа.

Skill

Умение из bot.skills или user.skills. Реализует Identified.

ПолеТипОписание
idIntId умения.
levelIntУровень.
level2IntДополнительный уровень (подуровень или заточка), если сервер его присылает.
passiveBooleanПассивное умение — кастовать нельзя.
disabledBooleanУмение временно заблокировано.
enchantedBooleanУмение заточено.
reuseTimeIntПолное время перезарядки.
cdMsLongОстаток перезарядки в миллисекундах. 0 — готово.
onCooldownBooleanПерезарядка ещё идёт.
readyBooleanСнято с перезарядки, не пассивное и не заблокированное. Не учитывает MP, реагенты и прочие условия каста.

InventoryItem

Вещь из bot.inventory, user.petItems, user.questItems.

ПолеТипОписание
oidIntObject id конкретной вещи.
itemIdIntTemplate-id — тип вещи.
countLongКоличество.
equippedBooleanНадета.
slotIntСлот или категория вещи, как присылает сервер.
bodyPartIntЧасть тела, куда вещь надевается.
enchantLevelIntУровень заточки.
augmentIdIntId аугментации. 0 — нет.
remainTimeIntОстаток времени жизни для временных вещей.
itemTypeIntТип вещи по классификации сервера.
isNamedBooleanИменная вещь.
stackableBooleanВещь стакуется.

StoreItem

Одна позиция из bot.storeItems — товары последней открытой частной лавки.

Это снимок на момент открытия, а не живые цены: когда кто-то выкупит позицию, сервер об этом молчит, и сохранённый список тихо устаревает.

ПолеТипОписание
oidIntObject id конкретной вещи.
itemIdIntTemplate-id — тип вещи.
countLongСколько выставлено на продажу.
priceLongЦена продавца за штуку.
basePriceLongСправочная цена предмета: разница price - basePrice показывает, насколько предложение отличается от базового.
bodyPartIntЧасть тела, куда вещь надевается. 0 — ненадеваемая.

Buff

Активный бафф или эффект: entity.buffs, partyMember.effects, partyPet.effects.

ПолеТипОписание
idIntId умения.
levelIntУровень.
level2IntДополнительный уровень, если сервер его присылает.
remainMsLongОстаток действия в миллисекундах. -1 — бафф без таймера.
permanentBooleanБафф без таймера, вечный. Проверяй именно это поле, а не сравнивай remainMs.
startTimeLongВремя начала действия, как присылает сервер.
reuseTimeIntВремя перезарядки умения, если сервер его прислал.

PetAction

Доступное действие пета из pet.actions.

ПолеТипОписание
idIntId действия.
categoryIntКатегория действия.

PartyMember

Участник группы из bot.party. Реализует Positioned. Это не LiveEntity — сервер присылает по участникам меньше данных.

ПолеТипОписание
oidIntObject id участника.
nameStringИмя.
classIdIntКласс.
levelIntУровень.
x, y, zIntКоординаты.
distToSelfIntРасстояние до моего персонажа.
hpIntТекущее HP.
maxHpIntМаксимальное HP.
mpIntТекущее MP.
maxMpIntМаксимальное MP.
cpIntТекущее CP.
maxCpIntМаксимальное CP.
hpPercentFloatДоля HP от 0f до 1f.
sexIntКод пола.
raceIntКод расы, см. числовые коды.
petsList<PartyPet>Петы участника.
effectsList<Buff>Эффекты на участнике.

Чтобы получить участника группы как полноценную сущность (с баффами, целью, боевым состоянием), найди его среди bot.chars по oid:

Kotlin
val member = bot.party.firstOrNull { it.name == "Healer" }
val asChar = member?.let { m -> bot.chars.byOid(m.oid) }

PartyPet

Пет участника группы из partyMember.pets. Реализует Identified.

ПолеТипОписание
idIntTemplate-id пета.
oidIntObject id пета.
ownerOidIntObject id владельца.
petTypeIntТип пета.
nameStringИмя.
hpIntТекущее HP.
maxHpIntМаксимальное HP.
mpIntТекущее MP.
maxMpIntМаксимальное MP.
effectsList<Buff>Эффекты на пете.

Packet

Сырой игровой пакет из bot.packetsIn / bot.packetsOut — см. «Сырой трафик». Не сущность мира: у него нет ни oid, ни позиции, это просто байты с провода.

ПолеТипОписание
hexStringБайты пакета в hex, верхним регистром, без разделителей.
bytesByteArrayТе же байты. Считаются при первом обращении.
incomingBooleantrue — от сервера (packetsIn), false — от клиента (packetsOut).
opcodeIntПервый байт — опкод пакета.
subOpcodeIntПодкоманда extended-пакета. -1, если пакет не extended.
sizeIntДлина тела в байтах.
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>Сколько надето вещей этого типа.
Kotlin
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_KEEPERS0Кто поднял, того и вещь.
RANDOM1Случайно между участниками.
RANDOM_SPOIL2Случайно, включая споил.
BY_TURN3По очереди.
BY_TURN_SPOIL4По очереди, включая споил.

RestartType

Точка возрождения для goHome.

ЗначениеКодОписание
TOWN0Ближайший город.
CLAN_HALL1Кланхолл.
CASTLE2Замок.
FORTRESS3Форт.
FLAG4Флаг осады.

У обоих перечислений есть поле code: Int с числовым значением из протокола.

Числовые коды

Некоторые поля отдаются числом, как их присылает сервер.

РасаChar.race, PartyMember.race

КодРасаКодРаса
0человек4гном
1эльф5камаэль
2тёмный эльф6эртея
3орк

Тип лавкиChar.storeType

КодЛавка
0нет
1продажа
2продажа пакетом
3скупка
5крафт (гномий)
8крафт (общий)
10настройка продажи
11настройка скупки

Коды каналов чата — на странице Команды.