Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Lockpicking

тут можно задать вопрос по скриптингу
Post Reply
untouch
Neophyte
Neophyte
Posts: 14
Joined: 09.01.2012 22:56

Lockpicking

Post by untouch »

Добрый вечер,

пытался написать скрипт на "локпикинг" исходя из своих неглубоких познаний,
но столкнулся с проблемкой: скрипт проходит 1 цикл все хорошо, на втором цикле перескакивает,
т.е. не ковыряет замок до тех пока не вылезет в журнале строка об "успешном взломе", а перескакивает
дальше по скрипту на процедуру (procedure lock_chest)

кто может помочь?!

п.с.: играю на Форест Варсе
(есть необходимость перезапирать замки из-за поломки сундуков при чрезмерном взломе)

Code: Select all

Program lockpicking;

{$Include 'all.inc'}

const
Chest = $47D3A9A3;
Key = $4000D42A;
lp_type = $14FB;
lp_color = $0000;
lp_value = 50;
lp_get = 100;

var
ctime : TDateTime;
k : integer;
m : integer;

procedure lock_chest;
begin
repeat
checksave;
WaitTargetObject(Chest);
UseObject(Key);
wait(500);
until (InJournalBetweenTimes('You lock the container', ctime, Now)<>-1);
end;

procedure lock_check;
begin
waitconnection(5000);
If Count(lp_type) < lp_value then
begin
FindType(lp_type, ground);
if FindCount > 0 then
begin
m:= FindQuantity;
Grab( FindItem, lp_get );
wait(1000);
checksave;
Addtosystemjournal('Взял еще ' + inttostr(lp_get) + ' отмычек из ' + inttostr(m));
end
else
begin
Addtosystemjournal('Нет отмычек на полу, добавьте');
repeat
wait(1000);
findtype(lp_type, ground);
until FindCount > 0;
m:= FindQuantity;
Grab(FindItem, lp_get);
wait(1000);
checksave;
Addtosystemjournal('Взял еще ' + inttostr(lp_get) + ' отмычек из ' + inttostr(m));
end;
end;
end;


Begin

while not Dead do

begin
k:=0;
repeat
checksave;
lock_check;
WaitTargetObject(Chest);
UseType(lp_type, lp_color);
k:=k+1;

until (InJournalBetweenTimes('успешно|быть использовано', ctime, Now)>=0) or (k>10);
if (InJournalBetweenTimes('успешно|быть использовано', ctime, Now)>=0) or (k>10) then

begin
lock_chest;
end;
end;
End.
untouch
Neophyte
Neophyte
Posts: 14
Joined: 09.01.2012 22:56

Re: Lockpicking

Post by untouch »

решил проблему с помощью ClearJournal; :)
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Lockpicking

Post by Vizit0r »

untouch wrote:решил проблему с помощью ClearJournal; :)
плохо решил.

Code: Select all

...
Begin

while not Dead do

begin
k:=0;
ctime := Now;//вот чего тут нехватало
repeat
checksave;
lock_check;
WaitTargetObject(Chest);
UseType(lp_type, lp_color);
k:=k+1;

until (InJournalBetweenTimes('успешно|быть использовано', ctime, Now)>=0) or (k>10);
if (InJournalBetweenTimes('успешно|быть использовано', ctime, Now)>=0) or (k>10) then

begin
lock_chest;
end;
end;
End.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
untouch
Neophyte
Neophyte
Posts: 14
Joined: 09.01.2012 22:56

Re: Lockpicking

Post by untouch »

спасибо, проверил, так и есть :)
теперь все работает...
Bop
Posts: 1
Joined: 24.03.2013 9:20

Re: Lockpicking

Post by Bop »

Скрипт дал один человечек, я немного его "раскидал" для удобного чтения, но скрипт не работает. При запуске юзает замок и стоит ждет. Не зависимо от того открыт сундук или нет, есть замок или нет. Вот собственно тело, помогите пожалуйста. Играю на махаоне.

Code: Select all

