Определить и добрать

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
Dexter Morgan
Posts: 14
Joined: 2013-07-27 15:27:11

Определить и добрать

Post by Dexter Morgan »

Доброго времени суток!

Есть скрипт, который должен определять количество определенного предмета в контейнере. Если меньше чем указано, то идет процедура:
A = Заданное количество - Найденное количество
Взять количество предметов, которого не хватает.

Вот сам скрипт:

Code: Select all

Sub Take(Type, Color, From, To, Quantity)
   Var A = 0

   UO.FindType(Type, Color, To)
   If UO.FindCount() < Quantity Then
      A = Quantity - UO.GetQuantity('finditem')

      UO.FindType(Type, Color, From)
      If UO.FindCount() Then
         UO.Grab(A, 'finditem')
         Wait(500)
      Else
         UO.Print('Запрашиваемый предмет не найден.')
      Endif
   Endif
End Sub


Проблема в том, что одну половину предметов он берет столько, сколько надо, а вторую берет все, что найдет в контейнере.

В чем заключается ошибка данного скрипта?
Будь осторожен в своих суждениях о людях. Скорее всего, ты ошибаешься.
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Определить и добрать

Post by Mirage »

Тут есть небольшая хитрость.
1) если ты используешь Grab без setreceivingcontainer то значит берешь всегда в пак чара. Тогда первая часть скрипта лишком большая.

Code: Select all

   UO.FindType(Type, Color, To)
   If UO.FindCount() < Quantity Then
      A = Quantity - UO.GetQuantity('finditem')

заменяется 1 строкой

Code: Select all

 A = Quantity - UO.count(Type, Color)


2) если ты пишешь универсальную перемещалку то надо либо извращаться с setreceivingcontainer либо взять более новую функцию uo.moveitem - если она работает естественно.
3) у тебя предмет тягается только 1 раз - а может лаг пролететь. Я бы перемещал через цикл пока предмет не переместится. Как то вот так:

Code: Select all

Sub GET(item, cont, min, max) ; предмет, откуда, минимум, сколько брать 
   If UO.Count( item ) < min Then
      UO.FindType( item, '-1', cont )  ; рассчитано на ЛЮБОЙ цвет
      if UO.FindCount() > 0 Then
         uo.charprint(printcolour,'Сырья в сундуке: '+Str(UO.GetQuantity('finditem')) ) 
         itemM=UO.GetSerial('finditem')
         timemove=UO.Timer()
         while UO.ContainerOf(itemM)==cont && timemove+20>UO.Timer()  ; проверка на перемещение предмета.
            uo.moveitem('finditem', max, 'backpack')
            wait(300)
         wend
      else
         uo.charprint(printcolour, 'Полностью кончилось сырье' )
         UO.CancelMenu()
         MyTerminate()
      endif
   Endif
end sub

Тут нет проверки цвета и добора предметов до определенного количества.
Dexter Morgan
Posts: 14
Joined: 2013-07-27 15:27:11

Re: Определить и добрать

Post by Dexter Morgan »

1. SetReceivingContainer прописывается в первой части скрипта, чтобы каждый лишний раз не прописывал.

Есть ли разница между

Code: Select all

A = Quantity - UO.GetQuantity('finditem')

и

Code: Select all

A = Quantity - UO.Count(Type, Color)

Если контейнер, где строка определяет количество, находится в личном рюкзаке?

2. К сожалению UO.MoveItem работает некорректно, поэтому приходиться извращаться.

3. Добавил проверку на то, в каком контейнере лежит предмет, как в твоем скрипте.
При запуске скрипта инжект выдает ошибку "Parse Error" на строку:

Code: Select all

While UO.ContainerOf( Item ) == To


Собственно вот скрипт целиком

Code: Select all

;==============================================================================;
   Var Reagents = '0x407D0DEC'; ID контейнера с реагентами
   Var Potions  = '0x40B04AA4'; ID контейнера с эликсирами
;------------------------------------------------------------------------------;
   Var TContainer = '0x0E76'; Тип контейнера для реагентов
   Var CContainer = '0x0481'; Цвет контейнера для реагентов
;------------------------------------------------------------------------------;
   Var Container, Item, A = 0
;==============================================================================;

sub Move()
   UO.FindType(TContainer, CContainer, 'backpack')
   If UO.FindCount() > 0 Then
      Container = UO.GetSerial('finditem')

      UO.Set('quiet', '1')
      UO.SetReceivingContainer( Container )

      Take('0x0F7A', '-1', Reagents, Container, 50); Black Pearl
      Take('0x0F7B', '-1', Reagents, Container, 50); Blood Moss
      Take('0x0F84', '-1', Reagents, Container, 50); Garlic
      Take('0x0F85', '-1', Reagents, Container, 50); Ginseng
      Take('0x0F86', '-1', Reagents, Container, 50); Mandrake Root
      Take('0x0F88', '-1', Reagents, Container, 50); Nightshade
      Take('0x0F8C', '-1', Reagents, Container, 50); Sulphorous Ash
      Take('0x0F8D', '-1', Reagents, Container, 50); Spider's Silk

      UO.UnsetReceivingContainer()
      UO.Set('quiet', '0')
   Else
      UO.Print('Контейнер для реагентов не найден.')
   Endif

   Take('0x0E24', '0x05BD', Potions, 'backpack', 10); Greater Agility Potion
   Take('0x0E24', '0x0060', Potions, 'backpack', 5);  Invisibility Potion
   Take('0x0E24', '0x0676', Potions, 'backpack', 5);  Total Refresh Potion
