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

FindTypeEx не ищет в подсумках

тут можно задать вопрос по скриптингу
Post Reply
taratata
Posts: 2
Joined: 18.03.2013 0:38

FindTypeEx не ищет в подсумках

Post 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;
в итоге тоже самое, из корня моего бекпака вылаживает золото, если оно же в какой-либо подсумке то нет.
Что не так?
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: FindTypeEx не ищет в подсумках

Post by nah nah »

если я не ошибаюсь, то эту сумку надо сначала открыть
taratata
Posts: 2
Joined: 18.03.2013 0:38

Re: FindTypeEx не ищет в подсумках

Post by taratata »

хмм я то думал эта функция сама ищет по всем подсумкам без отрытия предварительного, в случае с одной сумкой еще ладно, но как быть если сумок много, это что их всех открывать, я думал функция сама по ним пробьет и где найдет оттуда и возьмет
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: FindTypeEx не ищет в подсумках

Post by Vizit0r »

да.
ненадо стелс превращать в ИИ, он ничего сам додумывать и открывать не будет.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Re: FindTypeEx не ищет в подсумках

Post 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 

--->>>ПОИСК ПО ФОРУМУ, НАЧНИ С НЕГО!!!<<<---
--->>>Search the forum, start with him!!!<<<---
95% Ваших вопросов уже кем-то написаны и решены.
untoha
Novice
Novice
Posts: 51
Joined: 16.03.2013 17:21

Re: FindTypeEx не ищет в подсумках

Post by untoha »

присоединяюсь к создателю топика. из описания я тоже думал что ищет в подсумках сама, ну как тотал командер в поддиректориях итд , в итоге так и не догадался открывать сумки отдельно. спасибо топику, теперь буду знать что их надо открывать отдельно))
спасибо создатель, я твой должник!
elgreen
Posts: 5
Joined: 05.03.2013 17:27

Re: FindTypeEx не ищет в подсумках

Post 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;
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Re: FindTypeEx не ищет в подсумках

Post 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.: Код не компилился, так что должны быть ошибки (тем более, что я уже около года паскаль в глаза не видел).
Помните – ничто так не защищает ваши зубы 12 часов днем и 12 часов ночью как уважительное отношение к окружающим.
"Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня"© Larry Wall
Post Reply