Поднять предмет с пола и засунуть в стек.... [нид хелп]

Ask for help

Moderators: Murderator+, Murderator

Post Reply
Ph0en1x
Posts: 7
Joined: 2004-12-23 20:18:24

Поднять предмет с пола и засунуть в стек.... [нид хелп]

Post by Ph0en1x »

Помогите намутить что-то типа massmove, только чтоб подмимало с земли и засовывало в стек... (массмов из бекпака в стек сует без проблем, а вот с земли... :( )

З.Ы. Не предлагать мувайтем в контейнер... не канает... чтоб добавить в стек нужно именно перащить айтем на айтем того-же типа...
flake
Expert!
Posts: 746
Joined: 2004-08-11 23:56:17
Location: The Citadel
Contact:

Post by flake »

Лови.

Code: Select all

sub ToMove()
VAR Sunduk = '0x00000000' ; ID сундука, в котором находится стек
VAR Steck = '0x0000'   ; тип стека
VAR SteckItem = '0x0000' ; тип вещи, которую будем добавлять в стек
VAR SteckX, SteckY, k

UO.Exec( 'set finddistance 2' )

UO.FindType( Steck, '-1', Sunduk )
SteckX = UO.GetX( 'finditem' )
SteckY = UO.GetY( 'finditem' )

UO.FindType( SteckItem, '-1', '1', SteckX, SteckY ) ;   
UO.Print( 'Собираем...' )
k = 0
  While UO.FindCount() > 0 
    UO.MoveItem( 'finditem', '0', Sunduk)
    CheckLag() 
    UO.FindType( SteckItem, '-1', '1' )
    k = k + 1
  Wend
UO.Print( 'Сбор закончен. Собранно ' +STR( k ) + ' предметов.' )
end sub
Ph0en1x
Posts: 7
Joined: 2004-12-23 20:18:24

Post by Ph0en1x »

Решил немного подправить... :roll:

Code: Select all

sub ToMove()
VAR Sunduk = '0x00000000' ; ID сундука, в котором находится стек
VAR Steck = '0x0000'   ; тип стека
VAR SteckItem = '0x0000' ; тип вещи, которую будем добавлять в стек
VAR SteckX, SteckY, k

UO.Exec( 'set finddistance 2' )

UO.FindType( Steck, '-1', Sunduk )
SteckX = UO.GetX( 'finditem' )
SteckY = UO.GetY( 'finditem' )

UO.FindType( SteckItem, '-1', '1' ) ;  +++ Убрал отсюда...
UO.Print( 'Собираем...' )
k = 0
  While UO.FindCount() > 0 
    UO.MoveItem( 'finditem', '0', Sunduk, SteckX, SteckY,0) ;  +++ ... и вмастил сюда.
    Wait(1000)
    UO.FindType( SteckItem, '-1', '1' )
    k = k + 1
  Wend
UO.Print( 'Сбор закончен. Собранно ' +STR( k ) + ' предметов.' )
end sub


В нужном сундуке стек находит, извлекает координаты, находит вещи на полу, перетаскиевает, но на нулевые координаты (т.е. в левый верхний угол сундука :( )
Как быть?
flake
Expert!
Posts: 746
Joined: 2004-08-11 23:56:17
Location: The Citadel
Contact:

Post by flake »

Тьфу... Все напутал у себя.
Нефиг писать скрипты в 4 утра.

Хм, интересно, почему не работает.
А тебе подойдет, если стек будет лежать на полу около чара?
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Code: Select all

#####################################################################
sub AutoMove()
; Автоматическое перекладывание предметов одного типа и цвета из одного
; контейнера в другой. Поддержка двух режимов - драга на стопку и драга
; на контейнер.
; v.1.04b (c) Edred
   VAR MyPause = 600
   VAR Type1, Color1, s, n, SerStopka, SumCol = 0
   UO.Print( 'Select sending container' )
   UO.Exec('addobject TmpCont1')
   While UO.Targeting()
      Wait(100)
   Wend
   UO.Print( 'Select targeting container' )
   UO.Exec('addobject TmpCont2')
   While UO.Targeting()
      Wait(100)
   Wend
   UO.Print( 'Select type for move' )
   UO.Exec('addobject TmpObj1')
   While UO.Targeting()
      Wait(100)
   Wend
   Type1 = UO.GetGraphic( 'TmpObj1' )
   Color1 = UO.GetColor( 'TmpObj1' )
   While UO.Targeting()
      Wait(100)
   Wend
   s = ''
   s = UO.asmInputString("Задайте размер порции:","500")
   If s == '' Then
      UO.Print( 'Invalid count of objects!' )
      return
   Endif
   VAR ToDo = UO.asmInputList("Выберите способ:","'Драг в стопку';'Драг на контейнер'")
   SerStopka = UO.GetSerial( 'TmpCont2' )
   n = val( s )
   If n < 0 OR n > 20000 Then
      UO.Print( 'Invalid count of objects!' )
      return
   Endif
   repeat
      If ToDo == 1 Then
         UO.FindType( Type1, Color1, 'TmpCont2' )
         If UO.FindCount() > 0 Then
            SerStopka = UO.GetSerial( 'finditem' )
         Else
            SerStopka = UO.GetSerial( 'TmpCont2' )
         Endif
      Endif
      UO.FindType( Type1, Color1, 'TmpCont1' )
      If UO.FindCount() > 0 Then
         If UO.GetQuantity( 'finditem' ) < n Then
            SumCol = SumCol + UO.GetQuantity( 'finditem' )
         Else
            SumCol = SumCol + n
         Endif
         UO.MoveItem( 'finditem', str(n), SerStopka )
         Wait( MyPause )
         CheckLag()
         UO.Print( 'I moved ' + str(SumCol) + ' items' )
      Else
         UO.Print( 'Automove finished' )
         Return
      Endif
   until False
endsub


ЗЫ: Требует АСМ любой версии

ЗЗЫ: Ничего править в скрипте не надо, он сам предлагает указать прицелом на исходный контейнер, на приемный контейнер, на образец предмета. Потом спросит размер одной порции и способ укладки. Насколько я понимаю - тебе накладывать в банк. Этот скрипт - как раз то, что тебе надо :lol:
Ph0en1x
Posts: 7
Joined: 2004-12-23 20:18:24

Post by Ph0en1x »

Edred, скрипт не пашет даже в том случае если я перекидываю из одного сундука в другой... перекидывает 1 айтем как положено, а все остальные кидает в бекпак и не стекует...
Да, и до сих пор не научился ловить таргетом землю... :roll:

flake, если стек будет на полу - тож подойдет... :)
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Скрипт сделан именно для перекладывания из одного контейнера в другой. То есть на землю или прямо в банк - это не к нему. А вот если в какой-то пак или ящик или сундук на земле или в банке - это пожалуйста. Скрипт абсолютно рабочий, сам пользуюсь уже год, да и есть уже десяток людей, кто тоже пользуется. АСМ стоит? Скрипту он нужен. Может паузу надо чуть увеличить, я же не знаю какие у тебя на шарде зашиты минимальные задержки при перемещении объектов, какой у тебя коннект.
Ph0en1x
Posts: 7
Joined: 2004-12-23 20:18:24

Post by Ph0en1x »

Тестил я скрипт на 2 сумках, в первой были поштучно бутли, во второй стек из двух таких бутлей... - 1 бутыль кидает во вторую сумку не добовляя в стек, а остальные полетели в бекпак... (
АСМ - 501.05, лагов практически нет (городской сервер идет через жирный канал), защиты мин. задержки тож нет (массмув работает без проблем с задержкой 1)
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Дык для поштучного не очень правильно использовать этот скрипт. Хотя все равно должно работать. Попробуй вот этот:

Code: Select all

#####################################################################
sub AutoMove2()
; Автоматическое перекладывание некучкующихся предметов одного типа и цвета
; из одного контейнера в другой. Осуществляется драг на контейнер.
; v.1.05b (c) Edred
;
   VAR MyPause = 600
   VAR Type1, Color1, s, n, SerStopka, SumCol = 0, Howmany='200'
   UO.Print( 'Select sending container' )
   UO.Exec('addobject TmpCont1')
   While UO.Targeting()
      Wait(100)
   Wend
   UO.Print( 'Select targeting container' )
   UO.Exec('addobject TmpCont2')
   While UO.Targeting()
      Wait(100)
   Wend
   UO.Print( 'Select type for move' )
   UO.Exec('addobject TmpObj1')
   While UO.Targeting()
      Wait(100)
   Wend
   Type1 = UO.GetGraphic( 'TmpObj1' )
   Color1 = UO.GetColor( 'TmpObj1' )
   While UO.Targeting()
      Wait(100)
   Wend
   Howmany = UO.asmInputString("Сколько всего переложить?",Howmany)
   If Howmany == '' Then
      UO.Print( 'Invalid count of objects!' )
      return
   Endif
   repeat
      UO.FindType( Type1, Color1, 'TmpCont1' )
      If UO.FindCount() > 0 Then
         UO.MoveItem( 'finditem', '0', 'TmpCont2' )
         Wait( MyPause )
         CheckLag()
         SumCol = SumCol + 1
         If SumCol == val(Howmany) Then
            UO.Print( 'Script finished' )
            return
         Endif
      Else
         UO.Print( 'Script finished' )
         return
      Endif
   until False
endsub
Ph0en1x
Posts: 7
Joined: 2004-12-23 20:18:24

Post by Ph0en1x »

Из контейнера в контейнер перекидывает, но в стек не сует...

З.Ы. я же писал в самом первом посту, что обычный мувайтем в контейнер не пашет, чтоб добавить в стек - нужно перетащить айтем на айтем или на стек...
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Я тебе дал два скрипта, в первом весьма ясно показано как определять стек и класть в него. Так что дерзай. Я пишу скрипты под себя и не собираюсь подстраивать их фиг знает под какие шарды, где скриптеры не могут нормально прописать складывание предметов.
Ph0en1x
Posts: 7
Joined: 2004-12-23 20:18:24

Post by Ph0en1x »

Фсе! Спасибо обоим, как говорится - с миру по нитке... :)

Code: Select all

sub main()
 UO.Exec('addobject Stopka')
 While UO.Targeting()
  Wait(100)
 Wend
 UO.Exec('set finddistance 1')
 repeat
  uo.findtype(UO.GetGraphic('Stopka'),UO.GetColor('Stopka'),1)
  uo.moveitem('finditem',0,'Stopka',uo.getx('Stopka'),uo.gety('Stopka'),uo.getz('Stopka'))
  wait(100)
 until uo.findcount()<1
end sub


Ищет обьекты на земле на расстоянии 1 клетки и вкладывает в стек, который нужно положить на расстоянии 2 клеток или в стек, находящийся в любом контейнере...

Еще раз всем спасибо :D
Post Reply