Glassman 8 Опубликовано 24 августа, 2023 Жалоба Поделиться Опубликовано 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 Ссылка на сообщение Поделиться на другие сайты
Glassman 8 Опубликовано 26 августа, 2023 Автор Жалоба Поделиться Опубликовано 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 Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти