PDA

Просмотр полной версии : Пишу бота, нужна помощь


cvillian
08.09.2017, 21:02
Привет всем кто ещё здесь появляется :)
Есть вопрос - как внедрить карты подземелий, т.е. как понять когда нужно подсунуть нужную карту? Есть какой-то пакет с кодом локации?

SeregaZ
08.09.2017, 21:05
эм... а разве третья координата в loc - как раз не высота? по ней наверное ориентироваться над. ежели ниже по высоте, значит под землей - каты.

cvillian
08.09.2017, 22:07
Да, но речь идёт не только о катах, а например о ТоИ или круме. Волкер и L2Net как-то могут показывать карты этажей и не понятно как огранчить радиус действия карты по X Y.

Вот ещё есть системное сообщение о Проклятом Оружии. В нём даются координаты, надо как-то перевести их в локацию :(


LA2: "SystemMessage" size: 35 prot: 268 $10C
Addr: Size: Type: Description: Value:
0000 2 word psz 35 | $0023
0002 1 byte ID 98 | $62 'b'
0003 4 integer MsgID $s2 was dropped in the $s1 region. ($00000717)
0007 4 integer typesCount 2 | $00000002
000B 4 integer type 7 | $00000007
000F 0 vardat caseTypeZone
000F 4 integer x 7218 | $00001C32
0013 4 integer y -17066 | $FFFFBD56
0017 4 integer z -3632 | $FFFFF1D0
001B 4 integer type 3 | $00000003
001F 0 vardat caseTypeItem
001F 4 integer ItemID Demonic Sword Zariche ($00001FFE)

SeregaZ
09.09.2017, 00:53
эм... как бы я сделал: взял скриншот карты ладвы. и побежал бы в один из краев. куда можно добежать. кароче нашел бы самые большие значения Х и У, так-же самые малые. что-то типа креста на карте получилось бы. вот от них уже потом и строй примерное местоположение меча.

твой бот l2ultra случаем шифрацию не обходит? :)))

Smwr
09.09.2017, 11:08
вся карта поделена на регионы.

public static int WORLD_X_MIN = 15;
public static int WORLD_X_MAX = 26;
private static short getRegionOffset(int x, int y)
{
int rx = x >> 11; // =/(256 * 8)
int ry = y >> 11;
return (short) (((rx + Config.WORLD_X_MIN) << 5) + (ry + Config.WORLD_Y_MIN));


подсмотреть значения x/y min можно в исходниках явы своих хроник (код выше из lucera interlude). вообще, мне кто то говорил, что они везде одинаковы, однако значения с интерлюда не подошли к хф (хотя вероятно я где то накосячил), но т.к. я у себя карты не использую забил на это дело.

про многоэтажные локации: пробежаться по ним, глянуть высоту на каждом этаже и выдавать карту в зависимости от высоты.

ScythLab
09.09.2017, 12:13
Я отдал это на откуп пользователю, если в текущем регионе несколько слоев карт, то пользователю показывается ComboBox с выбором слоя, не думаю что ты сможешь это грамотно разрулить в автоматическом режиме.
Игровые координаты в координаты игровой зоны переводятся очень просто:
BlockX = (X div 32767) + OffsetX

cvillian
09.09.2017, 13:11
эм... как бы я сделал: взял скриншот карты ладвы. и побежал бы в один из краев. куда можно добежать. кароче нашел бы самые большие значения Х и У, так-же самые малые. что-то типа креста на карте получилось бы. вот от них уже потом и строй примерное местоположение меча.
про многоэтажные локации: пробежаться по ним, глянуть высоту на каждом этаже и выдавать карту в зависимости от высоты.

Впринципе карты катакомб я так и делал, только не бегал по углам а кликал по карте и переводил координаты, но думал можно как-то ещё.

твой бот l2ultra случаем шифрацию не обходит? :)))
Шифрация это не про меня :)

покопался немного в L2Net - там используется файл такого формата: 19_18.jpg|19|18|-4599|32767, т.е. по всей видимости карты действительно подсовываются по высоте.

С сообщением о проклятом оружие пока не понятно

Smwr
09.09.2017, 14:13
С сообщением о проклятом оружие пока не понятно

в клиенте есть метод

