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

Вот три моих скрипта на рыбалку. Реально работающих. Первые два относятся к прцессу рыбалки, а третий как вспомогательный. Почему в отдельных скриптах? Чтобы можно было тиражировать на сколько угодно чаров простым копированием и переименованием скриптов. Придумывал сам и использовал готовые скрипты. Спасибо всем.
1)fishin.txt
Код:
//Автоматизация ловли рыбы by NLObP
//Возможность работы нескольких одновременных скриптов
//Добавлена проверка на кол-во крючков и шотов.
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656
//Необходимо затариться удочкой и крючками, шотами
//выучить соответствующие скиллы
//1 одеть и снять: удочку, крючек для определения ObjectID
//2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID
//3 в процессе боя использовать Healing Potion для определения ObjectID
//Социальное действие YES или 1 в чат - начать
//Социальное действие NO или 2 в чат - остановиться
//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='2F 20 05 00 00 00 00 00 00 00';
  pump='2F 21 05 00 00 00 00 00 00 00';
  reel='2F 22 05 00 00 00 00 00 00 00';
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 одеть и снять: удочку, крючек!');
  Say('2 в процессе рыбалки использовать один раз фишин-шот!');
end;
//******************************************************************************
//                        Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
  timer.Free;
end;
//******************************************************************************
Function ObjtoColvo(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 Say(msg:string);
begin
  buf:=hstr('4A 00 00 00 00');
  WriteD(2);
  WriteS(Name);
  WriteS(msg);
  SendToClientEx(Name);
end;
//******************************************************************************
procedure UseItem(ObjID:integer);
begin
    buf:=#$14;
    WriteD(ObjID);
    WriteD(00);
    SendToServerEx(Name);
end;
//******************************************************************************
procedure Pumping;
begin
  if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
  //else Say('Кончились шоты!');
  buf:=HStr(pump);
  SendToServerEx(Name);
end;
//******************************************************************************
procedure Reeling;
begin
  if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
  //else Say('Кончились шоты!');
  buf:=HStr(reel);
  SendToServerEx(Name);
end;

//******************************************************************************
procedure Fishing;
begin
  if ColvoLure<>0 then begin
    RodInUse:=true;
    buf:=HStr(fish);
    SendToServerEx(Name);
  end
  else begin
    Status:=false;
    Say('Кончились крючки!');
    exit; //прекращаем рыбалку
  end;
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
  if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
     ColvoShot:=ObjtoColvo(Shot); //количество шотов
     //Say('Shot='+inttostr(ColvoShot));
     ColvoLure:=ObjtoColvo(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;
            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.
2)fish_open.txt
Код:
//Автоматизация потрошения рыбы by NLObP
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и  Protocol 656
//Как только поймаете рыбку, она потрошиться.

{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'; //имя чара
//*******************************************************************
var
  ItemObjID, time1: integer;
  status: boolean;
//*******************************************************************
procedure Init; //Вызывается при включении скрипта
begin
    time1:=0;
    status:=false;
end;
//*******************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
end;
//*******************************************************************
function Wait(var tick:integer; Timewait: Integer): Boolean;
// сквозная проверка без остановки скрипта (c)dmitry501
// modifed by Sh00rGo
var
  t: integer;
begin
  result:=false;
  t:=Round(Time*86400);
  if t>(tick+Timewait/1000) then begin
    if tick>0 then result:=true;
    tick:=t;
  end;
end;
//*******************************************************************
procedure UseItem(ObjectID:integer);
begin
   buf:=#$14;
   WriteD(ObjectID);
   WriteD(0);
   SendToServerEx(Name);
end;
//*******************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//*******************************************************************
begin
  //*******************************************************************
  //не обрабатываем пустые пакеты
  if pck='' then exit;
  //*******************************************************************
  //потрошим рыбу
  //необходимо уточнить ItemID рыб для своего сервера!!!
  if FromServer and (pck[1]+pck[2]=#$27#$01) and (ConnectName=Name) and ((ReadD(12)>=6411) and (ReadD(12)<=6518)) then
  begin
    ItemObjID:=ReadD(8);
    status:=true;
  end;
  //*******************************************************************
  if Wait(time1,2000) and status then begin
    UseItem(ItemObjID);
    status:=false;
  end;
end.
3)use_hp.txt
Код:
//автоматическое использование НР пробирок by NLObP
// 1-Изменяем Name='NLObP';
// 2-бросаем, подбираем или выпиваем Heal Potion
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и  Protocol 656

const
    Name='NLObP';
var
    ColvoHP, CharObjID, ItemObjID: integer;
    MaxHP, CurHP: integer;
    TimerHP: TTimer;
    Status: boolean;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
begin
    if ColvoHP=0 then exit;
    buf:=#$14;
    WriteD(ItemObjID);
    WriteD(00);
    SendToServerEx(Name);
    ColvoHP:=ColvoHP-1; //количество хилок
    if ColvoHP=0 then begin
      Say('Хилок='+inttostr(ColvoHP));
      Say('Кончились хилки! Закупите Heal Potion!');
    end;
end;
//******************************************************************************
procedure Say(msg:string);
begin
  buf:=hstr('4A 00 00 00 00');
  WriteD(2);
  WriteS(Name);
  WriteS(msg);
  SendToClientEx(Name);
end;
//******************************************************************************
procedure InitStats;
var
  i: integer;
begin
  //Запоминаем ИД
  i:=18;
  CharObjID:=ReadD(i);
  //смещение переменное, зависит от имени (LenName*2+2)
  i:=i+(Length(Name)*2+2)+44;
  MaxHP:=ReadD(i);
  CurHP:=ReadD(i);
  //Say('MaxHP='+inttostr(MaxHP)+'CurHP='+inttostr(CurHP));
  if ItemObjID=0 then exit;
  if (CurHP<MaxHP-50) then TimerHP.enabled:=true else TimerHP.enabled:=false;
end;
//******************************************************************************
procedure StatsUpdate;
var
  i: integer;
begin
  for i:=0 to ReadD(6)-1 do begin
    case pck[i*8+10] of
      #$09: CurHP:=ReadD(i*8+14);
      #$0A: MaxHP:=ReadD(i*8+14);
    end;
  end;
  if ItemObjID=0 then exit;
  if (CurHP<=MaxHP-50) then TimerHP.enabled:=true else TimerHP.enabled:=false;
end;
//******************************************************************************
procedure ObjtoColvo(ItemObjID: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 ColvoHP:=ReadD(i*28+16); //количество хилок
  end;
end;
//******************************************************************************
//                 Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
    status:=false;
    CharObjID:=0;
    ItemObjID:=0;
    timerHP:=TTimer.Create(nil);
    timerHP.OnTimer:=@OnTimerHP;
    timerHP.enabled:=false;
    timerHP.interval:=5000; //время отката лечения
    Say('Для начала работы скрипта бросаем, подбираем или выпиваем Heal Potion!');
end;
//******************************************************************************
//                 Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
     timerHP.Free;
end;
//******************************************************************************
//       Вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
 //******************************************************************************
  //не обрабатываем пустые пакеты
  if pck='' then exit;
 //******************************************************************************
 //InventoryUpdate
 if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)=1060) or (ReadD(12)=1061)) then begin //Healing Potion, Lesser Healing Potion
    ItemObjID:=ReadD(8);
    ColvoHP:=ReadD(16); //количество хилок
    if status then exit;
    Say('Автоматическое использование Нeal Рotion готово к работе!');
    Say('Хилок='+inttostr(ColvoHP));
    status:=true;
 end;
 //******************************************************************************
 //ItemList
 if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
    ObjtoColvo(ItemObjID); //количество хилок
    //Say('Хилок='+inttostr(ColvoHP));
 end;
 //******************************************************************************
 //UserInfo
 if FromServer and (ConnectName=Name) and (pck[1]=#$04) then InitStats;
 //******************************************************************************
 //StatusUpdate
 if FromServer and (ConnectName=Name) and (pck[1]=#$0E) and (CharObjID=ReadD(2)) then StatsUpdate;
end.
Кач магического дракона.
training_dragon.txt
Код:
//Автоматический кач 'Hatchling of the Stars' by NLObP
// Для работы скрипта:
// 1 - Саммоним дракона
// 2 - кладем ему еду, броню, когти
// На автомате, при нападении хозяина на моба дракон автоматически ассистит
// при необходимости лечит себя, после боя следует за хозяином.

//******************************************************************************
//                   константы и переменные скрипта
//******************************************************************************
const
    Owner='NLObP';     //ник перса хозяина
    Pet='';
var
    OwnerID, PetID, TargetID : Integer; //ИД хозяина, пета, ИД таргета
    CoordX, CoordY, CoordZ : String;   //координаты пета
    Cmd :String;                      //команда пету
    CurHP, MaxHP, i : Integer;
    tick: Integer;
    timerA: TTimer;
    timerHP: TTimer;
//******************************************************************************
//                          Подпрограммы
//******************************************************************************
//все сообщения ботов в приватном чате патилидера
//видны только нам
procedure Say(msg:string);
begin
  buf:=hstr('4A 00 00 00 00');
  WriteD(2);
  WriteS(ConnectName);
  WriteS(msg);
  SendToClientEx(Owner);
end;
//******************************************************************************
procedure OnTimerA(Sender: TObject);
begin
    //пакет RequestActionUse;
    buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
    SendToServerEX(Owner);
    //Say('магическая атака пета');
end;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
begin
    buf:=hstr('45 EE 03 00 00 00 00 00 00 00'); //пет лечиться
    SendToServerEX(Owner);
end;
//******************************************************************************
//                 Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
    OwnerID:=0;
    PetID:=0;
    timerA:=TTimer.Create(nil);
    timerA.OnTimer:=@OnTimerA; //
    timerA.enabled:=false; //
    timerA.interval:=1000; //время отката магии пета
    timerHP:=TTimer.Create(nil);
    timerHP.OnTimer:=@OnTimerHP; //
    timerHP.enabled:=false; //
    timerHP.interval:=2000; //время отката лечения пета
end;
//******************************************************************************
//                 Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
     timerA.Free;
     timerHP.Free;
end;
//******************************************************************************
//       Вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
  //не обрабатываем пустые пакеты
  if pck='' then exit;
//******************************************************************************
  //если от сервака принят пакет с UserInfo
  if FromServer and (OwnerID=0) and (ConnectName=Owner) and (pck[1]=#$04) then begin
      //Запоминаем собственный ИД
      OwnerID:=ReadD(18);
      Say('Скрипт готов к работе!');
  end;
//******************************************************************************
  //пакет Attack
  //атаковать, если хозяин напал на цель
  if FromServer and (ConnectName=Owner) and (pck[1]=#$05) and (OwnerID=ReadD(2)) then begin
      if (TargetID<>0) and (OwnerID<>TargetID) then begin
          buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
          SendToServerEX(Owner);
          TimerA.enabled:=true;
          //Say('Включили таймер');
      end;
  end;
//******************************************************************************
  //пакет MagicSkillUse
  //атаковать, если хозяин напал на цель магией
  if FromServer and (ConnectName=Owner) and (pck[1]=#$48) and (OwnerID=ReadD(2)) then begin
      if (TargetID<>0) and (OwnerID<>TargetID) then begin
          buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
          SendToServerEX(Owner);
          //Say('Атакую цель!');
          TimerA.enabled:=true;
          //Say('Включили таймер');
      end;
  end;
//******************************************************************************
  //пакет TargetSelect
  //если принят пакет со сменой таргета
  if FromServer and (ConnectName=Owner) and (pck[1]=#$a6) then begin
      //запоминаем ИД таргета для ассиста
      TargetID:=ReadD(2);
      //Say('Это ИД таргета.');
  end;
//******************************************************************************
  //пакет TargetUnselected
  //командир отменил цель
  if FromServer and (ConnectName=Owner) and (pck[1]=#$2a) and (OwnerID=ReadD(2)) then begin
      TargetID:=0;
      buf:=hstr('45 11 00 00 00 00 00 00 00 00'); //stop current action
      SendToServerEX(Owner);
      //Say('Стоп!');
      TimerA.enabled:=false;
      //Say('Выключили таймер');
  end;
//******************************************************************************
  //если от сервака принят пакет с PetInfo
  if FromServer and (PetID=0) and (ConnectName=Owner) and (pck[1]=#$b1) then begin
      //Запоминаем ИД пета
      PetID:=ReadD(6);
     //смещение переменное, зависит от имени Пета(LenName*2+2) и имени Чара(LenName*2+2)
     //126 байт до имени Пета(LenName*2+2) и имени Чара(LenName*2+2) после 20 байт (+1 начало CurHP)
     i:=126+(Length(Pet)*2+2)+(Length(Owner)*2+2)+20+1;
     CurHP:=ReadD(i);
     MaxHP:=ReadD(i);
      if (CurHP<MaxHP)
         then TimerHP.enabled:=true
         else TimerHP.enabled:=false;
         //Say('Запомнил ИД и жизнь пета');
  end;
//******************************************************************************
  //пакет PetStatusUpdate
  //проверяем на жизнь пета
  if FromServer and (ConnectName=Owner) and (pck[1]=#$b5) and (PetID=ReadD(6)) then begin
     //смещение переменное, зависит от имени Пета(LenName*2+2)
     //21 байт до имени Пета(LenName*2+2) после 8 байт (+1 начало CurHP)
     i:=21+(Length(Pet)*2+2)+8+1;
     CurHP:=ReadD(i);
     MaxHP:=ReadD(i);
     //Say('Считываем параметры пета');
     if (CurHP<MaxHP)
        then TimerHP.enabled:=true
        else TimerHP.enabled:=false;
   end;
end.
Автоматизация заточки предметов.
zatochka.txt
Код:
//Автоматизация заточки предметов до необходимого уровня by NLObP
//Затачиваем поочереди все предметы с Weapon ID пока не переломаем или не заточим

//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS"

//Необходимо затариться оружием, заточками и валерьянкой
//Открываем инвентарь для инициализации скрипта
//Социальное действие 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';
  Scroll=957; // 957 - ItemID Crystall Scroll Enchant Weapon (Grade D)
  Weapon=129; // 129 - ItemID Sword of Revolution D-grade
  MaxEnchLvl=20; //max уровень заточки
  max=250;    //max количество предметов в базе
var
//  WpnObjID:  array[1..maxwpn,1..maxwpn] of integer;    //Weapon ObjID
  WpnBase:  array[1..2,1..max] of integer;    //Weapon ObjID,lvl
  ScrlBase:  array[1..max] of integer;    //Scroll ObjID
  add: boolean; //прошла заточка?
  timer: TTimer;
  CurEnchLvl, ColvoWpn, ColvoScrl, CurWpn, CurScrl: integer;
//******************************************************************************
procedure Init; //Вызывается при включении скрипта
var
  i:integer;
begin
  //Enchant:=false;
  CurEnchLvl:=0;
  timer:=TTimer.Create(nil);
  timer.OnTimer:=@OnTimerHP;
  timer.enabled:=false;
  timer.interval:=2500; //время задержки
  Say('Для инициализации скрипта, откройте инвентарь');
end;
//******************************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
  WpnBase:=nil;
  ScrlBase:=nil;
  timer.Free;
end;
//******************************************************************************
procedure Say(msg:string);
begin
  buf:=hstr('4A 00 00 00 00');
  WriteD(2);
  WriteS(Name);
  WriteS(msg);
  SendToClientEx(Name);
end;
//******************************************************************************
procedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemID
var
  i, ss, ww, j, ObjID, ItemID, lvl, ListCount: integer;
begin
  ss:=1; //индекс в массиве скроллов
  ww:=1; //индекс в массиве предметов
  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
     ObjID:=ReadD(j);      //ObjectID
     ItemID:=ReadD(j);    //ItemID
     j:=j+14;
     Lvl:=ReadD(j);    //Level
     case ItemID of
        scroll: begin
            ScrlBase[ss]:=ObjID;
            ss:=ss+1;
            //Say('ColvoScrl='+IntToStr(ss));
        end;
        weapon: begin
            WpnBase[1,ww]:=ObjID;
            WpnBase[2,ww]:=lvl;
            ww:=ww+1;
            //Say('ColvoWpn='+IntToStr(ww));
        end;
     end;
    j:=j+2; //для С4
//    j:=j+10; //для Интерлюдии
  end;
  ColvoWpn:=ww-1;
  ColvoScrl:=ss-1;
  Say('>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//******************************************************************************
procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID
var
  i, ii, j, ss, ww, ObjID, ItemID, Lvl, ListCount, UpdType: integer;
begin
  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);
    ItemID:=ReadD(j);
    j:=j+14;
    Lvl:=ReadH(j);
//    Say('Предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ItemID));
    case UpdType of
      1:case ItemID of
          weapon: begin
            ColvoWpn:=ColvoWpn+1;
            //Say('Добавили предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
            for ii:=1 to max do
              if WpnBase[1,ii]=0 then begin WpnBase[1,ii]:=ObjID; WpnBase[2,ii]:=lvl; end;
          end;
          scroll: begin
            ss:=ss+1;
            //Say('Добавили скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));
            for ii:=1 to max do
              if ScrlBase[ii]=0 then ScrlBase[ii]:=ObjID;
          end;
      end;
      2:case ItemID of
          weapon:
            for ii:=1 to max do
              if WpnBase[1,ii]=ObjID then WpnBase[2,ii]:=lvl;
          scroll:
            //Say('Внимание! Изменения в скролле!?');
      end;
      //удален
      3:case ItemID of
          weapon: begin
             ColvoWpn:=ColvoWpn-1;
             for ii:=1 to max do
              if WpnBase[1,ii]=ObjID then begin WpnBase[1,ii]:=0; WpnBase[2,ii]:=0; end;
              //Say('Удаляем предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
          end;
          scroll: begin
             ColvoScrl:=ColvoScrl-1;
             for ii:=1 to max do
              if ScrlBase[ii]=ObjID then ScrlBase[ii]:=0;
              //Say('Удаляем скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));
          end;
      end;
    end;
    j:=j+2; //для С4
//    j:=j+10; //для Интерлюдии
  end;
  Say('>>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//******************************************************************************
function GetNextWeapon: integer; //Выдает ObjID предмета, если  не найден в базе, выдает -1,
//достигли макс уровня заточки -2, подбираем мин текущий уровень заточки -3
var
  i: integer;
begin
  Result:=-1;
  if CurEnchLvl>=MaxEnchLvl then begin
    Result:=-2;
    exit;
  end;
  for i:=1 to max do begin
    //находим первый подходящий предмет
    if (WpnBase[1,i]<>0) and (WpnBase[2,i]=CurEnchLvl) then begin
      Result:=WpnBase[1,i];
      exit;
    end;
  end;
  CurEnchLvl:=CurEnchLvl+1;
  Result:=-3;
end;
//******************************************************************************
function GetNextScroll: integer; //Выдает ObjID скролла, если  не найден в базе, выдает -1
var
  i: integer;
begin
  Result:=-1;
  for i:=1 to max do begin
    //находим первый подходящий предмет
    if (ScrlBase[i]<>0) then begin
      Result:=ScrlBase[i];
      exit;
    end;
  end;
end;
//******************************************************************************
procedure UseItem(ObjectID: integer);
begin
  buf:=#$14;
  WriteD(ObjectID);
  WriteD(0);
  SendToServerEx(Name);
end;
//******************************************************************************
procedure RequesEnchantItem(ObjectID: integer);
begin
  buf:=#$58;
  WriteD(ObjectID);
  SendToServerEx(Name);
end;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
var
  wpn, scrl:integer;
begin
    if ColvoScrl=0 then begin
      Say('Кончились скроллы! Прервано!');
      timer.enabled:=false;
      exit;
    end;
    if ColvoWpn=1 then begin
      Say('Остался последний предмет! Прервано!');
      timer.enabled:=false;
      exit;
    end;
    Scrl:=GetNextScroll;
    if scrl=-1 then begin
      Say('Нет такой заточки! Прервано!');
      timer.enabled:=false;
      exit;
    end;
    Wpn:=GetNextWeapon;
    case wpn of
    -1: begin
          Say('Нет такого предмета! Прервано!');
          timer.enabled:=false;
          exit;
       end;
    -2: begin
          Say('Достигли максимальный уровень заточки! Прервано!');
          timer.enabled:=false;
          exit;
        end;
    -3: begin
          //Say('Подбираем текущий уровень заточки!');
          timer.enabled:=true;
          exit;
        end;
    end;
    //************************************************
    UseItem(Scrl);
    RequesEnchantItem(Wpn);
    //************************************************
    Say('Заточили предмет! Weapon='+IntToStr(Wpn));
end;
//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
  //****************************************************************************
  //не обрабатываем пустые пакеты
  if pck='' then exit;
  //****************************************************************************
  //социальное действие yes для начало точки
  if FromClient and (ConnectName=Name) and (pck=HStr('1B 06 00 00 00')) then begin
    CurEnchLvl:=0;
    Say('Команда Старт!!!');
    timer.enabled:=true;
  end;
  //****************************************************************************
  //социальное действие no для начало точки
  if FromClient and (ConnectName=Name) and (pck=HStr('1B 05 00 00 00')) then begin
    Say('Команда Стоп!!!');
    timer.enabled:=false;
  end;
  //****************************************************************************
  //ItemList
  if FromServer and (ConnectName=Name) and (pck[1]=#$1B) then CreateItemBase; //создание базы предметов
//  if (ColvoWpn=0) or (ColvoScrl=0) then exit; //если нет базы итемов, скрипт дальше не пустит
  //****************************************************************************
  //если удалились предметы, стираем в базе предметов пары ObjectID - ItemID
  if FromServer and (ConnectName=Name) and (pck[1]=#$27) then UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета
end.
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


NLObP вне форума   Ответить с цитированием
За это сообщение NLObP нажился 11 спасибками от: