Сообщения без ответов | Активные темы Текущее время: Ср ноя 21, 2018 12:47 pm



Ответить на тему  [ 1 сообщение ] 
Квест 30 дней 
Автор Сообщение

Зарегистрирован: Пн дек 01, 2014 9:38 am
Сообщений: 13
Сообщение Квест 30 дней
Скрипт на выполнение квеста 30 дней руофф. На русском клиенте(прописаны русские селы). Сам берет квест, ищет комнату и сдает квест по завершению. Все действия выводятся в лог.

Код:
uses SysUtils;
var item: TL2Item;
    cur_state: Integer;
    cur_zone: Integer;
    dlg_sel_delay: Integer;
    soe_id: Integer;
    soe_delay: Integer;
    start_script : TDateTime;
    end_script : TDateTime;

procedure InitGlobalVariables;
begin
  start_script := Now;
  dlg_sel_delay := 300;
  cur_state := 0;
  cur_zone := 0;
  soe_id := 736;
  soe_delay := 23000;
end;

procedure TurnScriptOff();
begin
  end_script:= Now;
  Engine.Msg('[Script]', 'Конец исполнения скрипта(' + TimeToStr(end_script - start_script) + ')', $008000);
  Script.Stop();
end;

function CheckItemCount(itemID: Integer; quest: Boolean = False) : Integer;
var tempItem: TL2Item;
begin
  if quest then begin
    Inventory.Quest.ByID(itemID, tempItem)
  end else begin
    Inventory.User.ByID(itemID, tempItem);
  end;
  Result := tempItem.Count;
end;

function CheckCurrentState() : Integer;
begin
  if Engine.QuestStatus(926, 2) then begin
    Engine.Msg('   Quest[926]', 'Состояние 2', $FFFF00);
    Result := 2;
  end else if Engine.QuestStatus(926, 1) then begin
    Engine.Msg('   Quest[926]', 'Состояние 1', $FFFF00);
    Result := 1;
  end else begin
    if cur_state = 2 then begin
      Engine.Msg('   Quest[926]', 'Квест закончен', $FFFF00);
      Result := -1;
    end else begin
      Engine.Msg('   Quest[926]', 'Квест не взят', $FFFF00);
      Result := 0;
    end;
  end;
end;

function IsInFirstZone() : Boolean;
begin
  Engine.LoadZone('razlom_first_zone.zmap');
  if User.InZone then begin
    Engine.Msg('   Quest[926]', 'Персонаж находится в первой зоне разлома', $A4A0A0);
    cur_zone := 1;
    Result := true;
  end else begin
    cur_zone := 0;
    Result := false;
  end;
end;

function IsInSecondZone() : Boolean;
begin
  Engine.LoadZone('razlom_second_zone.zmap');
  if User.InZone then begin
    Engine.Msg('   Quest[926]', 'Персонаж находится во второй зоне разлома', $A4A0A0);
    cur_zone := 2;
    Result := true;
  end else begin
    cur_zone := 0;
    Result := false;
  end;
end;

function SetQuestNpcTarget() : Boolean;
begin
  delay(500);
  if IsInFirstZone() then begin
    Engine.SetTarget(34227);
    Result := true;
  end else if IsInSecondZone() then begin
    Engine.SetTarget(34228);
    Result := true;
  end else begin
    Engine.Msg('   Error', 'Не удается определить зону разлома', $0000FF);
    Result := false;
  end;
end;

procedure TakeKeyItem;
begin
  delay(dlg_sel_delay);
  Engine.DlgOpen();
  delay(dlg_sel_delay);
  Engine.DlgSel(2);
  delay(dlg_sel_delay);
end;

procedure EnterZone;
begin
  delay(dlg_sel_delay);
  Engine.DlgOpen();
  delay(dlg_sel_delay);
  Engine.DlgSel(1);
  delay(dlg_sel_delay);
end;

procedure EnterToQuestZones;
begin
  Engine.Msg('   Quest[926]', 'Заходим внутрь разлома', $A4A0A0);
  if SetQuestNpcTarget() then Engine.MoveToTarget;
  if CheckItemCount(47045) <> 1 then TakeKeyItem();
  delay(1000);
  if CheckItemCount(47045) = 1 then EnterZone();
end;

function ChangeCurrentZone() : Boolean;
begin
  Engine.UseItem(soe_id);
  delay(soe_delay);
  if (cur_zone = 1) and IsInSecondZone() then begin
    Result := true;
  end else if (cur_zone = 2) and IsInFirstZone() then begin
    Result := true;
  end else begin
    if SetQuestNpcTarget() then Engine.MoveToTarget;
    delay(dlg_sel_delay);
    Engine.DlgOpen();
    delay(dlg_sel_delay);
    Engine.DlgSel(3);
    delay(dlg_sel_delay);
    Result := true;
  end;
end;

procedure Take30DaysQuest;
begin
  Engine.Msg('   Quest[926]', 'Процедура получения квеста', $A4A0A0);
  if SetQuestNpcTarget() then Engine.MoveToTarget;
  delay(dlg_sel_delay);
  Engine.DlgOpen();
  delay(dlg_sel_delay);
  Engine.DlgSel('Квест');
  delay(dlg_sel_delay);
  Engine.DlgSel(2);
  delay(dlg_sel_delay);
  Engine.DlgSel(1);
  delay(dlg_sel_delay);
  Engine.DlgSel(1);
  delay(dlg_sel_delay);
  Engine.DlgSel(1);
  delay(dlg_sel_delay);
  if Engine.QuestStatus(926, 1) then begin
    Engine.Msg('   Quest[926]', 'Квест получен', $FFFF00);
  end else begin
     Engine.Msg('   Error', 'Не удается взять квест [926]', $0000FF);
     TurnScriptOff();
  end;
end;

procedure End30DaysQuest;
begin
  Engine.Msg('   Quest[926]', 'Процедура завершения квеста', $A4A0A0);
  if SetQuestNpcTarget() then Engine.MoveToTarget;
  delay(dlg_sel_delay);
  Engine.DlgOpen();
  delay(dlg_sel_delay);
  Engine.DlgSel('Квест');
  delay(dlg_sel_delay);
  Engine.DlgSel(1);
  delay(dlg_sel_delay);
  Engine.DlgSel(1);
  delay(dlg_sel_delay);
end;

function IsCharsInZone(num: Integer) : Boolean;
var i: integer;
    char_counter: integer;
begin
  Result:= false;
  char_counter := 0;
  for i:=0 to charlist.count-1 do begin
    if CharList.Items(i).InZone and
       not (CharList.Items(i) = User) and
       not CharList.Items(i).dead then
    begin
      Engine.Msg('   Quest[926]', 'В зоне ' + IntToStr(cur_zone) + ' части ' + IntToStr(num) + ' есть посторонние персонажи', $A4A0A0);
      Result:= true;
      break;
    end;
  end;
  if not Result then begin
    Engine.Msg('   Quest[926]', 'В зоне ' + IntToStr(cur_zone) + ' части ' + IntToStr(num) + ' нет постонних', $A4A0A0);
  end;
end;

procedure MoveToZone(zone, num : Integer);
var deltha_y : integer;
begin
  deltha_y := 0;
  if (zone = 2) then deltha_y := 2850;
  if num = 1 then begin
    Engine.MoveTo(-119326, -182459 + deltha_y, User.Z);
  end else if num = 2 then begin
    Engine.MoveTo(-118400, -182459 + deltha_y, User.Z);
  end else if num = 3 then begin
    Engine.MoveTo(-118422, -181522 + deltha_y, User.Z);
  end else if num = 4 then begin
    Engine.MoveTo(-119315, -181511 + deltha_y, User.Z);
  end else if num = 5 then begin
    Engine.MoveTo(-117639, -181511 + deltha_y, User.Z);
    Engine.MoveTo(-117661, -180585 + deltha_y, User.Z);
  end else if num = 6 then begin
    Engine.MoveTo(-118510, -180596 + deltha_y, User.Z);
  end else if num = 7 then begin
    Engine.MoveTo(-119403, -180574 + deltha_y, User.Z);
  end;
end;

function FindSpot() : Boolean;
var zone_num: integer;
begin
  EnterToQuestZones();
  Engine.LoadZone('razlom_' + IntToStr(cur_zone) + '_1.zmap');
  if User.InZone then begin
    Result:=false;
    Engine.Msg('   Quest[926]', 'Начинаем поиск свободной комнаты в ' + IntToStr(cur_zone) + ' зоне', $A4A0A0);
    for zone_num:=1 to 7 do begin
      MoveToZone(cur_zone, zone_num);
      Engine.LoadZone('razlom_' + IntToStr(cur_zone) + '_' + IntToStr(zone_num) + '.zmap');
      if not IsCharsInZone(zone_num) then begin
        Result:=true;
        break;
      end;
    end;
  end else begin 
    Engine.Msg('   Error', 'Не удалось зайти или неправильно определена зона', $0000FF);
    TurnScriptOff();
  end;
end;

procedure Complete30DaysQuest;
var start_action : TDateTime;
    end_action : TDateTime;
begin
  Engine.Msg('   Quest[926]', 'Процедура выполнения квеста', $A4A0A0);
  while not FindSpot() do begin
    ChangeCurrentZone();
    delay(1000);
  end;
  start_action := Now;
  Engine.Msg('   Quest[926]', 'Включаем бота для набития итемов', $A4A0A0);
  Engine.FaceControl(0,true);
  while CheckItemCount(46785, true) <> 100 do
  begin
    delay(2000);
  end;
  end_action := Now;
  Engine.FaceControl(0,false);
  Engine.Msg('   Quest[926]', 'Все итемы набиты(за ' + TimeToStr(end_action - start_action) + ' сек). Выключаем бота', $A4A0A0);
end;

// MAIN INSTRUCTIONS
begin
  Engine.Msg('[Script]', 'Старт скрипта', $008000);
  InitGlobalVariables();
  while Engine.Status = lsOnline do begin
    cur_state := CheckCurrentState();
    if (cur_state = 0) then Take30DaysQuest();
    if (cur_state = 1) then Complete30DaysQuest();
    if (cur_state = 2) then End30DaysQuest();
    if (cur_state = -1) then break;
  end;
  TurnScriptOff();
end.


Заходим в разлом и запускаем скрипт. Не делал проверку на смерть и подхват квеста, если вы уже его выполняете в зонах.
Ссылка на настройки для зон и самим скриптом.


Ср июл 25, 2018 10:48 am
Профиль
Показать сообщения за:  Сортировать по:  
Ответить на тему   [ 1 сообщение ] 

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Разработано: g-yar.
Русская поддержка phpBB