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

Автолут

тут можно задать вопрос по скриптингу
Viseris
Posts: 6
Joined: 30.08.2012 14:17

Автолут

Post 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).
Пока так.
Подскажите плиз где я ошибся. у меня подозрение, что я накосячил в целом, а не в конкретной строке.
ЧТо-то с массивами у меня не выходит. Буду очень благодарен!
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Автолут

Post by nah nah »

Code: Select all

Grab (i, 99) ;
А так можно пробелы ставить? :shock:
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Автолут

Post by nah nah »

Надо в граб id забрасывать
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Автолут

Post by nah nah »

и наверное i воткнуть в for
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Автолут

Post 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.

Если чего непонятно - спрашивай, не стесняйся.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Viseris
Posts: 6
Joined: 30.08.2012 14:17

Re: Автолут

Post 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;
так?
Есть где почитать про них в контексте стелса?
у меня с массивами всегда тяжело было... :(
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Автолут

Post 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 делает?

массивы в стелсе = массивы в паскале. есть мелкие отличия, но тебе это сейчас не нужно.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Viseris
Posts: 6
Joined: 30.08.2012 14:17

Re: Автолут

Post by Viseris »

С do - согласен, не оттуда, Then там должно быть.
begin-end, читал и видел. Приводил просто идею реализации нежели точный код.
Как домозгую полность - выложу на суд завтра, ок? :oops:
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Автолут

Post by Vizit0r »

эти идеи реализации имеют обыкновение совсем незаметно перетекать в обычный код...

выкладывай, глянем-с
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Viseris
Posts: 6
Joined: 30.08.2012 14:17

Re: Автолут

Post 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) До сбора лута так и не доходит.
По идее после резки, в трупе появляется лут( в данном случае для простоты тренировался на овцах) - а именно - мясо, кожа, шерсть и стрелы.
Режет, но не собирает. Вполне возможно, нужно, чтоб он сначала открывал труп, чтобы автоматически сработал граббер из ластконтейнера. Вечером ещё перепроверю эту теорию, но с нормальным коннектом. Может из-за лага происходит такое.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Автолут

Post by Vizit0r »

трупов на земле потенциально больше одного может быть?
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Viseris
Posts: 6
Joined: 30.08.2012 14:17

Re: Автолут

Post by Viseris »

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

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

Кстати, задумался. возможно ли каким-то образом выгребать из трупа всё, а не по типам. Должно сократить время. Проще потом от лишнего избавииться.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Автолут

Post by Vizit0r »

если трупов больше одного, то надо уже порезанные кидать в игнор, чтобы они не находились опять.

на подробнон разглядывание кода нет времени пока
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Viseris
Posts: 6
Joined: 30.08.2012 14:17

Re: Автолут

Post by Viseris »

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

на подробнон разглядывание кода нет времени пока
Идея хорошая, подумаю над этим. До конца недели попробую баги поподправлять.
Tomers
Novice
Novice
Posts: 99
Joined: 06.08.2009 11:51

Re: Автолут

Post by Tomers »

Что-то не понял, а перс не ходит чтоль? Разве он не должен подходить к трупу, прежде чем резать и лутать?
Post Reply