wchar_t *__thiscall FL2GameData::GetZoneName(FL2GameData *this, float, float, float)


либо ручками из датника (скорее всего, ZoneName-e.dat)

cvillian
09.09.2017, 16:14
в клиенте есть метод

wchar_t *__thiscall FL2GameData::GetZoneName(FL2GameData *this, float, float, float)


либо ручками из датника (скорее всего, ZoneName-e.dat)

судя по разбору скорей подходит HuntingZone-e.dat

id hunting_type level unk_1 loc_x loc_y loc_z extra affiliated_area_id name
4 1 25 0 5106.00000000 126916.00000000 -3664.00000000 a, 1 a,Cruma Marshlands\0

Только как это можно понять если в файле координата всего одной точки. Нужно хотябы две чтобы построить квадрат, я х.з.

Но конечно если не разобрать 1 системное сообщение - то не страшно :)

SeregaZ
09.09.2017, 20:30
кстати! а можно ли как-то узнать коим образом файлы клиента запакованы? user.ini хочу с валхаком - так как не тормозит, когда там все полосами вместо текстур. прям кайф играть и на замесах, ну и на последнем месте конечно видно за стеной всех врагов. этой цели даж и не было... но файлик чем-то сверху накрыт и file edit'ы - ни один из всей кучи не читает. там даж хедера нет. обычно там пишет линейдж 413 скажем. а тут-же нет такого. вот хотелось бы расковырять, подставить эти вх параметры и запаковать. попытался взять незапакованный user.ini с вх и вписал туда айпи сервера и подсунул. логин прошел, а вот дальше пишет что user.ini изменен, дескать пройдитесь обновлятором клиента для восстановления. хотя раз логин прошел, значит клиент может понимать и стандартную запаковку... просто где-то стоит проверка на размер или хэш файла - как узнать где и как исправить?

ScythLab
10.09.2017, 01:23
SeregaZ, гварды перехватывают функцию чтения файлов, смотрят начальную сигнатуру, если файл зашифрован гвардом, то файл расшифровывается и возвращается движку в готовом виде, если сигнатура не гвардовская, то управление передается оригинальной функции ла2 и дальше все работает как-будто гварда здесь и не было.

SeregaZ
10.09.2017, 18:18
и все-же он залупнулся, что дескать файл изменен и не пустил дальше. видимо надо искать не столько момент распаковки\запаковки, сколько некую таблицу где лежит например размер файла. изменив значение там - система успокоится.

cvillian
16.09.2017, 17:52
Обнаружил странную фигню. Допустим я передаю другому чару или кладу на склад предметы, которых нет у второго чара(или на складе), допустим 5 передаю, а 10 у меня остаётся.
Тогда мне приходят 2 пакета InventoryUpdate - 1-й добавляет мне в инвентарь 5 предметов с новым обжект ай-ди, а второй изменяет количество предметов на 10 у старого обжект ай-ди. И получается что у меня в инвентаре после этого 2 одинаковых предмета.
Никак не пойму как разрулить...

Получается как-бы что сервер создаёт у меня в инвентаре новый предмет с новым обжект ай-ди и его передаёт. Но как мне его отфильтровать не понятно

SeregaZ
16.09.2017, 18:52
сложно понять о чем ты :) инвентори апдейт 2 штуки не может приходить. приходит 1 на персонажа. второй значит на 2 персонажа. тогда все верно и путанницы нет.

тот который отдает итем - получает пакет с минусом, дескать столько то убавилось от такого-то итема. а клиент считает с тем что у него есть - то есть он ведет сам подсчет инвентаря до операции.

а второй персонаж получает 5 итемов с новым айди. хы... получается здесь айди стопки предмета :) поэтому этот айди другой - новый.

cvillian
17.09.2017, 11:43
В том-то и дело что одному персу приходят подряд два пакета.

Добавлено через 13 часов 38 минут
Возможно это особенность конкретного сервера.
Сделал пока так:

if (item.isStackable)
{
L2Item duplicate = Vars.Inventory.GetItemByID(item.id);
if (duplicate != null && item.objId != duplicate.objId)
continue;
}

