Glassman 8 Опубликовано 15 августа, 2023 Жалоба Поделиться Опубликовано 15 августа, 2023 Квест берется с 46 по 54 уровень у тп спота Pavel ruins у нпс Gutenhagen. Квест партийный, т.е. хилами можно тоже брать. По квесту надо набить 500 айтемов. Падают примерно с шансом 50%. Т.е. если взять квест всей фулл пати, то надо будет убить порядка 9000 мобов. Мобы х1, респ довольно быстрый. У меня там стояли мили пати из 5-ти чаров. Квест набивали часов за 20. С 47 по 54 смогли сдать по 3 раза. Луками/магами должно быть быстрее. Особенности скрипта. - Перед запуском квест должен быть взят и бот выведен на один из двух спотов. На скрине правый и левый. На правом хорошо идут ЕВЦ и ЕАЦ. На левом точек меньше, но мобов больше, чуть быстрее набивают квест. - Скрипт ждет пока у всех чаров в пати, у кого взят квест, не будет полного комплекта айтемов и только после этого идет сдавать. - Квест сдается и берется заново всеми чарами в пати. Запускать на каждом не надо. - Скрипт должен запускаться на том аккаунте в боте, по которому идет ассист и за которым вся пачка побежит (настроен фолоу). - Скрипт запоминает, на каком споте стояла пачка: на левом или на правом. И после сдачи квеста и взятия его заново вернется на тот же спот. - При выходе со спота бот отбивается от прицепившихся мобов. Отбивается тем чаром, на котором запущен. Поэтому важен ассист по нему. const Quest_id: integer = 647; var all_complete: boolean; cntr: TL2Control; right_spot: boolean; 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 MoveToSpot(right: boolean); begin if right then begin Engine.MoveTo(91448, -117144, -3936); Engine.MoveTo(92088, -116904, -3968); Engine.MoveTo(93336, -116872, -4048); Engine.MoveTo(93096, -117816, -4152); Engine.MoveTo(93048, -118104, -4240); Engine.MoveTo(93112, -118600, -4360); Engine.MoveTo(93448, -119464, -4528); end; if not right then begin Engine.MoveTo(90360, -119896, -3840); Engine.MoveTo(90008, -120952, -3888); Engine.MoveTo(89752, -120952, -3960); Engine.MoveTo(88152, -120968, -4256); end; 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(right: boolean); var i: integer; begin Engine.SetTarget(Engine.GetUser()); delay(300); if right then begin Engine.MoveTo(94024, -120760, -4544); Engine.MoveTo(93288, -118840, -4464); Engine.MoveTo(93016, -118120, -4240); Engine.MoveTo(93400, -116984, -4048); end; if not right then begin Engine.MoveTo(86888, -121400, -4384); Engine.MoveTo(88056, -120904, -4320); Engine.MoveTo(88952, -120872, -4080); Engine.MoveTo(90024, -121112, -3856); end; //beat off aggrs in 3 tries for i := 0 to 2 do begin delay(5000); BeatOff(); end; if right then begin Engine.MoveTo(92664, -116664, -3984); Engine.MoveTo(91384, -117080, -3936); Engine.MoveTo(91352, -116920, -3928); end; if not right then begin Engine.MoveTo(90776, -118168, -3888); Engine.MoveTo(91352, -117000, -3936); end; delay(10000); //beat off BeatOff(); end; procedure ReciveReward(E: TL2Control); begin if (QuestStage(E) <> 2) then exit; E.SetTarget('Gutenhagen'); delay(500); E.MoveTo(E.GetUser().Target); delay(1000); E.DlgOpen; delay(500); E.DlgSel(1); delay(1000); E.BypassToServer('Quest _647_InfluxOfMachines 32069-06.htm', true); delay(1000); //take it again E.DlgOpen; delay(1000); E.DlgSel(1); delay(1000); E.BypassToServer('Quest _647_InfluxOfMachines 32069-02.htm', true); delay(1000); end; begin while true do begin delay(1000); if (Engine.status <> lsOnline) then continue; all_complete := true; 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) = 1) then begin all_complete := false; break; end; end; end; if (engine.status = lsOnline) then begin if (QuestStage(Engine) = 1) then begin all_complete := false; end; end; if not all_complete then continue; //stop combat engine.FaceControl(0, false); delay(2000); //detect left or right spot right_spot := engine.getuser().InRange(93992, -122472, -4560, 2000, 500); //move to npc MoveFromSpot(right_spot); //dlg with npc delay(5000); ReciveReward(Engine); 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 cntr.FaceControl(0, false); delay(2000); ReciveReward(cntr); cntr.FaceControl(0, true); end; end; //move back to spot MoveToSpot(right_spot); //start combat engine.FaceControl(0, true); end; end. 1 1 Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти