Page 2 of 2

Re: Работа с предметами в контейнере

Posted: 11.07.2012 14:08
by frant
кажется нашел проблему свою))) забыл игнор контейнера поставить аж самому смешно :D

Re: Работа с предметами в контейнере

Posted: 12.07.2012 0:30
by nepopus

Code: Select all

const
  containerID = $00000000;

begin
  useobject(containerID);
  checklag(10000);
  wait(300);

  while findtypeex($FFFF, $FFFF, containerID, true) > 0 do begin
    ignore(finditem);

    if iscontainer(finditem) then begin
      useobject(finditem);
      checklag(10000);
      wait(300);
      continue;
    end;
    
    addtosystemjournal('$' + inttohex(finditem, 8));
  end;
end.
Как обещал. Собсно с какого ответа сообщение началось с того и закончилось)

Re: Работа с предметами в контейнере

Posted: 12.07.2012 15:03
by frant
спасибо, но он не подходит)

вот пример моего скрипта, не могу понять в чем проблема:

Code: Select all

procedure searching;
begin
useobject(finditem);
wait(500);
while findtype($ffff, lastcontainer) > 0 do begin
clickonobject(finditem);
wait(500);
if iscontainer(finditem) then searching;
itemname:= getname(finditem);
addtosystemjournal(getname(finditem));
ignore(finditem);
clearjournal;
ignore(lastcontainer);
end;
end;


Begin
useobject(container); //ID родительского контейнера, в котором происходит поиск
wait(500);
while findtype($ffff, $4001D20E) > 0 do begin
searching;
end;
End.
хочу в скрипте некую рекурсию сделать, дабы не дублировать код...кто может помочь, он зацикливается

Re: Работа с предметами в контейнере

Posted: 12.07.2012 16:54
by frant
Для наглядности, схема что ниже, это случай, с которым я мучаюсь уже который день...)
Прямоугольники- контейнеры, окружности- предметы соответственно...

Image

и причем эта иерархия может быть и больших порядков...

Re: Работа с предметами в контейнере

Posted: 12.07.2012 17:03
by nepopus
У вас в цикле может открываться по нескольку контейнеров, а игнор стоит лишь на последний.

Не думаю, что вы дождетесь нужного ответа, если будете, не вникнув, отбрасывать правильные решения и скрытым умыслом просить отполировать ваш костыль.
Что вы хотите получить? Названия предметов? Тогда прочтите еще раз моё прошлое сообщение.

П.С. ваши картинки меня уже достали : )

Re: Работа с предметами в контейнере

Posted: 12.07.2012 17:25
by frant
nepopus wrote:У вас в цикле может открываться по нескольку контейнеров, а игнор стоит лишь на последний.

Не думаю, что вы дождетесь нужного ответа, если будете, не вникнув, отбрасывать правильные решения и скрытым умыслом просить отполировать ваш костыль.
Что вы хотите получить? Названия предметов? Тогда прочтите еще раз моё прошлое сообщение.

П.С. ваши картинки меня уже достали : )
я не отбрасываю Ваш скрипт, он работает бесспорно, но не в моем случае, где подсумков более чем 2 порядка, поэтому я и нарисовал схему что в подсумках есть тоже подсумки и в тех тоже есть, их много)

Re: Работа с предметами в контейнере

Posted: 12.07.2012 20:32
by yuras

Code: Select all

Procedure OpenAll(Box:cardinal);
var
BoxID:array[0..200] of cardinal;
x,y,z,BoxIDC,fbox:integer;
List:TstringList;
begin
BoxIDC:=0;
ignorereset;
repeat
//  For x:=0 to BoxIDC-1 do
//    Ignore(BoxID[x]); 
  FindTypeEx($FFFF,$FFFF,Box,true);
  List:=TStringList.Create;
  GetFindedList(List);
  fbox:=0;
  For x:=0 to List.count-1 do
    If IsContainer(StrToInt('$'+List.strings[x])) then 
      begin
      z:=0;
      For y:=0 to BoxIDC-1 do
        If BoxID[y]=StrToInt('$'+List.strings[x]) then z:=1;
      if z=0 then
      begin  
        UseObject(StrToInt('$'+List.strings[x]));
        BoxID[BoxIDC]:=StrToInt('$'+List.strings[x]);
        BoxIDC:=BoxIDC+1;
        checklag(10000);
        wait(500);
        fbox:=1;
        AddToSystemJournal('Box ' + IntToStr(BoxIDC));
      end;
      end;
  List.Free;
until fbox=0; 
end;

Re: Работа с предметами в контейнере

Posted: 13.07.2012 11:24
by nepopus
Прошу прощения, не знал, что findtypeex работает только до 2го уровня папок =) Сказали бы, мы бы время сэкономили, но ошибка моя :)
Доделал ваш код:

Code: Select all

const
  containerID = $4026416B;
  
var
  i: integer;

procedure fi(container: cardinal);
  begin
    useobject(container);
    checklag(10000);
    wait(300);

    while findtype($FFFF, container) > 0 do begin
      ignore(finditem);

      if iscontainer(finditem) then begin
        fi(finditem);
        continue;
      end;
    
      i := i+1;
      addtosystemjournal(inttostr(i) + ': $' + inttohex(finditem, 8));
    end;
  end;

begin
  ignorereset;
  fi(containerID);
end.

Re: Работа с предметами в контейнере

Posted: 16.07.2012 18:24
by frant
Спасибо nepopus, Ваш скрипт работает :)

Re: Работа с предметами в контейнере

Posted: 01.06.2017 9:31
by GeeZeR
Ловко, вызов самой себя для каждого открытого ею же контейнера. Сам сидел мучился, вы сэкономили мне кучу времени, спасибо.

Re: Работа с предметами в контейнере

Posted: 01.06.2017 12:21
by nah nah
Не заметил второй страницы темы :roll:
Разве InSub не идёт по всем подсумкам глубже чем 2-ой уровень?

Re: Работа с предметами в контейнере

Posted: 01.06.2017 13:04
by GeeZeR
В Стелсе нельзя посмотреть что в сумке пока не открыл её, поэтому тут последовательное открытие всех вложенных.