Glassman Posted August 15, 2023 Report Share Posted August 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 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now