Page 1 of 1

Вопрос

Posted: 10.09.2010 14:08
by Venom
Помогите, в чем проблема ?
Если на земле чар видит хотя бы несколько болтов, он хватает их в сумку и игнорирует труп, в котором также лежат болты. Хотя в скрипте указано, что если в паке менее чем, то нужно добрать ?
И наоборот, если я кидаю в труп болты, но менее чем заданное кол-во, он их берет, а вот с земли добирать отказывается ?

Или я не добавил проверку, что если FindType($1BFB, ground) = 0, то....?

Суть - ищем в паке, если нет - вокруг, если нет - ищем рядом труп и далее в нем. А если в паке положенное кол-во болтов, то игнорировать, если лежит на земле или в найденом трупе.

И, можно ли как то определить свой труп ?
Т.е. если рядом лежит два трупа, лутить только из своего, а второй игнорировать.

Code: Select all

Program Loot;

var
bolts: integer;
Corpse: Cardinal;

procedure Loot;
begin
FindDistance := 2; 
if FindType($1BFB, backpack) < 1000 then 
begin
FindType($1BFB, ground); 
DragItem(finditem, 2800); 
DropItem(backpack,0,0,0);  
AddToSystemJournal('Закончили с болтами.'); 
end
else
begin
      If FindType($2006, ground) <> 0 then
      begin
         AddToSystemJournal('Найден труп ' + IntToStr(finditem));
         Corpse := finditem;
         UseObject(Corpse);
         Wait(1000);
         Ignore(Corpse);
         If FindType($1BFB, Corpse) <> 0 then
         begin
            DragItem(finditem, 0);
            Wait(500);
            DropItem(backpack,0,0,0);
            Wait(500);
         end;
	     end;
   end;
 end;
//*************************************************************** 
//ОСНОВНАЯ ЧАСТЬ
//***************************************************************
BEGIN
bolts :=$1BFB;
while true do
  begin
 If not(isDead(self)) then Loot;
  end;
end.

Posted: 10.09.2010 14:58
by pr0Zak
Вроде так должно работать:

Code: Select all

Program Loot;
VAR
   Corpse: Cardinal; 
   c : Integer;

CONST 
   Item = $1BFB;

procedure Loot; 
begin 
   FindDistance := 1; 
   if FindType(Item, backpack) < 1000 then 
   begin 
      if FindType(Item, ground) <> 0 then
      begin 
         grab(findtype(Item, Ground), c);
         wait(500);  
         AddToSystemJournal('Закончили с болтами.'); 
      end 
      else 
      begin 
         If FindType($2006, ground) <> 0 then 
         begin 
            AddToSystemJournal('Найден труп ' + IntToStr(finditem)); 
            Corpse := finditem; 
            UseObject(Corpse); 
            Wait(1000); 
            Ignore(Corpse); 
            If FindType(Item, Corpse) <> 0 then 
            begin 
               DragItem(finditem, 0); 
               Wait(500); 
               DropItem(backpack,0,0,0); 
               Wait(500); 
            end; 
         end; 
      end; 
   end;
end;
////////////////////////////
/////// ОСНОВНАЯ ЧАСТЬ ////////
////////////////////////////
 
BEGIN
   SetARStatus(true);
   AddToSystemJournal('Скрипт написал proZak (Age of Power)');
   UOSay(Chr(39)+'resend'); 
   Wait(5000);
   UseObject(Backpack); 
   Wait(1000);
  
   while true do
   begin
      If not(isDead(self)) then Loot; 
   end; 
END.

Posted: 10.09.2010 15:04
by Venom
Подскажи плс, как добавить проверку :
если в паке положенное кол-во, то игнорировать то,
что лежит на земле и в трупе.
+ не находит труп, хотя он лежит под ногами ?

Code: Select all

Program Loot;

var
bolts: integer;
Corpse: Cardinal;

procedure Loot;
begin
FindDistance := 2; 
if FindType($1BFB, backpack) = 0 then 
begin
FindType($1BFB, ground); 
DragItem(finditem, 2800); 
DropItem(backpack,0,0,0);  
AddToSystemJournal('Закончили с болтами.'); 
end
else
begin
If FindType($1BFB, ground) = 0 then
begin
      If FindType($2006, ground) <> 0 then
      begin
         AddToSystemJournal('Найден труп ' + IntToStr(finditem));
         Corpse := finditem;
         UseObject(Corpse);
         Wait(1000);
         Ignore(Corpse);
         If FindType($1BFB, Corpse) <> 0 then
         begin
            DragItem(finditem, 0);
            Wait(500);
            DropItem(backpack,0,0,0);
            Wait(500);
         end;
	     end;
   end;
 end;
 end;
//*************************************************************** 
//ОСНОВНАЯ ЧАСТЬ
//***************************************************************
BEGIN
bolts :=$1BFB;
while true do
  begin
 If not(isDead(self)) then Loot;
  end;
end.

Posted: 22.09.2010 13:39
by Fenix
Получение кол-ва болтов в бекпаке:

Code: Select all

BoltsCount := 0;
if FindType($1BFB, Backpack) <> 0 then begin
  BoltsCount := FindFullQuantity;
end;
Соответственно в переменной "BoltsCount" (не забываем предварительно её объявить в соответствующем месте) после выполнения данного кода будет общее количество болтов в бекпаке (даже если они лежат несколькими кучками).
По твоему последнему скрипту видно, что при полном отсутствии болтов в бекпаке производится поиск на земле: FindType($1BFB, ground). Если на земле нашли стрелы, то перетаскиваем их в бекпак. Если же в бекпаке стрелы есть, то ищем их на земле, если нашли - ищем на земле труп и уже шаримся в нём. Таким образом, если на земле не будет стрел, то из трупа стрелы тащить не станет. С земли стрелы подбирать не будет если в бекпаке они уже лежат, зато в этом случае будет их искать в трупе.

P.S.: Плохим тоном считается использование в коде т.н. "магических чисел". Поэтому все $1BFB рекомендую заменить на глобальную переменную bolts (которая у тебя к тому же объявлена и инициализирована).