SeregaZ
17.09.2017, 14:28
тада второй пакет это не инвентори апдейт - может это пакет диалога передачи? когда торгуешь с другим персонажем - ты сначала по одному выкладываешь разные итемы в торг. видимо вот то что ты выкладываешь ты сам и видишь тоже, в смысле это движение пакетов что из инвентаря убрали столько то. то есть некий промежуточный момент. после подтверждения торга ничо не происходит, так как инвентарь уже предварительно отминусованный, а ежели нажать отмену, тогда согласно моей теории должен прийти опять инвентари апдейт, но уже с плюсом.

cvillian
24.09.2017, 21:03
Сейчас вот думаю как хранить настройки - такие как атковать или нет моба, спойлить или нет и т.п. Я сделал сохранение настроек в XML - если сериализовать весь список мобов да ещё с настройками - будет ппц наверное. Чего бы придумать...

alexov
25.09.2017, 04:41
Я тоже храню настройки в XML, у меня самый жирный файл настроек на фулл-пати вместе с типами мобов спойлом и всем чем только можно придумать занимает 25kb. не считаю что это много. тем более что при прокачке через сеть он сжимается до 2kb

cvillian
25.09.2017, 11:21
а как хранится настройка на 1-го моба? Это отдельный класс?

Smwr
25.09.2017, 12:29
если сериализовать весь список мобов да ещё с настройками - будет ппц наверное. Чего бы придумать...
у тебя хард на 2мб наверное?

SeregaZ
25.09.2017, 14:11
не в харде дело, а в оптимизации. хоца чтоб находило что надо со скоростью света :) а когда массив будет боооооооооооооооольшой, то это надо впустую пол массива перебрать, чтоб нашелся тот что нужен.

Smwr
25.09.2017, 15:34
и как это относится к хранению?

ScythLab
25.09.2017, 17:20
SeregaZ, формат данных и способ хранения данных - немного разные вещи.
Если ты собираешься хранить инфу по всем игровым объектам, то можно использовать какую-нить легкую БД, либо сделать свое сортированное хранилище, сложность (читай скорость) поиска в таком хранилище логарифмическая.

alexov
25.09.2017, 18:46
Я немного не улавливаю зачем хранить инфу о игровых объектах? они же уникальны для игровой сессии. В конфиге для кача нужно хранить только ID типов мобов которых надо бить. Их от силы пару штук

<MonsterIDs>
<int>1001234</int>
</MonsterIDs>

Вот у меня эт выглядит как-то так. это что много? :D

SeregaZ
25.09.2017, 19:19
так и я о чем :) а то некоторые заладили 2 мегабайта 2 мегабайта :)

помню мелодию включал в свою программу. так программа увеличилась в два раза по размеру из-за этой дурацкой мелодии :) в текстовом формате мелодия занимала килобайт 10-15, но в массиве в памяти уже полтора мегабайта, что и увеличило размер всей программы. но решил оставить :)

alexov
25.09.2017, 21:36
А у меня иконка большую часть занимает)) WPF тупой её копирует несколько раз, для файла, для приложения для окна. 3-4 штуки получается.

Smwr
26.09.2017, 00:04
Я немного не улавливаю зачем хранить инфу о игровых объектах? они же уникальны для игровой сессии. В конфиге для кача нужно хранить только ID типов мобов которых надо бить. Их от силы пару штук

<MonsterIDs>
<int>1001234</int>
</MonsterIDs>

Вот у меня эт выглядит как-то так. это что много? :D

у меня всё хранится в json (с индентацией), чистые настройки ~25кб, до сегодняшнего дня даже не знал, сколько это весит, ибо до фени.
не о том заморачиваешься

SeregaZ
26.09.2017, 00:45
пили структуру :)
мобайди
имяеслинадо
спойл
атака


а я чот подумал про свою песню в ехешнике... я ж лепил везде не разбираясь 4 байтную .i - может надо было .a - 1 байтную. типа если нота у меня от 0 до 95. вполне в .a влазит. там от 0 до 255. повтыкал где можно эту .a, посмотрел на результат - 60 килобайт выиграл... тьфу :) лучше бы насчет анимации думал. чот пока не получается эта сраная анимация...

alexov
26.09.2017, 04:22
Smwr, ты не то зацитировал) Вопрос то не я задавал. я отвечал)

