| Рыцарь 
				 
				Регистрация: 25.02.2008 Адрес: г.Волгоград 
					Сообщений: 2,009
				 Сказал Спасибо: 1,285 
		
			
				Имеет 1,458 спасибок в 793 сообщенях
			
		
	      | 
				 Скрипт на продажу 
 Выкладываю скрипт продажи вещей. Как пользоваться, написано в начале скрипта. Основа из скрипта рыбалки. 
	delphi Код: //Автоматизация продажи by NLObP для L2PacketHack v.3.1.8+//
//version 0.1
program SellBot;
{
Скрипт распространяется как есть, и я не несу ответственности
за то, что ВЫ натворили у себя, его используя.
Проверялось на TheAbyss.ru (С6-interlude) и [url]www.lagam.net(c4[/url])
Перед использованием скрипта изменяем под свой сервер, один раз:
  Name='NLObP';  //имя чара для которого включаем скрипт
  max=80;        //размер инвентаря чара
  //установить константу в зависимости от типа игры (С4 или C6-Интерлюд)
  IL=true; //true - IL, false - C4
  //оставить один из них или поставить свой
  kID=1000000; //коэфф вычитаемый из NpcID C4 [url]www.lagam.net[/url]
  kID=1023000; //коэфф вычитаемый из NpcID C6 theAbyss.ru
  //ID продавца
  TraderID=8573; //Фишерман Monakan в Гиран-харборе
  //сюда вписываем ItemID предметов для автопродажи (продается за 1 раз не более 99999 штук)
  //например 1467=Soulshot: S-grade
  TradeSellItem=[1467,1467,1467,1467]; //повторим 4 раза продажу Soulshot: S-grade не более 99999 за каждый раз
  //количество предметов в массиве TradeSellItem (например, повторов продаж одной вещи)
  TradeSellItemCount=4;
Затем для осуществления продажи, делаем каждый раз:
1)Для получения TraderOID требуется отбежать от него (например продавца TraderID=8573
Фишерман Monakan в Гиран-харборе) на причал влево к самой воде и вернуться.
2)На Абисе S>Пакет UserInfo #$04 очень тяжело дождаться, а он нужен для инициализации
скрипта. Нужно купить или продать не нужную вещицу и Пакет UserInfo #$04 прийдет от сервера.
На [url]www.lagam.net(c4[/url]) проще, открываем инвентарь, сняли/одели оружие.
3)Увидим сообщение, что скрипт готов к работе:
  msg.Lines.Add('Скрипт инициализирован!');
  msg.Lines.Add('Социальное действие YES - начать!');
  msg.Lines.Add('Социальное действие  NO - остановиться!');
На форме кнопки старт и стоп дублируют социальные действия.
Всё остальное на форме в разработке и не используется в текущее время.
}
const
  Name='NLObP';  //имя чара для которого включаем скрипт
  max=80;        //размер инвентаря чара
  //установить константу в зависимости от типа игры (С4 или C6-Интерлюд)
  IL=true; //true - IL, false - C4
//  kID=1000000; //коэфф вычитаемый из NpcID C4 [url]www.lagam.net[/url]
  kID=1023000; //коэфф вычитаемый из NpcID C6 theAbyss.ru
  TraderID=8573; //Фишерман Monakan в Гиран-харборе
  //C4 [url]www.lagam.net[/url] и на C6 TheAbyss.ru
  getselllist='menu_select?ask=-1&reply=8';
  //сюда вписываем ItemID предметов для автопродажи
  TradeSellItem=[6904,6905,6906,6907,6920,6921,6922,6923,6924,6925,7686,7695,7696,7697,7698,7699,7700];
  //количество предметов в массиве TradeSellItem
  TradeSellItemCount=17;
//***************************************************************
var
  SellItemOID, SellItemID, SellItemValue, trade: integer;
  TraderOID: integer;
  ListID, i: integer;
  Trade1: TTimer;
  MaxHP, CurHP, MyID, but, MyXpos, MyYpos, MyZpos: integer;
  ColvoHP, NeedBuy, ColvoItm, ColvoItm2, SocialID : integer;
  ReadyToBuy, ReadyToSell, ReadyToMultiSell, add, status : boolean;
  trd, TradeCount, TradeID, EndTradeID, UpdType, ItemOID, ItemID, Lvl:  integer;
  ItemBase:  array[1..3,1..max] of integer;  //все предметы в инвентаре
  ItemBase2:  array[1..3,1..max] of integer; //найденные по ItemID
{
  1 - ObjectID
  2 - ItemID
  3 - ItemCount
}
  offs1, offs2, offs3, offs4, offs5 : integer;
  Label1: TLabel;
  Label2: TLabel;
  Label3: TLabel;
  Label4: TLabel;
  Label5: TLabel;
  Label6: TLabel;
  ComboBox1: TComboBox;
  ComboBox2: TComboBox;
  Edit1: TEdit;
  Edit2: TEdit;
  Edit3: TEdit;
  Edit4: TEdit;
  Button1: TButton;
  Button2: TButton;
  msg: TMemo;
  frm: TForm;
//***************************************************************
//Вызывается при включении скрипта
//***************************************************************
procedure Init;
begin
  if IL then begin //Interlude
    //CreateItemBase
    offs1:=24;
    //InventoryUpdate
    offs2:=22;
    //UserInfo, основной цикл
    offs3:=48;
    //InventoryUpdate, основной цикл
    offs4:=38;
    //ItemList, основной цикл
    offs5:=36;
  end else begin //C4
    offs1:=16;
    offs2:=14;
    offs3:=44;
    offs4:=30;
    offs5:=28;
  end;
  //ПАНЕЛЬКА
  frm:=TForm.Create(nil);
  with frm do
  begin
    Caption:='SellBot by NLObP';
    BorderStyle := bsSizeable;
    Position := poScreenCenter;
    Left := 0;
    Top := 0;
    ClientHeight := 310;
    ClientWidth := 418;
   end;
  //кнопка1
  Button1:=TButton.Create(frm);
  with Button1 do
  begin
    Name:='Button1';
    Parent:=frm;
//    SetBounds(112, 96, 75, 25);
    Left:=112;
    Top:=96;
    Width:=75;
    Height:=25;
    Caption:='Start';
    OnClick:=@Button1Click; { same as b.OnClick := 'ButtonClick' }
  end;
  //кнопка2
  Button2:=TButton.Create(frm);
  with Button2 do
  begin
    Name:='Button2';
    Parent:=frm;
//    SetBounds(112, 96, 75, 25);
    Left:=190;
    Top:=96;
    Width:=75;
    Height:=25;
    Caption:='Stop';
    OnClick:=@Button2Click; { same as b.OnClick := 'ButtonClick' }
  end;
  ComboBox1:=TComboBox.Create(frm);
  with ComboBox1 do
  begin
    Name:='ComboBox1';
    Parent:=frm;
    Left := 8;
    Top := 24;
    Width := 145;
    Height := 21;
    ItemHeight := 13;
    ItemIndex := 0;
    TabOrder := 0;
    Text := 'ComboBox1';
    OnChange:=@ComboBox1Change;
//    OnClick:=@ComboBox1Click;
  end;
  ComboBox2:=TComboBox.Create(frm);
  with ComboBox2 do
  begin
    Name:='ComboBox2';
    Parent:=frm;
    Left := 8;
    Top := 72;
    Width := 145;
    Height := 21;
    ItemHeight := 13;
    TabOrder := 2;
    Text := 'ComboBox2';
    OnChange:=@ComboBox2Change;
