PDA

Просмотр полной версии : PW OOG FrameWork


Ilyialat
25.09.2013, 14:22
Здраствуйте! Рад представить свою beta-разработку - PW OOG Framework. Делать её я начал давно, но быстро забросил. Теперь же я снова вспомнил про неё и решил довести до конца. И снова забросил :d Я, конечно, знаю, что у некоторых людей есть библиотеки лучше, но они приватные.

Хотел бы упомянуть людей, без которых библиотеки вообще бы не было:
*FreePvp)) - Всё началось с его статьи про протокол с прикреплённым файлом пакетов
*TBX1n - Без его сниффера тоже ничего бы не было.
Моя библиотека - объединение всего, что есть на форуме, объединение работы этих людей, ничего своего в ней нет.

Платформа - Net FrameWork(старая 4.0, новая - 4.5)

Реализованные компоненты:
MyPersLock
MyPers
Inventory
Trade

Исходники старой: [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Старая (если она кому-то нужна) 49570
Новая (исходники ядра, которые вам надо перетащить в проект и скомпилировать) 58239

Desmond Hume
25.09.2013, 15:23
System.Threading.Thread.Sleep(99999999); //Или объявите pw в классе, так как когда закончится функция, мусорщик выбросит локальный pw, а у нас кот!
Что за...?
Помощь с парсингом геодаты и алгоритмом передвижения (Я тут полный 0)
Геодата — да, но если бегать по плато...
А с алгоритмом что собственно?

Судя по

pw.WaitLoginResult();
pw.WaitCharsObtaining();
while (!inv.WaitObtaining()); //Пока мы её не получим (период ожидания - 10с)

Каждый раз поток вешается в паузу, и в конце вообще уходит в страшный сон.

Ilyialat
25.09.2013, 15:32
Всё продумано, возле каждого Wait есть параметр time = 10s, скачали бы сначала. Я написал, что есть эвенты LoginCompleted, Есть свойства IsloginCompleted. Кому-то удобно работать синхронно, кому-то - асинхронно. Насчёт Wait, там каждые 100мс проверяется значение параметра

public bool WaitLoginResult(int time = 10)
{
if (IsLoginCompleted)
return true;
for (int i = 0; i < time * 10; i++)
{
System.Threading.Thread.Sleep(100);
if (IsLoginCompleted)
return true;
}
return false;
}
Думаю, что вас это устроит.
Геодата - гео дата - геологическая информация. Файл с описанием точек граней, я точно не знаю, как оно реализовано.

System.Threading.Thread.Sleep(9999...);
Есть вас это не устраивает, то напишите
private PWClient pw;
private void button1_Click(...)
{
pw = new PWClient(.....);
}
Думаю, что теперь вы поняли.

Desmond Hume
25.09.2013, 17:41
Геодата - гео дата - геологическая информация. Файл с описанием точек граней, я точно не знаю, как оно реализовано.
Слава великим золотым яйцам — я это и так знаю. И, если я еще в своем уме, не спрашивал про это.

Кому-то удобно работать синхронно, кому-то - асинхронно.
У вас, насколько я понял, все в одном потоке (синхронность так и хлещет через край).

Я написал, что есть эвенты LoginCompleted, Есть свойства IsloginCompleted.
Если есть свойство, для чего ему булевая обертка? Бул, в булевой функции... Кощей бессмертный.

Опять же, можно сделать асинхронную модель с возвратом коллбэка — минимум событий, максимум потоков и пользы.

Ilyialat
25.09.2013, 18:46
Извините, я торопился, бегло прочитал и не так понял то, что вам надо.
Так и быть, я напишу ещё раз... Нет, не напишу, скопирую комментарий к функции:
/// <summary>
/// Ожидает результата авторизации
/// </summary>
/// <param name="time">Время ожидания в секундах</param>
/// <returns>Получен ли результат</returns>

Вам не нравится синхронный стиль программирования? Пожалуйста!
/// <summary>
/// Событие, вызызаемое при получении ответа о результате авторизации
/// </summary>
public event Action<bool> LoginCompleted;
Или вам нужен пример работы с ивентами?
Хорошо,
LoginCompleted += (bool result) => MessageBox.Show(string.Format("Логин {0} удался", (result ? "" : "не")));

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

while (!inv.WaitObtaining()); //Пока мы её не получим (период ожидания - 10с)
Каждый раз поток вешается в паузу, и в конце вообще уходит в страшный сон.
Вы не знаете конструкции do - while? Или вы просто не умеете читать комментарии?
Поясняю, зачем это надо. Иногда сервер не возвращает информации о персонаже (inv.GetInventory()), поэтому нужно ещё раз отправить запрос. Или возвращает, но слишком поздно, поэтому ещё раз послать запрос не помешает. Если сервер мнгновенно пришлёт информацию - клиент прервёт inv.WaitObtaining().

Я так понял, что вы ещё и не знаете о сборщике мусора в .Net, прочтите, пожалуйста:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Desmond Hume
25.09.2013, 19:15
Иногда сервер не возвращает информации о персонаже (inv.GetInventory()), поэтому нужно ещё раз отправить запрос. Или возвращает, но слишком поздно, поэтому ещё раз послать запрос не помешает.
Вот оно: современное извращение!

Я так понял, что вы ещё и не знаете о сборщике мусора в .Net, прочтите, пожалуйста:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Откуда же вы познали сие, что я не знаю этого? Желательно процитируйте. Любой другой ответ помимо цитаты будет выражен полным игнором ко всем вашим постам. :)

