Page 1 of 1

Помогите отладить скрипт!

Posted: 2008-09-23 20:59:23
by psy-maniac
Работает минут 5 и выдает ошибку ! помогите отредактировать плиз! для шарда ДРВ!

Code: Select all

sub LegsBS() 
VAR Sunduk1=0x40188EAF ;Мешки инги (пустые) 
VAR Sunduk2=0x40339B63 ;Складываем мешки с ногами 
VAR IngCount=100 ;Остатток ингов в сундуке 
VAR MaxItem=75 ; Колво ног в мешке 
VAR Item,Exit=0,Meshok,IngName,i,Color 
DIM Ing[17] 

Ing[0]="Rusty" 
Ing[1]="copper" 
Ing[2]="Dull Copper" 
Ing[3]="Old Copper" 
Ing[4]="Bronze" 
Ing[5]="Silver" 
Ing[6]="Gold" 
Ing[7]="Shadow" 
Ing[8]="Rose" 
Ing[9]="Agapite" 
Ing[10]="Blood Rock" 
Ing[11]="Verite" 
Ing[12]="Valorite" 
Ing[13]="Mytheril" 
Ing[14]="Black Rock" 
Ing[15]="Obsidian" 
Ing[16]="Plutonium" 

   UO.Print("Âûáåðè èíãè") 
   UO.AddType('FullarmING') 
   While UO.Targeting() 
      wait(500) 
   wend 
   UO.DeleteJournal() 
   Color=UO.GetColor('lasttarget') 
   UO.Click('lasttarget') 
   while NOT UO.InJournal("ngot") AND NOT UO.InJournal("Shadow") 
      wait(500) 
   wend 

   for i=0 to 16 
      If UO.InJournal(Ing[i]) then 
         IngName=Ing[i] 
         If IngName=="Shadow" then 
            IngName="Shadow" 
        endif 
      endif 
   next 
   If IngName=="Bronze" then 
      MessageBox("Èç ýòîé ðóäû êîâàòü íåëüçÿ") 
      UO.Exec('terminate all')        
   endif 

   while Exit<>1 
      Item=0 
      UO.UnsetCatchBag() 
      repeat 
         UO.FindType('0x0E76',-1,Sunduk1) 
         If UO.GetQuantity('finditem')<1 then 
            Exit=1 
            goto End 
         Else 
            UO.Moveitem('finditem',1,Sunduk2) 
            UO.DeleteJournal() 
            UO.Click('finditem') 
            wait(3000) 
            while NOT UO.InJournal("items") 
               wait(500) 
            wend 
         Endif 
      until UO.InJournal("(0 items)") 
        Meshok=UO.GetSerial('finditem') 
      wait(1500) 
      UO.SetCatchBag(Meshok) 
      repeat 
         If UO.Count('FullarmING',Color)<30 then 
            UO.UnsetCatchBag() 
            UO.FindType('FullarmING',Color,Sunduk1) 
            If UO.GetQuantity('finditem')<IngCount then 
               Exit=1 
               goto End 
            else 
               UO.Grab('500','finditem') 
               wait(1500) 
               UO.SetCatchBag(Meshok) 
            Endif 
         Endif 
         CheckLag()    
         UO.CancelMenu() 
         UO.AutoMenu(IngName+' Plate','Platemail Legs') 
         UO.AutoMenu(IngName+' Armor','Plate') 
         UO.AutoMenu('Colored','Armor') 
         UO.AutoMenu('Blacksmithing','Colored') 
         UO.DeleteJournal() 
         UO.UseType('FullarmING',Color) 
         while NOT UO.InJournal("You put") AND NOT UO.InJournal("You have failed") 
            
         wend 
         If UO.InJournal("You put") then 
          wait(800) 
            Item=Item+1 
            UO.Print("Çàïîíåíèå ìåøêà: "+STR(Item)+" èç "+STR(MaxItem)) 
         Endif 
      until Item==MaxItem 
   End: 
   wend 
end sub

Posted: 2008-09-27 18:35:53
by Millerbeer
Чего он ваще делать должен обьясни?

