Показать сообщение отдельно
Старый 21.10.2007, 04:36   #44
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию Re:

Цитата:
Сообщение от DO12
Собсно здрасте!)
Я люблю рыбалку... (с) Не помню откуда
Так вот, использую скрипт на рыбалку в таком виде + к ниму скрипт на хилки
Посмотри в этой теме на 1 странице более свежий скрипт на рыбалку. В нем проверяется количество крючков и шотов. В остальном алгоритм тот же.

Цитата:
Рыба ловится не взирая на вылезающих мобов, всё казалось бы зашибись, кроме одного, достаточно часто вылезают 2 моба под ряд (Одного моба протягивает простая хилка), и всёб хорошо, грейтер хилка их протягивает, но я ЖАДНЫЙ и мне не хочется трарить денюжки заработаные не честным путём на то, чтоб заробатывать дальше) Вопрос заключается в следующем: Возможно ли сделать так, чтобы когда значение ХП было ниже максимума, рыба ловиься переставала, и снова начинала при полном восстановлении?
А это вариант для чаров, которые могут сами себя лечить:
Код:
//Автоматизация ловли рыбы by NLObP

//Возможность работы нескольких одновременных скриптов
//Добавлена проверка на кол-во крючков и шотов.
//Доработанная на предмет лечения самого себя

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

//Необходимо затариться удочкой и крючками, шотами
//выучить соответствующие скиллы

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

//Социальное действие 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'; //исправить на имя чара
  heal=1218; //Greater Battle Heal
  fish=1312;
  pump=1313;
  reel=1314;

//******************************************************************************
var
  timer: TTimer;
  TimerHP: TTimer;
  TimerMOB: TTimer;
  status, status2, ScrInUse, UnderAttack: boolean;
  Cmd, Lure, ColvoLure, Shot, ColvoShot, CharObjID: Integer;
  CurMP, MaxMP, MaxHP, CurHP: integer;
//******************************************************************************
//                      Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
  Shot:=0;
  UnderAttack:=false;
  Status:=false;     //в процессе рыбалки или нет?
  Status2:=false;   //показывает, что скрипт готов к работе
  ScrInUse:=false; //скрипт отключен
  CharObjID:=0;   //идентификатор ловца

  timer:=TTimer.Create(nil);
  timer.OnTimer:=@OnTimer;
  timer.enabled:=false;
  timer.interval:=10000; //время задержки (сделать достаточно большое, чтобы среагировать на атаку моба)

  timerHP:=TTimer.Create(nil);
  timerHP.OnTimer:=@OnTimerHP;
  timerHP.enabled:=false;
  timerHP.interval:=5000; //время между попытками лечиться

  timerMOB:=TTimer.Create(nil);
  timerMOB.OnTimer:=@OnTimerMOB;
  timerMOB.enabled:=false;
  timerMOB.interval:=60000; //ждем примерно минуту, пока моб нас колбасит

  Say('1 одеть и снять: удочку, крючек!');
  Say('2 в процессе рыбалки использовать один раз фишин-шот!');
  Say('3 сделать таргет на себя для самолечения!');
end;

//******************************************************************************
//                        Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
  timer.Free;
  timerHP.Free;
  timerMOB.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 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);
  MaxMP:=ReadD(i);
  CurMP:=ReadD(i);
  if ScrInUse then begin
    if not UnderAttack then begin
      if (CurHP<MaxHP) then begin
        timer.enabled:=false; //выключаем задержку между забросами
        Status:=false;
        TimerHP.enabled:=true;
        TimerMOB.enabled:=true;
        UnderAttack:=true;
      end
      else begin
        if status=false then begin
          TimerHP.enabled:=false;
          timer.enabled:=true; //включаем задержку между забросами
        end;
      end;
    end;
  end;
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);
      #$0B: CurMP:=ReadD(i*8+14);
      #$0C: MaxMP:=ReadD(i*8+14);
    end;
  end;
  if ScrInUse then begin
    if not UnderAttack then begin
      if (CurHP<MaxHP) then begin
        timer.enabled:=false; //выключаем задержку между забросами
        Status:=false;
        TimerHP.enabled:=true;
        TimerMOB.enabled:=true;
        UnderAttack:=true;
      end
      else begin
        if status=false then begin
          TimerHP.enabled:=false;
          timer.enabled:=true; //включаем задержку между забросами
        end;
      end;
    end;
  end;
end;

//******************************************************************************
procedure OnTimer(Sender: TObject);
begin
    timer.enabled:=false; //выключаем задержку между забросами
    status:=true;
    Fishing;
end;

//******************************************************************************
procedure OnTimerMOB(Sender: TObject);
begin
    UnderAttack:=false;
end;

//******************************************************************************
procedure OnTimerHP(Sender: TObject);
begin
//   timerMOB.enabled:=true; //ждем примерно минуту, пока моб нас колбасит
   //таргет на себя надо делать! Можно заранее на себя таргет сделать.
   if (CurHP<MaxHP) then MagicSkillUse(heal); //каждые 10 сек лечимся, пока моб нас бъет в тесении 60 сек
end;

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

//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
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
  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); //количество крючков
  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); //количество шотов
  end;

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

  //******************************************************************************
  //ItemList
  if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then
  begin
     ColvoShot:=ObjtoColvo(Shot); //количество шотов
     ColvoLure:=ObjtoColvo(Lure); //количество крючков
  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 begin
         timer.enabled:=true; //ждем N секунд межде рыбалками
       end;
       //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;

  //******************************************************************************
  //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;

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


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