Исходники здесь
Вот такие скомпилированные версии есть у меня.
Ниже данные устарели.
Репозиторий находится тут (открывать через SVN клиент)
Удобный просмотр репозитория через браузер тут
Скомпилированные версии тут Пароль к архиву: coderx.ru
Есть ли предложения по модернизации существующего кода с описанием как должно и что хотелось бы заменить/добавить?
Дополнительные компоненты брать тут. (<-- TPerlRegEx есть только там)
/upd:
для компиляции последних ревизий понадобятся JCL, JVCL (ссылки выше) а так же:
jwapi2.2a, SyntEdit, TRichView.v11.0+ScaleRichView.v2.0, TsiLang (letitbit / upload.com.ua)
Немного подправленный FastScript искать в файловом архиве.
Последний раз редактировалось NLObP, 17.10.2016 в 00:02.
Нашел баг в uPluginData.pas
dmData.SendPacket(packet, tid, False); <--- почему false а не ToServer
и еще
вот здесь
procedure TdmData.SendPacket
есть 2 строчки TlspConnection(LSPConnections.Items[i]).Visual.processpacketfromacum;
они избыточные, т.к. потом в TlspConnection(LSPConnections.Items[i]).encryptAndSend(Packet, toserver);
итак это дело вызывается, поэтому дублируется лог
Tип: 0x62 (SystemMessage)
Pазмер: 43+2
Время прихода: 22:28:29:140
0002 d MsgID: $c1 получает от цели $c2 $s3 урона. ID:2262 (0x08D6)
0006 d typesCount: 3 (0x00000003)
0008 d typePar: тип параметра, может принимать значения:
0 - значит это строка (подставляеться вместо $cx)
1 - просто числовое значение (integer 4 байта) (подставляеться вместо $sx)
2 - id NPC (integer 4 байта) (подставляеться вместо $cx)
3 - id предмета (integer 4 байта) (подставляеться вместо $sx)
4 - id скила (integer 4 байта + ещё 4 байта которые я игнорирую) (подставляеться вместо $sx)
7 - где то видел но не нашел этого пакета в логах (12 байт)
могут быть и другие значения типов параметров, но мне пока не попадались.
x - это порядковый номер параметра, все значения в пакете идут по порядку как в строке.
Ну а потом идет собственно само значение и так по кругу typesCount раз.
Теперь мой вариант как прочитать этот пакет:
delphi Код:
var
lastSystemMessage: record
msgID: integer;
msgUnformatedString: string;
msgText: string;
end;
function TL2WorldData.GetL2SystemMessage(const pck: string): boolean;
var
i, j: integer;
typesCount: integer;
parType: integer;
st: string;
objSt: string;
sPar: string;
iPar: integer;
begin
Result:= false;
if pck[1] <> #$62thenexit;
i:= 2;
lastSystemMessage.msgID := ReadD(pck, i);
typesCount:= ReadD(pck, i);
lastSystemMessage.msgUnformatedString:= sysMsgIdList.Values[IntToStr(lastSystemMessage.msgID)];
st:= lastSystemMessage.msgUnformatedString;
for j:= 0to typesCount - 1dobegin
parType:= ReadD(pck, i);
case parType of0: begin
sPar:= ReadS(pck, i);
st:= AnsiReplaceStr(st, '$c' + IntToStr(j + 1), sPar);
end;
1: begin
iPar:= ReadD(pck, i);
st:= AnsiReplaceStr(st, '$s' + IntToStr(j + 1), IntToStr(iPar));
end;
2: begin
iPar:= ReadD(pck, i);
objSt:= NpcIdList.Values[IntToStr(iPar - 1000000)];
st:= AnsiReplaceStr(st, '$c' + IntToStr(j + 1), objSt);
end;
3: begin
iPar:= ReadD(pck, i);
objSt:= ItemIdList.Values[IntToStr(iPar)];
st:= AnsiReplaceStr(st, '$s' + IntToStr(j + 1), objSt);
end;
4: begin
iPar:= ReadD(pck, i);
objSt:= SkillIDList.Values[IntToStr(iPar)];
st:= AnsiReplaceStr(st, '$s' + IntToStr(j + 1), objSt);
inc(i, 4);
end;
7: begininc(i, 12);
end;
elsebegin
SendMSG('Неизвестный идентефикатор параметра в пакета SystemMesage (ID: '
+ IntToStr(lastSystemMessage.msgID) + ') ' + IntToStr(parType));
Exit;// выходим дабы не наделать горя, так как неизвестно сколько байт считыватьend;
end;
end;
lastSystemMessage.msgText:= st;
Result:= true;
end;
Последний раз редактировалось Yegor, 02.07.2009 в 22:07.