//    OnClick:=@ComboBox2Click;
  end;
  Label1:=TLabel.Create(frm);
  with Label1 do
  begin
    Name:='Label1';
    Parent := frm;
    Left := 8;
    Top := 5;
    Width := 50;
    Height := 13;
    Caption := 'Name NPC';
  end;
  Label2:=TLabel.Create(frm);
  with Label2 do
  begin
    Name:='Label2';
    Parent := frm;
    Left := 159;
    Top := 5;
    Width := 34;
    Height := 13;
    Caption := 'NPC ID';
  end;
  Label3:=TLabel.Create(frm);
  with Label3 do
  begin
    Name:='Label3';
    Parent := frm;
    Left := 8;
    Top := 53;
    Width := 52;
    Height := 13;
    Caption := 'Name Item';
  end;
  Label4:=TLabel.Create(frm);
  with Label4 do
  begin
    Name:='Label4';
    Parent := frm;
    Left := 159;
    Top := 53;
    Width := 36;
    Height := 13;
    Caption := 'Item ID';
  end;
  Label5:=TLabel.Create(frm);
  with Label5 do
  begin
    Name:='Label5';
    Parent := frm;
    Left := 288;
    Top := 5;
    Width := 34;
    Height := 13;
    Caption := 'ByPass';
  end;
  Label6:=TLabel.Create(frm);
  with Label6 do
  begin
    Name:='Label6';
    Parent := frm;
    Left := 286;
    Top := 53;
    Width := 26;
    Height := 13;
    Caption := 'Value';
  end;
  Edit1:=TEdit.Create(frm);
  with Edit1 do
  begin
    Name:='Edit1';
    Parent := frm;
    Left := 159;
    Top := 24;
    Width := 121;
    Height := 21;
    TabOrder := 1;
    Text := '0';
  end;
  Edit2:=TEdit.Create(frm);
  with Edit2 do
  begin
    Name:='Edit2';
    Parent := frm;
    Left := 159;
    Top := 72;
    Width := 121;
    Height := 21;
    TabOrder := 3;
    Text := '0';
  end;
  Edit3:=TEdit.Create(frm);
  with Edit3 do
  begin
    Name:='Edit3';
    Parent := frm;
    Left := 286;
    Top := 24;
    Width := 121;
    Height := 21;
    TabOrder := 4;
    Text := 'menu_select?ask=-1&reply=8';
  end;
  Edit4:=TEdit.Create(frm);
  with Edit4 do
  begin
    Name:='Edit4';
    Parent := frm;
    Left := 288;
    Top := 72;
    Width := 121;
    Height := 21;
    TabOrder := 5;
    Text := '0';
  end;
  msg:=TMemo.Create(frm);
  with msg do
  begin
    Parent := frm;
    align:=alBottom;
    ReadOnly:=true;
    ScrollBars:=2;
    Width:=418;
    Height:=180;
    Lines.Add('...');
  end;
  frm.Show;
  trade1:=TTimer.Create(nil);
  trade1.OnTimer:=@Ontrade1;
  trade1.enabled:=false;
  trade1.interval:=1000; //время задержки
end;
//***************************************************************
//Вызывается при выключении скрипта
//***************************************************************
procedure Free;
begin
  ItemBase:=nil;
  ItemBase2:=nil;
  label1.Free;
  label2.Free;
  label3.Free;
  label4.Free;
  label5.Free;
  label6.Free;
  edit1.Free;
  edit2.Free;
  edit3.Free;
  edit4.Free;
  combobox1.Free;
  combobox2.Free;
  button1.Free;
  button2.Free;
  msg.Free;
  frm.Free;
  trade1.OnTimer := nil;
  trade1.Enabled := false;
  trade1.Interval := 0;
  trade1.Free;
  //считываем ID
//  TraderID:=8572;
//  Edit1.Text:=inttostr(TraderID);
end;
//******************************************************************************
procedure Button1Click(Sender: TButton);
begin
//  Button1.Caption := 'Stop';
//  ShowMessage(Sender.Name);
//  frm.ModalResult:=mrOk;
//  if not status then exit;
//  TraderID:=strtoint(Edit1.Text);
  msg.Lines.Add('TraderID:'+inttostr(TraderID));
{  SellItemID:=strtoint(Edit2.Text);
  SellItemValue:=strtoint(Edit4.Text);
  msg.Lines.Add('SellItemID:'+inttostr(SellItemID));
  msg.Lines.Add('SellItemValue:'+inttostr(SellItemValue));
}  Status:=true;
  trade1.enabled:=true;
  msg.Lines.Add('Начинаем продавать...');
