Показать сообщение отдельно
Старый 23.10.2007, 23:29   #47
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию Re: ДА БУДЕТ БОТ!

Внес изменения в рыбалку для работы на Интерлюде. Пробуйте.

Код:
//Автоматизация ловли рыбы для Interlude by NLObP
//возможность нескольких одновременных скриптов
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656

//Изменения для работы на Интерлюде

//Необходимо затариться удочкой и крючками, шотами
//выучить соответствующие скиллы
//1 одеть и снять: удочку, крючек, мечь, щит для определения ObjectID
//2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID

//Социальное действие YES - начать
//Социальное действие NO - остановиться

//Enjoy!

{Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.}

const
  Name='NLObP'; //изменить на имя чара

  fish=1312;
  pump=1313;
  reel=1314;

var
  timer: TTimer;
  status, status2, RodInUse: boolean;
  Lure, ColvoLure, Shot, ColvoShot, CharObjID: Integer;
  SocialID: Integer;
  Cmd:string;

//******************************************************************************
//
//******************************************************************************
procedure Init; //Вызывается при включении скрипта
begin
  Shot:=0;
  Status:=false;
  Status2:=false;
  RodInUse:=false;

  timer:=TTimer.Create(nil);
  timer.OnTimer:=@OnTimer;
  timer.enabled:=false;
  timer.interval:=5000; //время задержки
  Say('1 одеть и снять: удочку, крючек, мечь, щит для определения ObjectID!');
  Say('2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID!');

end;

//******************************************************************************
//
//******************************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
  timer.Free;
end;

//******************************************************************************
//пакет 2F=RequestMagicSkillUse:h(MagicID)d(CtrlPressed)b(ShiftPressed)
procedure MagicSkillUse(MagicID:integer);
begin
    buf:=#$2F;
    WriteD(MagicID);
    WriteD(00);
    WriteC(00);
    SendToServerEx(Name);
end;

//******************************************************************************
procedure UseItem(ObjID:integer);
begin
    buf:=#$14;
    WriteD(ObjID);
    WriteD(00);
    SendToServerEx(Name);
end;

//******************************************************************************
//посылаем сообщение, которое видно только в окне бота
//можно использовать для отладки
procedure Say(msg:string);
begin
  buf:=hstr('4A 00 00 00 00');
  WriteD(2);
  WriteS(Name);
  WriteS(msg);
  SendToClientEx(Name);
end;

//******************************************************************************
procedure Fishing;
begin
  if ColvoLure<>0 then MagicSkillUse(fish)
  else begin
    Status:=false;
    RodInUse:=false;
    Say('Кончились крючки!');
  end;
end;

//******************************************************************************
procedure Pumping;
begin
  if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
  MagicSkillUse(pump);
end;

//******************************************************************************
procedure Reeling;
begin
  if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
  MagicSkillUse(reel);
end;

//******************************************************************************
//ItemList - Interlude
{
1 1      writeC(0x1B);
2 2      writeH(_showWindow ? 1 : 0);

4 2      writeH(_items.length);
      for(L2ItemInstance temp : _items)

6 2         writeH(temp.getItem().getType1()); // item type1
8 4         writeD(temp.getObjectId());
12 4         writeD(temp.getItemId());
16 4         writeD(temp.getCount());
20 2         writeH(temp.getItem().getType2()); // item type2
22 2         writeH(temp.getCustomType1()); // item type3
24 2         writeH(temp.isEquipped() ? 1 : 0);
26 4         writeD(temp.getItem().getBodyPart()); // rev 415  slot    0006-lr.ear  0008-neck  0030-lr.finger  0040-head  0080-??  0100-l.hand  0200-gloves  0400-chest  0800-pants  1000-feet  2000-??  4000-r.hand  8000-r.hand
30 2         writeH(temp.getEnchantLevel()); // enchant level
         //race tickets
32 2         writeH(temp.getCustomType2()); // item type3
34 4         writeD(0); // augmentation id
38 4         writeD(temp.getLifeTimeRemaining()); // shadow weapon life time
42
}
Function ObjtoColvoIL(ItemObjID:integer): integer;
var
  i: integer;
begin
  if ItemObjID=0 then exit;
  for i:=0 to ReadD(4)-1 do begin
    if ItemObjID=ReadD(i*36+8) then begin
        Result:=ReadD(i*36+16); //количество
        exit;
    end;
  end;
  Result:=0;
end;