End Sub

Sub Take(Type, Color, From, To, Quantity)
   UO.FindType(Type, Color, To)
   If UO.FindCount() < Quantity Then
      Item = UO.GetSerial('finditem')
      A = Quantity - UO.GetQuantity( Item )

      UO.FindType(Type, Color, From)
      If UO.FindCount() Then
         While UO.ContainerOf( Item ) == To
            UO.Grab(A, Item)
            Wait(500)
         Wend
      Else
         UO.Print('Запрашиваемый предмет не найден.')
      Endif
   Endif
End Sub


Как быть? Мне кажется, что эта строка:

Code: Select all

A = Quantity - UO.GetQuantity( Item )

Не всегда сбрасывает количество предыдущего предмета, таким образом плюсует и берет больше, чем насчитал.
Будь осторожен в своих суждениях о людях. Скорее всего, ты ошибаешься.
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Определить и добрать

Post by Mirage »

Code: Select all

   UO.FindType(Type, Color, To)
   If UO.FindCount() < Quantity Then
      Item = UO.GetSerial('finditem')
      A = Quantity - UO.GetQuantity( Item )

в твоем случае одно и тоже что и

Code: Select all

A = Quantity - UO.Count(Type, Color)

Плюсы первого - им можно искать не только в паке чара, плюсы второго кроме краткости - он отображает ВСЕ предметы данного цвета/типа в бэкпаке (хотя это может быть и минус). Если в паке лежит 3 кучи по 100 золотых скрипт скажет что 300 гп.
Первый будет работать с любой одной кучей => 100 золотых.
Про ошибку гляну - клиента под рукой нет.

UO.MoveItem - сервер не бестуо? Версия клиента какая?
Dexter Morgan
Posts: 14
Joined: 2013-07-27 15:27:11

Re: Определить и добрать

Post by Dexter Morgan »

Mirage, вот как оно работает, понятно. Спасибо.
Да, сервер The Best UO. Версия инжекта YokoInj 710.16
Будь осторожен в своих суждениях о людях. Скорее всего, ты ошибаешься.
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Определить и добрать

Post by Mirage »

на 710.16 вроде побороли проблему с мувитемом. ХЗ - надо тестить у меня чар на сервере голый :mrgreen:

Проверь вот такой добор регов.

Code: Select all

sub dobor_regs()
   var n, x, y = 20, z
   var BEKBag = 'backpack'  ; сумка куда добирать
   var REGBag = '0x40F5BB50' ; сумка с регами/банк
   Dim r[8]
   r[1] = '0x0F88'
   r[2] = '0x0F86'
   r[3] = '0x0F8D'
   r[4] = '0x0F8C'
   r[5] = '0x0F84'
   r[6] = '0x0F85'
   r[7] = '0x0F7B'
   r[8] = '0x0F7A'
   uo.useobject(BEKBag)
   wait(300)
   uo.useobject(REGBag)
   wait(300)
   For n = 1 To 8
      UO.FindType( r[n] , -1 ,'my')
      x = UO.GetQuantity('finditem')
      if x>y then
         z = x - y
         UO.FindType( r[n] , -1 ,'my')
         UO.MoveItem( 'finditem', str(z) , REGBag)
         wait(500)
      endif
      if x<y then
         z = y - x
         UO.FindType( r[n] , -1 ,REGBag)
         UO.MoveItem( 'finditem', str(z) , BEKBag)
         wait(500)
      endif
   next
end sub


Надо вам Славу пытать чего он там такого наваял. У меня на 56b сфере (и ночной и стабильной) и вашем клиенте MoveItem работает без багов, но с паузой в >300 мсек
Dexter Morgan
Posts: 14
Joined: 2013-07-27 15:27:11

Re: Определить и добрать

Post by Dexter Morgan »

Mirage, команда UO.MoveItem к сожалению до сих пор насилует сервер, поэтому придется извращаться дальше.

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

Как бы там ни было, хочется допилить свой скрипт. Свое все таки роднее, правильно? (;
Будь осторожен в своих суждениях о людях. Скорее всего, ты ошибаешься.
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Определить и добрать

Post by Mirage »

у тебя в скрипте из за граба сбита логика.

Code: Select all

UO.FindType(Type, Color, To)
   If UO.FindCount() < Quantity Then
      Item = UO.GetSerial('finditem')
      A = Quantity - UO.GetQuantity( Item )

      UO.FindType(Type, Color, From)
      If UO.FindCount() Then ; <========   ниже добавь  Item = UO.GetSerial('finditem')
            UO.Grab(A, Item)
            Wait(500)
      Else
граб пытается двинуть предмет который ты нашел у себя в сумке. Попробуй Item = UO.GetSerial('finditem') добавить еще раз и посмотри будет ли сбиваться.

или даже вот так

Code: Select all

UO.FindType(Type, Color, To)
   If UO.FindCount() < Quantity Then
      A = Quantity - UO.GetQuantity( 'finditem' )

      UO.FindType(Type, Color, From)
      If UO.FindCount() Then
            UO.Grab(A, 'finditem')
            Wait(500)
      Else
Post Reply