Page 1 of 2

Автолут

Posted: 01.09.2012 23:34
by Viseris
Выдаёт ошибку. ругается

Code: Select all

Compiler: [Error] (loot.sc at 25:17):  Type mismatch
Сам скрипт:

Code: Select all

Program loot;
var
  n:integer;
  i:array[0..3] of Cardinal;
  {$Include 'all.inc'}

procedure rezka;
  begin
    while not Dead do 
    useobject(findtype($0F51, backpack));
    waitfortarget(500);
    targettoobject(LastCorpse);
    wait(500);
  end;

Procedure sbor_luta;
  begin
    i[0]:=$09F1;
    i[1]:=$0F3F;
    i[2]:=$1078;
    i[3]:=$0DF8;
   while not dead do
   useobject(LastContainer);
   Wait(500);
   Grab (i, 99) ;
   end;


Begin
while true do
Checksave;
rezka;
Wait (1000);
sbor_luta;
Wait (2000);
End.   
	
Цель: Упростить охоту на монстров.
Суть. При открытии трупа, скрипт юзает на него дагер из пака(режет кожу), и собирает все шмотки по типам из трупа(массив переменной i).
Пока так.
Подскажите плиз где я ошибся. у меня подозрение, что я накосячил в целом, а не в конкретной строке.
ЧТо-то с массивами у меня не выходит. Буду очень благодарен!

Re: Автолут

Posted: 02.09.2012 3:44
by nah nah

Code: Select all

Grab (i, 99) ;
А так можно пробелы ставить? :shock:

Re: Автолут

Posted: 02.09.2012 3:46
by nah nah
Надо в граб id забрасывать

Re: Автолут

Posted: 02.09.2012 3:47
by nah nah
и наверное i воткнуть в for

Re: Автолут

