Page 1 of 1

Скрипт на взятие бодов.ChangeProfile()

Posted: 25.07.2013 17:41
by King_Artes
Добрый день уважаемые знатоки. Хочу написать скрипт для взятия бодов на тейлор. Но есть маленькая проблемка, ChangeProfile почему-то не срабатывает в моем скрипте, немогу понять в чем ошибка. Подскажите пожалуйста где я ошибся. Суть в том, что если допустим открыть какой то профиль не из списка, то профиль поменяеться, на первый профиль из списка, но потом профиль остаётся первым из списка. Рекконект происходит, но всё время на одно и того же персонажа.

Code: Select all

Program New;
Var
Profiles : array[1..5] of string;
i: integer;

begin
Profiles[5] := 'Poppy';
Profiles[1] := 'Renek';
Profiles[2] := 'Karthus';
Profiles[3] := 'Heimerdinger';
Profiles[4] := 'Kotigoroshko';
For i:= 1 to 5 Do
    begin                       
       ChangeProfile(Profiles[i]);
       wait(1000);
       Connect(); 
       wait(5000);
       While not Connected() Do
       Begin
          Wait(60000);
          ChangeProfile(Profiles[i]);
          Wait(1000);
          Connect();
       End;
       RequestContextMenu($00000329);
       SetContextMenuHook($00000329, 3);
       Wait(1000);
       WaitGump(1);
       Disconnect();
    end;
end.

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 25.07.2013 18:59
by Vizit0r
а кто за тебя будет значения, возвращаемые ChangeProfile проверять ?
function ChangeProfile(Name : String) : Integer;

SinChangeProfileResult := -1; // чар = nil
SinChangeProfileResult := -2; // этот чар подключается
SinChangeProfileResult := -3; // выполняется больше одного скрипта
SinChangeProfileResult := -4; // нет такого профиля
SinChangeProfileResult := 0; // успех

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 25.07.2013 19:39
by King_Artes
Возвращает 0. В тех местах где должна происходить смена профиля. Но смены профиля не происходит

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 25.07.2013 20:16
by King_Artes
Я тут немного подебажил, и увидел, что после дисконекта, не происходит перехода на следущую итерацию. А снова отрабатывает While. Я конечно давно не программировал на паскале, но что-то я неприпоминаю такой логики в программировании в целом, что бы цикл перехватывал управления после того как отработал. Тоесть получается, что как только происходит Disconect, вместо перехода на следущую итерацию фор, как должно быть поинструкции, срабатывает условие not Connected(), и скрипт переходит в бесконечный while.

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 25.07.2013 21:14
by Gauhar
Может поможет, то предположу, что все БОДеры находятся на одном аккаунте, если это так, то для для каждого бодера следует установить слот в котором он сохранен на акккаунте:
ProfilesSetup.JPG
ProfilesSetup.JPG (26.98 KiB) Viewed 14004 times
Еще есть вариант что персонаж не успевает выйти из игры, тогда смотри все что указал Vizit0r.

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 25.07.2013 22:00
by King_Artes
Ну да так и есть. Я как бы профили так и настроил . Суть немного в другом. У меня реально каким то образом зацикливается кусок с проверкой на connected, причем зацикливается, если после этого цикла сделать disconect, такое впечатление, что после дисконекта, условие снова начинает отрабатывать пока не приконектится, потом снова дисконектится и снова срабатывает условие. Но может , это связано с connect(), если он делает диссконект перед подключением, тогда ясно почему идёт зацикливание.

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 25.07.2013 22:34
by Gauhar
Часть моего скрипта:

Code: Select all

PROGRAM ProgramName;

VAR
   myProfiles: array of String;   // Важно! Настраиваем в основном блоке скрипта.
   nProfile: Integer;
   timeOrder: array of TDateTime;


BEGIN
   myProfiles := ['BODER-1','BODER-2','BODER-3','BODER-4','BODER-5'];

   SetLength(timeOrder, Length(myProfiles));
   for nProfile := 0 to (Length(timeOrder) - 1) do
      timeOrder[nProfile] := 0;

   FindDistance := 8;
   FindVertical := 20;

   repeat
      for nProfile := 0 to Length(myProfiles) - 1 do
      begin
         if (Now > timeOrder[nProfile])  then
         begin
            ChangeProfile(myProfiles[nProfile]);

            SetARStatus(TRUE);
            if not Connected() then
            begin
               Connect();
               while not Connected() do wait(100);
               wait(5000);
            end;
            
            {
               ЗДЕСЬ ВСЕ ЧТО СВЯЗАНО С ПОЛУЧЕНИЕМ БОДОВ.
            }
            
            SetARStatus(FALSE);
            Disconnect();
            timeOrder[nProfile] := Now + 1.0 / 24;  // Следующий заказ брать через час. (зависит от скилла бодера)
            wait(5*60*1000);   // Ждем пока бодер не выйдет из игры.
         end;
      end;
      wait(1000);
   until FALSE;