end;
//******************************************************************************
procedure Button2Click(Sender: TButton);
begin
  Status:=false;
  trade1.enabled:=false;
  msg.Lines.Add('Хватит на сегодня!');
end;
//******************************************************************************
procedure ComboBox1Click(Sender: TObject);
begin
  ShowMessage(Sender.ClassName);
  frm.ModalResult:=mrOk;
end;
//******************************************************************************
procedure ComboBox1Change(Sender: TObject);
begin
  ShowMessage(Sender.ClassName);
  frm.ModalResult:=mrOk;
  ComboBox1.Items.Add('Новая строка');
  Edit1.Text:=ComboBox1.Items.Strings[ComboBox1.ItemIndex];
//  Edit1.text:=ComboBox1.text;
  ComboBox1.Items.Delete(ComboBox1.ItemIndex);
end;
//******************************************************************************
procedure ComboBox2Click(Sender: TObject);
begin
//  ShowMessage(Sender.Name);
//  frm.ModalResult:=mrOk;
end;
//******************************************************************************
procedure ComboBox2Change(Sender: TObject);
begin
//  ShowMessage(Sender.Name);
//  frm.ModalResult:=mrOk;
end;
//***************************************************************
//21=RequestBypassToServer:s(Cmd)
//посылаем, чтобы получить пакет BuyItem с ListID
procedure RequestByPassToServer(cmd:string);
begin
  buf:=#$21;
  WriteS(cmd);
  SendToServerEx(Name);
end;
//***************************************************************
//s10=SellList:d(Money)h(ListID)w(ListCount)w(ItemType1)h(ObjectID)i(ItemID)d(Count)w(ItemType2)w(h)d(ItemBodyPart)w(EnchantLevel)w(h)w(h)d(refPrice)
//c1E=RequestSellItem:h(ListID)d(SellCount)h(ObjectID)i(ItemID)d(Count)
//продаем по одному типу
procedure RequestSellItem(ItemOID,ItemID,Count:integer);
begin
  if ReadyToSell then begin
    msg.Lines.Add('Продадим предмет OID:'+inttostr(ItemOID)+' ID:'+inttostr(ItemID)+' в кол-ве:'+inttostr(count));
    buf:=#$1E;
    WriteD(ListID);
    WriteD(1);
    WriteD(ItemOID);
    WriteD(ItemID);
    if count>99999 then count:=99999; //макс количество продаваемых вещей
    WriteD(Count);
    SendToServerEx(Name);
  end;
end;
//***************************************************************
//c1F=RequestBuyItem:h(ListID)d(BuyCount)i(ItemID)d(Count)
//купим по одному типу
procedure RequestBuyItem(ItemID,Count:integer);
begin
  if ReadyToBuy then begin
    msg.Lines.Add('Купим предмет ID:'+inttostr(ItemID)+' в кол-ве:'+inttostr(count));
    buf:=#$1F;
    WriteD(ListID);
    WriteD(1);
    WriteD(ItemID);
    WriteD(Count);
    SendToServerEx(Name);
  end;
end;
//***************************************************************
//cA7=RequestMultiSellChoose:h(ListID)d(EntryID)d(Amount)
//продаем по одному типу
procedure RequestMultiSellItem(ListId,EntryID,Count:integer);
begin
  msg.Lines.Add('Обменяем предмет ListID:'+inttostr(ListID)+' EntryID:'+inttostr(EntryID)+' в кол-ве:'+inttostr(count));
  if ReadyToMultiSell then begin
    buf:=#$A7;
    WriteD(ListID);
    WriteD(EntryId);
    WriteD(Count);
    SendToServerEx(Name);
  end;