UPD: Какой злой чувак — сразу побежал минусить пост...

Ilyialat
25.09.2013, 19:35
Что за...?
Я сам попрошу вас, игнорьте, пожалуйста, мои посты, и не пишите для них своих комментариев. Я писал свою библиотеку для людей другого типа. Вы под него не подходите.

Noyrel
04.10.2013, 17:26
Можно выложить вместе с dll ещё и lib файл для неявного подключения?
Никогда не юзал dllки и я застрял на подключении класса в явном виде.

Ilyialat
11.10.2013, 23:35
Если не ошибаюсь, то такого сделать нельзя.
Нашёл тему ([Ссылки могут видеть только зарегистрированные и активированные пользователи]), надеюсь, что это вам поможет.

nitrotek
27.10.2013, 23:59
Иногда сервер не возвращает информации о персонаже (inv.GetInventory()), поэтому нужно ещё раз отправить запрос. Или возвращает, но слишком поздно, поэтому ещё раз послать запрос не помешает.

Вот оно: современное извращение!

+1 /dgs. Если судить такой логики, вы должны все пакеты так отправлять/получать. Почему именно инвентарь вам так понравился? Обычный пакет, и приходит причём с первого запроса.

vogel
28.10.2013, 14:10
Не всегда. Мне тоже пришлось извращаться, когда ты просишь инвентарь - а он не приходит.

Desmond Hume
28.10.2013, 14:37
Не всегда. Мне тоже пришлось извращаться, когда ты просишь инвентарь - а он не приходит.
Всегда. По такой логике я боюсь представить реализацию пакетов движения.
А то это похоже на нашлепку на рваной шмотке, которая в любой момент может оторваться, оголив всему взору неопрятный зад.

MatveyMC
31.10.2013, 15:09
Ребят, а вот бы кто-нибудь смог выложить вариант примера использования библиотеки на Delphi, прям цены бы ему не было. (1С весь мозг сожрал, а так хочется фичу одну себе на делфях накатать)

Desmond Hume
31.10.2013, 16:12
Ребят, а вот бы кто-нибудь смог выложить вариант примера использования библиотеки на Delphi, прям цены бы ему не было. (1С весь мозг сожрал, а так хочется фичу одну себе на делфях накатать)
Это невозможно, эта и другая библиотека предназначена для dotNet. Библиотеки OOG для PW на Delphi пишутся авторами и бережно хранятся у них самих.
В паблик OOG библиотеках функционала, как такового, нету.

Smertig
31.10.2013, 17:13
В паблик OOG библиотеках функционала, как такового, нету.
..что очень радует.

Desmond Hume
31.10.2013, 17:46
..что очень радует.
Именно! /dgs

Ilyialat
03.11.2013, 13:08
Да, я понял свою ошибку. Я попытался переотправить пакет на инвентарь, за что меня выкинуло из игры. Вот только заметил я это тогда, когда писал оог кота(месяц - 2 назад). Тогда я и исправил логику, при входе в игру автоматически запрашивается инвентарь. Пакет так и так дойдёт, это же tcp, вопрос во времени, которое понадобится серверу на нахождение персонажа в базе. А про исходники я думал. Я думаю, что ничего страшного не случится, если я выложу исходники. Я добавил element.data парсер от рони, т.е. теперь можно узнать имя предмета, его тип и т.д. Также я начал работу над геодатой, но у рони она хранится в формате hmap и занимает около 300мб, что не очень хорошо. Друг посоветовал дерево квадрантов, я начал разбираться и... Дальше угас интерес к работе. Скоро снова появится =) Так что я не против, если кто-то дополнит фрэймворк, возможно, заметит мои ошибки, это же на общее благо. Ну хотя бы если кто-то скинет все пакеты на информацию и взаимодействие с котами. Это же немного, 1 пакет каждый человек добавит, потратит полчаса на это, и в итоге общими усилиями будет быстро сделана готовая система, не уступающая ig framework'у. Так что я с радостью выложу исходники, только вопрос куда =)

Ilyialat
11.11.2013, 19:03
Сократил текст вступления, кое-как выложил исходники. Возможно, что мой код не очень хороший, но теперь Вы можете помочь его улучшить, чему я буду рад! :)