END.

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 26.07.2013 1:16
by King_Artes
Благодарю за пример. Я решил чуть по другому, через рекурсивные процедуры.
Если кому-то интересно, вот

Code: Select all

Program New;
Var
Profiles : array[1..5] of string;
i, result: integer;

procedure changeChar(var ProfileName: string);
Begin
   result := ChangeProfile(ProfileName);                      
   AddToSystemJournal(IntToStr(result));
   AddToSystemJournal(ProfileName); 
   wait(1000);
   if not result = 0 then changeChar(ProfileName);
End;

procedure Connecting();
Begin
   Connect();
   wait(5000);
   if not Connected() then 
   Begin
   AddToSystemJournal('reconecting');
   wait(60000);
   Connecting();
   End
   else 
   AddToSystemJournal('connected');
End;

begin
Profiles[5] := 'Poppy';
Profiles[1] := 'Renek';
Profiles[2] := 'Karthus';
Profiles[3] := 'Heimer';
Profiles[4] := 'Kotigoroshko';
While True Do 
Begin
For i:= 1 to 5 Do
    begin
       Disconnect();
       changeChar(Profiles[i]); 
       Connecting();
       AddToSystemJournal('Taking bod');
       RequestContextMenu($00000329);
       SetContextMenuHook($00000329, 3);
       Wait(1000);
       WaitGump('1');
       Wait(2000);     
    end;
End;
end.

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 26.07.2013 1:51
by Vizit0r
нормальная такая себе рекурсия.

я так понял, сейчас все нормально со сменой профиля?

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 26.07.2013 12:06
by King_Artes
Да всё хорошо

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 17.09.2016 2:34
by GeeZeR
У меня не получается с ChangeProfile.
Все персонажи отключены. В окне 2 перса из одного аккаунта. 1-й по списку профайл называется "Boddy". Выделяю второй профайл (Alkanavt), запускаю в нём скрипт:

Code: Select all

Program Test;
BEGIN
ChangeProfile('Boddy');
END.
Результат:

Code: Select all

00:55:40:690 [Alkanavt]: Compiling
00:55:40:793 [Alkanavt]: Compiled succesfully
00:55:40:820 [Alkanavt]: Exec: [Error] (test.sc at line 6). Pax Unhandled Exception : Stack overflow
Error line is: " ChangeProfile('Boddy'); "
00:55:40:822 [Alkanavt]: Succesfully executed
00:55:40:823 [Alkanavt]: Script test.sc stopped successfuly
Пробовал поймать код ошибки:

Code: Select all

Program Test;
var
errcode : integer;
BEGIN
errcode := ChangeProfile('Boddy');
AddToSystemJournal(IntToStr(errcode));
END.
Результат:

Code: Select all

00:57:00:179 [Alkanavt]: Compiling
00:57:00:299 [Alkanavt]: Compiled succesfully
00:57:00:342 [Alkanavt]: Exec: [Error] (test.sc at line 6). Pax Unhandled Exception : Stack overflow
Error line is: " errcode := ChangeProfile('Boddy'); "
00:57:00:344 [Alkanavt]: Succesfully executed
00:57:00:345 [Alkanavt]: Script test.sc stopped successfuly

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 17.09.2016 18:40
by Vizit0r
тоже баг, и тоже исправлено.Тоже в апдейте будет.
Если надо срочно (апдейт будет не так чтоб скоро) - пиши в асю-скайп.

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 01.11.2016 10:27
by Tune
Глядя на даты сообщений баг с ChangeProfile не исправлен еще, когда апдейт будет?

Re: Скрипт на взятие бодов.ChangeProfile()

Posted: 03.11.2016 16:05
by Vizit0r
хз. Будет наверное сразу 8я версия.
Если нужен апдейт - могу лично скинуть, в скайпе\асе.