end;
//***************************************************************
//04=Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ)b(ShiftFlag)
procedure Target(Attacker: Integer);
begin
  buf:=#$04;
  WriteD(Attacker);
  WriteD(MyXpos);
  WriteD(MyYpos);
  WriteD(MyZpos);
  WriteC(00);
  SendToServerEx(Name);
end;
//***************************************************************
procedure TargetAttacker(Attacker: Integer);
begin
  msg.Lines.Add('Attacker='+IntToStr(Attacker)+' Player='+IntToStr(MyID));
  Target(Attacker);
  delay(1000);
  Target(Attacker);
end;
//***************************************************************
// Вся торговля здесь!!!
//***************************************************************
procedure OnTrade1(Sender: TObject);
begin
  //-------------------------------------------------
  //продаем фишерману из массива TradeSellItem
  //-------------------------------------------------
  if ReadyToSell then exit; //если еще не продали предыдущую вещь, то выходим сразу
  //мы у фишермана, продаем всё ненужное
  if TraderOID=0 then begin
    Trade1.enabled:=false; //останавливаем торговлю
    msg.Lines.Add('Не готовы к торговле, нет OID продавца! Требуется отбежать подальше и вернуться.');
    exit; //выходим
  end;
  if (TradeCount=TradeSellItemCount) then begin //проверка на выход из массива
    Trade1.enabled:=false; //останавливаем торговлю
    msg.Lines.Add('Всё продали!');
  end else begin
    if FindItem(TradeSellItem[TradeCount])<>0 then begin //проверка, что предмет есть в инвентаре и его можно продать
      TargetAttacker(TraderOID); //фишермана в таргет
      msg.Lines.Add('Готовы продать:'+inttostr(TradeSellItem[TradeCount]));
      ReadyToSell:=true; //готовы продавать
    end else msg.Lines.Add('Нет такого предмета:'+inttostr(TradeSellItem[TradeCount]));
    inc(TradeCount); //выбираем следующий предмет
    msg.Lines.Add('TradeCount/TradeSellItemCount:'+inttostr(TradeCount)+'/'+inttostr(TradeSellItemCount-1));
  end;
end;
//******************************************************************************
procedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemID
var
  i, j, ListCount: integer;
begin
  for i:=1 to max do begin
    //очищаем масив
    ItemBase[1,i]:=0;
    ItemBase[2,i]:=0;
    ItemBase[3,i]:=0;
  end;
  ColvoItm:=0;
  j:=4; //смещение для ListCount
  ListCount:=ReadH(j); //количество итемов не должно превышать max!
  if ListCount>max then ListCount:=max;
  j:=8; //смещение для ObjectID
  //Пробегаем по Инвентарю и сохраняем ObjectID соответствующие необходимым ItemID
  for i:=1 to ListCount do begin
    itemBase[1,i]:=ReadD(j); //OID
    itemBase[2,i]:=ReadD(j); //ItemID
    itemBase[3,i]:=ReadD(j); //ItemCount
    //Say('i='+inttostr(i)+' ItemBase[1,i]='+IntToStr(ItemBase[1,i])+' ItemBase[2,i]='+IntToStr(ItemBase[2,i])+' ItemBase[3,i]='+IntToStr(ItemBase[3,i]));
    //1B=ItemListPacket:w(window)w(ListCount)w(itemType1)h(ObjectID)i(ItemID)d(count)w(itemType2)w(CustType1)w(isEquipped)d(BodyPart)w(EnchantLevel)w(CustType2)
    j:=j+offs1; //16 для С4, 24 для интерлюдии
  end;
  ColvoItm:=ListCount;
  msg.Lines.Add('>ColvoItm='+IntToStr(Colvoitm));
end;
//******************************************************************************
//27=InventoryUpdate:w(count)w(1add2mod3remove)w(itemType1)d(ObjectID)i(ItemId)d(Count)w(itemType2)w(cusType1)w(isEquipped)d(BodyPart)w(EnchantLevel)w(cusType2)
procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID
var
  i, ii, j, ObjID, ItemID, ItemCount, ListCount, UpdType: integer;
  add : boolean;