Posted: 2008-09-30 16:11:20
by psy-maniac
Кгда запускаем скрипт, он просит указать руду из которой куем!
потом он берет из одного мешка , где лежат инги и мешочки для готового продукта, 1 мешочек кидает его в другой сундук затем берет 500 ингов, и кует туловище....как только в мешочке стало айтемов больше 75 он берет другой пустой мешок и так далее......

Но поработав 5-10 минут вышибает его клиент виснет! в чем проблема не догоню никак!

Posted: 2008-09-30 17:45:02
by Millerbeer
А что там за хитрые манипуляции с шедовом, и почему на бронзе он должен остановиться, и даж не просто остановиться, а все скрипты нах... отрубить? И куёт он не туловища, а плейтмейл ноги...

Posted: 2008-10-01 05:09:30
by psy-maniac
В мешке с ингами лежат разные инги и если он наткнется на бронзу то поидее вырубает....ну значит шадоу закончилось! Да в эом ноги кует...я переделал под туловища свой...сори !

Posted: 2008-10-01 05:59:11
by Millerbeer
У тебя он так сделан, что если ты в любую другую руду, кроме шедова ткнёшь, скрипт повиснет на цикле ожидания

Code: Select all

   while NOT UO.InJournal("ngot") AND NOT UO.InJournal("Shadow") 
      wait(500) 
   wend
. Вот это ваще зачем, непонятно

Code: Select all

         If IngName=="Shadow" then 
            IngName="Shadow" 
        endif 
типа если переменная IngName имеет значение Shadow, то опять присвоить ей значение Shadow, вдруг она сомневается :D . Вместо UO.Exec('terminate all') лучше использовать Return. На ДРВ после команды UO.Moveitem надо втыкать паузу, я ставлю 1000 мс, потому что сервак проверяет, за какое время была перемещена вещь, и может выдать сообщение Can't pick up this и вещь не переместится.

Code: Select all

       UO.UseType('FullarmING',Color) 
         while NOT UO.InJournal("You put") AND NOT UO.InJournal("You have failed") 
            
         wend 
Тут пустой цикл, воткни wait(500), вообще, помоему лучше использовать

Code: Select all

repeat 
wait(500)
until uo.injournal('You put|You have failed')
Проглюки бывают разные, так хоть одна пауза будет полюбому. Теперь, когда ты устанавливаешь приёмный контейнер командой UO.SetCatchBag(Meshok) и куёшь, предмет падает сначала в пак, потом инжа пытается его перекинуть в мешок, обычно сервак ругается, что ты слишком быстро двигаешь предметы и оставляет предмет в паке, так что тож надо или паузу втыкать или ваще отказаться от UO.SetCatchBag, а использовать UO.Moveitem .

Posted: 2008-10-01 16:04:48
by psy-maniac
Такс щас проверим =)! спасибо за советы! *beer*

Posted: 2008-10-02 16:27:35
by Millerbeer
В своих предидущих глубокомысленнейших умозаключениях :lol: допустил грубейшую ошибку :oops:

Code: Select all

   while NOT UO.InJournal("ngot") AND NOT UO.InJournal("Shadow") 
      wait(500) 
   wend
Если разобрать на пальцах, как работает эта конструкция, то бишь цикл ожидания. Цикл крутится, пока в журнале инжи не появится строка, содержащая ngot или Shadow. Пока этих строк нету, выражения UO.InJournal("ngot") и UO.InJournal("Shadow") равны 'false', т.е. ноль, соответственно их инверсии, т.е. NOT UO.InJournal("ngot") и NOT UO.InJournal("Shadow") равны единицам, между собой они сравниваются булевским И (and), и в результате получаем 1 and 1 (1&1) =1 - цикл крутится и ждёт...у моря погоды. Как только в журнале появляется та или другая искомые строки, или даже обе вместе, выражение принимает вид 1 & 0 = 0, 0 & 1 = 0 или же 0 & 0 = всё равно ноль! Цикл завершается и скрипт катится дальше. В твоём случае, значит, если в журнале появится ngot или Shadow или даже обе эти надписи вместе, скрипт срывается с цикла и шпарит дальше вполный рост. Отсюда напрашивается вопрос, нафига там ваще нужна проверка на шедов, ткни в любую другую руду и ожидание закончилось. Вот, собсно, и всё, пошёл дальше пиво пить...