const
  LockColor = $03EA;      // Цвет металла отмычки 
  LOckType = $14FB;

  LPColor = $03EA;    // Цвет металла замка
  LPType = $0E3D;

  KeyType = $1010;
  KeyId = $78952925;      // ИД главного ключа

  ChestId = $592041AA;    // Сундук, который ломаем
  
  KeyChestId = $6A9C13C1; // ИД сундука для копий ключей

var
  LT: TDateTime;
  Keys: integer;
  MainKey: cardinal;
  Key: array [0..255] of record
    Index: byte;
    ID: cardinal;
  end;

        function GetKeys:integer;
          begin
            Keys:= 0;
          while FindType(KeyType, BackPack) > 0 do begin
          LT:= Now;
          ClickOnObject(FindItem);
            Ignore(FindItem);
            CheckLag(10000);
            wait(100);
                if InJournalBetweenTimes('заготовка', LT, Now) > -1 then begin
                Key[Keys].ID:= FindItem;
                Keys:= Keys + 1;
                end  else begin
                      AddToSystemJournal('нашел копию');
                      MoveItem(FindItem, 0, KeyChestId, 0, 0, 0);
                wait(1000);
                  end;
          end;
        result:= Keys;
        end;
  
        procedure ReOpenChest;
          begin
            WaitTargetObject(ChestId);
            UseObject(KeyId);
            CheckLag(5000);
            wait(100);
          end;

        function NewLock:boolean;
          begin
            repeat
              LT:= Now;
              WaitTargetObject(ChestId);  
              wait(1000);
              UseType(LockType, LockColor);
              wait(1000);
              WaitJournalLine(Now, 'Нужен ключ для замка|Для начала откройте старый замок', 3000);
                  if InJournalBetweenTimes('Для начала откройте старый замок', LT, Now) > -1 then begin
                    ReOpenChest;
                    continue;
                  end;
                    if Keys > 0 then begin
                      WaitForTarget(3000);
                        if not TargetPresent then
                        continue;
                        TargetToObject(Key[Keys-1].ID);
                        Keys:= Keys - 1;
                        WaitGump('1000');
                        WaitForTarget(3000);
                            if not TargetPresent then begin
                              MainKey:= Key[Keys].ID;
                              continue;
                            end;
                    TargetToObject(MainKey);
                    end else begin
                      result:= false;
                      exit;
                    end;
                        WaitJournalLine(Now, 'Вы вставили замок.|Вы заменили замок.', 1000); 
                        MoveItem(Key[Keys].ID, 0, KeyChestId, 0, 0, 0);
            until InJournalBetweenTimes('Вы вставили замок.|Вы заменили замок.', LT, Now) > -1;
              result:= true;
          end;

                  function CheckChest:boolean;
                      begin
                          if WaitJournalLine(Now, 'Замок сломан, надо менять|Вы не смогли правильно подобрать отмычку!|Замок поломан!|Здесь нет замка!|Оно уже открыто!|Вам удалось открыть замок!|Вы поломали отмычку!|Вам удалось добраться до замка...|Вам не удалось закончить работу', 55000) then begin
                            wait(1000);
                            CheckLag(5000);
                              if InJournalBetweenTimes('Оно уже открыто|... и заблокировала замок...|Замок поломан!|Вам удалось открыть замок!', LT, Now) > -1 then
                              ReOpenChest;
                                if InJournalBetweenTimes('Замок сломан, надо менять|Здесь нет замка!|... и заблокировала замок...|Здесь нет замка!', LT, Now) > -1 then begin
                                    if not NewLock then begin
                                      result:= false;
                                      exit;
                                    end else ReOpenChest;
                                end;
                          end;
                      result:= true;
                      end;

          begin
              MainKey:= KeyId;
              IgnoreReset;
              Ignore(KeyId);
              SetARStatus(true);
                  if GetKeys = 0 then exit;
                    AddToSystemJournal('всего нашел ключей: '+IntToStr(Keys));
                      repeat
                        LT:= Now;
                        WaitTargetObject(ChestId);
                        UseType(LPType, LPColor);
                        CheckChest;
                        wait(1000);
                      until false;
          end.
Post Reply