ScythLab
26.09.2017, 16:59
alexov, информация может быть двух видов:
1) настройки автоматики - это байты и килобайты
2) какие-либо полезные данные об игровых объектах (списки мобов, умений, предметов)
(2) может занимать сотни кБ и даже несколько МБ, но в любом случае, данных не слишком много и даже самые жирные списки исчисляются в пределах 10-20 тысяч записей.

cvillian
27.09.2017, 16:53
пили структуру :)


у структур пролема с привязкой к элементам управления, придётся классы

SeregaZ
27.09.2017, 17:58
эм... вобще меня не слушай :) я французским не владею... классы или структуры разницы не знаю. в моем PureBasic все просто, я думал везде так просто :)

типа:
structure mob
id.i
flagaataka.a
flagspoil.a
name$
endstructure
Dim MassivMoby.mob(1000)

хотя было бы удобней, если в ладве мобы бы шли по порядку по возрастанию айди. но там как попало какая-то часть есть, где-то провал. в идеале было бы сделать чуть по другому - узнать максимальный айди и влепить размер массива по максимуму. то есть массив гонять тогда в цикле не нужно, пока нужный id попадет. а сразу id чтоб был номером в массиве. неудобство что из-за этих провалов в нумерации - стотыщьпятсот ячеек в массиве будут незаполнены.
structure mob
flagaataka.a
flagspoil.a
name$
endstructure
Dim MassivMoby.mob(100500)

alexov
27.09.2017, 20:09
было бы удобней, если в ладве мобы бы шли по порядку по возрастанию айди. но там как попало какая-то часть есть, где-то провал. в идеале было бы сделать чуть по другому - узнать максимальный айди и влепить размер массива по максимуму.

