Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Lineage II (https://forum.zone-game.info/forumdisplay.php?f=34)
-   -   Работа над Goddess of Destruction (part 5) (https://forum.zone-game.info/showthread.php?t=17274)

DXVSI 15.07.2013 19:18

Re: Работа над Goddess of Destruction (part 5)
 
Кто может скинуть рабочие пакеть UserInfo и CharInfo?

kloni1 16.07.2013 22:15

Re: Работа над Goddess of Destruction (part 5)
 
Подскажите пожалуйста, какой пакетик отвечает за то, что когда персонаж получает 4 профессию он подлетает вверх.

Gaikotsu 16.07.2013 23:27

Re: Работа над Goddess of Destruction (part 5)
 
обычный пакет использования социалки

kloni1 17.07.2013 00:02

Re: Работа над Goddess of Destruction (part 5)
 
Цитата:

Сообщение от Gaikotsu (Сообщение 311288)
обычный пакет использования социалки

Спасибо нашел :)

Seneon 18.07.2013 10:36

Re: Работа над Goddess of Destruction (part 5)
 
Ребята может кто дать ссылку на папку system с devmode для LineageII Goddess of Destruction - Epeisodion
буду благодарен!

Hint 18.07.2013 10:50

Re: Работа над Goddess of Destruction (part 5)
 
Пакет ExUserInfo. Разбирал "на глаз", анализируя трафик, поэтому мог где-нибудь ошибиться. Если заполните пробелы, буду благодарен.

procedure TGameStream.ExUserInfoPacket(Packet: TGamePacket);
var
  I, Flags, Size: Integer;
  Clan: TClan;
 
  function ReadBlockSize(Fixed: Integer = 0): Integer;
  begin
    Result := Packet.ReadH;
    if (Fixed > 0) and (Result <> Fixed) then raise EBadPacket.Create('Invalid block size!');
  end;
 
begin
  with Packet do
    begin
      Player.ObjectId := ReadD;
      ReadH; // Size
      ReadH;
      ReadC;
      Flags := ReadD;
 
      if ((Flags shr 15) and 1) = 1 then
        begin
          ReadD;
        end;
 
      if ((Flags shr 14) and 1) = 1 then // 12, 14?
        begin
          ReadBlockSize;
 
          Player.Name := ReadS2;
          ReadC;
          Player.Race := ReadC;
          Player.Sex := ReadC;
          Player.BaseClassId := ReadD;
          Player.ClassId := ReadD;          
          Player.Level := ReadC;
        end;
 
      if ((Flags shr 13) and 1) = 1 then
        begin
          ReadBlockSize(14);
 
          Player.Str := ReadH;
          Player.Dex := ReadH;
          Player.Con := ReadH;
          Player.Int := ReadH;
          Player.Wit := ReadH;
          Player.Men := ReadH;
        end;
 
      if ((Flags shr 12) and 1) = 1 then // 12, 14?
        begin
          ReadBlockSize(14);
 
          Player.MaxHP := ReadD;
          Player.MaxMP := ReadD;
          Player.MaxCP := ReadD;
        end;
 
      if ((Flags shr 11) and 1) = 1 then
        begin
          ReadBlockSize(38);
 
          Player.HP := ReadD;
          Player.MP := ReadD;
          Player.CP := ReadD;
          Player.SP := ReadQ;
          Player.Exp := ReadQ;
          Player.ExpProgress := ReadF;
        end;
 
      if ((Flags shr 10) and 1) = 1 then
        begin
          ReadBlockSize(3);
 
          ReadC;
        end;
 
      if ((Flags shr 9) and 1) = 1 then // ?
        begin
          ReadBlockSize(15);
 
          Skip(13);
        end;
 
      if ((Flags shr 8) and 1) = 1 then
        begin
          ReadBlockSize(5);
 
          ReadC;
          Player.PrivateStoreType := ReadC;
          ReadC;
        end;
 
      if ((Flags shr 23) and 1) = 1 then
        begin
          ReadBlockSize(56);
 
          ReadH;
          Player.PAtk := ReadD;
          Player.PAtkSpd := ReadD;
          Player.PDef := ReadD;
          Player.EvasionRate := ReadD;
          Player.Accuracy := ReadD;
          Player.CriticalHit := ReadD;
          Player.MAtk := ReadD;
          Player.MAtkSpd := ReadD;
          Player.PAtkSpd := ReadD;
          Player.MAccuracy := ReadD;
          Player.MDef := ReadD;
          Player.MEvasionRate := ReadD;
          Player.MCriticalHit := ReadD;
        end;
 
      if ((Flags shr 22) and 1) = 1 then // 17 or 22
        begin
          ReadBlockSize(14);
 
          Player.Elements.Fire := ReadH;
          Player.Elements.Water := ReadH;
          Player.Elements.Wind := ReadH;
          Player.Elements.Earth := ReadH;
          Player.Elements.Holy := ReadH;
          Player.Elements.Dark := ReadH;
        end;
 
      if ((Flags shr 21) and 1) = 1 then
        begin
          ReadBlockSize(18);
 
          Player.Pos.X := ReadD;
          Player.Pos.Y := ReadD;
          Player.Pos.Z := ReadD;
          ReadD;
        end;
 
      if ((Flags shr 20) and 1) = 1 then // ?
        begin
          ReadBlockSize(18);
 
          for I := 1 to 4 do
            begin
              ReadH; // Run Speed
              ReadH; // Walk Speed
            end;
        end;
 
      if ((Flags shr 19) and 1) = 1 then
        begin
          ReadBlockSize(18);
 
          ReadF;
          ReadF;
        end;
 
      if ((Flags shr 18) and 1) = 1 then // ?
        begin
          ReadBlockSize(18);
 
          ReadF;
          ReadF;
        end;
 
      if ((Flags shr 17) and 1) = 1 then // 17 or 22
        begin
          ReadBlockSize(5);
 
          Player.Elements.AttackType := ReadC;
          Player.Elements.AttackPower := ReadH;
        end;
 
      if ((Flags shr 16) and 1) = 1 then
        begin
          ReadBlockSize;
 
          Player.Title := ReadS2;
          ReadH; // Subdivision
          Player.Clan.Id := ReadD;
          ReadD;
          Player.Clan.CrestId := ReadD;
          ReadD;
          ReadC;
          Player.Clan.AllyId :=ReadD;
          Player.Clan.AllyCrestId := ReadD;
          ReadC; // PartyRoom
        end;
 
      if ((Flags shr 31) and 1) = 1 then
        begin
          ReadBlockSize(22);
 
          Skip(12);
          Player.PvP := ReadD;
          Player.Recomendations := ReadH;
          ReadH;
        end;
 
      if ((Flags shr 30) and 1) = 1 then // ?
        begin
          Size := ReadBlockSize;
 
          Skip(Size - 2);
        end;
 
      if ((Flags shr 29) and 1) = 1 then // ?
        begin
          Size := ReadBlockSize;
 
          Skip(Size - 2);
        end;
 
      if ((Flags shr 28) and 1) = 1 then
        begin
          ReadBlockSize(4);
 
          ReadC;
          Player.IsStanding := ReadBoolC;
        end;
 
      if ((Flags shr 27) and 1) = 1 then // ?
        begin
          ReadBlockSize(10);
 
          Player.NameColor := ReadD;
          Player.TitleColor := ReadD;
        end;
 
      if ((Flags shr 26) and 1) = 1 then // ?
        begin
          Size := ReadBlockSize;
 
          Skip(Size - 2);
        end;
 
      if ((Flags shr 25) and 1) = 1 then // ?
        begin
          Size := ReadBlockSize;
 
          Skip(Size - 2);
        end;
 
      EndOfPacket;
    end;       
 
  ...
end;
Code: Pascal

DXVSI 18.07.2013 12:31

Re: Работа над Goddess of Destruction (part 5)
 
Кто может поделится рабочим shuttle_data ?

alexteam 18.07.2013 13:06

Re: Работа над Goddess of Destruction (part 5)
 
remove this post.

Hint 18.07.2013 13:49

Re: Работа над Goddess of Destruction (part 5)
 
Цитата:

Сообщение от alexteam (Сообщение 311453)
стало не так увлекательно. правда ?

Сути не меняет. Только номера от 0 и выше, а не задом наперёд.

Добавлено через 3 минуты
ExNPCInfo пока так:
procedure TGameStream.ExNPCInfoPacket(Packet: TGamePacket);
var
  I, Count, Flags: Integer;
  NPC: TNPC;
  Clan: TClan;
begin
  with Packet do
    begin
      NPC.ObjectId := ReadD;
      NPCs.Get(NPC.ObjectId, NPC);
 
      ReadC; // Packet Type (0, 1, 2)
      ReadH; // $25
      ReadC; // $ED or $60
      Flags := ReadD;
      ReadC;
      NPC.IsAttackable := ReadBoolC;
      ReadH;
      NPC.Name := ReadS;
      NPC.Title := ReadS;
      ReadH; // Data Size
 
      if ((Flags shr 27) and 1) = 1 then
        begin
          NPC.ClassId := ReadD - 1000000;
          NPC.Pos.X := ReadD;
          NPC.Pos.Y := ReadD;
          NPC.Pos.Z := ReadD;
          NPC.Heading := ReadD;
          NPC.MAtkSpd := ReadD;
          NPC.PAtkSpd := ReadD;
          ReadH;
          ReadH;
          ReadH;
          ReadH;
        end;
 
      if ((Flags shr 6) and 1) = 1 then
        begin
          ReadD;
          ReadD;
          ReadD;
        end;
 
      if ((Flags shr 27) and 1) = 1 then
        begin
          NPC.VisibleName := ReadBoolC;
          NPC.IsRunning := ReadBoolC;
          NPC.IsInCombat := ReadBoolC;
          NPC.IsAlikeDead := ReadBoolC;
          NPC.Invisible := ReadBoolC;
          Skip(6);
          NPC.CurHP := ReadD;
          NPC.MaxHP := ReadD;
          ReadC;
 
          Count := ReadH;
          for I := 1 to Count do ReadH;
        end;
    end;
Code: Pascal

alexteam 18.07.2013 14:07

Re: Работа над Goddess of Destruction (part 5)
 
Цитата:

Сути не меняет
ну если то откуда можно взять длину битовой маски и то как клиент ее чекает сути не меняет. то считайте что вы ничего не видели.

п.с.
Цитата:

ReadH; // $25
ReadC; // $ED or $60
Flags := ReadD;
по тем же причинам. заведомо неправильно.


Текущее время: 20:46. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot