Перейти к содержанию

Скрипт на квест на рецепты А-гр бижи


Рекомендуемые сообщения

Квест с 63 (вроде бы) лвл. Берется в Адене у главы ДЕ гильдии. Делается в фобиден гейтвей (тп Silent valley). Квест не партийный, поэтому можно брать только теми, кто мобов бьет.

Как только кто-то из пати набивает квест, чар, на котором запущен скрипт бежит на полянку и отбивается от прицепившихся мобов. Далее чар с квестом делает анстак, бежит в ДЕ гилд, сдает квест и берет снова. После чего делает тп обратно на спот. Остальная пати его смирно ждет все это время. 

Особенности:

  • Перед запуском скрипта квест должен быть взят. Скрипт сам его не возьмет в первый раз.
  • Скрипт должен быть запущен на чаре, за которым настроен фоллоу и ассист (чтобы выбежать со спота на полянку и отбиться об мобов).
  • При сдаче квеста чар пишет в пати чат. Сделал ради визуальной статистики - кто чаще. 
  • Внимание! при выбегании со спота есть риск нацеплять паровоз. Рассчитывайте, что пати должна суметь завалить 5-8 дум кнайтов на хвосте. Редко так плохо, но иногда бывает.
  • Маршруты беготни не оптимизировал. Бегает криво, но не застревает вроде.
  • Пати должна суметь начать бой с поляны, где она собирается (см. скрин). т.е. скрипт не ведет пати куда-то, а просто включает бой, когда вернулся чар с квестом.

 

const Quest_id: integer = 358;
var
  cntr: TL2Control;
  cntr_withQuest: TL2Control;
  i: integer;
  
function QuestStage(E: TL2Control): integer;
var i: byte;
begin
  result:= 0;
  for i:= 1 to 32 do if E.QuestStatus(Quest_id, i) then result:= i;
end;

procedure ReturnToSpot(E:TL2Control);
begin
  //move to gk
  E.MoveTo(144712, 23944, -2144);
  E.MoveTo(145768, 24264, -2096);
  E.MoveTo(146360, 24472, -2016);
  E.MoveTo(146392, 25240, -2016);
  E.MoveTo(146536, 25688, -2016);
  E.MoveTo(146712, 25832, -2016);
  
  //tp
  E.SetTarget('Elisa');
  E.DlgOpen;
  delay(500);
  E.DlgSel(1);
  delay(500);
  E.DlgSel(12);
  delay(6000);

  //move to spot
  E.MoveTo(187112, 20456, -3568);
end;

procedure Kill(Enemy: TL2Live);
begin
  if Enemy.dead then exit;
  Engine.SetTarget(Enemy);
  delay(300);
  while not Enemy.dead do begin
    Engine.Attack();
    delay(500);
  end;
end;

function IsAgr(E:TL2Control; Mob: TL2Npc): boolean;
begin
  result := (Mob.AtkOID = E.GetUser().OID) and (not Mob.Dead);
end;

function AttackedBy(E:TL2Control): TL2Npc;
var
  moblist: TNpcList;
  cnt: integer;
begin
  result := nil;
  moblist := E.GetNpcList();
  
  for cnt:= 0 to moblist.Count-1 do begin
    if IsAgr(E, moblist(cnt)) then begin
      result:= moblist(cnt);
      break;
    end;
  end;
end;

procedure BeatOff();
var
  Enemy: TL2Live;
  i: integer;
  E: TL2Control;
  HaveMobsOnParty: boolean;
begin
  HaveMobsOnParty := true;
  while HaveMobsOnParty do begin
    HaveMobsOnParty := false;

    Enemy := AttackedBy(Engine);
    if (Enemy <> nil) then begin
      Kill(Enemy);
      HaveMobsOnParty := true;
    end;
    
    for i := 0 to Engine.GetParty().chars.count - 1 do begin
      cntr := GetControl(Engine.GetParty().chars.items(i).name);
      if Assigned(cntr) and (cntr.status = lsOnline) then begin
        Enemy := AttackedBy(cntr);
        if (Enemy <> nil) then begin
          Kill(Enemy);
          HaveMobsOnParty := true;
        end;
      end;
    end;
    
    delay(500);
  end;
end;

procedure MoveFromSpot();
var
  i: integer;
begin
  Engine.SetTarget(Engine.GetUser());
  delay(300);

  //move to
  Engine.MoveTo(190184, 21608, -3664);
  Engine.MoveTo(186664, 20392, -3504);
  
  //beat off aggrs in 3 tries
  for i := 0 to 2 do begin
    delay(5000);
    BeatOff();
  end;
end;

procedure MoveToNPC(E: TL2Control);
begin
  //move to square
  E.MoveTo(147432, 26328, -2128);

  //move to DE guild
  E.MoveTo(147240, 25912, -2016);
  E.MoveTo(146344, 25672, -2016);
  E.MoveTo(146248, 24344, -2016);
  E.MoveTo(144536, 23928, -2144);
  E.MoveTo(143896, 23928, -2120);
  E.MoveTo(143816, 23912, -2120);
end;

procedure DlgWithNPC(E: TL2Control);
begin
  E.SetTarget('Oltran');
  delay(500);
  E.DlgOpen();
  delay(500);
  E.BypassToServer('npc_268471851_Quest', true);
  delay(500);
  E.BypassToServer('Quest _358_IllegitimateChildOfAGoddess 30862-7.htm', true);
  delay(500);

  E.EnterText('#quest done and retaken.');
  delay(500);
  
  //take quest again
  E.DlgOpen();
  delay(500);
  E.BypassToServer('npc_268471851_Quest', true);
  delay(500);
  E.BypassToServer('Quest _358_IllegitimateChildOfAGoddess 30862-5.htm', true);
  delay(500);
end;


procedure ReciveReward(E: TL2Control);
begin
  if (QuestStage(E) <> 2) then exit;

  //unstuck
  E.EnterText('/unstuck');
  delay(70000);

  MoveToNPC(E);

  DlgWithNPC(E);
end;

begin
while true do begin
  delay(1000);
  if (Engine.status <> lsOnline) then continue;

  cntr_withQuest := nil;
  
  for i := 0 to Engine.GetParty().chars.count - 1 do begin
    cntr := GetControl(Engine.GetParty().chars.items(i).name);
    if Assigned(cntr) and (cntr.status = lsOnline) then begin
      if (QuestStage(cntr) = 2) then begin
        cntr_withQuest := cntr;
        break;
      end;
    end;
  end;
  if (engine.status = lsOnline)
    and (cntr_withQuest = nil) then begin
    if (QuestStage(Engine) = 2) then begin
      cntr_withQuest := Engine;
    end;
  end;

  if (cntr_withQuest = nil) then continue;

  //stop combat
  engine.FaceControl(0, false);
  delay(2000);
  
  //move to rest zone
  MoveFromSpot();

  //stops char's actions
  cntr_withQuest.FaceControl(0, false);
  //tp to Aden, move to DE guild, dialog with npc
  ReciveReward(cntr_withQuest);

  //move to GK, tp back
  ReturnToSpot(cntr_withQuest);

  //turn bot on
  cntr_withQuest.FaceControl(0, true);
  
  //start combat
  engine.FaceControl(0, true);
end;
end.

 

photo_2023-08-25_00-56-27.jpg

  • Like 1
Ссылка на сообщение
Поделиться на другие сайты

В новой версии скрипта:
- бот летает через альт+Б. Сильно быстрее и не застревает в Адене.
- бежит на поляну по прямой. Быстрее и меньше мобов.
- перед альт-Б проверяет, что не в бою.
- исправлены проблемы с байпасами на начало диалога с нпс.

 

const Quest_id: integer = 358;
var
  cntr: TL2Control;
  cntr_withQuest: TL2Control;
  i: integer;
  
function QuestStage(E: TL2Control): integer;
var i: byte;
begin
  result:= 0;
  for i:= 1 to 32 do if E.QuestStatus(Quest_id, i) then result:= i;
end;

procedure ReturnToSpot(E:TL2Control);
begin
  //move to gk
  E.MoveTo(144712, 23944, -2144);
  E.MoveTo(145768, 24264, -2096);
  E.MoveTo(146360, 24472, -2016);
  E.MoveTo(146392, 25240, -2016);
  E.MoveTo(146536, 25688, -2016);
  E.MoveTo(146712, 25832, -2016);
  
  //tp
  E.SetTarget('Elisa');
  E.DlgOpen;
  delay(1000);
  E.DlgSel(1);
  delay(1000);
  E.DlgSel(12);
  delay(6000);

  //move to spot
  E.MoveTo(187112, 20456, -3568);
end;

procedure Kill(Enemy: TL2Live);
begin
  if Enemy.dead then exit;
  Engine.SetTarget(Enemy);
  delay(300);
  while not Enemy.dead do begin
    Engine.Attack();
    delay(500);
  end;
end;

function IsAgr(E:TL2Control; Mob: TL2Npc): boolean;
begin
  result := (Mob.AtkOID = E.GetUser().OID) and (not Mob.Dead);
end;

function AttackedBy(E:TL2Control): TL2Npc;
var
  moblist: TNpcList;
  cnt: integer;
begin
  result := nil;
  moblist := E.GetNpcList();
  
  for cnt:= 0 to moblist.Count-1 do begin
    if IsAgr(E, moblist(cnt)) then begin
      result:= moblist(cnt);
      break;
    end;
  end;
end;

procedure BeatOff();
var
  Enemy: TL2Live;
  i: integer;
  E: TL2Control;
  HaveMobsOnParty: boolean;
begin
  HaveMobsOnParty := true;
  while HaveMobsOnParty do begin
    HaveMobsOnParty := false;

    Enemy := AttackedBy(Engine);
    if (Enemy <> nil) then begin
      Kill(Enemy);
      HaveMobsOnParty := true;
    end;
    
    for i := 0 to Engine.GetParty().chars.count - 1 do begin
      cntr := GetControl(Engine.GetParty().chars.items(i).name);
      if Assigned(cntr) and (cntr.status = lsOnline) then begin
        Enemy := AttackedBy(cntr);
        if (Enemy <> nil) then begin
          Kill(Enemy);
          HaveMobsOnParty := true;
        end;
      end;
    end;
    
    delay(500);
  end;
end;

procedure MoveFromSpot();
var
  i: integer;
begin
  Engine.SetTarget(Engine.GetUser());
  delay(300);

  //move to
  Engine.MoveTo(186664, 20392, -3504);
  
  //beat off aggrs in 3 tries
  for i := 0 to 2 do begin
    delay(5000);
    BeatOff();
  end;
end;

procedure MoveToNPC(E: TL2Control);
begin
  E.bypasstoserver('_bbsloc');
  delay(1000);
  E.bypasstoserver('_bbstop;51');
  delay(1000);
  E.bypasstoserver('_bbstop;511');
  delay(1000);
  E.bypasstoserver('_bbsteleport;teleport; 143961 23944 -2124 5000');
  delay(7000);
end;

procedure DlgWithNPC(E: TL2Control);
begin
  E.SetTarget('Oltran');
  delay(500);
  E.DlgOpen();
  delay(500);
  E.DlgSel(8);
  delay(500);
  E.BypassToServer('Quest _358_IllegitimateChildOfAGoddess 30862-7.htm', true);
  delay(500);

  E.EnterText('#quest done and retaken.');
  delay(500);
  
  //take quest again
  E.DlgOpen();
  delay(500);
  E.DlgSel(8);
  delay(500);
  E.BypassToServer('Quest _358_IllegitimateChildOfAGoddess 30862-5.htm', true);
  delay(500);
end;


procedure ReciveReward(E: TL2Control);
begin
  if (QuestStage(E) <> 2) then exit;

  delay(1000);
  
  if (E.GetUser().InCombat) then delay(15000);

  MoveToNPC(E);

  DlgWithNPC(E);
end;

begin
while true do begin
  delay(1000);
  if (Engine.status <> lsOnline) then continue;

  cntr_withQuest := nil;
  
  for i := 0 to Engine.GetParty().chars.count - 1 do begin
    cntr := GetControl(Engine.GetParty().chars.items(i).name);
    if Assigned(cntr) and (cntr.status = lsOnline) then begin
      if (QuestStage(cntr) = 2) then begin
        cntr_withQuest := cntr;
        break;
      end;
    end;
  end;
  if (engine.status = lsOnline)
    and (cntr_withQuest = nil) then begin
    if (QuestStage(Engine) = 2) then begin
      cntr_withQuest := Engine;
    end;
  end;

  if (cntr_withQuest = nil) then continue;

  //stop combat
  engine.FaceControl(0, false);
  
  //move to rest zone
  MoveFromSpot();

  //stops char's actions
  cntr_withQuest.FaceControl(0, false);
  //tp to Aden, move to DE guild, dialog with npc
  ReciveReward(cntr_withQuest);

  //move to GK, tp back
  ReturnToSpot(cntr_withQuest);

  //turn bot on
  cntr_withQuest.FaceControl(0, true);
  
  //start combat
  engine.FaceControl(0, true);
end;
end.

 

  • Like 1
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...