Сообщения без ответов | Активные темы Текущее время: Ср дек 12, 2018 5:20 am



Ответить на тему  [ Сообщений: 2 ] 
Трейд с сопартийцами (High Five) 
Автор Сообщение
Куда я попал

Зарегистрирован: Чт мар 29, 2018 8:12 am
Сообщений: 48
Сообщение Трейд с сопартийцами (High Five)
Код:
uses
  SysUtils;
 
var
  TRADE_ENABLE: boolean = true;
  TRADE_LIST: array of integer = [
  // ID предмета, Минимальное кол-во, Передаваемое кол-во
    1467, 100, 10000 // Заряд Души: Ранг S
  ];


type
  TNetworkPacket = class
  public
    Current: Integer;
    procedure WriteQ(value: int64);
    procedure WriteD(value: Cardinal);                                               
    procedure WriteH(value: Word);
    procedure WriteC(value: Byte);
    procedure WriteS(value: String);
    function ReadQ(): int64;
    function ReadD(): Cardinal;
    function ReadH(): Word;
    function ReadC(): Byte;
    function ReadS(): String;
    function ToHex(): String;
    constructor Create(pData: PChar; size: Word); overload;
    constructor Create(); overload;
  private
    data: Array[0..10240] of Byte;
  end;


constructor TNetworkPacket.Create(pData: PChar; size: Word);
begin
    inherited Create;
    Move(pData^, PChar(@data[0])^, size);
end;


constructor TNetworkPacket.Create();
begin
    inherited Create;
end;


function TNetworkPacket.ReadQ;
begin
    result:= PInt64(@data[Current])^;
    Current:= Current + sizeof(int64);
end;


function TNetworkPacket.ReadD;
begin
    result:= PCardinal(@data[Current])^;
    Current:= Current + sizeof(Cardinal);
end;


function TNetworkPacket.ReadH;
begin
    result:= PWord(@data[Current])^;
    Current:= Current + sizeof(Word);
end;


function TNetworkPacket.ReadC;
begin
    result:= PByte(@data[Current])^;
    Current:= Current + sizeof(Byte);
end;


function TNetworkPacket.ReadS;
begin
    result:= string(PChar(@data[Current]));
    Current:= Current + (length(result) + 1) * sizeof(Char);
end;


procedure TNetworkPacket.WriteQ;
begin
  (PInt64(@data[Current])^):= value;
  Current:= Current + sizeof(int64);
end;


procedure TNetworkPacket.WriteD;
begin
  (PCardinal(@data[Current])^):= value;
  Current:= Current + sizeof(Cardinal);
end;


procedure TNetworkPacket.WriteH;
begin
  (PWord(@data[Current])^):= value;
  Current:= Current + sizeof(Word);
end;


procedure TNetworkPacket.WriteC;
begin
  (PByte(@data[Current])^):= value;
  Current:= Current + sizeof(Byte);
end;


procedure TNetworkPacket.WriteS;
begin
  Move(value^, PChar(@data[Current])^, (length(value) + 1) * sizeof(Char));
  Current:= Current + (length(value) + 1) * sizeof(Char);
end;


function TNetworkPacket.ToHex;
var
  i: Cardinal;
begin
  result:= '';
  for i:= 0 to Current - 1 do
  begin
    result:= result + IntToHex(data[i], 2);
  end;
end;


function GetContr(Name: string): TL2Control;
var
  i: integer;
begin
  Result:= nil;


  for i:= 0 to 100 do
  begin
    Result:= nil;
    Result:= GetControlByIndex(i);
    if (Result <> nil) and (Result.GetUser.name = Name) then
      break;
  end;
end;


procedure TradeDone(Control: TL2Control);
var
  Pck: TNetworkPacket;
begin
  Pck:= TNetworkPacket.Create;


  Pck.WriteC($1C);
  Pck.WriteD(1);


  Control.SendToServer(Pck.ToHex);
  Pck.Free;
end;


procedure AddTradeItem(ItemOID, ItemCount: cardinal);
var
  Pck: TNetworkPacket;