Dictionary (https://ru.wikipedia.org/wiki/Ассоциативный_массив) тебе в руки.

SeregaZ
27.09.2017, 21:20
пробежался глазами... мало что понял с моими то тремя классами церковноприходской...

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

на сервере скажем 3 моба в файле:
id="3" mob="skelet"
id="5" mob="zombi"
id="6" mob="vampir"

первый вариант, массив меньше, но время доступа больше из-за необходимости цикла для кручения айди по массиву в поисках нужного:
Enumeration
#File
EndEnumeration

Structure mob
id.i
name$
spoilflag.a
atackflag.a
EndStructure

Dim Moby.mob(0)


If ReadFile(#File, "D:\moblist.txt")
; мотать файл до конца
While Eof(#File) = 0
; обнуление переменных
id = 0
name$ = ""

; читать строчку текста до символа перевода каретки
tmp$ = ReadString(#File)

; разбор строчки текста
id = Val(StringField(tmp$, 2, Chr(34)))
; Val() - превращение текста в цифру
; StringField - разбитие текста tmp$, по символу - Chr(34), то есть это кавычки
; и возврат 2 блока при разбитии
; сама текстовая строка выглядит так:
; id="3" mob="skelet"
; при разбитии по кавычкам:
; id= 1 блок
; 3 2 блок
; mob= 3 блок
; skelet 4 блок

name$ = StringField(tmp$, 4, Chr(34))

If name$
; если в переменной name$ что-то есть,
; то значит разбор прошел успешно
; надо увеличить массив на 1 единичку
size = ArraySize(Moby()) + 1
ReDim Moby(size)

; и внести туда данные
Moby(size)\id = id
Moby(size)\name$ = name$

EndIf

Wend

; закрыть открытый файл
CloseFile(#File)
EndIf

; теперь когда массив готов и приходят с сервера id мобов,
mobid = 3

; то получаем о них инфу:
For i = 0 To ArraySize(Moby())
If mobid = Moby(i)\id
Debug Moby(i)\name$
Break
EndIf
Next




вариант второй - цикл получается не нужен, чтение будет быстрее... но сам размер массива будет в разы больше с кучей пустых ячеек - в данном случае пустые будут 1, 2 и 4, а сам размер массива будет равен самому максимальному id.
Enumeration
#File
EndEnumeration

Structure mob
;id.i id в структуре становится не нужен. удаляем
name$
spoilflag.a
atackflag.a
EndStructure

Dim Moby.mob(0)


If ReadFile(#File, "D:\moblist.txt")
; мотать файл до конца
While Eof(#File) = 0
; обнуление переменных
id = 0
name$ = ""

; читать строчку текста до символа перевода каретки
tmp$ = ReadString(#File)

; разбор строчки текста
id = Val(StringField(tmp$, 2, Chr(34)))
; Val() - превращение текста в цифру
; StringField - разбитие текста tmp$, по символу - Chr(34), то есть это кавычки
; и возврат 2 блока при разбитии
; сама текстовая строка выглядит так:
; id="3" mob="skelet"
; при разбитии по кавычкам:
; id= 1 блок
; 3 2 блок
; mob= 3 блок
; skelet 4 блок

name$ = StringField(tmp$, 4, Chr(34))

If name$
; если в переменной name$ что-то есть,
; то значит разбор прошел успешно
; надо увеличить массив до числа id
size = ArraySize(Moby())
If size < id
ReDim Moby(id)
EndIf

; и внести туда данные
Moby(id)\name$ = name$

EndIf

Wend

; закрыть открытый файл
CloseFile(#File)
EndIf

; теперь когда массив готов и приходят с сервера id мобов,
mobid = 3

; то получаем о них инфу без цикла, используя id как номер в массиве:
Debug Moby(mobid)\name$

а вот с хранением инфы об галках атаки и спойла будут проблемы :) ежели всюююю инфу писать в файл, аналогично как лист мобов, то есть:
id="3" ataka="1" spoil="0"
id="5" ataka="1" spoil="1"
id="6" ataka="0" spoil="0"
то при изменении одного галимого параметра - придется переписывать веееееееесь файл. а что если во время записи произойдет ошибка? столько лет внесения в базу флагов атаки и спойла - все на смарку :)

можно конечно будет создавать отдельный файл с id в названии 3.txt:
ataka="1" spoil="0"
тогда изменение будет записываться в один маленький файл. удобно писать, удобно при потере информации - потеряется только 1 файл, основная база останется целой. но стописят тыщь файлов по 1 килобайту - жесткий диск скажет тебе большое "спасибо". он такую мелочь не любит.

поэтому всякие сикуели и нужны, но это поддерживает твой язык, не поддерживает... нужны доп библиотеки, не нужны... нужны всякие дополнительные программы и сервисы или не нужны... и кто его знает как там с защитой базы на случай ошибки записи предусмотрено.

alexov
27.09.2017, 21:32
пробежался глазами... мало что понял с моими то тремя классами церковноприходской...

Плохо пробежался, там есть пример для PureBasic:

; Создали ассоциативный массив.
NewMap Country.s()

; Заполнение массива данными.
Country("GE") = "Germany"
Country("FR") = "France"
Country("UK") = "United Kingdom"

Debug Country("FR") ; Вывод результата "FR" в отладочное окно.

; Перебор всех элементов с отображением их значений в отладочном окне.
ForEach Country()
Debug Country()
Next


У тебя просто проблема с базовыми типами данных, нужно взять книгу по твоему языку и почитать первые несколько глав, это сильно поможет.
И вообще, если не секрет, зачем разрабатываешь на такой экзотике? переходи на C++, Delphi, C# или Java лучше. Тогда проще будет ответы на вопросы находить

SeregaZ
28.09.2017, 14:48
так я не занимаюсь профессионально. на заре моих занятий херомантией стоял вопрос в том, что мне были нужны вин апи для автоматизации запуска наших непутевых налоговых программ. типа хочу чтоб все запускалось с 1 клика, а в стоке там надо было нажать туда, суда, ввести пароль и тд и тп. вот и попалась ссылка на этот PB... так и застрял :) за NewMap Country.s() спасибо, видимо действительно проглядел... пойду товарища на форуме пытать как это работает. не верится мне что все так просто :) зная раздолбайство разработчика моего недоязыка - думаю там все-таки цикл спрятан.

Добавлено через 15 часов 28 минут
посовещались на своем форуме :) скорость все-таки будет ниже из-за того, что обращение к массиву идет по текстовой переменной. с цифрами все-ж быстрее. но так очень удобно - не нужно следить за размером массива и удобно удалять. обычный массив в PB, если нужно удалить ячейку где-то в середине - потребует кучу танцев.

alexov
28.09.2017, 20:38
Возьмусь предположить что обращаться к словарю совсем не обязательно по текстовой переменной, подойдет любой объект. Если это не так, то автор языка действительно мудак. Но повторюсь, я в это не верю.

А вот типы которые лежат в словаре указываются при его создании, пример который я сбросил там .s - строка, все написано в документации (https://www.purebasic.com/documentation/reference/newmap.html), совсем не обязательно спрашивать товарища на форуме)

SeregaZ
28.09.2017, 21:08
так он на этом языке собаку съел :)

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

alexov
28.09.2017, 21:58
Шедевр на бейсике, ну это врядли :D Впрочем, удачи))

SeregaZ
28.09.2017, 23:29
шедевр шедевр :) онлайн база мелодий и саундэффектов сега игр для замены оригинальных звуков и мелодий Dune:
https://www.youtube.com/watch?v=P9FIDzWZNyQ

редактор графики юнитов:
https://www.youtube.com/watch?v=Qy2O9IMuoos

это причем из нового. а старого там уже на 50 тыщ строчек кода :) шедевр!