//ItemList - C4
{
1 1    writeC(0x1b);
2 2    writeH(0x01);
4 2    writeH(count);
    for (L2ItemInstance temp : _items)
6  2      writeH(temp.getItem().getType1()); // item type1
8  4      writeD(temp.getObjectId());
12 4      writeD(temp.getItemId());
16 4      writeD(temp.getCount());
20 2      writeH(temp.getItem().getType2());  // item type2
22 2      writeH(temp.getCustomType1());  // item type3
24 2      writeH(0x01);
26 4      writeD(temp.getItem().getBodyPart());  // rev 415  slot    0006-lr.ear  0008-neck  0030-lr.finger  0040-head  0080-??  0100-l.hand  0200-gloves  0400-chest  0800-pants  1000-feet  2000-??  4000-r.hand  8000-r.hand
30 2      writeH(temp.getEnchantLevel());  // enchant level
          //race tickets
32 2      writeH(temp.getCustomType2());  // item type3
}
Function ObjtoColvoC4(ItemObjID:integer): integer;
var
  i: integer;
begin
  if ItemObjID=0 then exit;
  for i:=0 to ReadD(4)-1 do begin
    if ItemObjID=ReadD(i*28+8) then begin
        Result:=ReadD(i*28+16); //количество
        exit;
    end;
  end;
  Result:=0;
end;

//******************************************************************************
procedure OnTimer(Sender: TObject);
begin
    Fishing;
    timer.enabled:=false;
end;

//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
  //не обрабатываем пустые пакеты
  if pck='' then exit;

  //****************************************************************************
  //если от сервака принят пакет с UserInfo. Запоминаем собственный ИД
  if FromServer and (ConnectName=Name) and (pck[1]=#$04) then CharObjID:=ReadD(18);

  //****************************************************************************
  {необходимо уточнить ItemID для своего сервера!!!
  6519=Green Colored Lure - Low Grade A
  6520=Green Colored Lure - Medium Grade
  6521=Green Colored Lure - High Grade
  6522=Purple Colored Lure - Low Grade
  6523=Purple Colored Lure - Medium Grade
  6524=Purple Colored Lure - High Grade
  6525=Yellow Colored Lure - Low Grade
  6526=Yellow Colored Lure - Medium Grade
  6527=Yellow Colored Lure - High Grade}
  //InventoryUpdate(27):w(count)w(1add2mod3remove)w(itemType1)h(ObjectID)i(ItemId)d(Count)
  //запоминаем ObjectID Lure и ColvoLure
  if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)>=6519) and (ReadD(12)<=6527)) then begin
     Lure:=ReadD(8);
     ColvoLure:=ReadD(16); //количество крючков
     //Say('Крючков='+inttostr(ColvoLure));
  end;

  //****************************************************************************
  {необходимо уточнить ItemID для своего сервера!!!
  6535=Fishing Shot: non-grade
  6536=Fishing Shot: D-grade
  6537=Fishing Shot: C-grade
  6538=Fishing Shot: B-grade
  6539=Fishing Shot: A-grade
  6540=Fishing Shot: S-grade}
  //InventoryUpdate(27):w(count)w(1add2mod3remove)w(itemType1)h(ObjectID)i(ItemId)d(Count)
  //запоминаем ObjectID Fishing Shot и ColvoShot
  if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)>=6535) and (ReadD(12)<=6540)) then begin
     Shot:=ReadD(8);
     ColvoShot:=ReadD(16); //количество шотов
     //Say('Шотов='+inttostr(ColvoShot));
  end;

  //****************************************************************************
  if (CharObjID<>0) and (ColvoLure<>0) and not status2 then begin //(Shot<>0) and (ColvoShot<>0) and
    Say('Автоматизация ловли рыбы готово к работе!');
    status2:=true;
  end;

  //******************************************************************************
  //ItemList (1B)
  if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
     ColvoShot:=ObjtoColvoIL(Shot); //количество шотов
     //Say('Shot='+inttostr(ColvoShot));
     ColvoLure:=ObjtoColvoIL(Lure); //количество крючков
     //Say('Lure='+inttostr(ColvoLure));
  end;

  //****************************************************************************
  //ловим рыбу
  if Status and FromServer and (ConnectName=Name) and (CharObjID<>0) then begin
       //FishingEnd
       if (pck[1]+pck[2]=#$FE#$14) and (CharObjID=ReadD(4)) then timer.enabled:=true; //FishingEnd ждем N секунд межде рыбалками
       //FishinHPRegen
       if (pck[1]+pck[2]=#$FE#$16) and (CharObjID=ReadD(4)) and (pck[15]+pck[16]=#$00#$00) then pumping;
       if (pck[1]+pck[2]=#$FE#$16) and (CharObjID=ReadD(4)) and (pck[15]+pck[16]=#$00#$01) then reeling;
  end;

  //****************************************************************************
  if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
    SocialID:=ReadD(2);
    case SocialID of
      //социальное действие Yes для начала ловли
      6: begin
            if CharObjID=0 then exit;
            Status:=true;
            RodInUse:=true;
            Fishing;
      end;
      //социальное действие No для окончания
      5: begin
            if CharObjID=0 then exit;
            if Status and RodInUse then Fishing;
            Status:=false;
            RodInUse:=false;
            timer.enabled:=false;
      end;
    end;
  end;
end.
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


NLObP вне форума   Ответить с цитированием