begin
  add:=false;
  ListCount:=ReadH(2); //количество итемов
  //Пробегаем по Инвентарю и сохраняем пары ObjectID - Lvl
  j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
//  Say('Апдейт базы!');
  for i:=1 to ListCount do begin
    UpdType:=ReadH(j);
    j:=j+2;
    ObjID:=ReadD(j);       //ObjectID
    ItemID:=ReadD(j);     //ItemID
    ItemCount:=ReadD(j); //Count
//    Say('Предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ItemID));
    case UpdType of
      1: begin
         for ii:=1 to max do
           if (ItemBase[1,ii]=0) and (add=false) then begin
             ItemBase[1,ii]:=ObjID;
             ItemBase[2,ii]:=ItemID;
             ItemBase[3,ii]:=ItemCount;
             msg.Lines.Add('Добавили предмет!');
             msg.Lines.Add('i='+inttostr(ii)+' ItemBase[1,ii]='+IntToStr(ItemBase[1,ii])+' ItemBase[2,ii]='+IntToStr(ItemBase[2,ii])+' ItemBase[3,ii]='+IntToStr(ItemBase[3,ii]));
             ColvoItm:=ColvoItm+ItemCount;
             add:=true;
           end;
      end;
      2: begin
        for ii:=1 to max do
           if ItemBase[1,ii]=ObjID then begin
             ItemBase[3,ii]:=ItemCount;
             msg.Lines.Add('Изменяем параметры предмета!');
             msg.Lines.Add('i='+inttostr(ii)+' ItemBase[1,ii]='+IntToStr(ItemBase[1,ii])+' ItemBase[2,ii]='+IntToStr(ItemBase[2,ii])+' ItemBase[3,ii]='+IntToStr(ItemBase[3,ii]));
           end;
      end;
      //удален
      3: begin
           for ii:=1 to max do
             if ItemBase[1,ii]=ObjID then begin
               msg.Lines.Add('Удаляем предмет!');
               msg.Lines.Add('i='+inttostr(ii)+' ItemBase[1,ii]='+IntToStr(ItemBase[1,ii])+' ItemBase[2,ii]='+IntToStr(ItemBase[2,ii])+' ItemBase[3,ii]='+IntToStr(ItemBase[3,ii]));
               ItemBase[1,ii]:=0;
               ItemBase[2,ii]:=0;
               ItemBase[3,ii]:=0;
               ColvoItm:=ColvoItm-ItemCount;
             end;
      end;
    end;
    j:=j+offs2; //14 для С4, 22 для интерлюдии
  end;
  msg.Lines.Add('>>ColvoItm='+IntToStr(Colvoitm));
end;
//******************************************************************************
function FindItem(item:integer) : integer; //находим в инвентаре все предметы с ItemID
var
  i, j : integer;
begin
  for i:=1 to max do begin
    //очищаем масив
    ItemBase2[1,i]:=0;
    ItemBase2[2,i]:=0;
    ItemBase2[3,i]:=0;
  end;
  ColvoItm2:=0;
  j:=1;
  for i:=1 to max do begin
    //находим подходящий предмет
    if (ItemBase[2,i]=item) then begin
      msg.Lines.Add('i='+inttostr(i)+' ItemBase[1,i]='+IntToStr(ItemBase[1,i])+' ItemBase[2,i]='+IntToStr(ItemBase[2,i])+' ItemBase[3,i]='+IntToStr(ItemBase[3,i]));
      ItemBase2[1,j]:=ItemBase[1,i];
      ItemBase2[2,j]:=ItemBase[2,i];
      ItemBase2[3,j]:=ItemBase[3,i];
      ColvoItm2:=ColvoItm2+ItemBase[3,i];
      inc(j);
    end;
  end;
  result:=colvoitm2;
  msg.Lines.Add('ColvoItm2='+IntToStr(Colvoitm2));