xanrias
09.02.2014, 05:05
Ребята возникло 2 вопроса, не могу найти как осуществить логаут из игры, и второе есть ли метод для установки персонажа в состояние медитации / усиленной медитации? спасибо за ответы.

А да ещё вопрос, подскажите событие при продаже определенного предмета.

ToRcH2565
09.02.2014, 19:12
Ребята возникло 2 вопроса, не могу найти как осуществить логаут из игры, и второе есть ли метод для установки персонажа в состояние медитации / усиленной медитации? спасибо за ответы.

А да ещё вопрос, подскажите событие при продаже определенного предмета.

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

xanrias
09.02.2014, 20:21
Вот в чем минус таких фрэймов... люди которые пользуются, даже не понимают как это работает)) и это действительно прискорбно....

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

ToRcH2565
09.02.2014, 22:22
единственное, что не найдено было без чтения исходников фрейма перечислено выше
Вот кстати об этом я и говорю, вы пользуетесь библиотекой и представления о том как она работает не имеете)))

что быстрее будет спросить в первоисточнике
В данном фрэйме нет обработки многих нужных ситуаций для написания полноценного котобота( не поверите я читал данный исходник хоть и пишу на другом языке)

Однако, более прискорбно то, что людей которые "понимают", хватает лишь на саркастическое высказывание
Вам рассказать как это допилить? перепишите эту библиотеку сами, полагаясь на нее лиш как на пример, и вопрос как доделать то что вы хотите отпадет сам собой...

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

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

вот такое помогать не вызывает желания)

xanrias
09.02.2014, 23:05
а пока ваши вопросы сводятся к:
ребята я взял эту библиотеку, начал ей пользоваться, но она не делает так как мне хочется, сделайте за меня вот это и это....
вот такое помогать не вызывает желания)
Ответ мог свестись к тому, что "Данные функции пока не реализованы, необходимо допилить самому", я думаю этого было бы достаточно. Вопрос задан с целью узнать имена функций, если они реализованы или как раз информации об их отсутствии, не вижу в своём вопросе просьб "сделайте что либо за меня / дайте готовый код итп.". Так что с желанием или без Вы уже и так помогли, спасибо.

vogel
10.02.2014, 15:34
Вопрос задан с целью узнать имена функций, если они реализованы или как раз информации об их отсутствии
Ответ приходит в процессе чтения исходных текстов. Серьёзно - попробуйте - это не больно.

xanrias
10.02.2014, 15:39
Да спасибо, я уже добавил необходимые функции в библиотеку.

Ilyialat
11.02.2014, 19:11
В данном фрэйме нет обработки многих нужных ситуаций для написания полноценного котобота
Да всё же есть вроде, если не хватает чего-то или написано криво - открываешь пандору и ищешь пакет/ошибку. Потом просто записываешь код по аналогии.

Я кучу глупостей сделал в процессе разработки. Я писал свой сниффер, я делал какие-то костыли, позже пандору заметил, так как исходников сервера не имел(и не имею), то разбирался во всём по пандоре, по форуму когда лазил, то увидел, что много вещей, на которые я кучу времени потратил, можно было прочитать. Так что спросить легче всё-таки.
Да спасибо, я уже добавил необходимые функции в библиотеку.
ЛогАут в той же пандоре, в конфиге от FreePvp)) есть, пакет 0x5, без контейнера посылается(new p_SPacket(0x05, false))

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

Ilyialat
11.02.2014, 19:48
Вот в чем минус таких фрэймов... люди которые пользуются, даже не понимают как это работает)) и это действительно прискорбно....
Другой вопрос кому это вообще нужно, скорее начинающим разработчикам либо геймерам-самоучкам, а если возьмётся кто покрупнее, то вот ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) что может случиться.

ToRcH2565
11.02.2014, 23:28
скорее начинающим разработчикам
им это только повредит :) начинать нужно с красивых и правильных кодов, а не со сборника костылей)

либо геймерам-самоучкам
а сим вообще не стоит лезть дальше уо пилота

а если возьмётся кто покрупнее
так может вообще не стоит даже начинать программировать?))

Добавлено через 8 минут
имхо:
Вот статья для начинающих разработчиков, если ориентируетесь на них - не делайте готового рабочего кода...
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Вот статья для геймеров...
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Для тех кто посерьезней таковые статьи стоит постить не тут, а на специфичных ресурсах касающихся сложных и спорных вопросов(чаще всего узкоспециализированых).. хотя те скорей найдут инфу в rfc или манах.....

а данная тема(и прочие похожие) больше похожи... как бы назвать чтоб не выражатся.... "рассадник школоло"....