Posted: 02.09.2012 9:38
by Vizit0r
написал здоровенный пост, и опера сдохла :(((

Code: Select all

while not Dead do
a;
b;
c;
d;
в цикле будет крутиться ТОЛЬКО a;

Code: Select all

while not Dead do
begin
  a;
  b;
  c;
  d;
end;
в цикле будет крутиться a;b; c; d;

дальше. i - массив Cardinal. Заносятся в него Type, который по типу есть Word, а не Cardinal.
В данном случае это прокатит, но в будущем будешь долго и нудно понять причину, почему что-то работает неправильно - а это может быть одной из причин.

Code: Select all

   while not dead do
   useobject(LastContainer);
опять же, про циклы описано выше. + полный бред с LastContainer. если ты открыл труп, зачем его переоткрывать?


теперь по самой ошибке.

Code: Select all

Grab (i, 99) ;
ты в граб кормишь даже не тип, что я бы понял - частая ошибка, а массив типов :)

должно быть что-то типа

Code: Select all

for n := 0 to 3 do
begin
  while Findtype(i[n],LastContainer) > 0 do
  begin
    Grab (FindItem, 99) ;
    Findtype(i[n],LastContainer);
  end;
end;
домашнее задание: разобраться с тем, что я понаписывал, внимательно понять что делают и как работают LastCorpse и LastContainer.

Если чего непонятно - спрашивай, не стесняйся.

Re: Автолут

Posted: 02.09.2012 19:08
by Viseris
Спасибо за ответы. сейчас буду разбираться.
По поводу процедуры резки кожи, подумал, что стоит изменить процедуру с нарезки последнего контейнера - на поиск трупов по типу на земле и в случае нахождения - резать. Что-то типа:

Code: Select all

Findtype (corpsetype, ground);
If findtype > 0 do
Useobject (dagertype, backpack);
targettobject (findtype, ground);
Единственное, что не совсем понимаю принцип использования finddistace.
Он бы здесь пригодился, чтоб лишний раз не спамить попытками резки.

По поводу Grab. Там только id нужно ставить? так не пойдёт ибо, поиск лута по id не сработает, только по типу.
внимательно понять что делают и как работают LastCorpse и LastContainer
Кстати по поводу LastCorpse. Стелс ругается на отсутствие такового, вроде. Но перепроверю.

И по поводу типов переменных...
при раскладе использования строк:

Code: Select all

for n := 0 to 3 do
begin
  while Findtype(i[n],LastContainer) > 0 do
  begin
    Grab (FindItem, 99) ;
    Findtype(i[n],LastContainer);
мы имеем в обьявлении переменных:

Code: Select all

 n:integer;
  i:array[0..n] of Cardinal;
так?
Есть где почитать про них в контексте стелса?
у меня с массивами всегда тяжело было... :(

Re: Автолут

Posted: 02.09.2012 20:24
by Vizit0r
Viseris wrote:Спасибо за ответы. сейчас буду разбираться.
По поводу процедуры резки кожи, подумал, что стоит изменить процедуру с нарезки последнего контейнера - на поиск трупов по типу на земле и в случае нахождения - резать. Что-то типа:

Code: Select all

Findtype (corpsetype, ground);
If findtype > 0 do
Useobject (dagertype, backpack);
targettobject (findtype, ground);
Единственное, что не совсем понимаю принцип использования finddistace.
Он бы здесь пригодился, чтоб лишний раз не спамить попытками резки.

По поводу Grab. Там только id нужно ставить? так не пойдёт ибо, поиск лута по id не сработает, только по типу.
внимательно понять что делают и как работают LastCorpse и LastContainer
Кстати по поводу LastCorpse. Стелс ругается на отсутствие такового, вроде. Но перепроверю.

И по поводу типов переменных...
при раскладе использования строк:

Code: Select all

for n := 0 to 3 do
begin
  while Findtype(i[n],LastContainer) > 0 do
  begin
    Grab (FindItem, 99) ;
    Findtype(i[n],LastContainer);
мы имеем в обьявлении переменных:

Code: Select all

 n:integer;
  i:array[0..n] of Cardinal;
так?
Есть где почитать про них в контексте стелса?
у меня с массивами всегда тяжело было... :(

Code: Select all

Findtype (corpsetype, ground);
If findtype > 0 do
Useobject (dagertype, backpack);
targettobject (findtype, ground);
ох не читал ты мой предыдущий пост насчет использования begin end в циклах и условиях. targettobject (findtype, ground); будет выполняться вне зависимости от результата If findtype > 0 do. И кстати, что тут do делает?

массивы в стелсе = массивы в паскале. есть мелкие отличия, но тебе это сейчас не нужно.

Re: Автолут

Posted: 02.09.2012 23:08
by Viseris
С do - согласен, не оттуда, Then там должно быть.
begin-end, читал и видел. Приводил просто идею реализации нежели точный код.
Как домозгую полность - выложу на суд завтра, ок? :oops:

Re: Автолут

Posted: 03.09.2012 0:18
by Vizit0r
эти идеи реализации имеют обыкновение совсем незаметно перетекать в обычный код...

выкладывай, глянем-с

Re: Автолут

Posted: 03.09.2012 12:35
by Viseris
Предварительно скрипт пришёл к вот такому виду:

Code: Select all

Program loot;
var
  n:integer;
  i:array[0..3] of Word;
  {$Include 'all.inc'}

procedure rezka;
begin
while not Dead do
  begin
  UseObject(FindType($0F51,backpack));
  WaitTargetGround($2006);
  Wait(500);
  end;
end;

Procedure sbor_luta;
  begin                         
    i[0]:=$09F1;
    i[1]:=$0F3F;
    i[2]:=$1078;
    i[3]:=$0DF8;
   for n:=0 to 3 do
begin
  UseObject(FindType($2006,ground));
  while Findtype(i[n],LastContainer) > 0 do
  begin
    Grab (FindItem, 99) ;
    Findtype(i[n],LastContainer);
  end;
end;
end;

Begin
while not Dead do
begin
disarm;
wait(500);
rezka;
Wait (1000);
sbor_luta;
Wait (2000);
end;
End.
 
	
Скрипт заработал, что правда чисто технически. Функционально, имеем проблемы.
1)При использовании дагера - он его в руки берёт, посему в цикл добавил ф-цию disarm;
Но тем не менее, в сислог процедура резки спамит:

Code: Select all

UseObject error: Object not found.
2) До сбора лута так и не доходит.
По идее после резки, в трупе появляется лут( в данном случае для простоты тренировался на овцах) - а именно - мясо, кожа, шерсть и стрелы.
Режет, но не собирает. Вполне возможно, нужно, чтоб он сначала открывал труп, чтобы автоматически сработал граббер из ластконтейнера. Вечером ещё перепроверю эту теорию, но с нормальным коннектом. Может из-за лага происходит такое.

Re: Автолут

Posted: 03.09.2012 20:12
by Vizit0r
трупов на земле потенциально больше одного может быть?

Re: Автолут

Posted: 03.09.2012 22:01
by Viseris
Vizit0r wrote:трупов на земле потенциально больше одного может быть?
Не "может", их зачастую больше даже двух.

Опытным путём обнаружил, что без нарезки трупов работает лучше. Точнее на нарезке затыкается и не собирает таки.
Ещё нужно переобдумать алгоритм автооткрытия трупов, ибо из-за этого иногда во время стрельбы из лука персонаж "роняет" часть стрел на пол. Пока не понял почему.

Кстати, задумался. возможно ли каким-то образом выгребать из трупа всё, а не по типам. Должно сократить время. Проще потом от лишнего избавииться.

Re: Автолут

Posted: 05.09.2012 8:33
by Vizit0r
если трупов больше одного, то надо уже порезанные кидать в игнор, чтобы они не находились опять.

на подробнон разглядывание кода нет времени пока

Re: Автолут

Posted: 05.09.2012 9:46
by Viseris
Vizit0r wrote:если трупов больше одного, то надо уже порезанные кидать в игнор, чтобы они не находились опять.

на подробнон разглядывание кода нет времени пока
Идея хорошая, подумаю над этим. До конца недели попробую баги поподправлять.

Re: Автолут

Posted: 07.11.2012 17:32
by Tomers
Что-то не понял, а перс не ходит чтоль? Разве он не должен подходить к трупу, прежде чем резать и лутать?