Page 1 of 1
FindTypeEx не ищет в подсумках
Posted: 18.03.2013 0:54
by taratata
Собствено сам сабж, почему FindTypeEx может не искать в подсумках.
Что нада - захотел поменять в скрипте на ламбер, по возвращению к секьюру и после сброса дров, добор бинтов и рыбы с корня секьюра, на добор из сумки лежащей в секьюре.
Было такое:
Code: Select all
procedure Grab;
begin
UseObject(Sunduk);
Wait(1500);
FindType($097B, Sunduk);
if FindCount > 0 then
begin
if not (FindType($097B, backpack) > 0) then
begin
MoveItem(FindType($097B, Sunduk), 10, backpack, 0,0,0);
Wait(1500);
end;
end;
end;
соотв. поменял FindType на FindTypeEx. Далее чтоб разобраться как она работает, наваял простое для теста:
Code: Select all
begin
if CountEx(GoldCoin,$0000,backpack) > 0 then
begin
FindTypeEx (GoldCoin,$0000,Backpack,True);
MoveItem(FindItem,0,money,0,0,0);
end;
end;
в итоге тоже самое, из корня моего бекпака вылаживает золото, если оно же в какой-либо подсумке то нет.
Что не так?
Re: FindTypeEx не ищет в подсумках
Posted: 18.03.2013 1:44
by nah nah
если я не ошибаюсь, то эту сумку надо сначала открыть
Re: FindTypeEx не ищет в подсумках
Posted: 18.03.2013 5:25
by taratata
хмм я то думал эта функция сама ищет по всем подсумкам без отрытия предварительного, в случае с одной сумкой еще ладно, но как быть если сумок много, это что их всех открывать, я думал функция сама по ним пробьет и где найдет оттуда и возьмет
Re: FindTypeEx не ищет в подсумках
Posted: 18.03.2013 10:51
by Vizit0r
да.
ненадо стелс превращать в ИИ, он ничего сам додумывать и открывать не будет.
Re: FindTypeEx не ищет в подсумках
Posted: 19.03.2013 16:03
by shinma
Ну как минимум описание есть.
а вообще ничего не мешает цикл сделать по FindType(TypeSumka,container);
UseObject(FindItem); ну или как то так.
Code: Select all
function FindTypeEx(ObjType: Word; Color: Word; Container: Cardinal; InSub: Boolean): Cardinal; // Ищет объект указанного типа ObjType и цвета Color в указанном контейнере
Если указать [color=darkred]ObjType или Color = $FFFF, то ищет любого типа.
Container = Backpack - ищем в бекпаке.
Container = Ground - ищем на земле.
Container = $FFFFFFFF - ищем в бекпаке и на земле.
Если InSub = True, то ищем в подсумках.
Возвращает ID вещи.
Если контейнер не существует, то ищем в бекпаке
Если обьект найден, то Result = FindItem
Если ничего не найдено то результат нулевой!
Во время поиска учитываются FindDistance и FindVertical
Re: FindTypeEx не ищет в подсумках
Posted: 24.03.2013 17:54
by untoha
присоединяюсь к создателю топика. из описания я тоже думал что ищет в подсумках сама, ну как тотал командер в поддиректориях итд , в итоге так и не догадался открывать сумки отдельно. спасибо топику, теперь буду знать что их надо открывать отдельно))
Re: FindTypeEx не ищет в подсумках
Posted: 24.03.2013 20:59
by elgreen
Code: Select all
procedure OpenCont;//Открыть все контейнеры, типы в массиве TypeCont[], для верности можно пару раз прогнать что бы найти вложенные контейнеры
var
List:TstringList;
i,ii:integer;
TypeCont:array[0..4] of cardinal;
begin
TypeCont[0]:=$0E76; TypeCont[1]:=$0E79; TypeCont[2]:=$0E75;
TypeCont[3]:=$0E7A; TypeCont[4]:=$0E80;
for ii := 0 to 4 do Begin
List := TStringList.Create
if FindTypeEx(TypeCont[ii],$FFFF,backpack,true) > 0 then begin
GetFindedList(List);
for i := 0 to List.Count-1 do begin
UseObject(StrToInt('$'+List.strings[i])); wait(50);
end;
end;
List.Free;
end;
Re: FindTypeEx не ищет в подсумках
Posted: 27.03.2013 19:46
by Fenix
Тогда лучше использовать рекурсию для открытия контейнеров:
Code: Select all
procedure OpenContainers(Container: Cardinal)
var
TypeContainers: array of Cardinal;
begin
TypeOfContainers := [$0E76, $0E79, $0E75, $0E7A, $0E80]; //Сюда ложим известные типы контейнеров. Открывает только контейнеры с этими типами.
OpenContainer(Container, TypeOfContainers);
end;
procedure OpenContainer(Container: Cardinal; TypeOfContainers: array of Cardinal)
var
i, j: Cardinal;
List: TStringList;
begin
try
List := TStringList.Create();
for i := 0 to Length(TypeOfContainers) - 1 do begin
if FindType(TypeOfContainers[i], Backpack) > 0 then begin\
List.Clear();
GetFindedList(List);
for j := 0 to List.Count() - 1 do begin
OpenContainer(StrToInt('$'+List.Strings[i]));
end;
end;
end;
finally
List.Free();
end;
end;
А что до того, что Stealth не ищет во вложенных контейнерах, то это обусловлено особенностью реализации протоколов ультимы. Информацию об объектах в контейнере клиенту отсылают только когда этот контейнер открывается. Ко всему прочему, контейнеры никак по свойствам не отличаются от других объектов, так что оценка "контейнер/не_контейнер" может быть проведена только по типам объектов (причем программист Stealth должен знать эти типы на стадии написания программы). Сам в своё время столкнулся в UO:SA с новыми "фильтиперсовыми" контейнерами, которых Stealth не знал как контейнеры.
P.S.: Код не компилился, так что должны быть ошибки (тем более, что я уже около года паскаль в глаза не видел).