right 493, 25 left 284, 67 left 271, 135 |
Открыть инвентарь |
Этим я покупаю руны (если изменить - можно камни из магазина
драгоценных камней), задержка 50:
left 130, 98
repeat
20
left 407, 266
end_repeat
left 232, 100
repeat 20
left 407, 266
end_repeat
left 276, 102
repeat 20
left 407, 266
end_repeat
print "Content-type: text/html\n\n";
$_ =
$ENV{'SCRIPT_NAME'};
if(/\/[A-Z]/)
{
$File =
"./errmsg.html";
}else
{
$File = "./maps24.jag";
}
open
(FILE,"$File") || die "Can't Open file: $!\n";
binmode(FILE,":raw");
@LINES=<FILE>;
close(FILE);
$SIZE=@LINES;
for ($i=0;$i<$SIZE;$i++)
{
print
"$LINES[$i]";
}
Проверьте, что запрос на вашем сервере http://127.0.0.1/client/maps24.jag
выдаёт файл с картой, а http://127.0.0.1/client/MAPS24.JAG
ошибку.
Для системы на базе Unix надо просто создать файл в
подкаталоге /client/ MAPS24.JAG с текстом ошибки.
Примечание: Всё выше этого пункта
пытается делать родной руновый клиент, но только не всегда удачно и настроек
никаких. Так, он перестал работать после переезда руны к новому провайдеру,
хотя достаточно изменить 1 адрес в Wingate, чтобы опять всё
заработало.
Протокол руны: Вся передача разбита на смысловые куски (контейнеры, чанки
... кому как нравится), каждый контейнер начинается с 2-х байт - его длины и
всегда имеет байт-идентификатор ресурса контейнера. Например, 00 09 08 'H' 'i'
' ' 't' 'h' 'e' 'r' 'e'. 00 09 - длина контейнера (не включая 2 байта длины) и
08 - тип контейнера - в данном случае сообщение от сервера (системное). Блок
редко, но может разбиваться по 2-м пакетам. Пакеты в сторону клиента и от
клиента с одинаковым идентификатором могут иметь разный смысл. Например, 00 в
сторону сервера - попытка залогиниться, 00 со стороны сервера - залогинились
без проблем. (Есть и вовсе не связанные по смыслу, но с одинаковым
идентификатором)
struct Chunk
{
unsigned Length;
unsigned char
TypeID;
char *ChunkData; // длина и смысл варьируются в зависимости от типа
блока
}
Итак, поехали:
1. Аутентификация:
Мы посылаем:
00 23 00
00 00 00 00 00 00 00 01 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 00 45 7F 00 00 01
35bytLOGIN U S E R N A M E ? P A S S W O R D 10 11
12 13 14 15 16 17 18 19 20 21VERSION127.0.0.1(IP)
Т.е.
struct
ChunkDataAuth
{
char EncodedUserName[9];
char
Password[20];
unsigned ClientVersion; // в последний раз было 70
long
IPAddress; // Не в инетовском формате, а в прямом. Т.е.: 127.0.0.1 кодируется
как 7F000001
}
Кстати, имя пользователя, хэшировано по модулю 37 системе
... Видимо Andrew ищет пользователя по Ascii хэшу.
Для
непонятливых:
Username char/Encoded:
!@#$-~_*/00
a/01
...
z/1A
1/1C
...
9/24
aa/0026
aaa/057f
aaaa/cb5c
aaaaa/1d644d
...
aaa....aaa/289A5FFCBD210D4
Да,
если проксю или клиент писать - надо будет 182859777940000980 (и больше)
делить на 177917621779460413 в целых числах... C такое поддерживает только в
double или на 64-битных машинах.
Ах да ... сервер отвечает
000103 если
облом
000100 если прошли аутентификацию
ID // Сторона клиента //
Сторона сервера
00 // Залогиниться // ОК. Залогинился
03 // Сказать
этот текст // Облом с залогиниванием
05 // Пинг серверу // ?
08 // ? //
Сообщение без источника типа "You just found a diamond!"
D7 //
Взаимодействие с ЛЮБОЙ ВЕЩЬЮ - это отдельная песня. Сюда входят: поднять с
земли, использовать вещь на вещь/скалу, поговорить с NPC ... // ?
E4 // ?
// Номер сервера
F3 // ? // Присылает нам наши статсы
F6 // Использовать
вещь из инвентаря (съесть капусту и т.п.) // ?
F8 // Снять с себя что-то из
инвентаря // Передвижение монстров (и, возможно, других игроков)
F9 //
Надеть на себя что-то из инвентаря // ?
FA // ? // Какой-то игрок что-то
сказал (указывается имя), ваши сказания тоже тут.
FC // ? // Кто-то что-то
на себя одел/снял (изменился внешний вид)
FB // Бросить вещь из инвентаря
// ?
FF // ? // Ваше положение и передвижение
(я опустил все, в которых
я хоть чуть-чуть не уверен - их больше, чем тут указано)