end;
//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
    //**************************************************************************
    //не обрабатываем пустые пакеты
    if pck='' then exit;
    //**************************************************************************
    //продажа состоит из следующих шагов:
    //1. таргет  на продавце, пауза, снова таргет c04=Action, c04=Action
    //2. приходит s0F=NpcHtmlMessage:d(MessageID)s(HTML)d(d)
    //3. шлем выбранный пункт из меню c21=RequestBypassToServer:s(Cmd)
    //4. приходит s10=SellList:d(Money)h(ListID)w(ListCount)w(ItemType1)h(ObjectID)i(ItemID)d(Count)w(ItemType2)w(h)d(ItemBodyPart)w(EnchantLevel)w(h)w(h)d(refPrice)
    //5. FindItem(ID) найдем OID, Count нужной вещи по ID
    //6. шлем c1E=RequestSellItem:h(ListID)d(SellCount)h(ObjectID)i(ItemID)d(Count)
    //**************************************************************************
    if ReadyToSell and (TraderOID<>0) then begin
      if (ConnectName=Name) and FromServer then begin
        case pck[1] of
          //после того, как мы взяли в таргет продавца приходит этот пакет (#$0F)
          //s0F=NpcHtmlMessage:d(MessageID)s(HTML)d(d)
          #$0F: begin
            msg.Lines.Add('S>Пакет NpcHtmlMessage #$0F');
            if ReadD(2)=TraderOID then begin
              delay(1000); //делаем небольшую паузу, чтобы пакеты шли в правильном порядке
              //шлем запрос выбора пункта - продажа
              //c21=RequestBypassToServer:s(Cmd)
              RequestByPassToServer(GetSellList);
              msg.Lines.Add('C>Пакет RequestBypassToServer #$21 (sell)');
            end;
          end;
          //после выбора пункта - продажа, приходит этот пакет (#$10)
          //s10=SellList:d(Money)h(ListID)w(ListCount)w(ItemType1)h(ObjectID)i(ItemID)d(Count)w(ItemType2)w(h)d(ItemBodyPart)w(EnchantLevel)w(h)w(h)d(refPrice)
          #$10: begin
            delay(1000); //делаем небольшую паузу, чтобы пакеты шли в правильном порядке
            msg.Lines.Add('S>Пакет SellList #$10');
            ListID:=ReadD(6); //запоминаем, он все время разный
            msg.Lines.Add('ListID='+inttostr(ListID));
            //шлем запрос на продажу
            //c1E=RequestSellItem:h(ListID)d(SellCount)h(ObjectID)i(ItemID)d(Count)
            msg.Lines.Add('C>Пакет RequestSellItem #$1E');
            //продадим первый из списка
            msg.Lines.Add('FindItem: OID:'+IntToStr(ItemBase2[1,1])+' ID:'+IntToStr(ItemBase2[2,1])+' Count:'+IntToStr(ItemBase2[3,1]));
            RequestSellItem(ItemBase2[1,1],ItemBase2[2,1],ItemBase2[3,1]);
            ReadyToSell:=false; //закончили с предметом
          end;
        end;
      end;
    end;
  //****************************************************************************
  if (ConnectName=Name) and FromServer then begin
    case pck[1] of
      #$04: begin
          //msg.Lines.Add('S>Пакет UserInfo #$04');
          //пакет с инфой о моём чаре
          i:=2;
          MyXpos:=ReadD(i); //получаю координату х моего чара
          MyYpos:=ReadD(i); //получаю координату у моего чара
          MyZpos:=ReadD(i); //получаю координату z моего чара
          //Запоминаем ИД
          i:=18;
          MyID:=ReadD(i); //получаю ид моего чара
          //смещение переменное, зависит от имени (LenName*2+2)
          i:=i+(Length(Name)*2+2)+offs3; //44 для С4, 48 для IL
          MaxHP:=ReadD(i);
          CurHP:=ReadD(i);
          //********************************************************************
          //проверка на готовность скрипта
          if (MyID<>0) and (TraderOID<>0) and (TraderID<>0) then begin // and (TraderOID<>0) and (TraderID<>0) and (SellItemOID<>0) and (SellItemID<>0) and (SellItemValue<>0) and not status
            msg.Lines.Add('Скрипт инициализирован!');
            msg.Lines.Add('Социальное действие YES - начать!');
            msg.Lines.Add('Социальное действие  NO - остановиться!');
          end;
      end;
      //***************************************************************
      //16=NpcInfo:h(ObjectID)d(NpcTypeID)d(IsAttackable)d(X)d(Y)d(Z)d(Heading)d(d)d(Maspd)d(Paspd)d(runSpd)d(walkSpd)d(swimRSpd)d(swimWSpd)d(flRSpd)d(flWSpd)d(FlyRSpd)d(FlyWSpd)f(ProperMul)f(Paspd)f(CollisRadius)f(CollisHeight)d(RHand)d(d)d(LHand)b(nameabove)b(isRun)b(isInFight)b(isAlikeDead)b(isSummoned)s(Name)s(Title)d(d)d(d)d(karma?)d(abnEffect)d(d)d(d)d(d)d(d)b(c)b(Team)f(collisRadius)f(collisHeight)d(d)
      #$16: begin
          msg.Lines.Add('S>Пакет NpcInfo #$16');
          //считываем ID
