[Ссылки могут видеть только зарегистрированные пользователи. ]
________________ Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - твинки любого игрока, их дата создания, последний онлайн, статус удаления и прочее
Skype - freepvps
ICQ - 412705115
[Ссылки могут видеть только зарегистрированные пользователи. ] - ставкобот [Ссылки могут видеть только зарегистрированные пользователи. ] - общение в КЧ через смартфон
Последний раз редактировалось Dinmaite; 12.02.2014 в 16:17.
Причина: Не благодари :)
имхо:
Думать - самая тяжелая работа для любого человека, и любой стремится избежать ее, прибегая к шаблонам..... (не помню чья фраза, донесен только смысл)..
И собсно любой инженер(действительно инженер) исключение из предложения выше...
так вот программист - частный случай инженера, и любой(начинающий\любитель\профи) не пытается избежать мыслительной деятельности, и найти решение проблемы, любой не инженер(аля наш упомянутый геймер) если с первой максимум второй попытки(если вообще пытался) не нашел решения - попытается повесить свою задачу(поиск решения его задачи) на окружающих...
это так.. офтоп на тему почему "геймерам" вообще не стоит лезть в программирование....
но это все лиш мои мысли или чужие мысли с которыми я согласен)
Все мы когдато начинали с кучи вопросов, не понимали что и как делать и почему это работает(или не работает), но ведь согласитесь, перед тем как спросить на форуме\сайте или еще где пытались найти решение сами...)
Последний раз редактировалось ToRcH2565; 12.02.2014 в 17:42.
а вот хотел узнать такая проблема... нужно отследить пакет выхода из сети на страницу выбора..
пандора его отображает как контейнер (может я конешно путаю что такое контейнер но вроде как это набор пакетов в пандоре они со стрелочкой свернуть/равернуть)
вообщем контейнер 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 минут
кажись нашел причину но не уверен подтвердите/опровергните мою логику
файл Client_Net_PacketParse.cs
в public static PWStream[] FromContainer(PWStream c) //Container
if (_header != 0x22) //Не ешё один контейнер
//throw new ArgumentException();
Последний раз редактировалось tianddu; 18.02.2014 в 19:08.
Причина: Добавлено сообщение
После 2х дней колупания в данном фрэйме понял что он очень некорректно работает с контейнером... если собираетесь разбиратся - перепишите парсинг 0x00 и 0х22 контейнеров под себя, с исправлением ошибок.
а тут
Цитата:
Сообщение от tianddu
в 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 Опкод пакета.
Данные пакета(кол-во байт = Размер данных в пакете)
Похвально, что вы проделали данную работу и поделились ей с общественностью, но хочется отметить, что вы взвалили на себя непосильную ношу. Самой большой ошибкой является то, что вы захотели инкапсулировать определенный ряд действий персонажа / с персонажем в своем фреймворке. Почему это ошибка - потому что возможных действий очень много, а реализовать все, что может понадобится каждому вы не сумеете физически. Вам не хватит как опыта, так и времени, чтобы создать действительно полнофункциональный фреймворк.
Данный пост не несет в себе цели обидеть кого-либо, а лишь содержит субъективную критику человека, который занимался данным вопросом продолжительное время на коммерческой основе, имея за плечами существенный опыт разработки крупных коммерческих проектов на платформе .NET.
О вашей неопытности говорит множество факторов, от отсутствия единых правил форматирования кода, до явных необязательынх ограничений при использовании вашего фрейморвка, например:
Цитата:
При работе с pw.GameObjects(игроки и мобы) обязательно делайте lock (pw.Wrapper), так как коллекция может поменятся
Данный пример хорошо отражает, то что вам следует изучить принципы разработки многопоточных приложений и средст синхронизации.
В заключение хочу посоветовать вам начать читать книги по языку C#, платформе .NET и принципу работе среды CLR, и поверьте, уже через полгода, посмотрев на свой код (который был написан сейчас) вас проймет ужас, и вопрос "как я мог ЭТО написать"
С уважением, TBX1n.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Быстрое снятие и загрузка скриншотов на хостинг.
В свете новых отловленных пакетов поправлю себя чуток.....
Цитата:
Сообщение от ToRcH2565
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;
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;
столкнулся с проблемой нужно движение по прямой... ну думаю не проблема вперед и все ! хД
ну вообщем поставил двигаться из -2000; -800;600 в -2005;-805;600 ну а че как обычно там прибавил 5 тут 5..
а не тут то было.. не идет чар и все, думал думал...кое как разобрался в отладке..
переменные float принимали значения infinity стал смотреть почему.. ну воообщем, не принимает функция движения хождения по строгой диагонали x=y
код уходит во второе исключение а дальше C# делает невозможное, делит число на ноль) и не выбивает ошибок
п.с. вдруг кто столкнется с таким, чтоб знали куда копать
Давно столкнулись) копайте как двигается клиент, проблему можно решить на коленке за день, копать в сторону серверной\клиентской геодаты, и правильной математики вычисления координат шага....
Добавлено через 3 минуты
А вообще дамп пандоры неплохо бы приложить чтобы понять что то))
зы. трасировку пошаговую сделать не? чтоб глянуть где выбивает исключение....
Последний раз редактировалось ToRcH2565; 24.03.2014 в 17:53.
Причина: Добавлено сообщение
ну если вы мне то там все предельно понятно почему ошибка..
я двигаюсь по прямой поверхности т.е. перемещение по Z = 0 ну и когда перс начинает двигаться по прямой x=y или ей подобной то код переходит в...
очень нуждаюсь в помощи очистки памяти..
делаю как в примере с котом
pw = new PWClient("178.22.90.52:29000", "Login", "Password");
pw.Connect();
в конце работы присваиваю pw = null;
а все равно не очищается память..продолжает обрабатывать входящий трафик и жрать память)
какие идеи есть как очистить это все?)
все также пытаюсь побороть утечку памяти.. вот такая вот строчка в файле Client_Net_Packets..
_p = new Dictionary<PacketAttribute, PacketHandler>(ushort.MaxValue);
после нее выделяется около 2мб памяти... как её можно очистить.. может кто глянуть?
Автору библиотеки огромное человеческое спасибо!
Сделал на этой библиотеке по просьбе жены RUOFF OOG кота. С кучей наворотов, типа оповещений о продажах, автодобавления проданного товара, кричалкой, автовосстановлением связи и запуском разных конфигов с командной строки (чтобы батником пачку котов поднимать). На все ушло полдня. Причем, на кодинг ушло максимум час-полтора - все остальное время разбирался с этим ублюдочным выкидышем майкрософта С#, который увидел впервые. Торент-сервак на атоме без проблем тянет десяток таких котов и даже не парится, хотя pw-клиента даже одного не потянет.
Библиотека - супер! Серьезно. Я знаю, что говорю. А людей готовых обосрать чужой труд растопырив пальцы, всегда хватает (это я о здешних критиках). В инете для них есть старое определение...