Показать сообщение отдельно
Старый 14.02.2008, 13:53   #246
Новичок
 
Регистрация: 14.02.2008
Сообщений: 2
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
as7
По умолчанию Re: ДА БУДЕТ БОТ!

На основе скрипта автозаточки от NLObP
Попытался отредактировать скрипт под автокристаллизацию. Давно искал такой скрипт, но средствами Валкера он не реализуем в С6.
В природе его не существует (я потратив кучу времени лично не нашёл).
Код:
//Атоматизация кристаллизации предметов
//На полной основе "Автоматизация заточки предметов до необходимого уровня by NLObP"

    //Необходимо затариться оружием, бронью или бижей
    //Открываем инвентарь (С4) или делаем покупку (С6) для инициализации скрипта
    //Социальное действие YES начать
    //Социальное действие NO остановиться

    //Enjoy!

   //******************************************************************************
    const
      Name='ABC';  //заменить на имя своего чара
      Weapon=6579; // ItemID Arcana Mace  //что будем кристаллизовать
      MaxEnchLvl=2; //max уровень заточки предмета, который  не разрешаем ломать (типа защиты)
      max=100;    //max количество предметов в базе
    var
    //  WpnObjID:  array[1..maxwpn,1..maxwpn] of integer;    //Weapon ObjID
      WpnBase:  array[1..2,1..max] of integer;    //Weapon ObjID,lvl
      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:=1000; //время задержки
      Say('Для инициализации скрипта сделайте покупку (С6) или откройте инвентарь (С4)');
    end;
    //******************************************************************************
    procedure Free; //Вызывается при выключении скрипта
    begin
      WpnBase:=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, ww, j, ObjID, ItemID, lvl, ListCount: integer;
    begin
      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
            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; //для С6
      end;
      ColvoWpn:=ww-1;
      Say('>ColvoWpn='+IntToStr(ColvoWpn)+' CurEnchLvl='+IntToStr(CurEnchLvl));
    end;
    //******************************************************************************
    procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID
    var
      i, ii, j, 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;
          end;
          2:case ItemID of
              weapon:
                for ii:=1 to max do
                  if WpnBase[1,ii]=ObjID then WpnBase[2,ii]:=lvl;
          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;
          end;
        end;
        //j:=j+2; //для С4
          j:=j+10; //для С6 //следующее смещение для действия с предметом 1-добавлен 2-изменен 3-удален
      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;
    //******************************************************************************
    procedure UseItem(ObjectID: integer);
    begin
      buf:=#$72;
      WriteD(ObjectID);
      WriteD(01);
      WriteD(00);
      WriteD(00);
      SendToServerEx(Name);
    end;
    //******************************************************************************
    procedure OnTimerHP(Sender: TObject);
    var
      wpn :integer;
    begin
        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(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.
Как это не странно, но скрипт работает.
Прошу мну не пинать, учитывая, что это первая программа в моей жизни (ну очень нужна была!).
Если автор исходника посчитает, что я как-то задел его профессиональные чувства - пусть удалит её!
as7 вне форума   Ответить с цитированием