Glassman Posted August 24, 2023 Report Share Posted August 24, 2023 Квест с 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. 1 Link to comment Share on other sites More sharing options...
Glassman Posted August 26, 2023 Author Report Share Posted August 26, 2023 В новой версии скрипта: - бот летает через альт+Б. Сильно быстрее и не застревает в Адене. - бежит на поляну по прямой. Быстрее и меньше мобов. - перед альт-Б проверяет, что не в бою. - исправлены проблемы с байпасами на начало диалога с нпс. 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. 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