Показать сообщение отдельно
Старый 13.10.2007, 21:25   #28
Пользователь
 
Аватар для HooleeCheeter
 
Регистрация: 10.10.2007
Сообщений: 29
Сказал Спасибо: 14
Имеет 0 спасибок в 0 сообщенях
HooleeCheeter
По умолчанию Re: ДА БУДЕТ БОТ!

Цитата:
Сообщение от NLObP
Я здесь выкладывал другой скрипт на заточку, он тоже не работатет?
Напиши свои WeaponID, ScrollID, названия предметов, пакеты от сервера 1B, 27

ЗЫЖ
max=250; //max количество предметов в базе (количество ячеек в инвентаре)
я нашёл только 1 :O

Код:
//Автоматизация заточки для PVP серверов... by NLObP
//Работа проверена на 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
  Scroll=957; // ItemID Crystall Scroll Enchant Weapon (Grade D)
  Weapon=129; // ItemID Sword of Revolution
  MaxEnchLvl=5;

var
  ItemBase: array of integer;
  add: boolean;
  ListCount: Integer;
  Cmd:String;
  timer: TTimer;

procedure Init; //Вызывается при включении скрипта
begin
  timer:=TTimer.Create(nil);
  timer.OnTimer:=@OnTimerHP;
  timer.enabled:=false;
  timer.interval:=1000; //время задержки
  add:=false;
  SendMsg('Начало инициализации скрипта, откройте инвентарь');
end;

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

procedure SendMsg(msg:string);
begin
  buf:=#$4A;
  WriteD(0);
  WriteD(10);
  WriteS('');
  WriteS(msg);
  SendToClient;
end;

procedure CreateItemBase; //Создает базу ObjectID и ItemID, опять же не проверяет пакет на правильность для экономия ресурсов
var
  i,j: integer;
begin
  j:=4; //смещение для ListCount
  ListCount:=ReadH(j); //количество итемов
  SetLength(ItemBase,ListCount*2); //размер массива должен быть в 2 раза больше, чем итемов
  j:=8; //смещение для ObjectID
  //Пробегаем по Инвентарю и сохраняем пары ObjectID - ItemID
  for i:=0 to ListCount-1 do begin
    ItemBase[i*2]:=ReadD(j);      //ObjectID
    ItemBase[i*2+1]:=ReadD(j);    //ItemID
    j:=j+20; 
  end;
end;

procedure UpdateItemBase; //Создает базу ObjectID и ItemID, опять же не проверяет пакет на правильность для экономия ресурсов
var
  i, ii, tmp, j, Count, ObjID, ItID, UpdType: integer;
begin
  Count:=ReadH(2); //количество итемов
  //Пробегаем по Инвентарю и сохраняем пары ObjectID - ItemID
  j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
  for i:=0 to Count-1 do begin
    UpdType:=ReadH(j);
    j:=j+2;
    ObjID:=ReadD(j);
    ItID:=ReadD(j);
    if (UpdType=3) then begin
      for ii:=0 to ListCount-1 do begin
        //находим подходящий предмет
        if (ItemBase[ii*2]=ObjID) then begin
            ItemBase[ii*2]:=0;
            ItemBase[ii*2+1]:=0;
        end;
      end;
    end
    else begin
      for ii:=0 to ListCount-1 do begin
        if (UpdType=1) and (ItemBase[ii*2]=0) then begin
            ItemBase[ii*2]:=ObjID;
            ItemBase[ii*2+1]:=ItID;
            add:=false;
            exit;
        end else if (UpdType=1) then add:=true;
      end;
    end;
    j:=j+18; //следующее смещение для действия с предметом
  end;
  if add=true then begin
     ListCount:=ListCount+1; //количество итемов
     SetLength(ItemBase,ListCount*2); //размер массива должен быть в 2 раза больше, чем итемов
     ItemBase[(ListCount-1)*2]:=ObjID;
     ItemBase[(ListCount-1)*2+1]:=ItID;
     add:=false;
  end;
end;

function GetObjID(ItemID:integer): integer; //Выдает ObjectID по его ItemID, если ItemID не найден в базе, выдает -1
var
  i: integer;
begin
  for i:=0 to ListCount-1 do
    //находим первый подходящий предмет
    if (ItemBase[i*2+1]=ItemID) then begin
      Result:=ItemBase[i*2];
      Exit;
    end;
  Result:=-1;
end;

procedure UseItem(ObjectID: integer);
begin
  buf:=#$14;
  WriteD(ObjectID);
  WriteD(0);
  SendToServer;
end;

procedure RequesEnchantItem(ObjectID: integer);
begin
  buf:=#$58;
  WriteD(ObjectID);
  SendToServer;
end;

procedure TryEnchantWeapon;
begin
    if GetObjID(Scroll)=-1 then begin
      SendMsg('Нет такого скролла! Прервано!');
      timer.enabled:=false;
      exit;
    end;
    UseItem(GetObjID(Scroll));
    if GetObjID(Weapon)=-1 then begin
      SendMsg('Нет такого оружия! Прервано!');
      timer.enabled:=false;
      exit;
    end;
    RequesEnchantItem(GetObjID(Weapon));
end;

procedure OnTimerHP(Sender: TObject);
begin
  TryEnchantWeapon;
end;

//******************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************
begin
  //не обрабатываем пустые пакеты
  if pck='' then exit;
  //****************************************************
   //социальное действие yes для начало точки
   if FromClient and (pck=HStr('1B 06 00 00 00')) then begin
    SendMsg('Начинаем точить всё оружие!!!');
    timer.enabled:=true;
   end;
   //социальное действие no для окончания
   if FromClient and (pck=HStr('1B 05 00 00 00')) then begin
    SendMsg('Окончили точить всё оружие!!!');
    timer.enabled:=false;
   end;
  //ItemList
  if FromServer and (pck[1]=#$1B) then CreateItemBase; //создание базы предметов
  if (length(ItemBase)=0) then exit; //если нет базы итемов, скрипт дальше не пустит

 //если удалились предметы, стираем в базе предметов пары ObjectID - ItemID
 if FromServer and (pck[1]=#$27) then UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета

  //*****************************************************
  //Команды отладки
  //*****************************************************
  //пакет Say2
  if FromClient and (pck[1]=#$38) then begin
      Cmd:=ReadS(2);
      case Cmd of
        '1':
          begin
            pck:='';
            //Dump;
          end;
        '2':
          begin
            pck:='';
            TryEnchantWeapon;
            //Dump;
          end;
      end;
      exit;
  end;
  //****************************************************

end.
HooleeCheeter вне форума   Ответить с цитированием