Smertig
12.02.2014, 00:55
ToRcH2565, очень категорично про геймеров самоучек. Я сам начинал с пилота, потом подкинули простейший исходник на аутоите по моей просьбе, и пошло, поехало.
Насчёт библиотеки для начинающего разработчика - это с какой стороны посмотреть. С одной стороны, если мы возьмем аналогию - какой-либо игровой движок, то увидим, что он дает возможность работать не только с векторами и точками, а с чем-то более сложным, но удобным. С другой стороны, функции не должны быть чересчур конкретными. Тогда они будут ограничивать программиста.
Самый лучший вариант библиотеки - функции для принятия/отправки, расшифровки/зашифровки/распаковки пакетов и остальное, нужное для простейшего "хелловорлда" (заход на акк, хотя бы). А пакеты можно и вручную поразбирать и дописать

p.s. оффтопим мы тут. Sirioga, если придешь, потри по желанию

FreePVP)))
12.02.2014, 13:51
а сим вообще не стоит лезть дальше уо пилота
Но ведь я... три года... на сишарпе...

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

ToRcH2565
12.02.2014, 16:37
Путаница в терминологии))

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

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


Все мы когдато начинали с кучи вопросов, не понимали что и как делать и почему это работает(или не работает), но ведь согласитесь, перед тем как спросить на форуме\сайте или еще где пытались найти решение сами...)

tianddu
18.02.2014, 16:50
а вот хотел узнать такая проблема... нужно отследить пакет выхода из сети на страницу выбора..
пандора его отображает как контейнер (может я конешно путаю что такое контейнер но вроде как это набор пакетов в пандоре они со стрелочкой свернуть/равернуть)
вообщем контейнер 0x00 с телом 45 10 00 00 00 01 XX XX XX XX 00 00 00 02 00 16 40 C4
а вот пакет в контейнере имеет вид - шапка : 0x45 тело 00 00 00 01 XX XX XX XX 00 00 00 02 00 16 40

вот как сделал отлов пакета
[Packet(0x45)]
private void p_Charexittrue(PWStream pkt)
{
uint Idchar1 = pkt.ReadUInt32();//if ((int)pkt.ReadUInt32() == Idchar)
Idchar = pkt.ReadUInt32();//if ((int)pkt.ReadUInt32() == Idchar)
uint Idchar2 = pkt.ReadUInt32();//if ((int)pkt.ReadUInt32() == Idchar)
uint Idchar3 = pkt.ReadUInt32();//if ((int)pkt.ReadUInt32() == Idchar)
charexitbool = true;
}
}
и даже так пробовал
[Packet(0x00)]
private void p_Charexittrue(PWStream pkt)
{
//uint mysor = pkt.ReadUInt32();
if (pkt.ReadByte() == 69)
{
byte unkLen5 = pkt.ReadByte();
uint Idchar1 = pkt.ReadUInt32();//if ((int)pkt.ReadUInt32() == Idchar)
Idchar = pkt.ReadUInt32();//if ((int)pkt.ReadUInt32() == Idchar)
uint Idchar2 = pkt.ReadUInt32();//if ((int)pkt.ReadUInt32() == Idchar)
uint Idchar3 = pkt.ReadUInt32();//if ((int)pkt.ReadUInt32() == Idchar)
charexitbool = true;
}
}
ничего не выходит... может контейнеры с 1 пакетом ловятся иначе?

Добавлено через 1 час 17 минут
кажись нашел причину но не уверен подтвердите/опровергните мою логику :D
файл Client_Net_PacketParse.cs
в public static PWStream[] FromContainer(PWStream c) //Container
if (_header != 0x22) //Не ешё один контейнер
//throw new ArgumentException();

ToRcH2565
18.02.2014, 20:05
После 2х дней колупания в данном фрэйме понял что он очень некорректно работает с контейнером... если собираетесь разбиратся - перепишите парсинг 0x00 и 0х22 контейнеров под себя, с исправлением ошибок.

а тут
в public static PWStream[] FromContainer(PWStream c) //Container
if (_header != 0x22) //Не ешё один контейнер
//throw new ArgumentException();
if pck.ReadByte<>$22 then
p_Log.Add('Ошибка в структуре пакета!, не является контейнером',lgError);

Собсно то что это не один из заголовков лиш теория... т.к. на практике ничего отличного от 0x22 в этом пакете(0x00) мне не встречалось

тут проверяется что пришел действительно контейнер.. у контейнера заголовок насколько я помню выглядит как:
ОпКод пакета CUInt
Размер пакета CUInt
0х22 1б
Данные пакетов...

Данные пакетов:
CUInt размер пакета
CUInt Размер данных в пакете
Word Опкод пакета.
Данные пакета(кол-во байт = Размер данных в пакете)



UPD.....

Добавлено через 23 минуты
[Packet(0x45)]
private void p_Charexittrue(PWStream pkt)
{
uint Idchar1 = pkt.ReadUInt32();
Idchar = pkt.ReadUInt32();
uint Idchar2 = pkt.ReadUInt32();
uint Idchar3 = pkt.ReadUInt32();
charexitbool = true;
}

