This commit is contained in:
alexey.min 2012-02-06 09:14:22 +00:00
parent 30ffde533a
commit 043d61633e
198 changed files with 13189 additions and 0 deletions

View File

@ -0,0 +1,57 @@
// [17:13:24] <Forsian>
void Decrypt(unsigned char *Data, int size_data){
if (!Crypt) return;
if (Settings.DebugLogFileLineage) {
fprintf(LogLineagePacket, "=======================================? %d (TCP: ~? %d)=============================================\nPacket:\n", NumberLineage2Packet, NumberIPPacket);
PrintData(Data, size_data, LogLineagePacket);
}
int i;
int j=0;
int Temp;
int Temp2 = 0;
for (i=0; i < size_data; i++){
Temp = Data[i] & 0xFF;
Data[i] = (byte)(Temp ^ (CryptKey[j++] & 0xFF) ^ Temp2);
Temp2 = Temp;
if (j == 16) j = 0;
}
if (Settings.DebugLogFileLineage) {
fprintf(LogLineagePacket, "\nOld Key: ");
for (i = 0; i < 16; i++){
fprintf(LogLineagePacket, "%02X ", CryptKey[i]);
}
}
long old = 0;
old |= CryptKey[8] & 0xFF;
old |= CryptKey[9] << 0x08 & 0xFF00;
old |= CryptKey[10] << 0x10 & 0xFF0000;
old |= CryptKey[11] << 0x18 & 0xFF000000;
if (Settings.DebugLogFileLineage) {
fprintf(LogLineagePacket, "\nLong Old = 0x%08X\n", old);
fprintf(LogLineagePacket, "Size: %d(dec) %04X(hex)\n", size_data, size_data);
}
old += size_data;
if (Settings.DebugLogFileLineage) {
fprintf(LogLineagePacket, "Old+Size: 0x%08X\n", old);
}
CryptKey[8] = (byte)(old & 0xFF);
CryptKey[9] = (byte)(old >> 0x08 & 0xFF);
CryptKey[10] = (byte)(old >> 0x10 & 0xFF);
CryptKey[11] = (byte)(old >> 0x18 & 0xFF);
if (Settings.DebugLogFileLineage) {
fprintf(LogLineagePacket, "New Crypt Key: ");
for (i = 0; i < 16; i++){
fprintf(LogLineagePacket, "%02X ", CryptKey[i]);
}
fprintf(LogLineagePacket, "\nPacket After Decrypt:\n");
PrintData(Data, size_data, LogLineagePacket);
fprintf(LogLineagePacket, "New Crypt Key: ");
for (i = 0; i < 16; i++){
fprintf(LogLineagePacket, "%02X ", CryptKey[i]);
}
fprintf(LogLineagePacket, "\n");
fflush(LogLineagePacket);
}
return;
}

1226
docs/GameGuardKey.txt Normal file

File diff suppressed because it is too large Load Diff

197
docs/corrector-2.fsc Normal file
View File