alexov
28.09.2017, 23:45
Много кода не всегда хорошо) это значит много копипасты. У меня вот бот на 4000 строк, раньше был на 10000. После следующего прохода рефакторинга я думаю останется 2000

SeregaZ
29.09.2017, 00:17
ну когда начинаешь - там да. много не оптимизированного в начале, но работает. потом смотришь и если совсем уж архазим, то переделываешь. когда мне нужны были биты - типа эвакуация кериолом с поля боя или еще чего, а там получается один байт отвечает за 8 параметров - биты. вот переводил это число в строку вида "00000000". отрезал в этой текстовой переменной нужное количество символов, делал условие если = "1" именно как текст в кавычках... то потом дали бит функции :) во многих местах пришлось переделывать, но скорость заметно возросла. с тех пор этот участок кода кочует из проекта в проект без изменений. очень удобно :)

ScythLab
30.09.2017, 16:03
alexov, сколько у тебя занимай блок автоматики? И примерно какой функционал там реализован?

SeregaZ
01.10.2017, 00:24
а я прям ну совсем бота так и не сделал :) у меня автоассистеры были. и тоже про оптимизацию кода не слышал никада :))) дичайший разбор инвентаря в поисках манны, но работал :)))
//разбор инвентаря для получения айди манны
#$1B:begin
countitem:= readh(4); //количество всех итемов
it1:=12;
it2:=13;
it3:=14;
it4:=15;
it5:=30;
base1item:=it1+(28*countitem);
iditema:=pck[it1]+pck[it2]+pck[it3]+pck[it4];

repeat
if (iditema=HStr('D8 02 00 00'))
then begin
idmana:= pck[it1-4]+pck[it2-4]+pck[it3-4]+pck[it4-4];

buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS('банки манны есть');
SendToClient;
break;
end;

it1:= it1 + 28;
it2:= it2 + 28;
it3:= it3 + 28;
it4:= it4 + 28;
it5:= it5 + 28;
iditema:=pck[it1]+pck[it2]+pck[it3]+pck[it4];

until it1 > base1item;
end;

alexov
01.10.2017, 13:35
alexov, сколько у тебя занимай блок автоматики? И примерно какой функционал там реализован?

657 строк на всю автоматику.
Но тут следует уточнить что это не чистые строки текстовых файлов, которые я даже не знаю как просуммировать кроме как руками, а строки которые считает инструмент Code Metrics. Он не считает переносы строк, скобочки, юзинги, енумы. Но например считает строки конечного автомата в который компилятор разворачивает async await. Как бы то ни было метрика хороша, потому что такой способ подсчета строк лучше коррелирует с его поддерживаемостью.

Так мало строк получилось потому что все написано в функциональном стиле. То есть на реализацию одной определенной функции уходит 1-10 строчек на Linq.

