Page 1 of 1
Поднять предмет с пола и засунуть в стек.... [нид хелп]
Posted: 2005-06-09 00:23:13
by Ph0en1x
Помогите намутить что-то типа massmove, только чтоб подмимало с земли и засовывало в стек... (массмов из бекпака в стек сует без проблем, а вот с земли...

)
З.Ы. Не предлагать мувайтем в контейнер... не канает... чтоб добавить в стек нужно именно перащить айтем на айтем того-же типа...
Posted: 2005-06-09 02:26:29
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
Posted: 2005-06-09 12:26:56
by Ph0en1x
Решил немного подправить...
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
В нужном сундуке стек находит, извлекает координаты, находит вещи на полу, перетаскиевает, но на нулевые координаты (т.е. в левый верхний угол сундука

)
Как быть?
Posted: 2005-06-09 14:13:01
by flake
Тьфу... Все напутал у себя.
Нефиг писать скрипты в 4 утра.
Хм, интересно, почему не работает.
А тебе подойдет, если стек будет лежать на полу около чара?
Posted: 2005-06-09 21:18:27
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
ЗЫ: Требует АСМ любой версии
ЗЗЫ: Ничего править в скрипте не надо, он сам предлагает указать прицелом на исходный контейнер, на приемный контейнер, на образец предмета. Потом спросит размер одной порции и способ укладки. Насколько я понимаю - тебе накладывать в банк. Этот скрипт - как раз то, что тебе надо

Posted: 2005-06-10 01:11:08
by Ph0en1x
Edred, скрипт не пашет даже в том случае если я перекидываю из одного сундука в другой... перекидывает 1 айтем как положено, а все остальные кидает в бекпак и не стекует...
Да, и до сих пор не научился ловить таргетом землю...
flake, если стек будет на полу - тож подойдет...

Posted: 2005-06-10 07:50:57
by Edred
Скрипт сделан именно для перекладывания из одного контейнера в другой. То есть на землю или прямо в банк - это не к нему. А вот если в какой-то пак или ящик или сундук на земле или в банке - это пожалуйста. Скрипт абсолютно рабочий, сам пользуюсь уже год, да и есть уже десяток людей, кто тоже пользуется. АСМ стоит? Скрипту он нужен. Может паузу надо чуть увеличить, я же не знаю какие у тебя на шарде зашиты минимальные задержки при перемещении объектов, какой у тебя коннект.
Posted: 2005-06-10 13:39:21
by Ph0en1x
Тестил я скрипт на 2 сумках, в первой были поштучно бутли, во второй стек из двух таких бутлей... - 1 бутыль кидает во вторую сумку не добовляя в стек, а остальные полетели в бекпак... (
АСМ - 501.05, лагов практически нет (городской сервер идет через жирный канал), защиты мин. задержки тож нет (массмув работает без проблем с задержкой 1)
Posted: 2005-06-10 14:10:23
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
Posted: 2005-06-10 14:52:07
by Ph0en1x
Из контейнера в контейнер перекидывает, но в стек не сует...
З.Ы. я же писал в самом первом посту, что обычный мувайтем в контейнер не пашет, чтоб добавить в стек - нужно перетащить айтем на айтем или на стек...
Posted: 2005-06-10 19:55:03
by Edred
Я тебе дал два скрипта, в первом весьма ясно показано как определять стек и класть в него. Так что дерзай. Я пишу скрипты под себя и не собираюсь подстраивать их фиг знает под какие шарды, где скриптеры не могут нормально прописать складывание предметов.
Posted: 2005-06-10 23:44:33
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 клеток или в стек, находящийся в любом контейнере...
Еще раз всем спасибо