@ -0,0 +1,197 @@
// corrector-3.fsc CT2.2 version
// ne?eio aey aiiieieoaeuiiai [aa]eiae?iaaiey ID enoiayueo iaeaoia aaeina?aa?a
// a ianoiyuaa a?aiy, ii aeaeiiio, io?ai oieuei aey ioa.
// Aaoiii?aaaeaiea LA2 aie?ii auou AEE??AII.
//
var
_seed : integer; // random generator seed for mixing id tables
_1_byte_table : string;
_2_byte_table : string;
_2_byte_table_size: integer;
_id_mix : boolean;
temp_seed : integer;
CharName : string;
Procedure OnCreate;
begin
_id_mix := false;
end;
procedure _pseudo_srand(seed : integer);
begin
_seed := seed;
end;
function _pseudo_rand: integer;
var
a : integer;
begin
a := (Int64(_seed) * $343fd + $269EC3) and $FFFFFFFF;
_seed := a;
result := (_seed shr $10) and $7FFF;
// writelogln(format('rand = %x; seed = %x',[result, _seed]));
end;
procedure _init_tables(seed: integer; _2_byte_size: integer);
var
i : integer;
x : byte;
rand_pos : integer;
cur_pos : integer;
begin
_1_byte_table := '';
_2_byte_table := '';
_2_byte_table_size := _2_byte_size;
for i := 0 to $D0 do begin
_1_byte_table := _1_byte_table + chr(i);
end;
for i := 0 to _2_byte_size do begin
_2_byte_table := _2_byte_table + chr(i) + #$0;
end;
_pseudo_srand(seed);
for i := 2 to $D1 do begin
rand_pos := (_pseudo_rand mod i) + 1;
x := GInt(_1_byte_table, rand_pos, 1);
PInt(_1_byte_table, GInt(_1_byte_table, i, 1), rand_pos, 1);
PInt(_1_byte_table, x, i, 1);
end;
cur_pos := 3;
for i := 2 to _2_byte_size+1 do begin
rand_pos := _pseudo_rand mod i;
x := GInt(_2_byte_table, rand_pos * 2 + 1 , 2);
PInt(_2_byte_table, GInt(_2_byte_table, cur_pos, 2), rand_pos * 2 + 1, 2);
PInt(_2_byte_table, x, cur_pos, 2);
cur_pos := cur_pos + 2;
end;
cur_pos := Pos(#$12, _1_byte_table);
x := GInt(_1_byte_table, $13, 1);
PInt(_1_byte_table, $12, $13, 1);
PInt(_1_byte_table, x, cur_pos, 1);
cur_pos := Pos(#$B1, _1_byte_table);
x := GInt(_1_byte_table, $B2, 1);
PInt(_1_byte_table, $B1, $B2, 1);
PInt(_1_byte_table, x, cur_pos, 1);
writelogln('one byte table');
writeloghexB(_1_byte_table);
writelogln('two byte table');
writeloghexB(_2_byte_table);
_id_mix := true;
end;
procedure _decode_ID(var buff:string);
var
p: integer;
begin
// writelogln(format('changing %x -> %x',[GInt(buff, 3, 1),GInt(_1_byte_table, GInt(buff, 3, 1)+1, 1) ]));
writelogln(format('id changed %x -> %x',[GInt(buff, 3, 1), GInt(_1_byte_table, GInt(buff, 3, 1) + 1, 1)]));
PInt(buff, GInt(_1_byte_table, GInt(buff, 3, 1) + 1, 1) , 3, 1);
if GInt(buff, 3, 1) = $D0 then begin
if GInt(buff, 4, 1) > _2_byte_table_size then begin
writelogln(format('incompatible subID %x detected',[GInt(buff, 4, 1)]));
writelogln('packet - blocked, terminating....');
gBlockPacket;
gSys.Killself;
end;
writelogln(format('sub id changed %x -> %x',[GInt(buff, 4, 1), GInt(_2_byte_table, GInt(buff, 4, 1) * 2 + 1, 1)] ));
PInt(buff, GInt(_2_byte_table, GInt(buff, 4, 1) * 2 + 1, 1) , 4, 1);
end;
end;
procedure _encode_ID(var buff:string);
var
p: integer;
begin
if GInt(buff, 3, 1) = $D0 then begin
p:= pos(Chr(GInt(buff, 4, 1)), _2_byte_table);
writelogln(format('changing back subID %x -> %x', [ GInt(buff, 4, 1), ((p + 1) shr 1) - 1 ]));
PInt(buff, ((p + 1) shr 1) - 1, 4, 1);
end;
p := pos(Chr(GInt(buff, 3, 1)), _1_byte_table);
writelogln(format('changing back ID %x -> %x',[GInt(buff, 3, 1), p-1]));
PInt(buff, p-1, 3, 1);
end;
Procedure OnDeCodeAlt;
begin
if _id_mix and (not _dFromServ) then begin
_dOutBuff := _dBuff;
_Decode_ID(_dOutBuff);
end;
end;
Procedure OnEnCodeAlt;
begin
if _id_mix and (not _dFromServ) then begin
_dOutBuff := _dBuff;
_Encode_ID(_dOutBuff);
end;
end;
begin
// CT2.2 einoueu
if (gSys.TrafType = 2) and (gSys.Protocol = 12) then begin
gSys.Protocol := 871;
if gSys.isGS > 0 then gSys.isGS := 3;
end;
// ii?aaaeaiea o?aoeea e onoaiiaea oaaeeo
// ?anoeay i?eaycea e eniieucoaiiio aa?eaioo i?ioieiea
if _gAbsNumPkt = 2 then begin
if (gSys.TrafType = 2) and (gSys.isGS = 3) and (Length(_gBuff) = $19) then begin
if gSys.Protocol = 871 then _init_tables(GInt(_dBuff, $16, 4), $58); // CT2.2
if gSys.Protocol = 851 then _init_tables(GInt(_dBuff, $16, 4), $55); // CT2
if gSys.Protocol = 831 then _init_tables(GInt(_dBuff, $16, 4), $4E); // CT1.5+
end;
// writelogln(format('TrafType = %d, isGS= %d, Protocol = %d',[gSys.TrafType, gSys.isGS, gSys.Protocol]));
end;
if _id_mix and (GInt(_gBuff, 3, 1) = $0B) then begin
ScanPck5(_gBuff, 4, 's-99-99-04d' ,CharName, temp_seed, null, null, null);
writelogln(format('reseting id tables on CharSelected; Seed = %x',[temp_seed]));
_init_tables(temp_seed,_2_byte_table_size);
end;
end.

190
docs/corrector-gracia1.fsc Normal file
View File

@ -0,0 +1,190 @@
// corrector-3.fsc ñêðèïò äëÿ äîïîëíèòåëüíîãî [äå]êîäèðîâàíèÿ ID èñõîäÿùèõ ïàêåòîâ ãåéìñåðâåðà
// â íàñòîÿùåå âðåìÿ, ïî âèäèìîìó, íóæåí òîëüêî äëÿ îôà.
// Àâòîîïðåäåëåíèå LA2 äîëæíî áûòü ÂÊËÞ×ÅÍÎ.
//
var
_seed : integer; // random generator seed for mixing id tables
_1_byte_table : string;
_2_byte_table : string;
_2_byte_table_size: integer;
_id_mix : boolean;
temp_seed : integer;
CharName : string;
Procedure OnCreate;
begin
_id_mix := false;
end;
procedure _pseudo_srand(seed : integer);
begin
_seed := seed;
end;
function _pseudo_rand: integer;
var
a : integer;
begin
a := (Int64(_seed) * $343fd + $269EC3) and $FFFFFFFF;
_seed := a;
result := (_seed shr $10) and $7FFF;
// writelogln(format('rand = %x; seed = %x',[result, _seed]));
end;
procedure _init_tables(seed: integer; _2_byte_size: integer);
var
i : integer;
x : byte;
rand_pos : integer;
cur_pos : integer;
begin
_1_byte_table := '';
_2_byte_table := '';
_2_byte_table_size := _2_byte_size;
for i := 0 to $D0 do begin
_1_byte_table := _1_byte_table + chr(i);
end;
for i := 0 to _2_byte_size do begin
_2_byte_table := _2_byte_table + chr(i) + #$0;
end;
_pseudo_srand(seed);
for i := 2 to $D1 do begin
rand_pos := (_pseudo_rand mod i) + 1;
x := GInt(_1_byte_table, rand_pos, 1);
PInt(_1_byte_table, GInt(_1_byte_table, i, 1), rand_pos, 1);
PInt(_1_byte_table, x, i, 1);
end;
cur_pos := 3;
for i := 2 to _2_byte_size+1 do begin
rand_pos := _pseudo_rand mod i;
x := GInt(_2_byte_table, rand_pos * 2 + 1 , 2);
PInt(_2_byte_table, GInt(_2_byte_table, cur_pos, 2), rand_pos * 2 + 1, 2);
PInt(_2_byte_table, x, cur_pos, 2);
cur_pos := cur_pos + 2;
end;
cur_pos := Pos(#$12, _1_byte_table);
x := GInt(_1_byte_table, $13, 1);
PInt(_1_byte_table, $12, $13, 1);
PInt(_1_byte_table, x, cur_pos, 1);
cur_pos := Pos(#$B1, _1_byte_table);
x := GInt(_1_byte_table, $B2, 1);
PInt(_1_byte_table, $B1, $B2, 1);
PInt(_1_byte_table, x, cur_pos, 1);
writelogln('one byte table');
writeloghexB(_1_byte_table);
writelogln('two byte table');
writeloghexB(_2_byte_table);
_id_mix := true;
end;
procedure _decode_ID(var buff:string);
var
p: integer;
begin
// writelogln(format('changing %x -> %x',[GInt(buff, 3, 1),GInt(_1_byte_table, GInt(buff, 3, 1)+1, 1) ]));
writelogln(format('id changed %x -> %x',[GInt(buff, 3, 1), GInt(_1_byte_table, GInt(buff, 3, 1) + 1, 1)]));
PInt(buff, GInt(_1_byte_table, GInt(buff, 3, 1) + 1, 1) , 3, 1);
if GInt(buff, 3, 1) = $D0 then begin
if GInt(buff, 4, 1) > _2_byte_table_size then begin
writelogln(format('incompatible subID %x detected',[GInt(buff, 4, 1)]));
writelogln('packet - blocked, terminating....');
gBlockPacket;
gSys.Killself;
end;
writelogln(format('sub id changed %x -> %x',[GInt(buff, 4, 1), GInt(_2_byte_table, GInt(buff, 4, 1) * 2 + 1, 1)] ));
PInt(buff, GInt(_2_byte_table, GInt(buff, 4, 1) * 2 + 1, 1) , 4, 1);
end;
end;
procedure _encode_ID(var buff:string);
var
p: integer;
begin
if GInt(buff, 3, 1) = $D0 then begin
p:= pos(Chr(GInt(buff, 4, 1)), _2_byte_table);
writelogln(format('changing back subID %x -> %x', [ GInt(buff, 4, 1), ((p + 1) shr 1) - 1 ]));
PInt(buff, ((p + 1) shr 1) - 1, 4, 1);
end;
p := pos(Chr(GInt(buff, 3, 1)), _1_byte_table);
writelogln(format('changing back ID %x -> %x',[GInt(buff, 3, 1), p-1]));
PInt(buff, p-1, 3, 1);
end;
Procedure OnDeCodeAlt;
begin
if _id_mix and (not _dFromServ) then begin
_dOutBuff := _dBuff;
_Decode_ID(_dOutBuff);
end;
end;
Procedure OnEnCodeAlt;
begin
if _id_mix and (not _dFromServ) then begin
_dOutBuff := _dBuff;
_Encode_ID(_dOutBuff);
end;
end;
begin
// îïðåäåëåíèå òðàôèêà è óñòàíîâêà òàáëèö
// æåñòêàÿ ïðèâÿçêà ê èñïîëüçóåìîìó âàðèàíòó ïðîòîêîëà
if _gAbsNumPkt = 2 then begin
if (gSys.TrafType = 2) and (gSys.isGS = 3) and (Length(_gBuff) = $19) then begin
if gSys.Protocol = 851 then _init_tables(GInt(_dBuff, $16, 4), $55); // CT2
if gSys.Protocol = 831 then _init_tables(GInt(_dBuff, $16, 4), $4E); // CT1.5+
end;
// writelogln(format('TrafType = %d, isGS= %d, Protocol = %d',[gSys.TrafType, gSys.isGS, gSys.Protocol]));
end;
if _id_mix and (GInt(_gBuff, 3, 1) = $0B) then begin
ScanPck5(_gBuff, 4, 's-99-99-04d' ,CharName, temp_seed, null, null, null);
writelogln(format('reseting id tables on CharSelected; Seed = %x',[temp_seed]));
_init_tables(temp_seed,_2_byte_table_size);
end;
end.

373
docs/demo_la2endecGS4m2.fsc Normal file
View File

@ -0,0 +1,373 @@
// 'demo_la2-endecGS-4m.fsc' Ïðèìåð ðó÷íîãî äåêîäèðîâàíèÿ LA2 GS ïàêåòîâ. Ñòàíäàðòíûé àëãîðèòì.
// âíóòðåííåå àâòîîïðåäåëåíèå è àâòîäåêîäèðîâàíèå ÍÅ ÈÑÏÎËÜÇÓÅÒÑß, îíî îòêëþ÷àåòñÿ (â ñêðèïòå).
//
// îïðåäåëåíèå òðàôèêà è äå/êîäèðîâàíèå GS ïîëíîñòüþ íà ñêðèïòå.
//
// èñïîëüçóþòñÿ ñîáûòèÿ-ôóíêöèè 'OnDeCode' è 'OnEnCode'
//
// (äëÿ ðàáîòû ñêðèïòà íåîáõîäèì WP507F èëè âûøå)
// â ïðèìåðå èñïîëüçóåòñÿ ðó÷íàÿ äå/êîäèðîâêà GS ïàêåòîâ C4/C5/Interlude ñòàíäàðòíûì àëãîðèòìîì.
// ñêðèïò FS
//
// 'demo_la2-endecGS-4m.fsc' ýòî ìîäèôèêàöèÿ ñêðèïòà 'demo_la2-endecGS-4.fsc'
// äîáàâëåíî îïðåäåëåíèå Êàìàýëü â GS3 (äëÿ WP507F íàäî ñêà÷àòü ôàéëû îïðåäåëåíèÿ)
//
var // áóäåì èñïîëüçîâàòü ëîêàëüíûå êëþ÷è, à íå âíóòðåííèå (õîòÿ ìîæíî ëþáûå, áåç ðàçíèöû)
Kci : string;// - äëÿ ïàêåòîâ ïðèøåäøèõ ñ êëèåíòà.
Kco : string;// - äëÿ ïàêåòîâ óõîäÿùèõ íà êëèåíò.
Ksi : string;// - äëÿ ïàêåòîâ ïðèøåäøèõ ñ ñåðâåðà.
Kso : string;// - äëÿ ïàêåòîâ óõîäÿùèõ íà ñåðâåð.
s,s1 : string;
scode : boolean;
le : integer;
ID : integer;
CharName : string;
_seed : integer; // random generator seed for mixing id tables
_1_byte_table : string;
_2_byte_table : string;
_id_mix : boolean;
temp_seed : integer;
Procedure OnCreate; // ôóíêöèÿ-ñîáûòèå íà ñòàðò ñêðèïòà.
// ýòà ô-öèÿ âûçûâàåòñÿ àâòîìàòè÷åñêè ïðè ñòàðòå ñêðèïòà (åùå äî ïåðâîãî ïàêåòà)
// ô-öèÿ íå îáÿçàòåëüíà è ìîæåò îòñóòñòâîâàòü â ñêðèïòàõ ...
begin
//
// Ïîîòêëþ÷àåì âñå ÀÂÒÎîïðåäåëåíèÿ è ÀÂÒÎäåêîäèðîâàíèÿ:
//
gSys.TrafType := 0; // îòêëþ÷èì âíóòðåííåå àâòîîïðåäåëåíèå òðàôèêà
gSys.tPDecode := 0; // îòêëþ÷èì âíóòðåííåå àâòîäåêîäèðîâàíèå
gSys.tKeyType := 0; // îòêëþ÷èì íà÷àëüíîå àâòîîïðåäåëåíèå êëþ÷à
gSys.Protocol := -1; // ïðîòîêîë ñîåäèíåíèÿ (ó LS è GS ðàçíûå ! îáû÷íî ãîâîðÿò î ïðîòîêîëå GS)
gSys.isGS := 0;
gSys.isLS := 0;
gSys.tParse := 2; // òèï ïàðñèíãà ïàêåòîâ (äâóõáàéòîâûé ðàçìåð â íà÷àëå ïàêåòà)
//
scode := false; // ôëàã äå/êîäèðîâàíèÿ GS
Kci := ''; Kco := ''; Ksi := ''; Kso := '';
//
CharName := '';
_id_mix := false;
end;
Procedure OnDestroy; // ôóíêöèÿ-ñîáûòèå íà çàêðûòèå ñêðèïòà è ñîåäèíåíèÿ.
// ýòà ô-öèÿ âûçûâàåòñÿ àâòîìàòè÷åñêè ïðè çàêðûòèå ñîåäèíåíèÿ
// ô-öèÿ íå îáÿçàòåëüíà è ìîæåò îòñóòñòâîâàòü â ñêðèïòàõ ...
begin
end;
procedure _DecGS(var bf : string;var ke : string; tk : integer); // äåêîäèðóåì ïàêåò GS, ýòî îáû÷íàÿ ô-öèÿ
var i,j,b,i1,sz,sk : integer;
begin
// ñòàíäàðòíûé àëãîðèòì XOR äåêîäèðîâàíèÿ GS la2
sz := length(bf);
sk := length(ke);
if sk = 0 then exit;
b := 0; j := 1;
for i := 3 to sz do begin
i1 := ord(bf[i]);
bf[i] := chr(i1 xor ord(ke[j]) xor b);
b := i1;
Inc(j,1);
if j > sk then j := 1;
end;
case tk of
1: PInt(ke,GInt(ke,1,4)+sz-2,1,4);
2: PInt(ke,GInt(ke,1,8)+sz-2,1,8);
3: PInt(ke,GInt(ke,9,8)+sz-2,9,8);
4: PInt(ke,GInt(ke,9,8)+sz-2,9,8);
end;
end;
procedure _EncGS(var bf : string;var ke : string; tk : integer); // êîäèðóåì ïàêåò GS, ýòî îáû÷íàÿ ô-öèÿ
var i,j,b,i1,sz,sk : integer;
begin
// ñòàíäàðòíûé àëãîðèòì XOR êîäèðîâàíèÿ GS la2
sz := length(bf);
sk := length(ke);
if sk = 0 then exit;
i1 := 0; j := 1;
for i := 3 to sz do begin
bf[i] := chr(ord(bf[i]) xor ord(ke[j]) xor i1);
i1 := ord(bf[i]);
Inc(j,1);
if j > sk then j := 1;
end;
case tk of
1: PInt(ke,GInt(ke,1,4)+sz-2,1,4);
2: PInt(ke,GInt(ke,1,8)+sz-2,1,8);
3: PInt(ke,GInt(ke,9,8)+sz-2,9,8);
4: PInt(ke,GInt(ke,9,8)+sz-2,9,8);
end;
end;
procedure _pseudo_srand(seed : integer);
begin
_seed := seed;
end;
function _pseudo_rand: integer;
var
a : integer;
begin
a := (Int64(_seed) * $343fd + $269EC3) and $FFFFFFFF;
_seed := a;
result := (_seed shr $10) and $7FFF;
// writelogln(format('rand = %x; seed = %x',[result, _seed]));
end;
procedure _init_tables(seed: integer);
var
i : integer;
x : byte;
rand_pos : integer;
cur_pos : integer;
begin
_1_byte_table := '';
_2_byte_table := '';
for i := 0 to $D0 do begin
_1_byte_table := _1_byte_table + chr(i);
end;
for i := 0 to $4D do begin
_2_byte_table := _2_byte_table + chr(i) + #$0;
end;
_pseudo_srand(seed);
for i := 2 to $D1 do begin
rand_pos := (_pseudo_rand mod i) + 1;
x := GInt(_1_byte_table, rand_pos, 1);
PInt(_1_byte_table, GInt(_1_byte_table, i, 1), rand_pos, 1);
PInt(_1_byte_table, x, i, 1);
end;
cur_pos := 3;
for i := 2 to $4E do begin
rand_pos := _pseudo_rand mod i;
x := GInt(_2_byte_table, rand_pos * 2 + 1 , 2);
PInt(_2_byte_table, GInt(_2_byte_table, cur_pos, 2), rand_pos * 2 + 1, 2);
PInt(_2_byte_table, x, cur_pos, 2);
cur_pos := cur_pos + 2;
end;
cur_pos := Pos(#$12, _1_byte_table);
x := GInt(_1_byte_table, $13, 1);
PInt(_1_byte_table, $12, $13, 1);
PInt(_1_byte_table, x, cur_pos, 1);
cur_pos := Pos(#$B1, _1_byte_table);
x := GInt(_1_byte_table, $B2, 1);
PInt(_1_byte_table, $B1, $B2, 1);
PInt(_1_byte_table, x, cur_pos, 1);
end;
procedure _decode_ID(var buff:string);
var
p: integer;
begin
// writelogln(format('changing %x -> %x',[GInt(buff, 3, 1),GInt(_1_byte_table, GInt(buff, 3, 1)+1, 1) ]));
PInt(buff, GInt(_1_byte_table, GInt(buff, 3, 1) + 1, 1) , 3, 1);
if GInt(buff, 3, 1) = $D0 then begin
PInt(buff, GInt(_2_byte_table, GInt(buff, 4, 1) * 2 + 1, 1) , 4, 1);
end;
end;
procedure _encode_ID(var buff:string);
var
p: integer;
begin
if GInt(buff, 3, 1) = $D0 then begin
p:= pos(Chr(GInt(buff, 4, 1)), _2_byte_table);
PInt(buff, ((p + 1) shr 1) - 1, 4, 1);
end;
p := pos(Chr(GInt(buff, 3, 1)), _1_byte_table);
// writelogln(format('changing %x -> %x',[GInt(buff, 3, 1), p-1]));
PInt(buff, p-1, 3, 1);
end;
Procedure Trafic_Detector;
var _s : string;
begin
// Îïðåäåëèì òèï òðàôèêà è òèï ñåðâåðà.
// Âíèìàíèå! ïðè íåîáõîäèìîñòè, îïðåäåëåíèå òðàôèêà ìîæíî äîïîëíèòü íîâûìè âàðèàíòàìè =)
//
le := length(_dBuff); // _dBuff - âõîäíîé ïàêåò (òàê êàê ýòà ô-öèÿ âûçâàíà èç OnDeCode)
//
// Îïðåäåëèì òèï òðàôèêà (â ýòîì ïðèìåðå íàñ èíòåðåñóåò òîëüêî LA2)
//
if (gSys.TrafType = 0) and (_gAbsNumPkt = 1) then begin
case le of
$0B,$9B,$AB,$BA: begin
gSys.TrafType := 2; // LA2
gSys.isLS := 1; // LS
if le = $0B then gSys.tKeyType := 1 else gSys.tKeyType := 2; // ýòî äëÿ LS, ïîêà íå ïîòðåáóåòñÿ
end;
$107: begin
gSys.TrafType := 2; // LA2
gSys.isGS := 1; // GS
end;
$07: begin
gSys.TrafType := 2; // LA2
gSys.isGS := 2; // GS
end;
else if le >= $107 then begin // áîëåå íàäåæíûé ñïîñîá îïðåäåëèòü LA2 GS
if pos(HStr('05 52 05 54 07 51 51 55 07 02 53 53 00 52 05 52'),_dBuff) <> 0 then begin
// åñëè íàéäåíà ñòðî÷êà '.R.T.QQU..SS.R.R' (äðåâíèé ðèì åïòü =) òîãäà ýòî ãåéì ñåðâåð ëà2.
gSys.TrafType := 2; // LA2
gSys.isGS := 2; // GS
end;
if StrCmp(copy(_dBuff, 3, 5), HStr('0E 3C 03 00 00')) then begin
writelogln('CT1 traffic detected');
gSys.TrafType := 2; // LA2
gSys.isGS := 3; // GS CT1
end;
end;
end;
//
if gSys.TrafType = 2 then gSys.SetIDposlen(3,1); // ID â ïàêåòàõ LA2 íàõîäèòñÿ â òðåòüåì áàéòå, ðàçìåð 1 áàéò.
if gSys.isGS > 0 then gSys.Protocol := gInt(_dBuff,4,4); // áåðåì íîìåð ïðîòîêîëà GS
// ïðîäóáëèì ïðîòîêîëû CT1
if gSys.Protocol >= 828 then gSys.isGS := 3; // GS CT1
// GS CT1+ ïîêà òàêîé æå
end;
//
// îïðåäåëèì êëþ÷ GS:
//
if (_gAbsNumPkt = 2) then
if (gSys.TrafType = 2) and (gSys.isGS > 0) and _dFromServ then begin
if (le = 12) then gSys.tKeyType := 1; // 12 áàéòíûé ïàêåò - òèï 1. GSDecodeJ (90% l2j)
if (le = 16) then gSys.tKeyType := 2; // 16 áàéòíûé ïàêåò - òèï 2. GSDecode (sub-off servers)
if (le = $1A) then gSys.tKeyType := 3; // ÷àñòü ôðè ñåðâåðîâ Interlude
if (le = $1C) then gSys.tKeyType := 3; // ÷àñòü ôðè ñåðâåðîâ Interlude
if (le = $15) then gSys.tKeyType := 3; // îôèöèàëüíûå ñåðâåðà Interlude (íà äàííûé ìîìåíò)
if (le = $19) then gSys.tKeyType := 4; // îôèöèàëüíûå ñåðâåðà CT1+
if gSys.tKeyType > 0 then begin
s := copy(_dBuff,5,16);
if gSys.tKeyType < 3 then s := copy(s,1,4)+Hstr('A1 6C 54 87'); // C4/C5/ïñåâäî èíòåðëþä.
if gSys.tKeyType = 3 then s := copy(s,1,8)+Hstr('C8 27 93 01 A1 6C 31 97'); // èíòåðëþä.
if gSys.tKeyType = 4 then begin
s := copy(s,1,8)+Hstr('C8 27 93 01 A1 6C 31 97');
_id_mix := true;
// ScriptTimeOut(30000);
_init_tables(GInt(_dBuff, $16, 4));
writelogln('kamael+ trafic detected');
// writelog('one byte table');
// writelogHexB(_1_byte_table);
// writelog('two byte table');
// writelogHexB(_2_byte_table);
// gSys.sleep(10000);
// ScriptTimeOut(1000);
end;
Kci := s; Kco := s; Ksi := s; Kso := s;
scode := true; // çàïóñòèì äå/êîäèðîâàíèå GS
writelogln('key:');writeloghexb(s);
end else writelogln('íåîïîçíàííûé êëþ÷åâîé ïàêåò GS LA2 ïðîòîêîëà')
end;
//
end;
Procedure OnDeCode; // ôóíêöèÿ-ñîáûòèå íà äåêîäèðîâàíèå ïàêåòà.
// ýòà ô-öèÿ âûçûâàåòñÿ ïðè ïîëó÷åíèè ïàêåòà, ÄÎ àâòîìàòè÷åñêîãî äåêîäèðîâàíèÿ (åñëè âêëþ÷åíî) è ÄÎ çàïèñåé â àâòîëîããåð îñíîâíûõ ïàêåòîâ
// ô-öèÿ íå îáÿçàòåëüíà è ìîæåò îòñóòñòâîâàòü â ñêðèïòàõ ...
// âõîäíîé áóôåð '_dBuff', âûõîäíîé '_dOutBuff', ôëàã íàïðàâëåíèÿ '_dFromServ' (íå ïåðåïóòàéòå)
begin
//writelogln('OnDeCode ..');
// _dBuff - âõîäíîé ïàêåò äëÿ äåêîäèðîâàíèÿ
if _gAbsNumPkt < 6 then Trafic_Detector; // îïðåäåëèì òðàôèê è òèï ñåðâåðà (â ïðåäåëàõ 5 ïåðâûõ ïàêåòîâ, äëÿ LA2 ýòîãî õâàòèò)
//
if scode and (_gAbsNumPkt > 2) then begin
// äåêîäèðóåì ïàêåò, ðó÷íàÿ ðåàëèçàöèÿ ñòàíäàðòíîãî àëãîðèòìà.
if _dFromServ then
_DecGS(_dBuff,Ksi,gSys.tKeyType)
else begin
_DecGS(_dBuff,Kci,gSys.tKeyType);
writelogHexB(_dBuff);
if _id_mix then _decode_id(_dBuff);
end;
_dOutBuff := _dBuff;
end;
end;
Procedure OnEnCode; // ôóíêöèÿ-ñîáûòèå íà êîäèðîâàíèå ïàêåòà.
// ýòà ô-öèÿ âûçûâàåòñÿ ïåðåä îòñûëêîé ïàêåòà, ïîñëå çàïèñè â àâòîëîããåð îñíîâíûõ ïàêåòîâ è ïîñëå àâòîìàòè÷åñêîãî êîäèðîâàíèÿ (åñëè âêëþ÷åíî)
// òàê æå ô-öèÿ âûçûâàåòñÿ àâòîìàòè÷åñêè ïðè èñïîëüçîâàíèè gSys.EnSendC è gSys.EnSendS
// !! Âíèìàíèå !!
// â OnEnCode çàïðåùåíî èñïîëüçîâàòü ô-öèè gSys.EnSendC è gSys.EnSendS âî èçáåæàíèå çàìêíóòîé ðåêóðñèè
// ô-öèÿ íå îáÿçàòåëüíà è ìîæåò îòñóòñòâîâàòü â ñêðèïòàõ ...
// âõîäíîé áóôåð '_dBuff', âûõîäíîé '_dOutBuff', ôëàã íàïðàâëåíèÿ '_dFromServ' (íå ïåðåïóòàéòå)
begin
//writelogln('OnEnCode ..');
if scode and (_gAbsNumPkt > 2) then begin
// êîäèðóåì ïàêåò, ðó÷íàÿ ðåàëèçàöèÿ ñòàíäàðòíîãî àëãîðèòìà
if _dFromServ then
_EncGS(_dBuff,Kco,gSys.tKeyType)
else begin
if _id_mix then _encode_id(_dBuff);
_EncGS(_dBuff,Kso,gSys.tKeyType);
end;
_dOutBuff := _dBuff;
//if _dFromServ then gSys.EnSendC(_dBuff) else gSys.EnSendS(_dBuff);
//gBlockPacket;
end;
end;
procedure SendMsg(msg : string); // ô-öèÿ äëÿ âûâîäà ëþáîãî ñîîáùåíèÿ â ÷àò êëèåíòà (äðóãèì íå âèäíî)
begin
if (gSys.isGS > 0) and (gSys.TrafType = 2) then // ïðîâåðêà íà òðàôèê LA2 GS
gSys.EnSendC(FormatPck('%cddss',[#$4A,0,10,#0,msg+#0]));
end;
BEGIN
// Òåëî ñêðèïòà
// âûçûâàåòñÿ ïðè ïîëó÷åíèè ïàêåòà ïðîøåäøåãî âñå äåêîäèðîâîêè è àâòîäåêîäèðîâêè
// êàê îáû÷íî, çäåñü ïàêåò ïðèõîäèò â _gBuff è åñëè åãî íàäî èçìåíèòü, òî ïèøåì â _gOutBuff
// ...
if length(_gBuff) < 3 then exit;
ID := gInt(_gBuff,3,1);
//if (ID = $FE) or (ID = $D0) then ID := gInt(_gBuff,3,2);
//
// â êà÷åñòâå ïðèìåðà
if ID = $15 then begin // âîçüìåì èìÿ âûáðàííîãî ïåðñîíàæà
//GetAnsiStr(copy(_gBuff,4,
ScanPck5(_gBuff,4,'s',CharName, null, null, null, null);
CharName := trim(CharName);
Writelogln('Âûáðàííûé ïåðñ: '+CharName);
end;
//
// CT1+ table reset on char selected
if ID = $0B then begin
ScanPck5(_gBuff, 4, 's-99-99-04d' ,CharName, temp_seed, null, null, null);
writelogln(format('reseting id tables on CharSelected; Seed = %x',[temp_seed]));
_init_tables(temp_seed);
end;
// ... äàëåå ïàêåò ëîãèðóåòñÿ è óõîäèò íà àâòîêîäèðîâêó çàòåì íà êîäèðîâêó (OnEnCode) è îòïðàâëÿåòñÿ.
END.

24
docs/exp_percent.txt Normal file
View File

@ -0,0 +1,24 @@
exp_table: array[0..85] of integer =
(
0, // level 0
1, 69, 364, 1169, 2885, 6039, 11288, 19424, 31379, 48230, //level 10
71203, 101678, 141194, 191455, 254331, 331868, 426289, 540001, 675597, 835863, //level 20
1023785, 1242547, 1495544, 1786380, 2118877, 2497078, 2925251, 3407898, 3949755, 4555797, //level 30
5231247, 5981577, 6812514, 7730045, 8740423, 9850167, 11066073, 12395216, 13844952, 15422930, //level 40
17137088, 18995666, 21007204, 23180551, 25524869, 28049636, 30764655, 33680053, 36806290, 40154163, //level 50
45525134, 51262491, 57383989, 63907912, 70853090, 80700832, 91162655, 102265882, 114038596, 126509653, //level 60
146308200, 167244337, 189364894, 212717908, 237352644, 271975263, 308443198, 346827154, 387199547, 429634523, //level 70
474207979, 532694979, 606322775, 696381369, 800225364, 900275364, 1000571463, 1100482881, 1200687304, 1300321654, //level 80
1400123456, 1550789123, 1680156789, 1850164821, 2099305232 //level 85
);
function PercentExp(lvl, Exp:integer):double;
var
Result:double;
begin
Result:=0;
if((lvl>=1)AND(lvl<=85))then Result:= (Exp-exp_table[lvl])/(exp_table[lvl+1]-exp_table[lvl])*100;
if(Result<0)then Result:=0;
PercentExp:=Result;
end;

78
docs/experience.txt Normal file
View File

@ -0,0 +1,78 @@
2 67
3 362
4 1,167
5 2,883
6 6,037
7 11,286
8 19,422
9 31,377
10 48,228
11 71,201
12 101,676
13 141,192
14 191,453
15 254,329
16 331,866
17 426,287
18 539,999
19 675,595
20 835,861
21 1,023,783
22 1,242,545
23 1,301,364
24 1,447,733
25 2,118,875
26 2,497,076
27 2,925,249
28 3,407,896
29 3,949,754
30 4,555,795
31 5,231,244
32 5,981,575
33 6,812,513
34 7,730,043
35 8,740,421
36 9,850,165
37 11,066,071
38 12,395,215
39 13,844,951
40 15,422,928
41 17,137,086
42 18,995,665
43 21,007,200
44 23,180,550
45 25,524,869
46 28,049,631
47 30,764,650
48 33,680,051
49 36,806,285
50 40,154,161
51 45,525,133
52 51,262,487
53 57,383,992
54 63,907,914
55 70,853,088
56 80,700,825
57 91,162,660
58 102,265,882
59 114,038,590
60 126,509,653
61 146,308,201
62 167,244,335
63 189,364,888
64 212,717,913
65 237,352,657
66 271,975,264
67 308,443,191
68 346,827,140
69 387,199,535
70 429,634,523
71 474,207,980
72 532,694,971
73 606,322,751
74 696,381,374
75 804,225,311
76 931,275,813
77 1,151,275,702
78 1,511,275,832
79 2,099,275,897

38
docs/exploring_c_prng.cpp Normal file
View File

@ -0,0 +1,38 @@
void __cdecl srand( unsigned int seed )
{
_getptd()->_holdrand = (unsigned long)seed;
}
int __cdecl rand( void )
{
_ptiddata ptd = _getptd();
return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff );
}
public rand
rand proc near
call sub_77C29F25 // _getptd()?
mov ecx, [eax+14h] // offset of _holdrand?
imul ecx, 343FDh // 214013
add ecx, 269EC3h // 2531011
mov [eax+14h], ecx
mov eax, ecx
shr eax, 10h // >> 16
and eax, 7FFFh
retn
rand endp
public srand
srand proc near
arg_0= dword ptr 8
mov edi, edi // 3 lines - BP-based frame
push ebp
mov ebp, esp
call sub_77C29F25 // _getptd()?
mov ecx, [ebp+arg_0] // ecx = seed (argument 0)
mov [eax+14h], ecx // _getptd()->_holdrand = seed
pop ebp
retn
srand endp

View File

@ -0,0 +1,22 @@
Server: 85 AbnormalStatusUpdate: len 25
19 00
85
02 00 // nEffects = 2
3E 14 00 00 // skillID 5182 \
01 00 // level 1 > 1
BF 1E 00 00 // duration 7871 /
E2 10 00 00 // skillID \
01 00 // level 1 > 2
42 0F 00 00 // duration 3906 /
19 00
85
02 00
3E 14 00 00 // skill
01 00
C5 1E 00 00 // 7877
E2 10 00 00
01 00
47 0F 00 00 // 3911
duration in seconds...?

View File

@ -0,0 +1,18 @@
14 00 // len - 20
1F // ptype - Action
39 A4 00 10 // objectID 268477497 of a target
9A CB 00 00 // originX 52122
3D 2B FF FF // originY -544657
A9 F3 FF FF // originZ -3159
00 // use shift? 00 - false, 01 - true
client sends its own coordinates
(52136,-54431,-3184)
[PACKET] Client: 1F Action [268477497]
[PACKET] Server: 23 TargetSelected [268636209] -> [268477497]
my_obj_ID -> targ_obj_ID
[PACKET] Server: B9 MyTargetSelected [268477497]
targ_obj_ID

View File

@ -0,0 +1,3 @@
Client Len 3 [Appearing]
03 00
3A // pcode Appearing

View File

@ -0,0 +1,11 @@
Server: 39 AskJoinParty: len 23
17 00
39
41 00 6C 00 65 00 78 00 78 00 69 00 61 00 00 00 // inviter A l e x x i a
04 00 00 00 // loot type
// 0 - Finders Keepers
// 1 - Random
// 2 - Random including spoil
// 3 - by turn
// 4 - by turn including spoil

View File

@ -0,0 +1,38 @@
Server: Len 39 [Attack]
27 00
33
6C 08 00 10 // attacker
B2 16 00 10 // target
A6 00 00 00 // damage
00 // flags
9A AC 00 00 // x
F9 A4 00 00 // y coords of attacker
5D F2 FF FF // z
00 00 // count-1
B2 16 00 10 // attacker (same)
A6 00 00 00 // damage (same)
00 // flags (same)
Flags:
if (soulshot) _flags |= 0x10 | _grade;
if (crit) _flags |= 0x20;
if (shld > 0) _flags |= 0x40;
if (miss) _flags |= 0x80;
writeC(0x33);
writeD(_attackerObjId);
writeD(_hits[0]._targetId);
writeD(_hits[0]._damage);
writeC(_hits[0]._flags);
writeD(_x);
writeD(_y);
writeD(_z);
writeH(_hits.length-1);
for (Hit temp: _hits)
{
writeD(temp._targetId);
writeD(temp._damage);
writeC(temp._flags);
}

View File

@ -0,0 +1,9 @@
21 00 // 33 b
2B // on L2J if obfuscator (last 4 bytes) in KeyPacket are 00 00 00 00
// pcode may vary on retail!
6C 00 65 00 78 00 78 00 00 00 // account login (Unicode string)
BC C4 1C 61 // sessionKey2 part2
6A 92 28 32 // sessionKey2 part1
62 05 8C 1A // sessionKey1 part1
A7 0D 32 D9 // sessionKey1 part2
01 00 00 00 // hz

View File

@ -0,0 +1,76 @@
Server: Len 2765 [BuyList] |
CD 0A
07
C7 55 35 00 // money 3495367
90 00 00 00 // list ID 144
2B 00 // items count 43
04 00 // item type 1 0-weapon/ring/earring/necklace 1-armor/shield 4-item/questitem/adena
00 00 00 00 // objectID
2B 07 00 00 // itemID 1835 Soulshot no grade
00 00 00 00 // current count
05 00 // item type2 0-weapon 1-shield/armor 2-ring/earring/necklace 3-questitem 4-adena 5-item
00 00 // ??
00 00 00 00 // bodypart (for armor)
00 00 // enchant level
00 00 00 00 // ??
07 00 00 00 // price (=7)
FE FF FF FF // atk attribute type (-2) \\
00 00 00 00 // atk attribute value \\
00 00 00 00 // fire def \\
00 00 00 00 // water def || element attributes
00 00 00 00 // wind def ||
00 00 00 00 // earth def //
00 00 00 00 // holy def //
00 00 00 00 // unholy def //
protected final void writeImpl()
{
writeC(0x07);
writeD(_money); // current money
writeD(_listId);
writeH(_list.size());
for (L2TradeItem item : _list)
{
if (item.getCurrentCount() > 0 || !item.hasLimitedStock())
{
writeH(item.getTemplate().getType1()); // item type1
writeD(0x00); //objectId
writeD(item.getItemId());
writeD(item.getCurrentCount() <0 ? 0 : item.getCurrentCount());
writeH(item.getTemplate().getType2()); // item type2
writeH(0x00); // ?
if (item.getTemplate().getType1() != L2Item.TYPE1_ITEM_QUESTITEM_ADENA)
{
writeD(item.getTemplate().getBodyPart());
writeH(0x00); // item enchant level
writeH(0x00); // ?
writeH(0x00);
}
else
{
writeD(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
}
if (item.getItemId() >= 3960 && item.getItemId() <= 4026)//Config.RATE_SIEGE_GUARDS_PRICE-//'
writeD((int)(item.getPrice() * Config.RATE_SIEGE_GUARDS_PRICE * (1 + _taxRate)));
else
writeD((int)(item.getPrice() * (1 + _taxRate)));
// T1
for (byte i = 0; i < 8; i++)
{
writeD(0x00);
}
}
}
}

View File

@ -0,0 +1,11 @@
Server: Len 15 [ChangeMoveType]
0F 00
28
B2 16 00 10 // object id
00 00 00 00 // 0 - walk, 1 - run
00 00 00 00 // ??
writeC(0x28);
writeD(_charObjId);
writeD(_running ? RUN : WALK);
writeD(0); //c2

View File

@ -0,0 +1,46 @@
Server: Len 284
1C 01
0B // CharSelected
4E 00 69 00 72 00 61 00 65 00 6C 00 00 00 // char name
7A 0B 03 00 // char id?
00 00 // title
FA B6 BA AF // session id
00 00 00 00 // clan id
00 00 00 00 // always 0
01 00 00 00 // sex
01 00 00 00 // race
17 00 00 00 // class id
01 00 00 00 // 1 - active?
F4 40 02 00 // x
7F 31 FF FF // y
3A F5 FF FF // z
00 00 00 00 00 0A A8 40 // cur Hp
58 A8 35 CD 3B EC 99 40 // cur mp
FF CA 53 00 // sp
5A B6 E2 31 00 00 00 00 // exp
4B 00 00 00 // level
00 00 00 00 // karma
00 00 00 00 // const 0x00
17 00 00 00 // int
28 00 00 00 // str
1E 00 00 00 // con
1A 00 00 00 // men
24 00 00 00 // dex
0E 00 00 00 // wit
00 00 00 00 00 00 00 00 // const
00 00 00 00 // class id...? O_o
00 00 00 00 // 00 1
00 00 00 00 // 00
00 00 00 00 // 00
00 00 00 00 // 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 E1 1A 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00
wtf dunno end of packet

View File

@ -0,0 +1,75 @@
S->C Len 317
3D 01 // length (example 317)
09 // packet code
01 00 00 00 // number of chars
07 00 00 00 // max chars on server?
00 // always 0x00
// repeated block unknown length, because of var-length strings
// minimum length must be 281 bytes (not sure)
46 00 6C 00 61 00 6D 00 65 00 64 00 53 00 6F 00 75 00 6C 00 00 00 // char name (Unicode)
37 0B 0E 00 // char ID
6C 00 65 00 78 00 78 00 68 00 75 00 6C 00 65 00 00 00 // login name
0D FE 0F 00 // sessionID (playOkId1)
4E 2A 00 00 // clanID
00 00 00 00 // L2J says it's always 00 00 00 00; as I saw, on retail also
01 00 00 00 // sex
00 00 00 00 // race
0A 00 00 00 // character base class ID
01 00 00 00 // active? (c) L2J // useless >_<
9F B1 FF FF \
32 E4 01 00 | (( x ,y ,z )) ?
00 F3 FF FF /
B8 1E 85 EB 51 F8 79 40 // HP cur
C2 F5 28 5C 8F 92 78 40 // MP cur
85 51 00 00 // SP
0C BA 0D 00 00 00 00 00 // Exp
14 00 00 00 // Level
00 00 00 00 // karma
00 00 00 00 // PK kills
00 00 00 00 // PVP kills
00 00 00 00 \
00 00 00 00 \
00 00 00 00 | some 7 zero dwords
00 00 00 00 |
00 00 00 00 /
00 00 00 00 /
00 00 00 00 /
00 00 00 00 // itemID hair all
4E 03 00 00 // itemID r ear
4E 03 00 00 // itemID l ear
8D 03 00 00 // necklace
6E 03 00 00 // r finger
6E 03 00 00 // l finger
2C 00 00 00 // head
37 01 00 00 // r hand
71 02 00 00 // l hand
33 00 00 00 // gloves
4D 04 00 00 // chest
50 04 00 00 // legs
27 00 00 00 // feet
00 00 00 00 // back
00 00 00 00 // LR hand
00 00 00 00 // hair
00 00 00 00 // hair 2
00 00 00 00 // R bracelet
00 00 00 00 // L bracelet
00 00 00 00 \
00 00 00 00 \
00 00 00 00 | some 6 null dwords
00 00 00 00 |
00 00 00 00 /
00 00 00 00 /
02 00 00 00 // hair style
03 00 00 00 // hair color
00 00 00 00 // face
B8 1E 85 EB 51 F8 79 40 // HP max
C2 F5 28 5C 8F 92 78 40 // MP max
00 00 00 00 // deleteDays; if != 0 then char is inactive
0A 00 00 00 // classID
01 00 00 00 // 0x00000001 if last used char, 0x00000000 otherwise
00 // enchantEffect (<=127)
00 00 // Augmentation ID
00 00 // something also for augment
00 00 00 00 // transformation ID
// (but on retail you cannot see transform on char select screen)

View File

@ -0,0 +1,16 @@
Client: Len 63 [CharacterCreate]
3F 00
0C // opcode
41 00 65 00 72 00 69 00 6E 00 00 00 // name
01 00 00 00 // race
01 00 00 00 // sex
19 00 00 00 // class id
1C 00 00 00 // INT
27 00 00 00 // STR
1E 00 00 00 // CON
1B 00 00 00 // MEN
23 00 00 00 // DEX
0B 00 00 00 // WIT
00 00 00 00 // hair style
00 00 00 00 // hair color
00 00 00 00 // face

View File

@ -0,0 +1,8 @@
Client: Len 21
15 00
12
00 00 00 00 // charslot
00 00 00 00 // rest are constant
00 00 00 00
00 00 00 00
00 00

View File

@ -0,0 +1,72 @@
Server: Len 313 [CharacterSelectionInfo]
39 01
09
01 00 00 00 // num chars
07 00 00 00 // server max chars
00 // 00
41 00 6C 00 65 00 78 00 78 00 69 00 61 00 00 00 // name
7A 0B 03 00 // oid
6D 00 69 00 6E 00 6C 00 65 00 78 00 78 00 00 00 // acc
46 8D 2A 54 /// play ok 1
00 00 00 00 /// clan id
00 00 00 00 // 0x00
01 00 00 00 // sex
00 00 00 00 // race
10 00 00 00 // base cls
01 00 00 00 // 0x01 - active
E8 AA 00 00 \
58 42 FF FF > x,y,z
E8 FC FF FF /
00 00 00 00 00 06 A6 40 // hp cur
00 00 00 00 00 98 AC 40 // mp cur
39 B9 56 00 // sp
A6 8E F5 0B 00 00 00 00 // exp
3F 00 00 00 // level 63
00 00 00 00 // karma
00 00 00 00 // pk
02 00 00 00 // pvp
00 00 00 00 \
00 00 00 00
00 00 00 00
00 00 00 00 > 7 zero dwords
00 00 00 00
00 00 00 00
00 00 00 00 /
70 25 00 00 \ HAIRALL
39 30 00 00 REAR
32 30 00 00 LEAR
30 30 00 00 NECK
31 30 00 00 RFINGER
31 30 00 00 LFINGER
00 02 00 00 HEAD
C2 2E 00 00 RHAND
00 00 00 00 LHAND
87 16 00 00 GLOVES
67 09 00 00 CHEST
00 00 00 00 LEGS
93 16 00 00 FEET
00 00 00 00 BACK
00 00 00 00 LRHAND
F4 22 00 00 HAIR
00 00 00 00 HAIR2
75 25 00 00 RBRACELET
00 00 00 00 LBRACELET
00 00 00 00 DECO1
00 00 00 00 2
00 00 00 00 3
00 00 00 00 4
00 00 00 00 5
00 00 00 00 6
00 00 00 00 BELT
02 00 00 00 hStyle
03 00 00 00 hColor
00 00 00 00 face
00 00 00 00 00 06 A6 40 HP max
00 00 00 00 00 98 AC 40 MP max
00 00 00 00 del secs
10 00 00 00 classId
01 00 00 00 1 - last used char
00 enchantEffect
00 00 00 00 aug Id
00 00 00 00 transform id

View File

@ -0,0 +1,71 @@
Server: 4A CreatureSay: len 255
FF 00
4A
00 00 00 00 0A 00 00 00 00 00 1D 04 30 04 47 04 J 0 G
30 04 3B 04 41 04 4F 04 20 00 4D 04 32 04 35 04 0 A O M 2 5
3D 04 42 04 20 00 27 00 43 00 6F 00 66 00 66 00 B C o f f
65 00 72 00 20 00 6F 00 66 00 20 00 53 00 68 00 e r o f S h
61 00 64 00 6F 00 77 00 73 00 27 00 2E 00 20 00 a d o w s
1F 04 3E 04 34 04 40 04 3E 04 31 04 3D 04 3E 04 4 1
41 04 42 04 38 04 20 00 3C 04 3E 04 36 04 3D 04 A B 8 6
3E 04 20 00 43 04 37 04 3D 04 30 04 42 04 4C 04 C 7 0 B L
20 00 43 04 20 00 4F 00 6D 00 65 00 67 00 61 00 C O m e g a
27 00 73 00 20 00 43 00 61 00 74 00 2C 00 20 00 s C a t
3A 04 3E 04 42 04 3E 04 40 04 3E 04 33 04 3E 04 B 3
20 00 12 04 4B 04 20 00 41 04 3C 04 3E 04 36 04 K A 6
35 04 42 04 35 04 20 00 3D 04 30 04 39 04 42 04 5 B 5 0 9 B
38 04 20 00 32 04 20 00 31 04 3B 04 38 04 36 04 8 2 1 8 6
30 04 39 04 48 04 35 04 3C 04 20 00 33 04 3E 04 0 9 H 5 3
40 04 3E 04 34 04 35 04 2E 00 00 00
FF 00 // len 255
4A
00 00 00 00 // objectID
0A 00 00 00 // text Type
00 00 // char name - empty here
1D 04 30 04 47 04
30 04 3B 04 41 04 4F 04 20 00 4D 04 32 04 35 04 0 A O M 2 5
3D 04 42 04 20 00 27 00 43 00 6F 00 66 00 66 00 B C o f f
65 00 72 00 20 00 6F 00 66 00 20 00 53 00 68 00 e r o f S h
61 00 64 00 6F 00 77 00 73 00 27 00 2E 00 20 00 a d o w s
1F 04 3E 04 34 04 40 04 3E 04 31 04 3D 04 3E 04 4 1
41 04 42 04 38 04 20 00 3C 04 3E 04 36 04 3D 04 A B 8 6
3E 04 20 00 43 04 37 04 3D 04 30 04 42 04 4C 04 C 7 0 B L
20 00 43 04 20 00 4F 00 6D 00 65 00 67 00 61 00 C O m e g a
27 00 73 00 20 00 43 00 61 00 74 00 2C 00 20 00 s C a t
3A 04 3E 04 42 04 3E 04 40 04 3E 04 33 04 3E 04 B 3
20 00 12 04 4B 04 20 00 41 04 3C 04 3E 04 36 04 K A 6
35 04 42 04 35 04 20 00 3D 04 30 04 39 04 42 04 5 B 5 0 9 B
38 04 20 00 32 04 20 00 31 04 3B 04 38 04 36 04 8 2 1 8 6
30 04 39 04 48 04 35 04 3C 04 20 00 33 04 3E 04 0 9 H 5 3
40 04 3E 04 34 04 35 04 2E 00 00 00
[++] Server: 4A CreatureSay: len 93
5D 00
4A
00 00 00 00 0A 00 00 00 54 00 58 00 77 00 6B 00 J T X w k
61 00 00 00 14 04 3E 04 31 04 40 04 3E 04 20 00 a 1
3F 04 3E 04 36 04 30 04 3B 04 3E 04 32 04 30 04 6 0 2 0
42 04 4C 04 20 00 3D 04 30 04 20 00 41 04 35 04 B L 0 A 5
40 04 32 04 35 04 40 04 20 00 4E 00 4C 00 20 00 2 5 N L
78 00 31 00 30 00 2E 00 00 00
[++] Server: 4A CreatureSay: len 81
51 00
4A
00 00 00 00 0A 00 00 00 00 00 1D 04 30 04 47 04 J 0 G
30 04 3B 04 41 04 4F 04 20 00 4D 04 32 04 35 04 0 A O M 2 5
3D 04 42 04 20 00 27 00 54 00 68 00 65 00 20 00 B T h e
46 00 61 00 6C 00 6C 00 20 00 48 00 61 00 72 00 F a l l H a r
76 00 65 00 73 00 74 00 27 00 2E 00 00 00
[++] Server: 4A CreatureSay: len 99
63 00
4A
00 00 00 00 0A 00 00 00 00 00 1D 04 30 04 47 04 J 0 G
30 04 3B 04 41 04 4F 04 20 00 4D 04 32 04 35 04 0 A O M 2 5
3D 04 42 04 20 00 27 00 4C 00 32 00 20 00 4D 00 B L 2 M
65 00 64 00 61 00 6C 00 20 00 43 00 6F 00 6C 00 e d a l C o l
6C 00 65 00 63 00 74 00 69 00 6F 00 6E 00 20 00 l e c t i o n
45 00 76 00 65 00 6E 00 74 00 27 00 2E 00 00 00 E v e n t

13
docs/gamepackets/Die.txt Normal file
View File

@ -0,0 +1,13 @@
Server: Len 35 [Die]
23 00
00
3F 8E 05 10 // objectID?
01 00 00 00 // 1 - can resurrect to nearest village
00 00 00 00 // 1 - can res to CH
01 00 00 00 // 1 - can res to castle
00 00 00 00 // 1 - can res to siege HQ
also possible that next will follow:
00 00 00 00 // sweepable (blue glow)
00 00 00 00 // allow fixed res
00 00 00 00 // to fortress

View File

@ -0,0 +1,78 @@
Java server ignores all EnterWorld content, parsing unknown :(
Client: Len 107
6B 00
11
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
C9 BC F2 A7
66 5A 0B 98
36 A5 BD 89
ED 7F E4 D7
6B 49 E2 9F
EF 76 EB CE
A3 FA F4 BF
0C 64 A3 B4
A4 CE DC C6
08 3E 6E EA
45 CA D3 FE
88 13 87 B8
06 2C 96 F0
9B 1E 8E BC
C6 9B 98 C8
63 16 CF D0
29 00 00 00
0A E1 74 17
0A 08 00 08
5C 32 BD E1
5C 32 BE 01
5C 32 BE 22
same char as above:
Client: Len 107
6B 00
11
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
C9 BC F2 A7
66 5A 0B 98
36 A5 BD 89
ED 7F E4 D7
6B 49 E2 9F
EF 76 EB CE
A3 FA F4 BF
0C 64 A3 B4
A4 CE DC C6
08 3E 6E EA
45 CA D3 FE
88 13 87 B8
06 2C 96 F0
9B 1E 8E BC
C6 9B 98 C8
63 16 CF D0
29 00 00 00
0A E1 74 17
0A 08 00 08
5C 32 BD E1
5C 32 BE 01
5C 32 BE 22
different acc, different char:
Client: Len 107
6B 00
11
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
C9 BC F2 A7 66 5A 0B 98 36 A5 BD 89 ED 7F E4 D7
6B 49 E2 9F EF 76 EB CE A3 FA F4 BF 0C 64 A3 B4
A4 CE DC C6 08 3E 6E EA 45 CA D3 FE 88 13 87 B8
06 2C 96 F0 9B 1E 8E BC C6 9B 98 C8 63 16 CF D0
29 00 00 00 0A E1 74 17 0A 08 00 08 5C 32 BD E1
5C 32 BE 22 5E 19 03 41
last 2 D's are different, depend on char and/or account

View File

@ -0,0 +1,11 @@
Server: F9 EtcStatusUpdate: len 35
23 00
F9
00 00 00 00 // 1-7 increase force, lvl
00 00 00 00 // 1-4 weight penalty, lvl (1=50%, 2=66.6%, 3=80%, 4=100%)
00 00 00 00 // 1 = block all chat
00 00 00 00 // 1 = danger area
00 00 00 00 // 1 = grade penalty
00 00 00 00 // 1 = charm of courage (allows resurrection on the same spot upon death on the siege battlefield)
00 00 00 00 // 1-15 death penalty, lvl (combat ability decreased due to death)
00 00 00 00 // _activeChar.getSouls()

View File

@ -0,0 +1,9 @@
Server: Len 19 [GameGuardQuery]
13 00
74
D9 3D 53 27 1D A5 72 2E 8B 03 17 20 A3 1E 5B C3
Client: Len 19 [GameGuardReply]
13 00
CB
7F 97 F0 78 04 3C E6 D6 71 0C F6 89 DD 9E 06 70

View File

@ -0,0 +1,10 @@
Server: Len 7
07 00
3A
00 00 00 00 // response
protected final void writeImpl()
{
writeC(0x3a);
writeD(_response);
}

View File

@ -0,0 +1,22 @@
===================================
L2J
19 00 // p.len 25
2E // pcode
01 // always const
42 55 77 8F C3 05 69 87 // xorkey first part
01 00 00 00 // always const
01 // possible Game Server ID // on L2J always 01
00 00 00 00 // always NULLs
00 00 00 00 // in L2J always NULLs - no obfuscation
==========================================
Retail NCSoft
19 00 // p.len 25
2E // pcode
01 // always const
42 55 77 8F C3 05 69 87 // xorkey first part
01 00 00 00 // always const
01 // possible Game Server ID - depends on game server ID
00 00 00 00 // always NULLs
XX XX XX XX // always different, non-nulls: opcode obfuscator

View File

@ -0,0 +1,8 @@
Client: Len 3
03 00
00
send when IN_GAME mode, to disconnect and close client
if restart possible server responds with 0x84 LeaveWorld from IN_GAME mode
from character selection screen, whe client sends this packet, server just disconencts... TODO: check...

View File

@ -0,0 +1,15 @@
Server: Len 49 [MagicSkillUse]
31 00
48
6C 08 00 10 // objectId
AC 16 00 10 // targetObjectId
79 05 00 00 // skillID 1401 - Major HEal
0A 00 00 00 // skillLevel level 10
57 07 00 00 // hitTime cast time 1879 ms
CF 08 00 00 // reuseDelay 2255 reuse delay
5B AD 00 00 // x
E5 A4 00 00 // y
5D F2 FF FF // z
00 00 00 00 // ??
00 00 00 00 // ??
00 00 // ??

View File

@ -0,0 +1,11 @@
Server: Len 27 [MoveToPawn]
1B 00
72 // MoveToPawn
6C 08 00 10 // _charObjId // 6C080010 objectID who is moving (can be user at least)
B2 16 00 10 // _targetId // B2160010 is target object id, to which he moves to
39 00 00 00 // _distance wtf is 57?..
C7 AC 00 00 // x
0A A6 00 00 // y dunno if it is user coordinates or mob coordinates
5D F2 FF FF // z
possible these are target's coordinates

View File

@ -0,0 +1,3 @@
Client: Len 3 [NewCharacter]
03 00 // packet length - 3 bytes
13 // opcode

View File

@ -0,0 +1,28 @@
Server: Len 967 [NewCharacterSuccess]
C7 03
0D // opcode
0C 00 00 00 // number of templates
// [ for each template ]
00 00 00 00 // race
00 00 00 00 // class id
46 00 00 00 // 0x46
28 00 00 00 // base STR
0A 00 00 00 // 0x0A
46 00 00 00 // 0x46
1E 00 00 00 // base DEX
0A 00 00 00
46 00 00 00
2B 00 00 00 // base CON
0A 00 00 00
46 00 00 00
15 00 00 00 // base INT
0A 00 00 00
46 00 00 00
0B 00 00 00 // base WIT
0A 00 00 00
46 00 00 00
19 00 00 00 // base MEN
0A 00 00 00

View File

@ -0,0 +1,117 @@
Server: Len 1503 [NpcHtmlMessage]
DF 05
19
AC 16 00 10 // npcObjectID
3C 00 68 00 ... 3E 00 00 00 // html
00 00 00 00 // itemID
writeC(0x19);
writeD(_npcObjId);
writeS(_html);
writeD(_itemId);
/**
*
* the HTML parser in the client knowns these standard and non-standard tags and attributes
* VOLUMN
* UNKNOWN
* UL
* U
* TT
* TR
* TITLE
* TEXTCODE
* TEXTAREA
* TD
* TABLE
* SUP
* SUB
* STRIKE
* SPIN
* SELECT
* RIGHT
* PRE
* P
* OPTION
* OL
* MULTIEDIT
* LI
* LEFT
* INPUT
* IMG
* I
* HTML
* H7
* H6
* H5
* H4
* H3
* H2
* H1
* FONT
* EXTEND
* EDIT
* COMMENT
* COMBOBOX
* CENTER
* BUTTON
* BR
* BODY
* BAR
* ADDRESS
* A
* SEL
* LIST
* VAR
* FORE
* READONL
* ROWS
* VALIGN
* FIXWIDTH
* BORDERCOLORLI
* BORDERCOLORDA
* BORDERCOLOR
* BORDER
* BGCOLOR
* BACKGROUND
* ALIGN
* VALU
* READONLY
* MULTIPLE
* SELECTED
* TYP
* TYPE
* MAXLENGTH
* CHECKED
* SRC
* Y
* X
* QUERYDELAY
* NOSCROLLBAR
* IMGSRC
* B
* FG
* SIZE
* FACE
* COLOR
* DEFFON
* DEFFIXEDFONT
* WIDTH
* VALUE
* TOOLTIP
* NAME
* MIN
* MAX
* HEIGHT
* DISABLED
* ALIGN
* MSG
* LINK
* HREF
* ACTION
*
*
* @version $Revision: 1.3.2.1.2.3 $ $Date: 2005/03/27 15:29:57 $
*/
// html code must not exceed 8192 bytes

View File

@ -0,0 +1,51 @@
Server: Len 75
4B 00
4E
6C 08 00 10 // party leader object id
00 00 00 00 // party loot type
01 00 00 00 // number of members (except you)
6C 08 00 10 // member oobject id
41 00 65 00 72 00 69 00 6E 00 00 00 // member name
CD 06 00 00 // current cp
CD 06 00 00 // max cp
61 0D 00 00 // current hp
61 0D 00 00 // max hp
7B 0A 00 00 // current mp
7B 0A 00 00 // max mp
50 00 00 00 // level
1E 00 00 00 // class id
00 00 00 00 // constant 00 00 00 00
01 00 00 00 // race
00 00 00 00 // constant 00 00 00 00
protected final void writeImpl()
{
writeC(0x4e);
writeD(_partyMembers.get(0).getObjectId()); // c3 party leader id
writeD(_partyMembers.get(0).getParty().getLootDistribution());//c3 party loot type (0,1,2,....)
writeD(_partyMembers.size()-1);
for(L2PcInstance member: _partyMembers)
{
if (member != _exclude)
{
writeD(member.getObjectId());
writeS(member.getName());
writeD((int) member.getCurrentCp()); //c4
writeD(member.getMaxCp()); //c4
writeD((int) member.getCurrentHp());
writeD(member.getMaxHp());
writeD((int) member.getCurrentMp());
writeD(member.getMaxMp());
writeD(member.getLevel());
writeD(member.getClassId().getId());
writeD(0);//writeD(0x01); ??
writeD(member.getRace().ordinal());
writeD(0);
}
}
}

View File

@ -0,0 +1,49 @@
Server: Len 81 [PrivateStoreListBuy]
51 00
BE
CE 09 00 10 // buyer oid
EA B0 0B 00 // cur.user adena
01 00 00 00 // sell items count
// for each item
C7 09 00 10 // item oid
F4 25 00 00 // item itemID
00 00 // enchant
02 00 00 00 // count
00 00 00 00 // reference price
00 00 // 00
00 00 00 00 // body part
05 00 // type2
01 00 00 00 // buyers price
02 00 00 00 // ma buy amount
FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // attributes
writeC(0xbe);
writeD(_objId); // buyer
writeD(_playerAdena);
writeD(_items.length);
for (TradeList.TradeItem item : _items)
{
writeD(item.getObjectId());
writeD(item.getItem().getItemId());
writeH(item.getEnchant());
writeD(item.getCount()); //give max possible sell amount
writeD(item.getItem().getReferencePrice());
writeH(0);
writeD(item.getItem().getBodyPart());
writeH(item.getItem().getType2());
writeD(item.getPrice());//buyers price
writeD(item.getCount()); // maximum possible tradecount
// T1
writeD(item.getAttackElementType());
writeD(item.getAttackElementPower());
for (byte i = 0; i < 6; i++)
{
writeD(item.getElementDefAttr(i));
}
}

View File

@ -0,0 +1,67 @@
Server: Len 85 [PrivateStoreListSell]
55 00
A1
CE 09 00 10 // seller oid
00 00 00 00 // is package sale
EB B0 0B 00 // cur.user adena
01 00 00 00 // sell items count
/// for each item
05 00 00 00 // type2
D0 09 00 10 // item oid
F4 25 00 00 // item itemID
01 00 00 00 // item count
00 00 // 00
00 00 // enchant
00 00 // 00
00 00 00 00 // body part
01 00 00 00 // sell price
00 00 00 00 // reference price (original price)
FE FF FF FF // atk attr type
00 00 00 00 // atk attr val
00 00 00 00 // def fire
00 00 00 00 // def water
00 00 00 00 // def wind
00 00 00 00 // def earth
00 00 00 00 // def holy
00 00 00 00 // def dark
// player's private shop
public PrivateStoreListSell(L2PcInstance player, L2PcInstance storePlayer)
{
_objId = storePlayer.getObjectId();
_playerAdena = player.getAdena();
_items = storePlayer.getSellList().getItems();
_packageSale = storePlayer.getSellList().isPackaged();
}
@Override
protected final void writeImpl()
{
writeC(0xa1);
writeD(_objId);
writeD(_packageSale ? 1 : 0);
writeD(_playerAdena);
writeD(_items.length);
for (TradeList.TradeItem item : _items)
{
writeD(item.getItem().getType2());
writeD(item.getObjectId());
writeD(item.getItem().getItemId());
writeD(item.getCount());
writeH(0x00);
writeH(item.getEnchant());
writeH(0x00);
writeD(item.getItem().getBodyPart());
writeD(item.getPrice()); //your price
writeD(item.getItem().getReferencePrice()); //store price
// T1
writeD(item.getAttackElementType());
writeD(item.getAttackElementPower());
for (byte i = 0; i < 6; i++)
{
writeD(item.getElementDefAttr(i));
}
}
}

View File

@ -0,0 +1,4 @@
Server: Len 451 [PrivateStoreManageListBuy]
C3 01
BD // pcode
D1 73 02 10 C5 97 06 00 08 00 00 00 E0 02 00 00 00 00 01 00 00 00 90 01 00 00 00 00 00 00 00 00 05 00 FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 27 00 00 00 00 01 00 00 00 74 0E 00 00 00 00 00 00 00 00 05 00 FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 25 04 00 00 00 00 6E 00 00 00 4A 01 00 00 00 00 00 00 00 00 05 00 FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6D 0F 00 00 00 00 E8 01 00 00 5A 00 00 00 00 00 00 00 00 00 05 00 FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 07 00 00 00 00 04 00 00 00 B4 00 00 00 00 00 00 00 00 00 05 00 FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 B8 05 00 00 00 00 BC 0E 00 00 0F 00 00 00 00 00 00 00 00 00 05 00 FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F4 25 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3A 11 00 00 00 00 41 00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

View File

@ -0,0 +1,59 @@
/**
* 3 section to this packet
* 1)playerinfo which is always sent
* 2)list of items which can be added to sell
* 3)list of items which have already been setup
*/
Server: Len 2255 [PrivateStoreManageListSell]
CF 08
A0 // pcode
// section 1
09 A5 04 10 // player (user) objectID
00 00 00 00 // is package sale
87 C1 00 00 // player (user) adena
// section 2
24 00 00 00 // items count in section 2
[[ for each item ]]
05 00 00 00 // type2
39 D6 05 10 // objectID
B2 05 00 00 // itemID
2E 00 00 00 // count
00 00 // 00
00 00 // enchant
00 00 // 00
00 00 00 00 // body part
8A 02 00 00 // store price
FE FF FF FF // atk attr type
00 00 00 00 // atk attr val
00 00 00 00 // fire def
00 00 00 00 // water def
00 00 00 00 // wind def
00 00 00 00 // earth def
00 00 00 00 // holy def
00 00 00 00 // dark def
// section 2
00 00 00 00 // items count in section 3
D // type2
D // oid
D // itemID
D // cnt
H // 0
H // ench
H // 0
D // b.part
D // your price
D // referencePrice (store price)
FE FF FF FF // atk attr type
00 00 00 00 // atk attr val
00 00 00 00 // fire def
00 00 00 00 // water def
00 00 00 00 // wind def
00 00 00 00 // earth def
00 00 00 00 // holy def
00 00 00 00 // dark def

View File

@ -0,0 +1,13 @@
Server: Len 45 [PrivateStoreMsgBuy]
2D 00
BF
99 73 06 10 // objectID
6B 00 61 00 ... 00 00 // store msg
protected final void writeImpl()
{
writeC(0xbf);
writeD(_objId);
writeS(_storeMsg);
}

View File

@ -0,0 +1,21 @@
C->S
0B 01 // len
0E // p.code ProtocolVersion
3C 03 00 00 // protocol - 828
09 07 54 56 03 09 0B 01 07 02 54 54 56 07 00 02
55 56 00 51 00 53 57 04 07 55 08 54 01 07 01 53
00 56 55 56 01 06 05 04 51 03 08 51 08 51 56 04
54 06 55 08 02 09 51 56 01 53 06 55 04 53 00 56
56 53 01 09 02 09 01 51 54 51 09 55 56 09 03 04
07 05 55 04 06 55 04 06 09 04 51 01 08 08 06 05
52 06 04 01 07 54 03 06 52 55 06 55 55 51 01 02
04 54 03 55 54 01 57 51 55 05 52 05 54 07 51 51
55 07 02 53 53 00 52 05 52 07 01 54 00 03 05 05
08 06 05 05 06 03 00 0D 08 01 07 09 03 51 03 07
53 09 51 06 07 54 0A 50 56 02 52 04 05 55 51 02
53 00 08 54 04 52 56 06 02 09 00 08 03 53 56 01
05 00 55 06 08 56 04 0D 06 07 52 06 07 04 0A 06
01 04 54 04 00 05 02 04 54 00 09 52 53 05 04 01
04 05 05 01 52 51 52 0D 06 51 08 09 54 53 00 0D
01 02 03 54 53 01 05 03 08 56 54 07 02 54 0B 06
8D 71 5F 08

View File

@ -0,0 +1,20 @@
0B 01 // len
0E
92 00 00 00
09 07 54 56 03 09 0B 01 07 02 54 54 56 07 00 02
55 56 00 51 00 53 57 04 07 55 08 54 01 07 01 53
00 56 55 56 01 06 05 04 51 03 08 51 08 51 56 04
54 06 55 08 02 09 51 56 01 53 06 55 04 53 00 56
56 53 01 09 02 09 01 51 54 51 09 55 56 09 03 04
07 05 55 04 06 55 04 06 09 04 51 01 08 08 06 05
52 06 04 01 07 54 03 06 52 55 06 55 55 51 01 02
04 54 03 55 54 01 57 51 55 05 52 05 54 07 51 51
55 07 02 53 53 00 52 05 52 07 01 54 00 03 05 05
08 06 05 05 06 03 00 0D 08 01 07 09 03 51 03 07
53 09 51 06 07 54 0A 50 56 02 52 04 05 55 51 02
53 00 08 54 04 52 56 06 02 09 00 08 03 53 56 01
05 00 55 06 08 56 04 0D 06 07 52 06 07 04 0A 06
01 04 54 04 00 05 02 04 54 00 09 52 53 05 04 01
04 05 05 01 52 51 52 0D 06 51 08 09 54 53 00 0D
01 02 03 54 53 01 05 03 08 56 54 07 02 54 0B 06
A6 23 F4 FE

View File

@ -0,0 +1,20 @@
0B 01
0E
0C 00 00 00
09 07 54 56 03 09 0B 01 07 02 54 54 56 07 00 02
55 56 00 51 00 53 57 04 07 55 08 54 01 07 01 53
00 56 55 56 01 06 05 04 51 03 08 51 08 51 56 04
54 06 55 08 02 09 51 56 01 53 06 55 04 53 00 56
56 53 01 09 02 09 01 51 54 51 09 55 56 09 03 04
07 05 55 04 06 55 04 06 09 04 51 01 08 08 06 05
52 06 04 01 07 54 03 06 52 55 06 55 55 51 01 02
04 54 03 55 54 01 57 51 55 05 52 05 54 07 51 51
55 07 02 53 53 00 52 05 52 07 01 54 00 03 05 05
08 06 05 05 06 03 00 0D 08 01 07 09 03 51 03 07
53 09 51 06 07 54 0A 50 56 02 52 04 05 55 51 02
53 00 08 54 04 52 56 06 02 09 00 08 03 53 56 01
05 00 55 06 08 56 04 0D 06 07 52 06 07 04 0A 06
01 04 54 04 00 05 02 04 54 00 09 52 53 05 04 01
04 05 05 01 52 51 52 0D 06 51 08 09 54 53 00 0D
01 02 03 54 53 01 05 03 08 56 54 07 02 54 0B 06
EB EF 3D E6

View File

@ -0,0 +1,21 @@
C->S Len 267
0B 01 // len
0E // p. code
3F 03 00 00 // protocol - 831 (Hellbound?)
09 07 54 56 03 09 0B 01 07 02 54 54 56 07 00 02
55 56 00 51 00 53 57 04 07 55 08 54 01 07 01 53
00 56 55 56 01 06 05 04 51 03 08 51 08 51 56 04
54 06 55 08 02 09 51 56 01 53 06 55 04 53 00 56
56 53 01 09 02 09 01 51 54 51 09 55 56 09 03 04
07 05 55 04 06 55 04 06 09 04 51 01 08 08 06 05
52 06 04 01 07 54 03 06 52 55 06 55 55 51 01 02
04 54 03 55 54 01 57 51 55 05 52 05 54 07 51 51
55 07 02 53 53 00 52 05 52 07 01 54 00 03 05 05
08 06 05 05 06 03 00 0D 08 01 07 09 03 51 03 07
53 09 51 06 07 54 0A 50 56 02 52 04 05 55 51 02
53 00 08 54 04 52 56 06 02 09 00 08 03 53 56 01
05 00 55 06 08 56 04 0D 06 07 52 06 07 04 0A 06
01 04 54 04 00 05 02 04 54 00 09 52 53 05 04 01
04 05 05 01 52 51 52 0D 06 51 08 09 54 53 00 0D
01 02 03 54 53 01 05 03 08 56 54 07 02 54 0B 06
FB 87 B9 4A

View File

@ -0,0 +1,4 @@
Server: Len 43 [RecipeShopMsg]
2B 00
E1
86 C5 01 10 2D 00 3D 00 3D 00 3D 00 44 00 45 00 4C 00 41 00 79 00 20 00 43 00 41 00 4D 00 3D 00 3D 00 3D 00 2D 00 00 00

View File

@ -0,0 +1,6 @@
Client Len 13 [RequestAutoSoulShot]
0D 00
D0
0D 00
6F 0F 00 00 // itemID
01 00 00 00 // 1 - on, 0 - off

View File

@ -0,0 +1,8 @@
Client: Len 19 [RequestBuyItem]
13 00
40
90 00 00 00 // list ID
01 00 00 00 // count
[[ for each item ]]
25 04 00 00 // itemID
64 00 00 00 // count

View File

@ -0,0 +1,8 @@
Client: Len 45 [RequestBypassToServer]
2D 00
23
6E 00 70 00 63 00 5F 00 32 00 36 00 38 00 34 00
33 00 37 00 39 00 39 00 30 00 5F 00 43 00 68 00
61 00 74 00 20 00 31 00 00 00
_command = readS()

View File

@ -0,0 +1,5 @@
Client: Len 11
0B 00
2F
13 14 04 10 // objectID 268702739
01 00 00 00 // count 1

View File

@ -0,0 +1,5 @@
Client: Len 11 [RequestDestroyItem]
0B 00
60
71 08 00 10 // objectID
01 00 00 00 // count

View File

@ -0,0 +1,5 @@
Client: Len 13 [RequestDispel]
0D 00
D0 4E 00 // D0:004E RequestDispel
4B 05 00 00 // skillID 1355 (PoWater?)
01 00 00 00 // skillLvl lvl 1

View File

@ -0,0 +1,14 @@
Client: Len 23 [RequestDropItem]
17 00
17
E4 09 00 10 // objectID
01 00 00 00 // count
F4 AA 00 00 // x
2F A4 00 00 // y
43 F2 FF FF // z
_objectId = readD();
_count = readD();
_x = readD();
_y = readD();
_z = readD();

View File

@ -0,0 +1,5 @@
Client: Len 15
0F 00
42
6C 00 6F 00 6C 00 00 00 // target char name
00 00 00 00 // loot type, item distribution

View File

@ -0,0 +1,9 @@
protected void readImpl()
{
_name = readS();
}
Client: Len 13
0D 00
45
4C 00 65 00 78 00 78 00 00 00

View File

@ -0,0 +1,9 @@
Client: Len 23 [RequestPrivateStoreBuy]
17 00
83 // pcode
CE 09 00 10 // seller player oid
01 00 00 00 // count
// for each item
D0 09 00 10 // item oid
01 00 00 00 // count
01 00 00 00 // price

View File

@ -0,0 +1 @@
Client: Len 3 [RequestPrivateStoreQuitBuy] | 03 00 / 9C /

View File

@ -0,0 +1 @@
Client: Len 3 [RequestPrivateStoreQuitSell] | 03 00 / 96 /

View File

@ -0,0 +1,11 @@
Client: Len 31 [RequestPrivateStoreSell]
1F 00
9F // pcode
CE 09 00 10 // seller oid
01 00 00 00 // count
C7 09 00 10 // oid
F4 25 00 00 // iid
00 00 00 00 // ?? 0x00000000
02 00 00 00 // cnt
01 00 00 00 // price

View File

@ -0,0 +1,6 @@
Client: Len 3
03 00
57
send when IN_GAME mode, to character select screen.
if restart possible server responds with 0x57 RestartResponse

View File

@ -0,0 +1,15 @@
Client: Len 7 [RequestRestartPoint]
07 00
7D
00 00 00 00 // 00 - to village
case 1: // to clanhall
case 2: // to castle
case 3: // to fortress
case 4: // to siege HQ
case 5: // Fixed or Player is a festival participant
after successful restart point server sends TeleportToLocation
then client send Appearing
then server sends Revive

View File

@ -0,0 +1,7 @@
Client Len 49 [RequestSaveInventoryOrder]
31 00
D0
24 00
05 00 00 00 6E 08 00 10 00 00 00 00 6F 08 00 10 01 00
00 00 70 08 00 10 02 00 00 00 EC 09 00 10 03 00
00 00 F5 0C 00 10 04 00 00 00

View File

@ -0,0 +1,13 @@
Client: Len 59 [RequestSellItem]
3B 00
37 // pcode
00 00 00 00 // list ID (0 - to NPC?)
04 00 00 00 // count
[[ for each item ]]
1D 21 01 10 // objectID
F0 0F 00 00 // itemID
01 00 00 00 // count
B4 20 01 10 F9 0F 00 00 01 00 00 00
A5 1C 01 10 03 10 00 00 02 00 00 00
05 23 01 10 F8 0F 00 00 01 00 00 00

View File

@ -0,0 +1,3 @@
Client: Len 3
03 00
A6

View File

@ -0,0 +1,4 @@
Client Len 5 [ RequestTargetCanceld]
05 00
48
00 00

View File

@ -0,0 +1,24 @@
Client Len 7 [ RequestUserCommand]
07 00
B3
00 00 00 00 // command ID
================================
Decimal command numbers:
0 - /loc
52 - /unstuck (Escape)
61 - /Mount
62 - /DisMount
77 - /time
81 - /partyinfo
88 - /AttackList
89 - /underattacklist
90 - /warlist
93 - /ChannelDelete
96 - /ChannelLeave
97 - /ChannelListUpdate
100 - /ClanPenalty
109 - /OlympiadStat
114 - /InstanceZone

View File

@ -0,0 +1,4 @@
Server: Len 7 [Revive]
07 00
01
3F 8E 05 10 // objectID?

View File

@ -0,0 +1,56 @@
Server: Len 1357 [SellList]
4D 05
06
6F A5 34 00 // cur money
00 00 00 00 // lease npcID ? O_o wtf
15 00 // items count
[ for each item ]
04 00 // type1
C4 40 07 10 // objectID
E0 02 00 00 // itemID
0B 00 00 00 // count
05 00 // type2
00 00 // ??
00 00 00 00 // body part
00 00 // enchant level
00 00 00 00 // ??
C8 00 00 00 // sell price
FE FF FF FF // atk attrib type
00 00 00 00 // atk attrib val
00 00 00 00 // def attr fire
00 00 00 00 // -- water
00 00 00 00 // -- wind
00 00 00 00 // -- earth
00 00 00 00 // -- holy
00 00 00 00 // -- unholy
L2J WriteImpl
writeC(0x06);
writeD(_money);
writeD(_lease == null ? 0x00 : 1000000 + _lease.getTemplate().npcId);
writeH(_selllist.size());
for (L2ItemInstance item : _selllist)
{
writeH(item.getItem().getType1());
writeD(item.getObjectId());
writeD(item.getItemId());
writeD(item.getCount());
writeH(item.getItem().getType2());
writeH(0x00);
writeD(item.getItem().getBodyPart());
writeH(item.getEnchantLevel());
writeH(0x00);
writeH(0x00);
writeD(item.getItem().getReferencePrice()/2);
// T1
writeD(item.getAttackElementType());
writeD(item.getAttackElementPower());
for (byte i = 0; i < 6; i++)
{
writeD(item.getElementDefAttr(i));
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
Client: Len 13 [SendBypassBuildCmd]
0D 00
74
68 00 65 00 61 00 6C 00 00 00 _command = readS();

View File

@ -0,0 +1 @@
Client: Len 111 [ SendWareHouseDepositList] | 6F 00 / 3B / 0D 00 00 00 53 20 01 10 02 00 00 00 D2 0C 02 10 10 00 00 00 26 1E 01 10 1F 00 00 00 8B 1D 01 10 37 00 00 00 29 1D 01 10 06 00 00 00 9A 1B 01 10 04 00 00 00 83 1B 01 10 0F 00 00 00 70 FC 00 10 18 00 00 00 F9 0C 08 10 02 00 00 00 E2 51 06 10 02 00 00 00 41 53 07 10 0E 00 00 00 94 4D 07 10 07 00 00 00 45 4D 07 10 27 00 00 00

View File

@ -0,0 +1,4 @@
Client: Len 103 [SendWareHouseWithDrawList]
67 00
3C
0C 00 00 00 60 72 08 10 01 00 00 00 5E 72 08 10 01 00 00 00 61 72 08 10 01 00 00 00 5C 72 08 10 01 00 00 00 5D 72 08 10 01 00 00 00 E5 6E 07 10 01 00 00 00 E1 6E 07 10 01 00 00 00 F9 6E 07 10 01 00 00 00 03 6F 07 10 01 00 00 00 E2 6E 07 10 01 00 00 00 D0 60 07 10 01 00 00 00 B5 BB 07 10 7E 05 00 00

View File

@ -0,0 +1,9 @@
Client: Len 23 [SetPrivateStoreListSell]
17 00
31 // pcode
00 00 00 00 // package?
01 00 00 00 // count
2D 9A 06 10 // obj ID
DC 13 00 00 // count
0E 00 00 00 // price

View File

@ -0,0 +1,6 @@
Server: Len 15 [SetupGauge]
0F 00
6B
00 00 00 00 // color 0-blue 1-red 2-cyan 3-
57 07 00 00 // skill cast time 1879, ms
57 07 00 00

View File

@ -0,0 +1,13 @@
protected final void writeImpl()
{
writeC(0xfa);
writeD(_skillId);
writeD(_skillLvl);
writeD(_duration); // in seconds!
}
0D 00
FA
XX XX XX XX
XX XX XX XX
XX XX XX XX // in seconds!

View File

@ -0,0 +1,81 @@
Client: Len 12 [RequestActionUse] | 0C 00 / 56 / 25 00 00 00 00 00 00 00 00
Server: Len 183 [RecipeShopManageList]
B7 00
DE // pcode
09 A5 04 10 // seller oid
D4 A1 1E 00 // seller adena
00 00 00 00 // isCommonCraft; 0 - dwarven, 1 - common
14 00 00 00 // section 2 count
14 00 00 00 // recipe ID
01 00 00 00 // seq.number
15 00 00 00 02 00 00 00
19 00 00 00 03 00 00 00
1A 00 00 00 04 00 00 00
1B 00 00 00 05 00 00 00
1C 00 00 00 06 00 00 00
1D 00 00 00 07 00 00 00
1E 00 00 00 08 00 00 00
1F 00 00 00 09 00 00 00
20 00 00 00 0A 00 00 00
21 00 00 00 0B 00 00 00
22 00 00 00 0C 00 00 00
23 00 00 00 0D 00 00 00
24 00 00 00 0E 00 00 00
25 00 00 00 0F 00 00 00
26 00 00 00 10 00 00 00
27 00 00 00 11 00 00 00
43 01 00 00 12 00 00 00
44 01 00 00 13 00 00 00
60 02 00 00 14 00 00 00
00 00 00 00 // section 3 count
XX XX XX XX // recipe id
00 00 00 00 // 0x00
XX XX XX XX // cost
Client: Len 25 [RequestRecipeShopMessageSet]
19 00
BA // pcode
63 00 72 00 61 00 66 00 74 00 20 00 66 00 72 00 65 00 65 00 00 00 // unicode str
Client: Len 31 [RequestRecipeShopListSet]
1F 00
BB // pcode
03 00 00 00 // count
[ for each recipe ]
44 01 00 00 // recipe ID
01 00 00 00 // price
// server makes client sit down
Server: Len 23 [ChangeWaitType] | 17 00 / 29 / 09 A5 04 10 00 00 00 00 F2 40 01 00 F5 D2 00 00 24 FA FF FF
//
Server: Len 29 [RecipeShopMsg]
1D 00
E1
09 A5 04 10 // oid?
63 00 72 00 61 00 66 00 74 00 20 00 66 00 72 00 65 00 65 00 00 00 // message str
.........
Client: Len 3 [RequestRecipeShopManageQuit] | 03 00 / BC /
Recipe ID ==>> item ID conversion from sql table.... or some other
Client: Len 31 [RequestRecipeShopListSet]
1F 00
BB
03 00 00 00
14 00 00 00 // ssd (20)
01 00 00 00
15 00 00 00 // ssc (21)
02 00 00 00
44 01 00 00 // bssc (324)
03 00 00 00

View File

@ -0,0 +1,18 @@
Server: Len 23 [StopMove]
17 00
47 // StopMove
6C 08 00 10 // objectID of char who stopped
9A AC 00 00 // x
F9 A4 00 00 // y
5D F2 FF FF // z
45 B9 00 00 // heading
protected final void writeImpl()
{
writeC(0x47);
writeD(_objectId);
writeD(_x);
writeD(_y);
writeD(_z);
writeD(_heading);
}

View File

@ -0,0 +1,13 @@
Server: Len 19 [TeleportToLocation]
13 00
22
6D 08 00 10 // oid 268437613
3F 1D 01 00 // x 73023
DC CE 01 00 // y 118492
9D F1 FF FF // z -3683
writeC(0x22);
writeD(_targetObjId);
writeD(_x);
writeD(_y);
writeD(_z);

View File

@ -0,0 +1,81 @@
Trading (requester sends):
Client: Len 7 [TradeRequest] | 07 00
1A // pcode
C5 09 00 10 // objectID of partner
Trade receiver recieves:
Server: Len 7 [SendTradeRequest]
07 00
70 // pcode
CE 09 00 10 // object ID of person who wants to trade to you
Trade receiver responds:
Client: Len 7 [AnswerTradeRequest]
07 00
55 // pcode
01 00 00 00 // 1 - ok, 0 - cancel
// then both (requester and receiver) receive
Server: Len 189 [TradeStart]
BD 00
14 // pcode
C5 09 00 10 // partner objectID
03 00 // items count (your inv)
/// for each item
04 00 // item type1
CF 09 00 10 // item oid
D4 15 00 00 // item iid
01 00 00 00 // item count
05 00 // item type2
00 00 // 00
00 00 00 00 // body part
00 00 // enchant
00 00 00 00 // 0000
FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // attribs
Server: Len 65 [TradeOtherAdd]
41 00
1B // pcode
01 00 // item cnt
04 00 // type1
C0 09 00 10 // oid
39 00 00 00 // iid
0D 00 00 00 // cnt
04 00 // type2
00 00 // 00
00 00 00 00 // b.part
00 00 // enchatnt
00 00 00 00 // 00 ??
FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // attribs
Client: Len 15 [AddTradeItem]
0F 00
1B // pcode
01 00 00 00 // tradeId? O_o wtf L2J ignores this
D1 09 00 10 // objectID
01 00 00 00 // count
Server: Len 65 [TradeOwnAdd]
41 00
1A // pcode
01 00 // count
04 00 // type1
D1 09 00 10 // oid
9A 29 00 00 // iid
01 00 00 00 // cnt
05 00 // type2
00 00 // 00
00 00 00 00 // b.part
00 00 // enchant
00 00 00 00 // 00
FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // attribs
Client: Len 7 [TradeDone]
07 00
1C // pcode
01 00 00 00 // num; 1 - confirm, 0 - cancel trade
Server: Len 7 [TradeDone]
07 00
1C // pcode
01 00 00 00 // num; 1 - confirm, 0 - cancel trade

View File

@ -0,0 +1,4 @@
0B 00 // len 11
19 // ptype - UseItem
57 EA 03 10 // objectID? 268692055
00 00 00 00 // wtf nulls?

View File

@ -0,0 +1,18 @@
Server: Len 23 [ValidateLocation]
17 00
79
B2 16 00 10 // mob/npc objectID
91 AC 00 00 // x
C5 A4 00 00 // y
5D F2 FF FF // z
FA C5 00 00 // heading
protected final void writeImpl()
{
writeC(0x79);
writeD(_charObjId);
writeD(_x);
writeD(_y);
writeD(_z);
writeD(_heading);
}

View File

@ -0,0 +1,32 @@
Client: Len 23 [ValidatePosition]
17 00
59
B3 A5 00 00 // x 42419
39 A4 00 00 // y 42041
5B F2 FF FF // z -3493
E2 24 00 00 // heading 9442
00 00 00 00 // wtf data? L2J ignores
After TeleportToLocation client sends ValidatePosition twice.
First is above
Second below:
Both coordinates x,y,z are coords BEFORE teleport.
Client: Len 23 [ValidatePosition]
17 00
59
B3 A5 00 00 // x,y,z are the same
39 A4 00 00
5B F2 FF FF
00 00 00 00 // client changes heading to 0
00 00 00 00
Then client sends Appearing (trigger).
After that server sends UserInfo with all info, icluding new coords.
ValidatePosition L2J:
_x = readD();
_y = readD();
_z = readD();
_heading = readD();
_data = readD();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,4 @@
Client: Len 3
03 00
00

View File

@ -0,0 +1,24 @@
ProtocolVersion - MyChanged
0030 0b 01 0e 53 03 00 00 09 07 54 ..B.....S.....TV
0040 56 03 09 0b 01 07 02 54 54 56 07 00 02 55 56 00 ......TTV...UV.Q
0050 51 00 53 57 04 07 55 08 54 01 07 01 53 00 56 55 .SW..U.T...S.VUV
0060 56 01 06 05 04 51 03 08 51 08 51 56 04 54 06 55 ....Q..Q.QV.T.U.
0070 08 02 09 51 56 01 53 06 55 04 53 00 56 56 53 01 ..QV.S.U.S.VVS..
0080 09 02 09 01 51 54 51 09 55 56 09 03 04 07 05 55 ...QTQ.UV.....U.
0090 04 06 55 04 06 09 04 51 01 08 08 06 05 52 06 04 .U....Q.....R...
00a0 01 07 54 03 06 52 55 06 55 55 51 01 02 04 54 03 .T..RU.UUQ...T.U
00b0 55 54 01 57 51 55 05 52 05 54 07 51 51 55 07 02 T.WQU.R.T.QQU..S
00c0 53 53 00 52 05 52 07 01 54 00 03 05 05 08 06 05 S.R.R..T........
00d0 05 06 03 00 0d 08 01 07 09 03 51 03 07 53 09 51 .........Q..S.Q.
00e0 06 07 54 0a 50 56 02 52 04 05 55 51 02 53 00 08 .T.PV.R..UQ.S..T
00f0 54 04 52 56 06 02 09 00 08 03 53 56 01 05 00 55 .RV......SV...U.
0100 06 08 56 04 0d 06 07 52 06 07 04 0a 06 01 04 54 .V....R.......T.
0110 04 00 05 02 04 54 00 09 52 53 05 04 01 04 05 05 ....T..RS.......
0120 01 52 51 52 0d 06 51 08 09 54 53 00 0d 01 02 03 RQR..Q..TS.....T
0130 54 53 01 05 03 08 56 54 07 02 54 0b 06 df b8 3b S....VT..T....;T
0140 54
RequestGSAuthLogin - MyChanged
0030 00 bc 6c 00 65 00 78 00 78 00 ........l.e.x.x.
0040 68 00 75 00 6c 00 65 00 00 00 0d fe 0f 00 12 eb h.u.l.e.........
0050 01 00 0d fe 0f 00 30 28 fc 55 01 00 00 00 ......0(.U....

View File

@ -0,0 +1,25 @@
ProtocolVersion - Gracia
0030 0b 01 0e 53 03 00 00 09 07 54 ...b.....S.....T
0040 56 03 09 0b 01 07 02 54 54 56 07 00 02 55 56 00 V......TTV...UV.
0050 51 00 53 57 04 07 55 08 54 01 07 01 53 00 56 55 Q.SW..U.T...S.VU
0060 56 01 06 05 04 51 03 08 51 08 51 56 04 54 06 55 V....Q..Q.QV.T.U
0070 08 02 09 51 56 01 53 06 55 04 53 00 56 56 53 01 ...QV.S.U.S.VVS.
0080 09 02 09 01 51 54 51 09 55 56 09 03 04 07 05 55 ....QTQ.UV.....U
0090 04 06 55 04 06 09 04 51 01 08 08 06 05 52 06 04 ..U....Q.....R..
00a0 01 07 54 03 06 52 55 06 55 55 51 01 02 04 54 03 ..T..RU.UUQ...T.
00b0 55 54 01 57 51 55 05 52 05 54 07 51 51 55 07 02 UT.WQU.R.T.QQU..
00c0 53 53 00 52 05 52 07 01 54 00 03 05 05 08 06 05 SS.R.R..T.......
00d0 05 06 03 00 0d 08 01 07 09 03 51 03 07 53 09 51 ..........Q..S.Q
00e0 06 07 54 0a 50 56 02 52 04 05 55 51 02 53 00 08 ..T.PV.R..UQ.S..
00f0 54 04 52 56 06 02 09 00 08 03 53 56 01 05 00 55 T.RV......SV...U
0100 06 08 56 04 0d 06 07 52 06 07 04 0a 06 01 04 54 ..V....R.......T
0110 04 00 05 02 04 54 00 09 52 53 05 04 01 04 05 05 .....T..RS......
0120 01 52 51 52 0d 06 51 08 09 54 53 00 0d 01 02 03 .RQR..Q..TS.....
0130 54 53 01 05 03 08 56 54 07 02 54 0b 06 df b8 3b TS....VT..T....;
0140 54 T
RequestGSAuthLogin - Gracia
0030 31 00 3e c0 a3 ab da ed 20 49 ..>g..1.>..... I
0040 81 ce 5d 29 88 88 b9 4b e4 76 15 75 fa ba 77 00 ..])...K.v.u..w.
0050 21 07 94 98 c7 a4 95 4d cc 2d 00 6c 1d 52 9f be !......M.-.l.R..
0060 ab f1 0c 01 a0 cc fd .......

View File

@ -0,0 +1,19 @@
ProtocolVersion - Hellbound
0030 0b 01 0e 3f 03 00 00 09 07 54 .........?.....T
0040 56 03 09 0b 01 07 02 54 54 56 07 00 02 55 56 00 V......TTV...UV.
0050 51 00 53 57 04 07 55 08 54 01 07 01 53 00 56 55 Q.SW..U.T...S.VU
0060 56 01 06 05 04 51 03 08 51 08 51 56 04 54 06 55 V....Q..Q.QV.T.U
0070 08 02 09 51 56 01 53 06 55 04 53 00 56 56 53 01 ...QV.S.U.S.VVS.
0080 09 02 09 01 51 54 51 09 55 56 09 03 04 07 05 55 ....QTQ.UV.....U
0090 04 06 55 04 06 09 04 51 01 08 08 06 05 52 06 04 ..U....Q.....R..
00a0 01 07 54 03 06 52 55 06 55 55 51 01 02 04 54 03 ..T..RU.UUQ...T.
00b0 55 54 01 57 51 55 05 52 05 54 07 51 51 55 07 02 UT.WQU.R.T.QQU..
00c0 53 53 00 52 05 52 07 01 54 00 03 05 05 08 06 05 SS.R.R..T.......
00d0 05 06 03 00 0d 08 01 07 09 03 51 03 07 53 09 51 ..........Q..S.Q
00e0 06 07 54 0a 50 56 02 52 04 05 55 51 02 53 00 08 ..T.PV.R..UQ.S..
00f0 54 04 52 56 06 02 09 00 08 03 53 56 01 05 00 55 T.RV......SV...U
0100 06 08 56 04 0d 06 07 52 06 07 04 0a 06 01 04 54 ..V....R.......T
0110 04 00 05 02 04 54 00 09 52 53 05 04 01 04 05 05 .....T..RS......
0120 01 52 51 52 0d 06 51 08 09 54 53 00 0d 01 02 03 .RQR..Q..TS.....
0130 54 53 01 05 03 08 56 54 07 02 54 0b 06 fb 87 b9 TS....VT..T.....
0140 4a J

9
docs/hide.txt Normal file
View File

@ -0,0 +1,9 @@
This "hide" as it's called here, is actually nothing but a standard setting inside the L2 client.
It's been part of an invisible options menu since the birth of L2, under CPU settings. There, you could set some extraordinary values which would cause the client to "lag" in the same fashion as regular zone lag, and cause the infamous "teleport". A key bind into the actual L2 client could be set there as well.
The built-in teleport is actually better utilized than this programmed version. Since it allows you to literally click a location on the floor (even at the opposite side of a room/dungeon/field) and teleport right to it.
Back in the day, the few who knew about it simply called it a "teleport hack".
I've used it 2 times to personally test, but never after that. it's way to sketchy to risk getting banned for that, imo.

View File

@ -0,0 +1,27 @@
0,0-655,1310
line 22: x = -94 344 [ix = 182]
line 45: x = 185 823
dline = 23; dx = 280 167
x per line = 12181
line 24: y = -213 611
line 62: y = 249 634
dline = 38
y per line = 12190
-94344 - [3*12185 = 36555] = -130899; kx = -130899
-213611 - [4*12185 = 48740] = -262351; ky = -262351
line num starts with x: 19; y: 20 ... why?..
dline on img = 61px; dline on game map ~= 12185
dc = dlm / dli = 199.75 ~= 200
===================================================
Constants: dc = 200; kx = -130899; ky = -262351
Input: mx, my - coords of point in game
Output: ix, iy - coords of point on image
---------------------------------------------------
ix = (mx - kx) / dc
iy = (my - ky) / dc
===================================================

467
docs/l2_launcher.c Normal file
View File

@ -0,0 +1,467 @@
#include <stdio.h>
#define LAUNCHER_DAT_LINES 446
char *launcher_dat [ LAUNCHER_DAT_LINES ] = {
"[URL]",
"Protocol=unreal",
"ProtocolDescription=Unreal Protocol",
"Name=Player",
"Map=Index.unr",
"LocalMap=Entry.unr",
"Host=",
"Portal=",
"MapExt=unr",
"EXEName=l2.exe",
"SaveExt=usa",
"Port=7777",
"Class=LineageWarrior.MFighter",
"ServerAddr=94.23.90.121",
"IsL2NetLogin=True",
"IsL2Console=True",
"IsL2Seamless=True",
"IsL2Projector=True",
"ISL2Mark=2",
"ForceAspectRatio=False",
"AspectRatio=1.334",
"IsDefaultShaodw=False",
"IsUnderWaterEffect=False",
"IsUseCommand=True",
"L2VersionCheck=false",
"IsL2MemLog=False",
"L2ThreadFilter=1",
"L2TestServer=false",
"EnablePurgeLevel=True",
"SharedSky=True",
"L2MaxPawnResourceLoad=1.0",
"L2UseKeyCrypt=true",
"L2UseReplayManager=true",
"L2SaveLog=true",
"EnableSecondWindow=true",
"IsUseXMLUI=True",
"L2ShaderPath=..\\system\\",
"",
"[L2WaterEffect]",
"ColorReference=(A=180,R=38,G=56,B=64,RR=150)",
"EffectResolution=512",
"",
"[LanguageSet]",
"Language=0",
"",
"[FontSet]",
";Font=L2Font.Japan",
";Glyph=Japan.gly",
"Font=L2Font.gulim",
"Glyph=gulim.gly",
"",
"[CharacterDisplay]",
"Name=true",
"Dist=1000",
"",
"[ClippingRange]",
"PawnMax=3.0",
"PawnMin=1.5",
"AntiPortal=1.5",
"Terrain=8.0",
"StaticMesh=4.0",
"Projector=0.2",
"StaticMeshLod=5.0",
"Pawn=2.0",
"Actor=4.0",
"",
"[AutoLogOn]",
"IsL2AutoLogOn=Ture",
"L2ID=zodiac",
"L2Passwd=zodiac",
"L2Slot=7",
"",
"[FirstRun]",
"FirstRun=2110",
"",
"[Engine.Engine]",
"RenderDevice=D3DDrv.D3DRenderDevice",
";RenderDevice=Engine.NullRenderDevice",
";RenderDevice=OpenGLDrv.OpenGLRenderDevice",
"AudioDevice=ALAudio.ALAudioSubsystem",
";AudioDevice=XboxAudio.XboxAudioSubsystem",
"NetworkDevice=IpDrv.TcpNetDriver",
"DemoRecordingDevice=Engine.DemoRecDriver",
"Console=Engine.Console",
"DefaultPlayerMenu=UDebugMenu.UDebugRootWindow",
"Language=int",
"GameEngine=Engine.GameEngine",
"EditorEngine=Editor.EditorEngine",
"GUIController=Engine.BaseGUIController",
";DefaultGame=WarfareGame.WarfareTeamGame",
";DefaultServerGame=WarfareGame.WarfareTeamGame",
"DefaultGame=Engine.GameInfo",
"DefaultServerGame=Engine.GameInfo",
"ViewportManager=WinDrv.WindowsClient",
";ViewportManager=XboxDrv.XboxClient",
";ViewportManager=SDLDrv.SDLClient",
"Render=Render.Render",
"Input=Engine.Input",
"Canvas=Engine.Canvas",
"DefaultPlayerController=Engine.LineagePlayerController",
"L2NetHandler=Engine.NetHandler",
"L2Console=NWindow.ConsoleWnd",
"L2Font=NWindow.L2Font",
"",
"[Core.System]",
"PurgeCacheDays=30",
"SavePath=../Save",
"CachePath=../Cache",
"CacheExt=.uxx",
"Paths=../System/*.u",
"Paths=../StaticMeshes/*.usx",
"Paths=../Textures/*.utx",
"Paths=../Sounds/*.uax",
"Paths=../Voice/*.uax",
"Paths=../Maps/*.unr",
";Paths=../Music/*.umx",
"Paths=../Animations/*.ukx",
"Paths=../Animations/*.uix",
"Paths=../SysTextures/*.utx",
"Paths=../Animations/*.usk",
"Paths=../Saves/*.uvx",
"Suppress=DevLoad",
"Suppress=DevSave",
"Suppress=DevNetTraffic",
"Suppress=DevGarbage",
"Suppress=DevKill",
"Suppress=DevReplace",
"Suppress=DevCompile",
"Suppress=DevBind",
"Suppress=DevBsp",
"",
"[Engine.GameEngine]",
"CacheSizeMegs=32",
"UseSound=True",
";ServerActors=IpDrv.UdpBeacon",
";ServerActors=IpServer.UdpServerQuery",
";ServerActors=IpServer.UdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900",
";ServerActors=UWeb.WebServer",
"ServerPackages=AmbientCreatures",
";ServerPackages=WarEffects",
";ServerPackages=Decorations",
"ServerPackages=GamePlay",
"ServerPackages=UnrealGame",
";ServerPackages=WarfareGame",
";ServerPackages=WarClassLight",
";ServerPackages=WarClassHeavy",
";ServerPackages=WarClassMisc",
";ServerPackages=Pickups",
"",
"[WinDrv.WindowsClient]",
"WindowedViewportX=640",
"WindowedViewportY=480",
"FullscreenViewportX=1024",
"FullscreenViewportY=768",
"MenuViewportX=640",
"MenuViewportY=480",
"Brightness=0.800000",
"Contrast=0.700000",
"Gamma=0.800000",
"UseJoystick=True",
"CaptureMouse=True",
"StartupFullscreen=True",
"UseWindowFrame=True",
"ScreenFlashes=True",
"NoLighting=False",
"MinDesiredFrameRate=35.000000",
"Decals=True",
"Coronas=True",
"DecoLayers=True",
"Projectors=True",
"NoDynamicLights=False",
"ReportDynamicUploads=False",
"TextureDetailInterface=Higher",
"TextureDetailTerrain=Higher",
"TextureDetailWeaponSkin=Higher",
"TextureDetailPlayerSkin=Higher",
"TextureDetailWorld=Higher",
"TextureDetailRenderMap=Higher",
"TextureDetailLightmap=Higher",
"NoFractalAnim=False",
"ScaleHUDX=0.0",
"",
"[SDLDrv.SDLClient]",
"WindowedViewportX=640",
"WindowedViewportY=480",
"FullscreenViewportX=800",
"FullscreenViewportY=600",
"MenuViewportX=640",
"MenuViewportY=480",
"Brightness=0.800000",
"Contrast=0.700000",
"Gamma=0.800000",
"UseJoystick=True",
"JoystickNumber=0",
"IgnoreHat=False",
"JoystickHatNumber=0",
"CaptureMouse=True",
"StartupFullscreen=True",
"ScreenFlashes=True",
"NoLighting=False",
"MinDesiredFrameRate=35.000000",
"Decals=True",
"Coronas=True",
"DecoLayers=True",
"Projectors=True",
"NoDynamicLights=False",
"ReportDynamicUploads=False",
"TextureDetailInterface=Normal",
"TextureDetailTerrain=Normal",
"TextureDetailWeaponSkin=Normal",
"TextureDetailPlayerSkin=Normal",
"TextureDetailWorld=Normal",
"TextureDetailRenderMap=Normal",
"TextureDetailLightmap=UltraHigh",
"NoFractalAnim=False",
"",
"[Engine.Player]",
"ConfiguredInternetSpeed=10000",
"ConfiguredLanSpeed=20000",
"",
"[ALAudio.ALAudioSubsystem]",
"UseEAX=False",
"Use3DSound=False",
"UseDefaultDriver=False",
"CompatibilityMode=False",
"UsePrecache=True",
"ReverseStereo=false",
"Channels=32",
"MusicVolume=0.1",
"AmbientVolume=1.0",
"SoundVolume=1.0",
"DopplerFactor=1.0",
"Rolloff=0.5",
"TimeBetweenHWUpdates=15",
"DisablePitch=False",
"LowQualitySound=False",
"",
"[IpDrv.TcpNetDriver]",
"AllowDownloads=True",
"ConnectionTimeout=15.0",
"InitialConnectTimeout=500.0",
"AckTimeout=1.0",
"KeepAliveTime=0.2",
"MaxClientRate=20000",
"SimLatency=0",
"RelevantTimeout=5.0",
"SpawnPrioritySeconds=1.0",
"ServerTravelPause=4.0",
"NetServerMaxTickRate=20",
"LanServerMaxTickRate=35",
"DownloadManagers=IpDrv.HTTPDownload",
"DownloadManagers=Engine.ChannelDownload",
"",
"[IpDrv.HTTPDownload]",
"RedirectToURL=",
"ProxyServerHost=",
"ProxyServerPort=3128",
"UseCompression=True",
"",
"[Engine.DemoRecDriver]",
"DemoSpectatorClass=Warriors.CHSpectator",
"MaxClientRate=25000",
"ConnectionTimeout=15.0",
"InitialConnectTimeout=500.0",
"AckTimeout=1.0",
"KeepAliveTime=1.0",
"SimLatency=0",
"RelevantTimeout=5.0",
"SpawnPrioritySeconds=1.0",
"ServerTravelPause=4.0",
"NetServerMaxTickRate=60",
"LanServerMaxTickRate=60",
"",
"[Engine.GameReplicationInfo]",
"ServerName=Another Unreal Server",
"ShortName=Unreal Server",
"",
"[IpDrv.TcpipConnection]",
"SimPacketLoss=0",
"SimLatency=0",
"",
"[IpServer.UdpServerQuery]",
"GameName=ut",
"",
"[IpDrv.UdpBeacon]",
"DoBeacon=True",
"BeaconTime=0.50",
"BeaconTimeout=5.0",
"BeaconProduct=ut",
"",
"[XboxDrv.XboxClient]",
"TextureDetail=Medium",
"SkinDetail=Medium",
"LightmapDetail=High",
"TextureMinLOD=6",
"TextureMaxLOD=9",
"Brightness=0.8",
"Contrast=0.7",
"Gamma=0.8",
"NoFractalAnim=True",
"",
"[XBoxAudio.XBoxAudioSubsystem]",
"ReverseStereo=False",
"Channels=32",
"MusicVolume=1.0",
"SoundVolume=1.0",
"AmbientFactor=1.0",
"UsePrecache=True",
"",
"[D3DDrv.D3DRenderDevice]",
"DetailTextures=True",
"HighDetailActors=True",
"SuperHighDetailActors=True",
"UsePrecaching=True",
"UseTrilinear=True",
"AdapterNumber=-1",
"ReduceMouseLag=True",
"UseTripleBuffering=False",
"UseHardwareTL=True",
"UseHardwareVS=True",
"UseCubemaps=True",
"DesiredRefreshRate=60",
"UseCompressedLightmaps=True",
"UseStencil=True",
"Use16bit=False",
"Use16bitTextures=False",
"MaxPixelShaderVersion=255",
"UseVSync=False",
"LevelOfAnisotropy=1",
"DetailTexMipBias=0.8",
"DefaultTexMipBias=-0.5",
"UseNPatches=False",
"TesselationFactor=1.0",
"CheckForOverflow=False",
"",
"[OpenGLDrv.OpenGLRenderDevice]",
"DetailTextures=True",
"HighDetailActors=True",
"SuperHighDetailActors=True",
"UsePrecaching=True",
"UseCompressedLightmaps=True",
"UseTrilinear=True",
"UseStencil=False",
"MaxTextureUnits=8",
"VARSize=32",
"ReduceMouseLag=False",
"",
"[Engine.NullRenderDevice]",
"DetailTextures=True",
"HighDetailActors=True",
"SuperHighDetailActors=True",
"UsePrecaching=True",
"UseCompressedLightmaps=True",
"UseStencil=False",
"",
"[Editor.EditorEngine]",
"UseSound=True",
"CacheSizeMegs=32",
"GridEnabled=True",
"SnapVertices=False",
"SnapDistance=10.000000",
"GridSize=(X=16.000000,Y=16.000000,Z=16.000000)",
"RotGridEnabled=True",
"RotGridSize=(Pitch=1024,Yaw=1024,Roll=1024)",
"GameCommandLine=-log",
"FovAngleDegrees=90.000000",
"GodMode=True",
"AutoSave=True",
"AutoSaveTimeMinutes=5",
"AutoSaveIndex=6",
"UseAxisIndicator=True",
"MatineeCurveDetail=0.1",
"LoadEntirePackageWhenSaving=0",
"EditPackages=Core",
"EditPackages=Engine",
"EditPackages=Fire",
"EditPackages=Editor",
"EditPackages=UWindow",
"EditPackages=UnrealEd",
"EditPackages=IpDrv",
"EditPackages=GamePlay",
"EditPackages=LineageEffect",
"EditPackages=LineageWarrior",
"EditPackages=LineageNpc",
"EditPackages=LineageNpc2",
"EditPackages=LineageNpcEv",
"EditPackages=LineageMonster",
"EditPackages=LineageMonster2",
"EditPackages=LineageMonster3",
"EditPackages=LineageMonster4",
"EditPackages=LineageVehicle",
"EditPackages=LineageDeco",
"EditPackages=LineageCreature",
"EditPackages=LineageSceneInfo",
"EditPackages=UDebugMenu",
"EditPackages=NWindow",
"EditPackages=LineageSkillEffect",
";EditPackages=WarEffects",
";EditPackages=Decorations",
";EditPackages=WarfareGame",
";EditPackages=IHVDemoContent",
";EditPackages=Pickups",
";EditPackages=WarClassLight",
";EditPackages=WarClassHeavy",
";EditPackages=WarClassMisc",
";EditPackages=AmbientCreatures",
";EditPackages=Vehicles",
";EditPackages=UPreview",
"",
"[UMenu.UnrealConsole]",
"RootWindow=UMenu.UMenuRootWindow",
"UWindowKey=IK_Esc",
"ShowDesktop=True",
"",
"[UMenu.UMenuMenuBar]",
"ShowHelp=True",
"GameUMenuDefault=UTMenu.UTGameMenu",
"MultiplayerUMenuDefault=UTMenu.UTMultiplayerMenu",
"OptionsUMenuDefault=UTMenu.UTOptionsMenu",
"",
"[Engine.GameInfo]",
"bLowGore=False",
"bVeryLowGore=False",
"",
"[UWeb.WebServer]",
";Applications[0]=UTServerAdmin.UTServerAdmin",
";ApplicationPaths[0]=/ServerAdmin",
";Applications[1]=UTServerAdmin.UTImageServer",
";ApplicationPaths[1]=/images",
"DefaultApplication=0",
"bEnabled=False",
"",
"[Engine.LevelInfo]",
"PhysicsDetailLevel=PDL_Medium",
"",
"[Engine.Console]",
"ConsoleKey=9",
"",
"[WindowPositions]",
"GameLog=(X=0,Y=0,XL=512,YL=256)",
"",
"[Secure]",
"SecureModule=False",
"",
"[PrimeShop]",
"UsePrimeShop=false"
};
int main() {
FILE *f = fopen("launcher.dat", "w");
int i;
if (f==NULL) {
perror("Error! Nie mog&#281; pisa&#263; do 'launcher.dat'");
printf("%s\n", "Wszyscy zginiemy! Aaaaa!");
system("PAUSE");
return 1;
}
for (i = 0; i < LAUNCHER_DAT_LINES; i++)
fprintf(f, "%s\n", launcher_dat[i]);
fclose(f);
i = execlp("L2.bin", "L2.bin", "-INI=launcher.dat", (char *)0);
return i;
}

163
docs/l2_races_classes.ini Normal file
View File

@ -0,0 +1,163 @@
// Lineage II races
L2MaxRaces = 6;
L2Race[0] = "Human";
L2Race[1] = "Elf";
L2Race[2] = "Dark Elf";
L2Race[3] = "Orc";
L2Race[4] = "Dwarf";
L2Race[5] = "Kamael";
// Lineage II classes
L2MaxClasses = 137;
L2Class[0] = "Human Fighter";
L2Class[1] = "Warrior";
L2Class[2] = "Gladiator";
L2Class[3] = "Warlord";
L2Class[4] = "Knight";
L2Class[5] = "Paladin";
L2Class[6] = "Dark Avenger";
L2Class[7] = "Rogue";
L2Class[8] = "Treasure Hunter";
L2Class[9] = "Hawkeye";
L2Class[10] = "Human Mystic";
L2Class[11] = "Human Wizard";
L2Class[12] = "Sorceror";
L2Class[13] = "Necromancer";
L2Class[14] = "Warlock";
L2Class[15] = "Cleric";
L2Class[16] = "Bishop";
L2Class[17] = "Prophet";
L2Class[18] = "Elven Fighter";
L2Class[19] = "Elven Knight";
L2Class[20] = "Temple Knight";
L2Class[21] = "Sword Singer";
L2Class[22] = "Elven Scout";
L2Class[23] = "Plains Walker";
L2Class[24] = "Silver Ranger";
L2Class[25] = "Elven Mystic";
L2Class[26] = "Elven Wizard";
L2Class[27] = "SpellSinger";
L2Class[28] = "Elemental Summoner";
L2Class[29] = "Elven Oracle";
L2Class[30] = "Elven Elder";
L2Class[31] = "Dark Fighter";
L2Class[32] = "Paulus Knight";
L2Class[33] = "Shillien Knight";
L2Class[34] = "BladeDancer";
L2Class[35] = "Assassin";
L2Class[36] = "Abyss Walker";
L2Class[37] = "Phantom Ranger";
L2Class[38] = "Dark Mystic";
L2Class[39] = "Dark Wizard";
L2Class[40] = "Spellhowler";
L2Class[41] = "Phantom Summoner";
L2Class[42] = "Shillien Oracle";
L2Class[43] = "Shillien Elder";
L2Class[44] = "Orc Fighter";
L2Class[45] = "Orc Raider";
L2Class[46] = "Destroyer";
L2Class[47] = "Orc Monk";
L2Class[48] = "Tyrant";
L2Class[49] = "Orc Mystic";
L2Class[50] = "Orc Shaman";
L2Class[51] = "Overlord";
L2Class[52] = "Warcryer";
L2Class[53] = "Dwarven Fighter";
L2Class[54] = "Scavenger";
L2Class[55] = "Bounty Hunter";
L2Class[56] = "Artisan";
L2Class[57] = "Warsmith";
L2Class[88] = "Duelist";
L2Class[89] = "Dreadnought";
L2Class[90] = "Phoenix Knight";
L2Class[91] = "HellKnight";
L2Class[92] = "Sagittarius";
L2Class[93] = "Adventurer";
L2Class[94] = "Archmage";
L2Class[95] = "Soultaker";
L2Class[96] = "Arcana Lord";
L2Class[97] = "Cardinal";
L2Class[98] = "Hierophant";
L2Class[99] = "Eva's Templar";
L2Class[100] = "Sword Muse";
L2Class[101] = "Wind Rider";
L2Class[102] = "Moonlight Sentinel";
L2Class[103] = "Mystic Muse";
L2Class[104] = "Elemental Master";
L2Class[105] = "Eva's Saint";
L2Class[106] = "Shillien Templar";
L2Class[107] = "Spectral Dancer";
L2Class[108] = "Ghost Hunter";
L2Class[109] = "Ghost Sentinel";
L2Class[110] = "Storm Screamer";
L2Class[111] = "Spectral Master";
L2Class[112] = "Shillien Saint";
L2Class[113] = "Titan";
L2Class[114] = "Grand Khauatari";
L2Class[115] = "Dominator";
L2Class[116] = "Doomcryer";
L2Class[117] = "Fortune Seeker";
L2Class[118] = "Maestro";
L2Class[123] = "Kamael Male Soldier";
L2Class[124] = "Kamael Female Soldier";
L2Class[125] = "Trooper";
L2Class[126] = "Warder";
L2Class[127] = "Berserker";
L2Class[128] = "Soulbreaker (Male)"; //"Male Soulbreaker";
L2Class[129] = "Soulbreaker (Female)"; //"Female Soulbreaker";
L2Class[130] = "Arbalester";
L2Class[131] = "Doombringer";
L2Class[132] = "Soulhound (Male)"; // male
L2Class[133] = "Soulhound (Female)"; // female
L2Class[134] = "Trickster"; // female
L2Class[135] = "Inspector";
L2Class[136] = "Judicator";
// Sex :)
L2MaxSexes = 2;
L2Sex[0] = "Male";
L2Sex[1] = "Female";
// Races pictures depending on sex
// L2MaxRacePics = L2MaxRaces * L2MaxSexes;
L2RacePic[0] = "human_male.png";
L2RacePic[1] = "human_female.png";
L2RacePic[2] = "elf_male.png";
L2RacePic[3] = "elf_female.png";
L2RacePic[4] = "darkelf_male.png";
L2RacePic[5] = "darkelf_female.png";
L2RacePic[6] = "orc_male.png";
L2RacePic[7] = "orc_female.png";
L2RacePic[8] = "dwarf_male.png";
L2RacePic[9] = "dwarf_female.png";
L2RacePic[10] = "kamael_male.png";
L2RacePic[11] = "kamael_female.png";
// NPC races/classes
// index is level of skill id = 4416
L2MaxNPCRaces = 25;
L2NPCRace[0] = "NPC race index 0 not used";
L2NPCRace[1] = "Undead";
L2NPCRace[2] = "Magic Creatures";
L2NPCRace[3] = "Beasts";
L2NPCRace[4] = "Animals";
L2NPCRace[5] = "Plants";
L2NPCRace[6] = "Humanoids";
L2NPCRace[7] = "Spirits";
L2NPCRace[8] = "Angels";
L2NPCRace[9] = "Demons";
L2NPCRace[10] = "Dragons";
L2NPCRace[11] = "Giants";
L2NPCRace[12] = "Bugs";
L2NPCRace[13] = "Fairies";
L2NPCRace[14] = "Humans";
L2NPCRace[15] = "Elves";
L2NPCRace[16] = "Dark Elves";
L2NPCRace[17] = "Orcs";
L2NPCRace[18] = "Dwarves";
L2NPCRace[19] = "Others";
L2NPCRace[20] = "Non-living Beings";
L2NPCRace[21] = "Siege Weapons";
L2NPCRace[22] = "Defending Army";
L2NPCRace[23] = "Mercenaries";
L2NPCRace[24] = "Unknown Creature";

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -0,0 +1,9 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /&lt; was not found on this server.</p>
<hr>
<address>Apache/2.2.3 (Debian) PHP/5.2.0-8+etch13 Server at forum.vingrad.ru Port 8080</address>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Some files were not shown because too many files have changed in this diff Show More