//          TraderID:=strtoint(Edit1.Text);
          if ReadD(6)=(kID+TraderID) then begin
            TraderOID:=ReadD(2);
            msg.Lines.Add('TraderOID='+inttostr(TraderOID));
          end;
      end;
      //***************************************************************
      //1B=ItemListPacket:w(window)w(ListCount)w(itemType1)h(ObjectID)i(ItemID)d(count)w(itemType2)w(CustType1)w(isEquipped)d(BodyPart)w(EnchantLevel)w(CustType2)d(Augment)d(--)
      //ItemList - 28 для C4, 36 - IL
      #$1B: begin
          msg.Lines.Add('S>Пакет ItemListPacket #$1B');
          CreateItemBase; //создание базы предметов
      end;
      //***************************************************************
      //27=InventoryUpdate:w(count)w(1add2mod3remove)w(itemType1)d(ObjectID)i(ItemId)d(Count)w(itemType2)w(cusType1)w(isEquipped)d(BodyPart)w(EnchantLevel)w(cusType2)-(8)
      //необходимо уточнить ItemID для своего сервера!!!
      //запоминаем ObjectID Lure и ColvoLure
      #$27: begin     // 41(42) для IL, 32(34) для С4
          msg.Lines.Add('S>Пакет InventoryUpdate #$27');
          UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета
      end;
    end;
  end;
  //****************************************************************************
  if (ConnectName=Name) and FromClient then begin
    case pck[1] of
      //Социальные действия
      #$1B: begin
        //msg.Lines.Add('C>Пакет RequestSicialAction #$1B');
        case ReadD(2) of
          //социальное действие Yes для начала ловли
          6: begin
//            if not status then exit;
            Status:=true;
            trade1.enabled:=true;
            msg.Lines.Add('Начинаем продавать...');
            //не передаем серверу
            pck:='';
          end;
          //социальное действие No для окончания
          5: begin
            Status:=false;
            trade1.enabled:=false;
            msg.Lines.Add('Хватит на сегодня!');
            //не передаем серверу
            pck:='';
          end;
        end;
      end;
      //ValidatePosition пакет от клиента с моими кординатами
      #$48: begin
        //msg.Lines.Add('C>Пакет ValidatePosition #$48');
        MyXpos:=ReadD(2); //получаю координату х моего чара
        MyYpos:=ReadD(6); //получаю координату у моего чара
        MyZpos:=ReadD(10); //получаю координату z моего чара
      end;
    end;
  end;
end.
 
ЗЫЖ что-то отзывов нет, не работает что ли?  			 Последний раз редактировалось NLObP, 25.04.2008 в 13:34.
 |