begin
  Pck:= TNetworkPacket.Create;


  Pck.WriteC($1B);
  Pck.WriteD(1);
  Pck.WriteD(ItemOID);
  Pck.WriteQ(ItemCount);
 
  Engine.SendToServer(Pck.ToHex);
  Pck.Free;
end;


procedure AnswerTradeRequest(MemberControl: TL2Control);
var
  Pck: TNetworkPacket;
begin
  Pck:= TNetworkPacket.Create;


  Pck.WriteC($55);
  Pck.WriteD(1);


  MemberControl.SendToServer(Pck.ToHex);
  Pck.Free;
end;


procedure RequestTrade(ChOID: cardinal);
var
  Pck: TNetworkPacket;
begin
  Pck:= TNetworkPacket.Create;


  Pck.WriteC($1A);
  Pck.WriteD(ChOID);


  Engine.SendToServer(Pck.ToHex);
  Pck.Free;
end;


procedure TradeItemToChar(MemberControl: TL2Control; Member: TL2Char; ItemOID, ItemCount: cardinal);
begin
  RequestTrade(Member.OID);
  delay(500);
  AnswerTradeRequest(MemberControl);
  delay(500);
  AddTradeItem(ItemOID, ItemCount);
  TradeDone(Engine);
  TradeDone(MemberControl);
end;


procedure TradeThread(TRADE_LIST: array of integer);
var
  Member: TL2Char;
  MemberEngine: TL2Control;
  MemberInventory: TInventory;
  Item, MemberItem: TL2Item;
  ItemCount: cardinal;
  ItemName: string;
  i, j: integer;
  Traded: boolean;
begin
  while (true) do
  begin
    delay(100);


    while (User.dead) or (Engine.Status <> lsOnline) do delay(10);
   
    Traded:= false;
    for i:= 0 to Party.Chars.count - 1 do
    begin
      if (Traded) then
break;


      Member:= Party.Chars.items(i);
      if (Member.valid) and (User.DistTo(Member) < 300) then
      begin
        MemberEngine:= GetContr(Member.name);
        if (MemberEngine <> nil) then
        begin
          MemberInventory:= MemberEngine.GetInventory;
          for j:= 0 to length(TRADE_LIST) - 1 do
          begin
            if (Inventory.User.ByID(TRADE_LIST[j], Item)) and
               (
                 (not MemberInventory.User.ByID(TRADE_LIST[j], MemberItem)) or
                 (MemberItem.count <= TRADE_LIST[j + 1])
               ) then
            begin
              print('TRADE :: ' + Member.name + ' нужны ' + Item.name);


              ItemName:= Item.name;
              if (Item.count > TRADE_LIST[j + 2]) then
                ItemCount:= TRADE_LIST[j + 2]
              else
                ItemCount:= Item.count;
               
              TradeItemToChar(MemberEngine, Member, Item.OID, ItemCount);
              delay(1000);
              if not
                 ((Inventory.User.ByID(TRADE_LIST[j], Item)) and
                 (
                   (not MemberInventory.User.ByID(TRADE_LIST[j], MemberItem)) or
                   (MemberItem.count <= TRADE_LIST[j + 1])
                 )) then
                 print('TRADE :: ' + Member.name + ' получил ' + ItemName);   
              Traded:= true;
            end;
         
            inc(j, 2);
          end;
        end;
      end;
    end;
  end;
end;
 
begin
  if (TRADE_ENABLE) then
    Script.NewThread(@TradeThread(TRADE_LIST));
end.

_________________
Оказываю помощь бесплатно только публично на форуме, цените свои и мое время.
AdrenalineScript.com - премиум плагины и скрипты


Пт май 25, 2018 9:06 am
Профиль WWW

Зарегистрирован: Пн дек 01, 2014 9:38 am
Сообщений: 13
Сообщение Re: Трейд с сопартийцами (High Five)
Эта бомба) спасибо!


Пт июн 01, 2018 3:37 am
Профиль
Показать сообщения за:  Сортировать по:  
Ответить на тему   [ Сообщений: 2 ] 

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Разработано: g-yar.
Русская поддержка phpBB