Poprawne zapisanie pakietów.

0

Witam. Mam problem z poprawnym rozpisaniem pakietów. Otóż chodzi o ten skrypt:

 procedure Dzialaj(typ:string);
var
PacketBuffer: array [0..1000] of byte;
ProcessID: Cardinal;
begin
GetWindowThreadProcessId(FindWindow('Gierka',Nil), @ProcessID);
PacketBuffer[0] := $0B;
PacketBuffer[1] := $00;
PacketBuffer[2] := $84;
PacketBuffer[3] := $FF;
PacketBuffer[4] := $FF;
PacketBuffer[5] := $07;
PacketBuffer[6] := $00;
PacketBuffer[7] := $00;

if(typ='Thing1')then
PacketBuffer[8] := $D5;
PacketBuffer[9] := $07;

if(typ='Thing2')then
PacketBuffer[8] := $D6;
PacketBuffer[9] := $07;

if(typ='Thing3')then
PacketBuffer[8] := $CF;
PacketBuffer[9] := $0F;

if(typ='Thing4')then
PacketBuffer[8] := $D0;
PacketBuffer[9] := $0F;

if(typ='Thing7')then
PacketBuffer[8] := $0F;
PacketBuffer[9] := $0E;

//na koniec to
PacketBuffer[10] := $00;
PacketBuffer[11] := $01;

SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE);
end;

Do pewnego momentu działa wszystko poprawnie. Załóżmy że chcę wysłać pakiet z Thing1, więc cały początek jest dobry ( aż do pakietu 7), później 8 pakiet z thing1 też jest poprawny i niestety pakiet 9 jest wysyłany z thing9 niestety, czyli kończy się to $D5, $0E, $00, $01. Chciałbym by kończyło się to tak: $D5 $07, $00, $01.

Co zrobiłem nie tak że idzie to nie po mojej myśli?

0

Argument typ nie powinien być łańcuchem znaków, a liczbą - naturalną, enumem (to też liczba); Dzięki temu nie będziesz musiał robić paskudnych drabinek **If**ów, które w dodatku nie robią tego, czego od nich oczekujesz;

Usiądź w końcu do jakiegoś kursu programowania, bo po raz kolejny hakujesz tę Tibię, a nie masz pojęcia o podstawowych, powtarzam, podstawowych konstrukcjach języka, takich jak grupowanie instrukcji; Więc nie dziw się, że kod działa źle, skoro żaden warunek nie grupuje znajdujących się pod nimi dwóch instrukcji, a tylko jedną;

I nadal używasz bufora o ogromnej wiekości, a używasz tylko i wyłącznie jego dwunastu wiodących bajtów.

0

Zmieniłem na:

 procedure Dzialaj(typ:string);
var
PacketBuffer: array [0..1000] of byte;
ProcessID: Cardinal;
begin
GetWindowThreadProcessId(FindWindow('Gierka',Nil), @ProcessID);
PacketBuffer[0] := $0B;
PacketBuffer[1] := $00;
PacketBuffer[2] := $84;
PacketBuffer[3] := $FF;
PacketBuffer[4] := $FF;
PacketBuffer[5] := $07;
PacketBuffer[6] := $00;
PacketBuffer[7] := $00;
 
if(typ='Thing1') then PacketBuffer[8] := $D5;
if(typ='Thing1') then PacketBuffer[9] := $07;
 
if(typ='Thing2') then PacketBuffer[8] := $D6;
if(typ='Thing2') then PacketBuffer[9] := $07;
 
if(typ='Thing3') then PacketBuffer[8] := $CF;
if(typ='Thing3') then PacketBuffer[9] := $0F;
 
if(typ='Thing4') then PacketBuffer[8] := $D0;
if(typ='Thing4') then PacketBuffer[9] := $0F;
 
if(typ='Thing5') then PacketBuffer[8] := $0F;
if(typ='Thing5') then PacketBuffer[9] := $0E;
 
//na koniec to
PacketBuffer[10] := $00;
PacketBuffer[11] := $01;
 
SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE);
end; 

Śmiga jak należy. Czytam troszkę (na ile mi czas pozwala) troszkę podstaw i przy tym staram się majstrować co nie co przy "bocie" do OTS.

1

Trochę do d**y, bo każde wywołanie tej procedury to sprawdzenie dziesięciu warunków, a potrzeba wykonać tylko jeden; Do grupowania instrukcji (gdziekolwiek i jakichkolwiek, uogólniają) służy blok Begin End; Poza tym, jeśli już modyfikować Twoją drabinkę, to z użyciem słówka Else, aby po spełnieniu danego warunku, kolejne już nie były sprawdzane:

if(typ='Thing1')then
begin
  PacketBuffer[8] := $D5;
  PacketBuffer[9] := $07;
end
else
  if(typ='Thing2')then
  begin
    PacketBuffer[8] := $D6;
    PacketBuffer[9] := $07;
  end
  else
    if(typ='Thing3')then
    begin
      PacketBuffer[8] := $CF;
      PacketBuffer[9] := $0F;
    end
    else 
      if(typ='Thing4')then
      begin
        PacketBuffer[8] := $D0;
        PacketBuffer[9] := $0F;
      end
      else
      //if(typ='Thing7')then
      begin
        PacketBuffer[8] := $0F;
        PacketBuffer[9] := $0E;
      end;

Ale to i tak potworny potwór i należy się pozbyć tych warunków; Do tego celu należy zmienić typ argumentu na wartość liczbową, czyli na przykład zadeklarować sobie kilka stałych:

const
  THING_1 = 0;
  THING_2 = 2;
  THING_3 = 4;
  THING_4 = 6;
  THING_5 = 8;

aby móc je podać w parametrze tej procedury; Dałoby to również możliwość skorzystania z instrukcji wyboru (Case Of), ale nie o to mi chodzi; Dostając w argumencie liczbę, będzie możliwość obliczenia miejsca, z którego można by było przekopiować te dwa bajty pod indeksy 8 i 9 - przykład poniżej:

procedure DoMagic(AThing: Integer);
const
  PACKET_BUFFER: array [0 .. 11] of Byte = ($0B, $00, $84, $FF, $FF, $07, $00, $00, $00, $00, $00, $01);
  PACKET_THINGS: array [0 .. 9]  of Byte = ($D5, $07, $D6, $07, $CF, $0F, $D0, $0F, $0F, $0E);
var
  LPacket: array [0 .. 11] of Byte;
  LProcessID: Cardinal;
begin
  Move(PACKET_BUFFER[0], LPacket[0], 12);
  Move(PACKET_THINGS[AThing], LPacket[8], 2);
 
  GetWindowThreadProcessId(FindWindow('Gierka', nil), @LProcessID);
  SendPacket(LProcessID, @LPacket, True, False);
end;

Tak, to jest milion Twoich linii kodu, skompresowane i zoptymalizowane do dwóch wywołań procedury Move; Pewne rzeczy uprościłem, dzięki temu widzimy np. hardkodowane indeksy do komórek bufora pakietu, ale do tego też można sobie dorobić stałe, jeśli to komuś przeszkadza; Pisałem z głowy, w razie czego poprawi się;

Edit: Używasz dwóch funkcji API systemu, ale nie kontrolujesz wartości przez nie zwracanych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1