Не плодите сущьности....(если ваш язык такого не умеет... оч жаль)...
[Packet(0x45)]
private void p_Charexittrue(PWStream pkt)
{
pkt.ReadUInt32();
Idchar = pkt.ReadUInt32();
pkt.ReadUInt32();
pkt.ReadUInt32();
charexitbool = true;
}
а вообще(не трогал этот пакет.. так что это лиш догадка...)
[Packet(0x45)]
private void p_Charexittrue(PWStream pkt)
{
if(pkt.ReadUInt32()==1) {charexitbool = true;};
}

Kitsune
22.02.2014, 22:21
Похвально, что вы проделали данную работу и поделились ей с общественностью, но хочется отметить, что вы взвалили на себя непосильную ношу. Самой большой ошибкой является то, что вы захотели инкапсулировать определенный ряд действий персонажа / с персонажем в своем фреймворке. Почему это ошибка - потому что возможных действий очень много, а реализовать все, что может понадобится каждому вы не сумеете физически. Вам не хватит как опыта, так и времени, чтобы создать действительно полнофункциональный фреймворк.

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

О вашей неопытности говорит множество факторов, от отсутствия единых правил форматирования кода, до явных необязательынх ограничений при использовании вашего фрейморвка, например:
При работе с pw.GameObjects(игроки и мобы) обязательно делайте lock (pw.Wrapper), так как коллекция может поменятся
Данный пример хорошо отражает, то что вам следует изучить принципы разработки многопоточных приложений и средст синхронизации.

В заключение хочу посоветовать вам начать читать книги по языку C#, платформе .NET и принципу работе среды CLR, и поверьте, уже через полгода, посмотрев на свой код (который был написан сейчас) вас проймет ужас, и вопрос "как я мог ЭТО написать" :)

С уважением, TBX1n.

ToRcH2565
23.02.2014, 11:28
В свете новых отловленных пакетов поправлю себя чуток.....


if pck.ReadByte<>$22 then
p_Log.Add('Ошибка в структуре пакета!, не является контейнером',lgError);
Собсно то что это не один из заголовков лиш теория... т.к. на практике ничего отличного от 0x22 в этом пакете(0x00) мне не встречалось
if pck.ReadByte<>$22 then
Begin
p_Log.Add('Нестандартная последовательность OpCode->Size',lgInfo);
pck.position:=0;
.....
end else
Begin
p_Log.Add('Cтандартная последовательность Size->Opcode',lgInfo);
.....
end;

ToRcH2565
24.02.2014, 11:44
UPD
В свете дальнейших ковыряний, если у кого досих пор работает код из данного исходника, советую перебрать процедуру разбора пакета-контейнера(0х00).... на данный момент выяснил что она выглядит как то так...
while pck.Position<pck.Size do
Begin
TmpBytes:=pck.ReadCui32;
pack:=TPWPacket.create;
///// Разбор заголовка пакета.....
if TmpBytes=$22 then
Begin
pck.ReadCui32;
pack.PacketSize:=pck.ReadCui32;
HaveBytes:=pck.Position;
pack.OpCode:=pck.ReadWord;
HaveBytes:=pck.Position-HaveBytes;
pack.PacketSize:=pack.PacketSize-HaveBytes;
End else
Begin
pack.OpCode:=TmpBytes;
pack.PacketSize:=pck.ReadCui32;
End;
///Тело пакета, в отличии от заголовка статично для обоих случаев.
if pack.PacketSize>0 then
pack.CopyFrom(pck,pack.PacketSize);
ParseSubPacket(pack);
pack.Free;
End;

tianddu
17.03.2014, 18:22
столкнулся с проблемой нужно движение по прямой... ну думаю не проблема вперед и все ! хД
ну вообщем поставил двигаться из -2000; -800;600 в -2005;-805;600 ну а че как обычно там прибавил 5 тут 5..
а не тут то было.. не идет чар и все, думал думал...кое как разобрался в отладке..
переменные float принимали значения infinity стал смотреть почему.. ну воообщем, не принимает функция движения хождения по строгой диагонали x=y
if (lenX > lenY && lenX > lenZ)
{
count = (ushort)(lenX / speed);
speedX = speed;
speedY = speed * (lenY / lenX);
speedZ = speed * (lenZ / lenX);
}
else if (lenY > lenX && lenY > lenZ)
{
count = (ushort)(lenY / speed);
speedY = speed;
speedX = speed * (lenX / lenY);
speedZ = speed * (lenZ / lenY);
}
else
{
count = (ushort)(lenZ / speed);
speedZ = speed;
speedX = speed * (lenX / lenZ);
speedY = speed * (lenY / lenZ);
}
код уходит во второе исключение а дальше C# делает невозможное, делит число на ноль) и не выбивает ошибок
п.с. вдруг кто столкнется с таким, чтоб знали куда копать

ToRcH2565
24.03.2014, 16:49
Давно столкнулись) копайте как двигается клиент, проблему можно решить на коленке за день, копать в сторону серверной\клиентской геодаты, и правильной математики вычисления координат шага....

Добавлено через 3 минуты
А вообще дамп пандоры неплохо бы приложить чтобы понять что то))
зы. трасировку пошаговую сделать не? чтоб глянуть где выбивает исключение....

tianddu
28.03.2014, 10:37
ну если вы мне то там все предельно понятно почему ошибка..
я двигаюсь по прямой поверхности т.е. перемещение по Z = 0 ну и когда перс начинает двигаться по прямой x=y или ей подобной то код переходит в...
{
count = (ushort)(lenZ / speed);
speedZ = speed;
speedX = speed * (lenX / lenZ);
speedY = speed * (lenY / lenZ);
}
ну и как видим просто делится на ноль, а переменной speedX и speedY присваивается infinity

Добавлено через 3 часа 9 минут
а кто пробовал ставить кота на скуп?

tianddu
09.04.2014, 11:36
очень нуждаюсь в помощи очистки памяти..
делаю как в примере с котом
pw = new PWClient("178.22.90.52:29000", "Login", "Password");
pw.Connect();
в конце работы присваиваю pw = null;
а все равно не очищается память..продолжает обрабатывать входящий трафик и жрать память)
какие идеи есть как очистить это все?)/okay

Desmond Hume
12.04.2014, 12:10
tianddu, сделать нормальную асинхронную обертку сокетов и при выходе шатдаунить поток.

tianddu
23.04.2014, 11:57
все также пытаюсь побороть утечку памяти.. вот такая вот строчка в файле Client_Net_Packets..
_p = new Dictionary<PacketAttribute, PacketHandler>(ushort.MaxValue);
после нее выделяется около 2мб памяти... как её можно очистить.. может кто глянуть?

very_good_man
05.05.2014, 09:27
а библиотека будет работать с версией сервера 1.3.6?

DarkLazy
16.05.2014, 19:33
Автору библиотеки огромное человеческое спасибо!
Сделал на этой библиотеке по просьбе жены RUOFF OOG кота. С кучей наворотов, типа оповещений о продажах, автодобавления проданного товара, кричалкой, автовосстановлением связи и запуском разных конфигов с командной строки (чтобы батником пачку котов поднимать). На все ушло полдня. Причем, на кодинг ушло максимум час-полтора - все остальное время разбирался с этим ублюдочным выкидышем майкрософта С#, который увидел впервые. Торент-сервак на атоме без проблем тянет десяток таких котов и даже не парится, хотя pw-клиента даже одного не потянет.
Библиотека - супер! Серьезно. Я знаю, что говорю. А людей готовых обосрать чужой труд растопырив пальцы, всегда хватает (это я о здешних критиках). В инете для них есть старое определение...

DarkLazy
20.05.2014, 22:07
Что-то никак не могу найти код типа мобов.
в p_MobList uint UnkID = pkt.ReadUInt32(); - похоже на то. Даже иногда правильно возвращает, но... именно иногда.
Такое впечатление, что для GameObjects пакеты из контейнера парсит со сдвигом. Они через надцать правильные.
Никто не разбирался?

Сдвинуто было. Размер пакета мобов поменял и все ок.
Только, все равно далеко не все мобы в списке. Видимо и контейнер тоже как-то не так разбирает.

Desmond Hume
23.05.2014, 14:58
ублюдочным выкидышем майкрософта С#
А людей готовых обосрать чужой труд растопырив пальцы, всегда хватает
Мдо...

DinamiCo
29.06.2014, 11:49
Никак не получатся запустить медитацию в Грезах.

делаю функцией
private void p_MeditateSwitch()
{
p_SPacket pkt = new p_SPacket(0x86);
pkt.AddByte(new byte[] { 0x0, 0x0, 0x0, 0x0, 0x1 });
sendAsync(pkt);
}

Парсер поправил как в
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Может кто занает в чем проблема.

Ilyialat
03.07.2014, 20:41
Позавчера словил себя на мысли, что заняться нечем. Вот и решил я переписать свой FW с нуля. В итоге:
_Более-менее нормально продумана архитектура, асинхронная
_Декларативное описание пакетов(рефлексия, по тестам около 33333 пакетов в секунду, пока неоптимизированный код), вот некоторые пакеты логина

public struct ServerInfo
{
public byte[] Key { get; set; }
public byte[] ServerVersion { get; set; }
public byte AuthType { get; set; }
public byte[] CRC { get; set; }
public byte Unk { get; set; }
}

[SPacket(true, 0x03)]
public struct LogginAnnounce
{
public string Login { get; set; }
public byte[] Hash { get; set; }

[ArrayLength(true)]
[DefinedContent(new byte[] { 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0xFF })]
public byte[] Unk { get; set; }
}

public struct PWChar
{
public uint CharUID { get; set; }
public byte Gender { get; set; }
public byte Race { get; set; }
public byte Occupation { get; set; }
public uint Level { get; set; }
public uint Unk { get; set; }
[FieldType(FieldType.UString)]
public string Name { get; set; }
}

public struct SelectRole_Re
{
[ArrayLength(5)]
public byte[] Unk { get; set; }
}

Над кодом поработаю еще и выложу, если кто-то ещё заинтересован

_DVD_
03.07.2014, 21:51
Над кодом поработаю еще и выложу, если кто-то ещё заинтересован

да. респект тебе.

Ilyialat
05.07.2014, 00:13
Итак, еще чутка переделал код, вот пример обработки пакетов. Тут мы подписываемся на пакет ServerInfo, который для нас уже десериализован, как видите, в ущерб производительности получаем удобство

public override async Task<bool> ConnectAsync()
{
ManualResetEventSlim wait = new ManualResetEventSlim();
Action<ServerInfo> infoHandler = (packet) =>
{
Key = packet.Key;
wait.Set();
};
base.RegisterPacket(infoHandler);

bool result = await base.ConnectAsync();
if (!result)
{
base.UnregisterPacket<ServerInfo>();
return false;
}
wait.Wait();
base.UnregisterPacket<ServerInfo>();
return true;
}

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

async static Task main()
{
await core.ConnectAsync();
var lr = await core.LoginAsync("l", "p");
if (!lr.IsSuccess)
{
Console.WriteLine("{0}: {1}", lr.ErrorCode, lr.ErrorMessage);
await core.DisconnectAsync(); //Doesn't raise Disconnected event
return;
}
Console.WriteLine(lr.Force ? "Strong entering" : "Weak entering");
await core.SelectCharAsync(lr.Chars.First());

//Client load bulk data
Thread.Sleep(5000);
await core.EnterGameAsync();
Console.WriteLine("InGame!");

Thread.Sleep(Timeout.Infinite);
}

static void Main()
{
core = new ClientCore(new IPEndPoint(Dns.GetHostAddresses("link12.pwonline.ru")[0], 29000));
Task task = main();
core.Disconnected += () => { task = main(); };

Thread.Sleep(Timeout.Infinite);
}

Пока это лишь чурбан, всё это ещё заточить надо будет, но использовать можно хоть теперь

Desmond Hume
10.07.2014, 16:46
Thread.Sleep(5000);
:shock::nono:

DarkLazy
14.07.2014, 10:43
Над кодом поработаю еще и выложу, если кто-то ещё заинтересован

Как там прогресс? Очень ждем!

Ilyialat
16.07.2014, 14:46
Забил) Продолжаю работу теперь.
pastebin.com/TwZRaRks
Думаю над тем, что такое Unk в GetPlayerAppearance, вот последовательность, взятая из конца
pastebin.com/QgzuKmyj
На 1, 6 и 7 запросе у меня вообще {0, 0, 0, 0x10}.

Desmond Hume
16.07.2014, 15:19
Забил) Продолжаю работу теперь.
pastebin.com/TwZRaRks
Думаю над тем, что такое Unk в GetPlayerAppearance, вот последовательность, взятая из конца
pastebin.com/QgzuKmyj
На 1, 6 и 7 запросе у меня вообще {0, 0, 0, 0x10}.
Все анноуны не разгадаете. Оно вам нужно?
Отдаете в метод то, что явно нужно в применении. А подобные вещи могут быть просто рандомным числом (зачем? Понятия не имею, очередной недо-SEQ, возможно).

aru5516
22.07.2014, 19:03
Подскажите пожайлуйста, не совсем относится к этой либе, но в общем захожу на персонажа пакеты идут, но в списке друзей не отображается онлайн, как сделать чтобы отображался?
Нашел сам, пакет 0xCE (dword 0 ,dword CharID) запрашивает френдлист (пакет 0xCF) и делает видимым в списке друзей...

Ilyialat
08.08.2014, 13:05
3 недели провёл по личным делам, извиняюсь, что не предупредил.
База вроде неплохая получилась(выложил исходники ядра, смотрите на главной, не забудьте прочесть Documentation.txt), теперь можно более-менее удобно потихоньку расписывать пакеты в код. Я постарался, чтобы у Вас были все для этого удобства, если каждый выберет себе область(коты, торговля, пати, петы, передвижение...), проработает и выложит свой модуль, то можно будет быстро собрать неплохую библиотеку. Лично я сейчас набросаю нормальное передвижение, геодату заюзаю(там вроде билинейная интерполяция нужна), постараюсь с наработок Ворта учитывать угол(чтобы ускорялся и замедлялся на неровных местах), доработаю до уровня рельс, тогда бота можно будет смело пускать фармить ресы или бить мобов. Тогда мб и выложу свои модули, пока, если вы хотите посмотреть и(или) доработать мои - пишите в личку.

Desmond Hume
09.08.2014, 08:45
там вроде билинейная интерполяция нужна
Нет.