По функционалу писал уже в своей ветке, но можно повториться:
Килл мобов, спойл, манор. Фильтрация/сортировка целей по аггресивности, жив/мертв, ассисту сопартийцев, наложенным эффектам, хп, ID, расстоянию, проспойоленности/проманоренности/просвипанности. Бафы, снятие дебафов, оффпати, возврат в точку, следование за персонажем, убегать от агров к своим, сесть/встать на реген, хил, речарж, рес, сбор дропа
В привате по техническим причинам остаются пока уведомления о всевозможных событиях и по политическим причинам часть автоматики.

ScythLab
01.10.2017, 17:02
alexov, компактненько, хотя конечно Linq реально уменьшает некоторый код, но все равно компактно)

SeregaZ
02.10.2017, 01:38
ни у кого браузер не переходит на левые сайты, будучи здесь на coderx? у меня походу редиректит сам по себе.

alexov
02.10.2017, 03:27
Ищи вирусы на компе) Хотя щас бывает и сами сайты болеют, но этот вроде пока цел))

cvillian
04.10.2017, 20:11
А в каком пакете взять список скилов самона\пета ?

alexov
05.10.2017, 04:41
Когда мне нужно что-то узнать о пакетах я запускаю l2phx на виртуалке, захожу в игру и смотрю чо там ходит. Сначала сбрасываю фильтры потом ненужное фильтрую. Несколько релогов и все находится.
А вообще не уверен что такой пакет есть. Это у персонажа скилы нужно учить, поэтому сервер вынужден тебе присылать список. А скилы самона зависят только от лвл-а и профы, которые клиенту уже сообщили при логине. Так что по факту клиент может это сам вычислить., и я думаю он так и делает.

SeregaZ
05.10.2017, 14:57
а вдруг там шифрация? :) лпх может не помочь.

alexov
05.10.2017, 16:07
Ну для написания функционала смотришь на сервере без шифрации., а потом юзаешь где надо

ScythLab
05.10.2017, 17:42
На сколько помню все скиллы хранятся в самом клиенте (в каком-то из dat-файлов), а ты из этой таблицы по уровню питомца и его id получаешь список доступных.

Breadfan
05.10.2017, 18:57
ActionName-e.dat

SeregaZ
05.10.2017, 19:24
опять таки, некоторые горе-админы с прибабахом, которые "2 года закрытой разработки" - портят файлы клиента своей дополнительной шифрацией файлов клиента. в результате играть на таких серверах на старом компьютере невозможно :) слайдшоу. если на нормальном сервере аховое положение с фпсом спас бы валхак, то на таком "шифрованом" такое уже не прокатит.

Breadfan
06.10.2017, 08:12
Не переживай, это касается не только старых компьютеров.

Smwr
08.10.2017, 16:29
Много кода не всегда хорошо) это значит много копипасты. У меня вот бот на 4000 строк, раньше был на 10000. После следующего прохода рефакторинга я думаю останется 2000
4000 - это совсем чуть чуть :D.
у меня примерно столько (не считая кода сгенерированного дизайнером) с месяц назад занимала форма настроек (~ 700 контролов).

Не переживай, это касается не только старых компьютеров.
это всё корейцы

cvillian
09.10.2017, 00:41
ActionName-e.dat
Формат у него какой-то жуткий :)

Smwr
09.10.2017, 07:02
Формат у него какой-то жуткий :)

ничего жуткого, формат как и у всех других.
http://prntscr.com/guzylu
cat2_cnt - количество id, c[i] = id

alexov
09.10.2017, 07:40
4000 - это совсем чуть чуть :D.
у меня примерно столько (не считая кода сгенерированного дизайнером) с месяц назад занимала форма настроек (~ 700 контролов).

Ну потому и чуть-чуть что все генерирую) Формы настроек тоже, поэтому они к программе строк не добавляют. Ну, лишних строк. Один новый параметр - одна строка.

cvillian
11.10.2017, 13:52
ничего жуткого, формат как и у всех других.
http://prntscr.com/guzylu
cat2_cnt - количество id, c = id

да, только у некоторых cat2_cnt стоит отрицателное значение, -2, -3
как это разобрать непонятно

[I]Добавлено через 6 минут
вроде то что относится к сумону имеет type -1 и category 4,5

SeregaZ
11.10.2017, 15:14
может тип переменной не тот? типа вместо -1 должно быть что-то типа $FFFF, то есть 65535 если тип другой.

cvillian
11.10.2017, 23:40
такие цифры в файле