Продолжая тему про AddNetworkQueue, хочу поделится своими наработками, может кому-нибуть будут полезными ...
Что бы добавить свой пакет в массив, нужно выделить память, но просто выделить мало, нужно выделить где-то внутри ла2. Для выделения памяти я юзал ф-ию "L2MemoryAlloc", ее можно легко найти, она находится рядом с AddNetworkQueue. Выглядит она следующим образом:
Код:
L2MemoryAlloc(cmd: PWideChar; Len: integer): Pointer;
В качестве параметров используются строки "NetCmd", "NetPacket" и размер. Строки указывают для чего резервируется память и выделяется в соответствующем месте. Вообще выделение памяти здесь звучит довольно не корректно, т.к выделения памяти по сути происходит не всегда и зависит от аргументов. Стоит еще отметить то, что вызывать нужно поразному для конкретного аргумента(cmd), не знаю с чем это связано, но при вызове ф-ии в регистрах должно быть то, что должно быть, иначе будет ошибка. Для выделения памяти под сам пакет и под структуру NetworkPacket, которую в дальнейшем мы будем добавлять, я юзал такие ф-ии:
Код:
function L2MemoryAllocNetCmd(len: integer): Pointer; stdcall;
asm
push NetCmd
push len
mov edx, [$01E6D6A4]
mov ecx, [edx]
mov edx, [ecx]
mov eax, [edx]
call eax
end;
function L2MemoryAllocNetPacket: Pointer; stdcall;
asm
push NetPacket
push $0C
mov edx, [$01E6D6A4]
mov ecx, [edx]
mov eax, [ecx]
mov edx, [eax]
call edx
end;
Вообще это копипаст из клиента и адресс 01E6D6A4 будет действителен только для конкретных хроник - ИТ, найти в другом клиенте не должно вызвать проблем.
В первом случае мы выделяем память, куда положим свой пакет без его длинны, ID и если есть то и SubID. Во втором под структуру NetworkPacket. Заполняем и вызываем примерно таким образом:
Код:
procedure AddNetworkQueue(NetworkPacket: PNetworkPacket); stdcall;
asm
mov ecx, [$00BFF558] - UNetworkHandler
mov edx, [ecx]
mov eax, [edx+$84]
push NetworkPacket
call eax
end;
Проверялось на Интерлюдии, должно работать везде впринципе. Самое главное выделить память без ошибок.