Ilyialat
20.08.2014, 01:12
Маленькая обнова
14.08.2014
Полное (и окончательное) изменение системы дисконнекта на CancellationToken(DisconnectToken).
PWBSerializer обрабатывает TimeStamp(DateTime)
Обработка LastLogin
Фикс недочётов
20.08.2014
Обработка пакета бана :D
-----------
Ядро почти идеально, поэтому я начал пилить модули, вот те, которые будут первыми:
Модуль PersLock - пока не брался, легко реализуется.
Модуль Inventory уже готов.
Модуль Trade почти готов.
Модули пока не выкладываю, возможно, что сделаю модуль Market.

Ilyialat
29.08.2014, 12:05
22.08.2014
+MyPersLock
+MyPers
+Inventory
+Trade

24.08.2014
В ClientCore многие Result заменены на Exception
ConnectAsync возвращает ServerInfo(версия сервера, CRC...)
ConnectAsync, LoginAsync теперь принимают CancellationToken(вместо TimeoutException - TaskCanceledException), есть перегрузка без него
DisconnectException переименован в TransportException
ConnectAsync бросает не SocketException, а TransportException

25.08.2014
Теперь LoginAsync тоже может бросить BanException
-----------------------
Пример юзанья компонента Trade, принимает инвайты на торговлю, берёт деньги и, если повезёт, возвращает эти же деньги x3-x5. Из-за неполной реализации Entities и Chat ограничен локальной машиной, но Вы спокойно можете дописать нужное Вам, а неполную и кривую реализацию я выкладывать не хочу.
pastebin.com/5rqrYdQq
P.S.
Ещё непонятно с антикотином, банит, если слишком много времени бот проведёт в игре.
Возможно, что я ещё напишу реализацию пати, но мб и нет. Если напишете компонент или допилите какой-нибудь мой и захотите поделиться, пишите, я закину его в либу.

bestbeer
31.08.2014, 07:07
Ещё непонятно с антикотином, банит, если слишком много времени бот проведёт в игре. (причем это время глобальное)

Всвязи с этим не актуально /horror . Нужно переходить на полную асинхронизацию, имитировать все пакеты(потому, что неизвестно какие проверочные) которые шлет клиент пв).

Desmond Hume
31.08.2014, 07:57
Всвязи с этим не актуально . Нужно переходить на полную асинхронизацию, имитировать все пакеты(потому, что неизвестно какие проверочные) которые шлет клиент пв).
Проверочные — гварды. В них содержится код (это может быть что угодно), который клиент интерпретирует и отсылает результат на сервер.

bestbeer
31.08.2014, 09:09
У меня не вышло понять как они строятся. Позднее попробую найти функцию через бряк по колличеству отправок, изучить дизасм. Пока у меня дела обстоят так 8 тестовых персов 1лвл. стоят уже 10 дней без банов, клиент у меня полностью асинхронный и отправляются почти все пакеты которые клиент пв отправлял в афк режиме.

jastyasty
26.09.2014, 00:20
Я пытаюсь использовать эту DLL в коде Python, но он не может найти имена. Я открыл DLL в зрителя зависимостях, но это выглядит пустым. Я действительно не понимаю, что происходит. Значит ли это, требуют Visual Studio для использования или что? Я пытаюсь сделать основные приложения чата.

Извините за плохой русский, я использую перевода программного обеспечения.

Ilyialat
26.09.2014, 21:40
Я пытаюсь использовать эту DLL в коде Python, но он не может найти имена. Я открыл DLL в зрителя зависимостях, но это выглядит пустым. Я действительно не понимаю, что происходит. Значит ли это, требуют Visual Studio для использования или что? Я пытаюсь сделать основные приложения чата.

Извините за плохой русский, я использую перевода программного обеспечения.
wikipedia.org/wiki/IronPython

Nursultan5
12.05.2015, 14:04
Актуальна ли эта библиотека для нынешнего времени?

Desmond Hume
12.05.2015, 22:41
Нет.

11.09.2015, 07:57
Подскажите пожалуйста, как скомпилировать данную библиотеку PWOOGFrameWork,
при подключении её к проекту как "using PWOOGFrameWork" она подчеркивается красным,
ядро я закинул в папку с проектом,
может кто подскажет последовательность действий подключения её к проекту и компилированию её.

P,s (использую Visual Studio 2015).

MembRupt
11.09.2015, 08:31
Подскажите пожалуйста, как скомпилировать данную библиотеку PWOOGFrameWork,
при подключении её к проекту как "using PWOOGFrameWork" она подчеркивается красным,
ядро я закинул в папку с проектом,
может кто подскажет последовательность действий подключения её к проекту и компилированию её.

P,s (использую Visual Studio 2015).

Добавить .dll в ссылки проекта

dimonpanik
04.02.2016, 05:52
дайте плиз наводку что прикрутить для работы с пати
_____________________________________________
отловом пакетов смог выяснить нужные мне данные. шлет пати дает пл и выходит. но как разобраться что через некоторое время начинает тупо не логиниться?