Yoko

All sides of Injection
It is currently 2017-09-25 04:41:46

All times are UTC+02:00




Post new topic  Reply to topic  [ 23 posts ]  Go to page 1 2 Next
Author Message
PostPosted: 2008-08-20 10:08:21 
Offline
User avatar

Joined: 2008-08-13 01:04:10
Posts: 34
Location: Krd
Доброго времени суток. Вот только начал разбираться со скриптингом для инжи и много ещё что не понятно, многих вещей ещё не знаю, так что если мой вопрос, или то чего я понаприкручивал, покажется глупым, уж не обессудьте. :) Собсно вопрос заключается в следующем:
К скрипту на поштучное производство стрел, нужно прикрутить функцию перекладывания готовой стрелы или в бэкпак или в сундук откуда берутся шафты. Это всё из за того что БК скрипт на сервере написан так чтобы стрелы, если их делать по одной, падали в пак и не стакались. А тут ещё ограничение в 140 итемов в паке. Поэтому необходимо или перекладывать их обратно в контейнер или ещё раз в пак кидать, тогда они складываюся. Я что то прикрутил, но это что то не работает, потому как нет строчки которая указывает куда нужно перекладывать готовые стрелы, как я понял.
Вот исходный скрипт :
Code:
sub Bowcraft()
   repeat
      UO.FindType('0x1BD4','0x0000','backpack')
      put:
      If UO.GetQuantity('finditem')<1 then
         UO.FindType('0x1BD4','0x0000','0x720581FB') ;Сериал сундука
         UO.Grab('1','finditem')
         wait(800)
      Endif
      UO.FindType('0x1bd4','0x0000','backpack')
      If UO.GetQuantity('finditem')<1 then
         goto put
      Endif
      wait(100)
      UO.Usetype('0x1bd4')
      UO.WaitTargetType('0x1BD1')
      UO.WaitMenu('What you you want to create?','Arrow')
      wait(800)
      UO.DeleteJournal()
      while not (UO.InJournal('You create some arrows and put them in your pack') or UO.InJournal('You destroy some materials'))
      wait(100)
      until UO.Dead()
   end sub

А вот с недоделанным куском:
Code:
sub Bowcraft()
   repeat
      UO.FindType('0x1BD4','0x0000','backpack')
      put:
      If UO.GetQuantity('finditem')<1 then
         UO.FindType('0x1BD4','0x0000','0x720581FB') ;Сериал сундука
         UO.Grab('1','finditem')
         wait(800)
      Endif
      UO.FindType('0x1bd4','0x0000','backpack')
      If UO.GetQuantity('finditem')<1 then
         goto put
      Endif
      wait(100)
      UO.Usetype('0x1bd4')
      UO.WaitTargetType('0x1BD1')
      UO.WaitMenu('What you you want to create?','Arrow')
      wait(800)
      UO.DeleteJournal()
      while not (UO.InJournal('You create some arrows and put them in your pack') or UO.InJournal('You destroy some materials'))
         wait(600)
         UO.FindType('0x0F3F') ;стрелы
         If UO.GetQuantity('0x0F3F') == 1 then
            UO.Grab('1','0x0F3F')
            wait(600)
         Else
            If UO.FindCount() < 1 then
               wait(100)
               UO.Print( 'No arrows' )
               wait(100)
            Endif
         Endif
      until UO.Dead()
   end sub

И в первом и во втором варианте всё работает, но абсолютно одинаково (т.е никто ничего не перекладывает), что не удивительно. Что ещё нужно добавить чтобы скрипт заработал полностью?
Заранее благодарю за возможные ответы.
З.Ы Правда иногда на 13 строчку ошибка вылетает, "GoTo - Некорректное определение цикла в скрипте!!?" пишет... с чем это связано тоже не могу понять...


Top
   
 Post subject:
PostPosted: 2008-08-20 15:06:02 
Offline

Joined: 2005-04-19 18:00:29
Posts: 2259
Location: Московская область
Вот конструкция для перекладки стрелы в контейнер:

Code:
if uo.InJournal('put') then
  uo.FindType('тип стрелы','цвет стрелы','backpack')
  if uo.FindCount() then
    uo.moveitem('finditem','all','ID контейнера')
    wait(750)
  end if
  uo.DeleteJournal()
end if

Перед запуском скрипта открой все контейнеры с которыми будет работать скрипт. (бекпек, контейнеры и т.д.)


Top
   
 Post subject:
PostPosted: 2008-08-21 18:53:56 
Offline
User avatar

Joined: 2008-08-13 01:04:10
Posts: 34
Location: Krd
Scripts Writer, спасибо огромное. Но так получилось что появилась ещё пара вопросов. :?
Скрипт заработал, вместе с перетаскиванием готовых стрел. Но отказался работать с тем же контейнером из которого берёт шафты. Добавил ещё один - заработал. Теперь проблема в том что перекладывает почемуто не каждую стрелу, а как то выборочно и только одну, а не все подходящие по тэйпу и цвету. То подряд перекладывает, то через одну, то через 3, то вообще через 5-7 упавших в пак, короче полный рандом.
И ошибка "Line 13: GoTo - Некорректное определение цикла в скрипте!!?" по прежнему присутствует, и что там в 13-ой строчке не так, не могу понять, темболее что скрипт работает, а эта ошибка выскакивает через N-ное количество циклов, тоже рандомное. Может работать и 15 минут, а может и на первых секундах выдать это сообщение....
Code:
sub Bowcraft()
   repeat
      UO.FindType('0x1BD4','0x0000','backpack')
      put:
      If UO.GetQuantity('finditem')<1 then
         UO.FindType('0x1BD4','0x0000','0x720581FB')
         UO.Grab('1','finditem')
         wait(800)
      End if
      UO.FindType('0x1bd4','0x0000','backpack')
      If UO.GetQuantity('finditem')<1 then
         goto put
               End if ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Line 13
            wait(100)
      UO.Usetype('0x1bd4')
      UO.WaitTargetType('0x1BD1')
      UO.WaitMenu('What you you want to create?','Arrow')
                 wait(800)
      UO.DeleteJournal()
      while not (UO.InJournal('You create some arrows and put them in your pack') or UO.InJournal('You destroy some materials'))
                 wait(600)
            If UO.InJournal('put') then
                 UO.FindType('0x0F3F','0x0000','backpack')
            If UO.FindCount() then
                 UO.moveitem('finditem','all','0x7216C9D4')
                wait(750)
               End if
            UO.DeleteJournal()
  End if
      until UO.Dead()
end sub


Top
   
 Post subject:
PostPosted: 2008-08-21 20:32:12 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3207
http://ultimasoft.ru/tools/codesweeper.php

Инструктирую:
1. Скопировать скрипт.
2. Нажать кнопу.
3. Сделать выводы.

Это как минимум. Как максимум - стараться избегать конструкций goto.

_________________
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Skype: d119060


Top
   
 Post subject:
PostPosted: 2008-08-22 10:17:43 
Offline
User avatar

Joined: 2008-08-13 01:04:10
Posts: 34
Location: Krd
Destruction wrote:
http://ultimasoft.ru/tools/codesweeper.php

Инструктирую:
1. Скопировать скрипт.
2. Нажать кнопу.
3. Сделать выводы.

Это как минимум. Как максимум - стараться избегать конструкций goto.

Спасибо за инструктаж.
Утилитка пишет что скрипт кривой, но только это я и сам давно понял :) Я имел ввиду что пока плохо втыкаю откуда "ноги растут" у этой кривизны конкретно. Я не буду спрашивать почему лучше стараться избегать конструкций goto, потому как думаю что ответ может быть достаточно объёмный, да и ктому же я могу его и не понять полностью.
Для начала, было бы неплохо, на примере глючного куска скрипта, написать что конкретно призван делать этот фрагмент. Вернее как это понял я. Для того чтобы находить ошибки, нужно хорошо понимать как работает скрипт.
Вот этот кусок:
Code:
UO.FindType('0x1bd4','0x0000','backpack')
      If UO.GetQuantity('finditem')<1 then
         goto put
      End if

Вот как это понимаю я: Ищем в бэкпаке объект "0x1bd4" (шафты) с цветом "0x0000", если количество этих объектов < 1 (меньше еденицы) то возвращяемся к "put" (чтобы выполнить UO.Grab('1','finditem') ещё раз).
Исходя из этого и из того что лучше избегать применения goto в скрипте я изменил скрипт следующим образом :
Code:
sub Bowcraft()
   repeat
      UO.FindType('0x1BD4','0x0000','backpack')
      put:
      If UO.GetQuantity('finditem')<1 then
         UO.FindType('0x1BD4','0x0000','0x720581FB')
         UO.Grab('1','finditem')
         wait(800)
      End if
      UO.FindType('0x1bd4','0x0000','backpack')
      If UO.GetQuantity('finditem')<1 then
         wait(300)
      End if
      UO.Usetype('0x1bd4')
      UO.WaitTargetType('0x1BD1')
      UO.WaitMenu('What you you want to create?','Arrow')
      wait(800)
      UO.DeleteJournal()
      while not (UO.InJournal('You create some arrows and put them in your pack') or UO.InJournal('You destroy some materials'))
         wait(600)
         If UO.InJournal('put') then
            UO.FindType('0x0F3F','0x0000','backpack')
            If UO.FindCount() then
               UO.moveitem('finditem','1','0x7216C9D4')
               wait(750)
            End if
            UO.DeleteJournal()
         End if
      until UO.Dead()
   end sub

Проверка есть ли в паке шафт, как я понял, особо не нужна. Если шафт по какой то причине не попал в пак, скрипт завершит цикл и на следующем ещё раз будет пататься взять шафт, что у него должно получится. Но это всё так, если я правильно понял принцип работы того фрагмента о котором говорил в начале.
Тест скрипта показал его полную функциональность, без сбоев. Но достаточно долго тестить скрипт не получается потому что ограничение количества итемов в бэкпаке не даёт делать более 140 стрел за раз. Потом приходится останавливать скрипт и перекладывать стрелы вручную (,massmove), а затем запускать его вновь так как конструкция перемещения готовых стрел работает "через раз на пятый", или, можно сказать, вообще не работает. В чём причина - не могу понять.
Очень Вам признателен за то, что отвечаете на мои идиотские вопросы :) надёюсь что не бросите меня на этом этапе доведения до "ума" данного скрипта. Я не прошу выложить готовый скрипт, так как хочу сам понять как это всё работает, но придание ускорения по нужному вектору очень желательно :).
=============
З.Ы. Насчёт утилиты. Всё что я увидел, это то что скрипт стал выглядеть иначе (визуально лучше воспринимается), и замечание вверху что он, тем неменее, кривой. Еслиб было немного побольше опыта в знании языков програмирования, то возможно и понял что нибудь ещё. Но на данном этапе только это...


Top
   
 Post subject:
PostPosted: 2008-08-22 10:51:52 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3207
Quote:
Утилитка пишет что скрипт кривой, но только это я и сам давно понял Smile Я имел ввиду что пока плохо втыкаю откуда "ноги растут" у этой кривизны конкретно.

Утилитка расставляет отступы в скрипте согласно логическим конструкциям.

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

Конкретнее? - У вас в скрипте есть while (1шт), но нет ни одного wend.. Отсюда и глюки - программа незнает, какой именно участок кода нужно повторять.

Quote:
Я не буду спрашивать почему лучше стараться избегать конструкций goto, потому как думаю что ответ может быть достаточно объёмный, да и ктому же я могу его и не понять полностью.

Никакой объёмности, всё кратко и просто - они глючные -)

Теперь конкретно анализ "последней" версии вашего скрипта:
Code:
sub Bowcraft()
   repeat
      UO.FindType('0x1BD4','0x0000','backpack')
      put: ; зачем нам метка, если мы её не используем?
      If UO.GetQuantity('finditem')<1 then ; а если предмет не найден? - Вы будите пытаться получить количество несуществующего предмета.. Не самый лучший подход, смотри так же функцию uo.findcount()
         UO.FindType('0x1BD4','0x0000','0x720581FB')
         UO.Grab('1','finditem') ; команда устарела, используйте uo.moveitem()
         wait(800) ; а здесь лучше использовать функцию checklag()
      End if
      UO.FindType('0x1bd4','0x0000','backpack') ; эта и следущие три строчки - что за хитрая конструкция? Смысл ?
      If UO.GetQuantity('finditem')<1 then
         wait(300)
      End if
      UO.Usetype('0x1bd4') ; а вы уверены, что оно есть в рюкзаке? - Положить конструкцию под if.
      UO.WaitTargetType('0x1BD1') ; а вы уверены, что оно есть в рюкзаке? - Положить конструкцию под if.
      UO.WaitMenu('What you you want to create?','Arrow')
      wait(800) ; зачем ?
      UO.DeleteJournal() ; лучше разместить до usetype - логичнее.
      while not (UO.InJournal('You create some arrows and put them in your pack') or UO.InJournal('You destroy some materials')) ; используйте один uo.injournal, не пишите сообщения полностью, разделяйте сообщения при помощи |
         wait(600) ; многовато, 100 - оптимальный вариант
         If UO.InJournal('put') then ; лучше мерить по uo.count()
            UO.FindType('0x0F3F','0x0000','backpack')
            If UO.FindCount() then ; заменить всю эту систему на while, чтобы перекидывать все.
               UO.moveitem('finditem','1','0x7216C9D4')
               wait(750) ; используйте checklag
            End if
            UO.DeleteJournal()
         End if
      wend ; почему его тут не стояло? ;-)
   until UO.Dead()
end sub


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

Вообще скрипты такой кривизны не подлежат исправлениям, а подлежат переписыванию.

Т.е. "правильно" скрипт выглядел бы так:
Code:
sub Bowcraft()
   var T_arrow = "0x0F3F" ; тип стрел
   var T_logs = "0x1BD4" ; тип логов
   var C_logs = "0x0000" ; цвет логов
   var I_container = "0x720581FB" ; ID контейнера с логами
   var I_receiver = "0x7216C9D4" ; ID контейнера куда складывать продукцию
   var menu_size = 1 ; количество элементов в выборке меню
   DIM promts[ val( str( menu_size ) ) ]
   DIM choice[ val( str( menu_size ) ) ]
   ; элементы выбора в меню
   promts[ 0 ] = "What you you want to create?"
   choice[ 0 ] = "Arrow"
   var craft_msg = "You create|You destroy"
   repeat
      while uo.count( T_arrow )
         uo.moveitem( "^" + T_arrow, "0", T_receiver )
         checklag()
      wend
      if uo.count( T_logs, C_logs ) then
         ; если в рюкзаке есть логи
         deljournal( craft_msg ) ; опять ошибка? - опять читайте подпись -)
         uo.usetype( T_logs, C_logs )
         uo.waittargettype( T_logs, C_logs )
         my.waitmenu( promts, choice, menu_size )
         repeat
            wait( 100 )
         until uo.injournal( craft_msg )
      else
         ; если нема в рюкзаке логов
         uo.findtype( T_logs, C_logs, I_container )
         if not uo.findcount() then
            uo.print( "Нема логов в контейнере!" )
            return false
         endif
         uo.moveitem( "finditem", "1" )
         checklag() ; возникла тут ошибка? - читайте мою подпись.
      endif
   until uo.dead()
endsub

Sub my.waitmenu( promts, choice, len )
   ; шаманская функция, теоретически могёт закосячить при формировании переменной menu, ибо не тестировалась.
   var i, menu = "waitmenu"
   for i = 0 to len -1
      menu = menu + " '" + promts[ i ] + "' '" + choice[ i ] + "'"
   next
   uo.exec( menu )
endsub


Вообще не большой любитель писать > 0, < 1 и тому подобные конструкции, как вы навярняка заметили. За сим небольшой хинт, как работает строчка:
Code:
if not uo.count( T_logs, C_logs ) then 


uo.count - вернёт количество предмета в бекпаке
далее, NOT - изменит булеву переменную на противоложную
как вы наврняка знаете, что любое число отличное от нуля - трактуется как true, 0 - false.
соответственно и получаем, если uo.count возвращает 0 (false), то NOT меняет его на true => условие проходит.

_________________
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Skype: d119060


Top
   
 Post subject:
PostPosted: 2008-08-25 16:22:45 
Offline
User avatar

Joined: 2008-08-13 01:04:10
Posts: 34
Location: Krd
Destruction, Огромое, человеческое спасибо ! :)
Ездил на море, вот недавно вернулся. Попробовал переделать кривой скрипт, но ничего особо не получилось. В лучшем случае он делал один полный цикл и останавливался. После тщетных попыток хоть как то изменить ситуацию, решил не забивать себе голову изначально кривыми скриптами и попытался разобраться с "правильным" скриптом -). Вопросов поначалу было гораздо больше чем ответов. Но чтобы не занимать Ваше время лишними вопросами, разбирался и вникал сам, в то что смог вникнуть. Но остались всё же некоторые моменты которые не могу понять. Восновном это касается "шаманской" функции -). Работать то она работает, не косячит, всё ок. Но вот только как она работает непоняяяятно :). И + ещё несколько вопросов. Чтобы было удобнее их воспринимать, а не вытаскивать из всего текста покусочкам, я ниже напишу что конкретно не понятно, как говорится, по пунктам. И буду с надеждой ждать ответов -).
Скрипт немножко переделал и дополнил, в соответствии с реалиями того шарда на котором этот скрипт будет использоваться в первую очередь. Здесь просто стрелы делаются не напрямую из логов, а из шавтов которые делаются из логов. Потом дабллклик на шавтах и таргет на перья. Это малоинтересная мелочёвка, но из за неё пришлось добавить ещё пару переменных и немножко местами подправить. Кроме этого добавил сабы "checklag" и "deljournal". Вот что из этого получилось :
Code:
sub Bowcraft() 
   var T_arrow = "0x0F3F" ; тип стрел
   var T_shaft = "0x1BD4" ; тип шавтов
   var C_shaft = "0x0000" ; цвет шавтов
   var I_container = "0x720581FB" ; ID контейнера с шавтами
   var I_receiver = "0x7216C9D4" ; ID контейнера куда складывать продукцию
   var menu_size = 1 ; количество элементов в выборке меню
   var T_feather = "0x1BD1" ; тип перьев
   var C_feather = "0x0000" ; цвет перьев
   DIM promts[ val( str( menu_size ) ) ]
   DIM choice[ val( str( menu_size ) ) ]
   promts[ 0 ] = "What you you want to create?"
   choice[ 0 ] = "Arrow"
   var craft_msg = "You create|You destroy"
   repeat
      while uo.count( T_arrow )
         uo.moveitem( "^" + T_arrow, "0", I_receiver )
         checklag()
      wend
      if uo.count( T_shaft, C_shaft ) then
         deljournal( craft_msg )
         uo.usetype( T_shaft, C_shaft )
         uo.waittargettype( T_feather, C_feather )
         my.waitmenu( promts, choice, menu_size )
         repeat
            wait( 100 )
         until uo.injournal( craft_msg )
      else
         uo.findtype( T_shaft, C_shaft, I_container )
         if not uo.findcount() then
            uo.print( "Нема шавтов в контейнере!" )
            return false
         endif
         uo.moveitem( "finditem", "1" )
         checklag()
      endif
   until uo.dead()
end sub

Sub my.waitmenu( promts, choice, len )
   var i, menu = "waitmenu"
   for i = 0 to len -1
      menu = menu + " '" + promts[ i ] + "' '" + choice[ i ] + "'"
   next
   uo.exec( menu )
end sub

Sub checklag()
  deljournal("Backpack") ; не знал что имеет значение с какой буквы пишется "Backpack". =)
  uo.click("backpack")
   repeat
   wait(50)
  until uo.injournal("Backpack")
endsub
 
Sub deljournal(msg)
 while uo.injournal(msg)
  uo.setjournalline(uo.injournal(msg)-1,"")
 wend
end sub

На самом деле словосочетание "добавил сабы" звучит несколько громко, скорее это просто копипаст :), потому как не очень понимаю как это всё работает. Поэтому мог где нибудь не указать параматры, в тех местах где мне непонятно как это работает или просто незаметил. Если что то упустил, рад буду услышать где именно. Но даже если гдето и упустил что нить, скрипт работает. Да как работает. Как швейцарские часы работает :), чему я безмерно рад. Но всётаки хотелось бы понять полностью. Чтобы не осталось "пробелов" в понимании работы всего скрипта вцелом и всех его частей по отдельности в частности.
Теперь то что непонял.
1. "var menu_size = 1 ; количество элементов в выборке меню" Элементы это те итемы в меню ктороые можно сделать? А как тогда выглядят элементы подменю. Т.е. есть крафты в меню которых сначала выберается раздел, а уже потом итем.
===================================
2. DIM promts[ val( str( menu_size ) ) ] С "choice" - понятно, это выбор конкретного итема в меню, а что за "promts"?
DIM choice[ val( str( menu_size ) ) ] -- А это что, тоже переменные? Почему тогда DIM? И что за параметры "val" и "str"?
===================================
3. uo.moveitem( "^" + T_arrow, "0", I_receiver ) -- Понятно впринципе почти всё кроме параметров "^" и "0". Что они означают? И почему перед "T_arrow" стоит "+" ?
===================================
4. Sub my.waitmenu( promts, choice, len ) -- Что за параметр "len" ? И почему ему в скрипте присвоено значение "-1" ? И вообще что означает параметр "-1" ?
===================================
5. menu = menu + " '" + promts[ i ] + "' '" + choice[ i ] + "'" -- эта строчка вообще для меня "тёмный лес". -)
===================================
6. Sub checklag() -- Что делает этот саб? Кликает на бэкпаке, ждёт отклика от сервера и появление в журнале строчки "a Backpack"? А если нет отклика от сервера (лаг), то что? Скрипт как бы стоит на паузе и ждёт пока будет отклик от сервера в виде надписи в журнале "a Backpack" и только после этого продолжает работать?
===================================
Короче говоря, больше всего вопросов возникает там где используется меню крафта. Было бы интересно увидеть примеры, как выглядят строчки в скрипте если итемов в меню не 1, а к примеру 8 и надо сделать не первый, а 5 итем в меню.
Надеюсь на прояснение этих моментов. Потому как сейчас нужно написать ещё один скрипт на боукрафт, но уже не на стрелы а на луки. А там менюшка немного посложнее и элементов намного больше.
Сейчас, впринципе, сам уже смог бы написать его, но вот только эти непонятные моменты не дают мне этого сделать -). Пока не разберусь с менюшками, вот кент скинул скрипт, если это можно так назвать, на крафт луков.
Code:
sub firebow()
while uo.count('0x1BDD')>15  # logs
UO.Exec("waitmenu 'What do you wish to make?' 'Firebow'")
UO.Exec("waittargetobject '^0x1BDD'")
UO.Exec("useobject '^0x0F51'") # dagger
wait(6000)

UO.Exec("waittargetobject '^0x13B2'") # firebow
Wait (500)
UO.Exec("useobject '^0x10E7'")  # scorp
Wait (3000)
wend
end sub

Не знаю как "это" работает, но судя по всему не очень хорошо. :) Хотя прекрасно понимаю что если немного изменить уже полностью готовый и работоспособный скрипт на крафт стрел, то можно получить, впринципе, скрипт на любой крафт. Но вышеописанные непонятные моменты не способствуют этому. Надеюсь на внесение ясности и заранее благодарствую... ))


Top
   
 Post subject:
PostPosted: 2008-08-25 23:35:30 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3207
Quote:
не знал что имеет значение с какой буквы пишется "Backpack". =)

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

Отсюда следует два варианта кроссшардного решения проблемы:
Вариант первый - очевидный: deljournal( "Backpack|backpack" )
Вариант второй - тоже очевидный, но более.. мм.. краткий: deljournal( "ackpack" )

Quote:
1. "var menu_size = 1 ; количество элементов в выборке меню" Элементы это те итемы в меню ктороые можно сделать? А как тогда выглядят элементы подменю. Т.е. есть крафты в меню которых сначала выберается раздел, а уже потом итем.

Не-не-не.. Смотри, у нас waitmenu как работает?:
waitmenu( prompt, choice, ... итд ... )
Для полного понимания - зайди на http://yoko.com.ua/help в раздел "Символы" и ознакомься, что это конкретно есть.
Теперь касательно того, как работает шаманская функция. Однажды я подумал, а почему бы данные для этого waitmenu не выносить в отдельную переменную? - В переменную оказалось не удобно - длинная строка получается, а вот в массивы - самое оно.
Так вот, возвращаясь к теме вопроса. Переменная означает лишь то, сколько мы хотим объявить пар promt & choice (если вы прочитали про них внимательно, то почему именно пар - вопроса быть не должно).
Собственно говоря, зачем она нужна? - Посмотрите скрипт, используется в трёх местах:
1. Для объявления массива promt (указывает количество элементов конструктору массива).
2. Аналогично в массиве choice.
3. Для перебора всех элементов массивов promt и choice (который передаются в функцию, кстати да - массивы можно передавать аргументом в функцию, хитрая фишка).

По второму вопросу я кажется уже ответил в первом пункте -)
Quote:
3. uo.moveitem( "^" + T_arrow, "0", I_receiver ) -- Понятно впринципе почти всё кроме параметров "^" и "0". Что они означают? И почему перед "T_arrow" стоит "+" ?

Давайте разберёмся по-порядку.
Первое - нулик. В первую очередь - открываем хелп по команде:
http://yoko.com.ua/help/help.php?lang=r ... m=moveitem
Смотрим, нулик идёт вторым аргументом - второй аргумент - quantity - количество, про что в хелпе более чем ясно написано:
Количество quantity если 0 или не указано означает всю стопку.
Вы просто поленились зайти в хелп да прочитать, непорядок.

Далее, что означает плюсик? - Плюсик это оператор конкатенации, если справа и слева строка или оператор сложения, если справа и слева число. Если тип данных справа отличается от типа данных слева, то вы плохой программист -)
Конкатенация, если вкратце, это процесс склеивания строк. Т.е. "a" + "b" = "ab" и ничего более.
Собственно говоря имеем строку - "^" и к ней прибавляется переменная, T_arrow, значение которой - строка "0x0F3F", итого получается, что первый аргумент функции moveitem передаётся - "^0x0F3F".
Опять идём в хелп по команде moveitem - первый аргумент подсвечен, нажимаем на него и попадаем в описание символа "object". Пролистав вниз, вы найдёте информацию о том, что такая строка означает.
Quote:
4. Sub my.waitmenu( promts, choice, len )

Почему минус один? - В скрипте как раз таки единица. Мы заранее знаем, что количество элементов в получаемых массивах promts и choice - одинаково. Третий же аргумент функции, len - говорит сколько в них элементов, т.к. другого нормального способа получить эту информацию - просто нет. Ну и соответственно исходя из третьего аргумента уже и работает цикл.
Quote:
menu = menu + " '" + promts[ i ] + "' '" + choice[ i ] + "'" -- эта строчка вообще для меня "тёмный лес". -)

Я уже писал про конкатенацию. promts[ i ] - обращение к конкретному элементу массива, в котором опять-таки лежит строка.
Проще говоря - эта функция строит команду waitmenu с нужными аргументами и исполняет через uo.exec.
Quote:
6. Sub checklag() -- Что делает этот саб? Кликает на бэкпаке, ждёт отклика от сервера и появление в журнале строчки "a Backpack"? А если нет отклика от сервера (лаг), то что? Скрипт как бы стоит на паузе и ждёт пока будет отклик от сервера в виде надписи в журнале "a Backpack" и только после этого продолжает работать?

Это динамическая пауза. Суть этого шаманства в том, что сервер присылает данные строго по-порядку, т.е. если в журнале появилась надпись (а мы её ещё не получили от сервера), потом мы сделали клик по бекпаку - то сначала нам придёт надпись в журнал, а потом надпись о клаце по бекпаку. Проще говоря - так мы как раз таки ждём, пока всё отлагает. Есть минус - если есть потери пакетов до сервера, то нужно как-то ограничить эту функцию, но это требуется очень редко и вообще - играть с потерями пакетов - плохая идея.

Кажется ответил на все вопросы, который ты растянул на столь длинный пост -)

PS: Задание на дом - разобраться в чём отличие писать "sub" или "Sub", проще говоря - в чём фишка ;-)

PPS: Касательно того, что я поназывал переменные I_, T_, C_ - я просто подумал, что так новичку будет сложнее запутаться и читабельность как-то выше - сразу видно где возможна ошибка.

_________________
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Skype: d119060


Top
   
 Post subject:
PostPosted: 2008-08-27 14:24:56 
Offline
User avatar

Joined: 2008-08-13 01:04:10
Posts: 34
Location: Krd
Ну прям не знаю что и сказать... -)
Спасибо ещё раз это да, но тут спасибами уже не отделаешся, я так понимаю. Дело уже магарычом пахнуть начинает... -)) Правда магарыч дело такое, требующее нужной локации получателя. Предавать почтой это уже извращение, на мой взгляд -)
Ну да ладно, я думаю это не большая проблема. Все ездят летом на море (ну кроме тех кто предпочитает отдыхать в Турции, Греции и тп..), и как раз чаще всего через нашу "большую деревню", так что это решаемо.. ) Это конечно при условии что ты в России живёш =))
Ну это я немного отвлёкся -).


Касательно "домашнего задания". Если писать sub маленькими буквами, то он будет виден в списке доступных к запуску скриптов в инже. А если писать Sub, то в этом списке видно его не будет, но он останется и будет полностью рабочим, просто будет спрятан от глаз посторонних (или просто чтобы их не мазолил) -)). Во всяком случае это так, как я понял... )
============

Теперь о том что всеравно частично осталось за пределами моего понимания.
А именно: как скрипт выбирает ту или иную пару promt/choise. Где в скрипте указываются переменные?
Я думаю, что если я увижу пример изменений мне станет всё понятно. Вовсяком случае я на это надеюсь.. ))
Неплохо было бы увидеть что изменяется в уже полностью рабочем скрипте который был выложен постом выше (какие именно строчки и параметры) если выбор в меню другой. Ну например если надо сделать не "Arrow", а "Bolt". На самом деле в той менюшке как раз два элемента. Стрелы и болты.
Нужно ли менять на "2" цифру в этой переменной - var menu_size = 1?
И вообще что и где меняется.
И совсем замечательно было бы увидеть пример того что изменится если будет не одна пара promt/choise а две. Например, сначала promt = select category, choise = weapons, а затем promt = select item, shoise = hatchet. В этом примере все названия взял с потолка, тут главное понять что и где меняется. В реальности таких пар на шарде нет.


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

P.S.
Quote:
PPS: Касательно того, что я поназывал переменные I_, T_, C_ - я просто подумал, что так новичку будет сложнее запутаться и читабельность как-то выше - сразу видно где возможна ошибка.

Так действительно труднее запутатся, и легче воспринимается. Думаю что так будет правильнее называть переменные, в случае если в перспективе есть возможность того что скрипт будет использоваться кем то ещё. Т.е не просто для личного пользования. Хотя даже если и чисто для себя, так удобнее, имхо...


Top
   
 Post subject:
PostPosted: 2008-08-27 15:03:04 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3207
Следущие три кода делают одно и то же:
Code:
var menu_size = 3 ; количество элементов в выборке меню
DIM promts[ val( str( menu_size ) ) ]
DIM choice[ val( str( menu_size ) ) ]
promts[0] = "Blacksmithing"
choice[0] = "Weapons"
promts[1] = "Weapons"
choice[1] = "Fencing"
promts[2] = "Fencing"
choice[2] = "dagger"
my.waitmenu( promts, choice, menu_size )

Code:
uo.exec( "waitmenu 'Blacksmithing' 'Weapons' 'Weapons' 'Fencing' 'Fencing' 'dagger'" )

Code:
uo.waitmenu( "Blacksmithing", "Weapons", "Weapons", "Fencing", "Fencing", "dagger" )


Причём как не крути, все эти коды, на самом деле - сводятся к варианту номер два -)

_________________
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Skype: d119060


Top
   
 Post subject:
PostPosted: 2008-08-27 16:10:47 
Offline
User avatar

Joined: 2008-08-13 01:04:10
Posts: 34
Location: Krd
Краткость сестра таланта -).
Вроде не много написал, а всё стало понятно. :)

Quote:
Причём как не крути, все эти коды, на самом деле - сводятся к варианту номер два -)

А тут, сам собой напрашивается вопрос. В чём тогда преимущество таких, во всяком случае на первый взгляд, сложных конструкций, когда можно отделатся строчкой - uo.exec( "waitmenu 'Blacksmithing' 'Weapons' 'Weapons' 'Fencing' 'Fencing' 'dagger'" )?


Top
   
 Post subject:
PostPosted: 2008-08-27 19:43:38 
Offline
Expert!
User avatar

Joined: 2006-02-07 08:51:40
Posts: 1347
Location: г. Старый Оскол
TwiN wrote:
А тут, сам собой напрашивается вопрос. В чём тогда преимущество таких, во всяком случае на первый взгляд, сложных конструкций, когда можно отделатся строчкой - uo.exec( "waitmenu 'Blacksmithing' 'Weapons' 'Weapons' 'Fencing' 'Fencing' 'dagger'" )?


Потому что так легче изменять и править скрипт, если допустим ты забудешь кавычку, когда будешь править сам эту строку, то рано или поздно скрипт упадет с ошибкой, если вообще запустится. А с переменными ты меняешь просто текстовые строки, не причиняя особого вреда коду скрипта, плюс не нужно искать эту строку по всему скрипту(если до нее еще 200 - 500 строк кода), все переменные в начале скрипта указанны. Ну и так профессиональней в конце концов. :roll:


Top
   
 Post subject:
PostPosted: 2008-09-13 00:32:02 
Offline
User avatar

Joined: 2008-08-13 01:04:10
Posts: 34
Location: Krd
Kynep wrote:
TwiN wrote:
А тут, сам собой напрашивается вопрос. В чём тогда преимущество таких, во всяком случае на первый взгляд, сложных конструкций, когда можно отделатся строчкой - uo.exec( "waitmenu 'Blacksmithing' 'Weapons' 'Weapons' 'Fencing' 'Fencing' 'dagger'" )?


Потому что так легче изменять и править скрипт, если допустим ты забудешь кавычку, когда будешь править сам эту строку, то рано или поздно скрипт упадет с ошибкой, если вообще запустится. А с переменными ты меняешь просто текстовые строки, не причиняя особого вреда коду скрипта, плюс не нужно искать эту строку по всему скрипту(если до нее еще 200 - 500 строк кода), все переменные в начале скрипта указанны. Ну и так профессиональней в конце концов. :roll:


Как то не подумал о том что скрипты могут быть очень большие, потому и задал глупый вопрос -)
Но спасибо всеравно :)


Top
   
 Post subject:
PostPosted: 2008-09-13 01:01:45 
Offline
User avatar

Joined: 2008-08-13 01:04:10
Posts: 34
Location: Krd
Кстати о проффесиональности -)
Мне пока до неё ой как далеко, научиться бы пока тому чтобы простенькие скрипты работали нормально.
Собсно я вот что хотел узнать. Недавно понадобился скрипт на поизонинг, не на прокачку, а на протравку. Ну что тут сложного, думаю, прикинул как и что сделать, сел и написал. Изначально этот скрипт задумывался для личного использования и никаких особых требований к нему нет. Просто юзает скилл поизонинг, ждёт таргета, кидает его на бутылки с ядом, ждёт второй таргет и кидает его на оружие... Но не работает сволоч, доходит до таргета который нужно кидать на оружие и глохнет... вернее не глохнет а спамит в журнал с висящим таргетом и всё... В чём проблемма не могу понять, вроде всё так.. но это только на мой взгляд, хотя и знаю что какой то косяк есть...
но не могу его найти и всё... уже и форум облазил в поисках чёнить похожего, кое что исправлял - всеравно не работает... не находит топор, хотя он там есть, и всё...
Если кто нибудь подскажет что там не так, буду очень благодарен...
Code:
sub Poisoning()
 var P_Type = '0x0F0E'  ;тайп бутылок
 var P_Col = '0x0694'    ;цвет бутылок
 var W_Type = '0x0F4B' ;тайп оружия для протравки
 repeat
  uo.deletejournal()
   uo.findtype(P_Type,P_Col,'Backpack') 
   uo.waittargetobject('finditem',W_Type)
   uo.useskill('Poisoning')
    wait( 1500 )
   if uo.injournal('You succeed') then
    uo.print('Poison in complete!')
     wait( 10000 )
    endif
 until uo.dead()
end sub


Top
   
 Post subject:
PostPosted: 2008-09-13 19:40:55 
Offline
User avatar

Joined: 2006-11-06 21:45:23
Posts: 137
ошибка может быть здесь:
uo.waittargetobject('finditem',W_Type)

Синтакс: uo.waittargetobject(object,[object2])

попробуй эту комманду:
Синтакс: uo.waittargetobjecttype(object,type,[color])


Top
   
 Post subject:
PostPosted: 2008-09-15 21:37:03 
Offline
User avatar

Joined: 2008-08-13 01:04:10
Posts: 34
Location: Krd
Quote:
попробуй эту комманду:
Синтакс: uo.waittargetobjecttype(object,type,[color])


Попробовал, всеравно не пашет.
Переделал скрипт следующим образом :

Code:
sub Poisoning() 
 var P_Type = '0x0F0E' ;тайп бутылок
 var P_Col = '0x0694'  ;цвет бутылок
 var W_Type = '0x0F4B' ;тайп оружия
 var W_Col = '0x0253'  ;цвет оружия
 repeat
  uo.deletejournal()
   uo.findtype(P_Type,P_Col,'Backpack')
   uo.waittargetobject('finditem',W_Type,W_Col)
   uo.useskill('Poisoning')
    wait( 1500 )
   if uo.injournal('You succeed') then
    uo.print('Poison in complete!')
     wait( 10000 )
    endif
 until uo.dead()
end sub


Теперь, первый таргет, который инициируется "uo.useskill('Poisoning')" зависает и дальше скрипт не идёт. Пишет "Usage: waittargetobject object [object2]". Я ничего не могу понять, вродеж указал ему все объёкты. Или может я чёто не так указал?


Last edited by TwiN on 2008-09-15 22:36:47, edited 1 time in total.

Top
   
 Post subject:
PostPosted: 2008-09-15 22:10:38 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3207
uo.waittargetobject
uo.waittargettype

Try to find some difference ;-)

Вообще я непонимаю, чего надо ?

Тебе два таргета повесить надо ?..

Simple example:
Code:
var object1, object2
uo.findtype( ... ) ; ищем объект для первого таргета
object1 = uo.getSerial( "finditem" )
uo.findtype( ... ) ; ищем объект для второго таргета
object2 = uo.getSerial( "finditem" )
uo.waittargetobject( object1, object2 )

_________________
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Skype: d119060


Top
   
 Post subject:
PostPosted: 2008-09-15 22:51:35 
Offline
User avatar

Joined: 2008-08-13 01:04:10
Posts: 34
Location: Krd
Quote:
uo.waittargettype
uo.waittargetobject


Try to find some difference


Честно говоря, я плохо понимаю разницу. Вообще я думал что "uo.waittargetobject" это ловушка для таргета на объекты, т.е. self другой чар или нпс, а "uo.waittargettype" - для различных итемов.
Сейчас знаю только что "uo.waittargetobject" ищет в паке и есть возможность кинуть два последовательных таргета. А "uo.waittargettype" ищет на земле и только один объект. Могу и ошибатся... :?

Quote:
Тебе два таргета повесить надо ?..

Именно. Два последовательных таргета.
Сейчас буду пробовать изменить скрипт в соответствии с твоими инстукциями... :)
Чесно говоря, у меня такое предчуствие, что так всё заработает -))
Просто я не знал как именно всё это сделать... Только примерно, но не точно...


Top
   
 Post subject:
PostPosted: 2008-09-15 23:27:54 
Offline
User avatar

Joined: 2008-08-13 01:04:10
Posts: 34
Location: Krd
Я выше написал что uo.waittargettype и uo.waittargetobject ищут, но только не ищут, а ставят ловушку таргета. Это я понимаю, просто не так выразился. :)

Вот только протестить скрипт сегодня, ксожалению, не смогу - сервер в дауне. Значит завтра, но уже переделал :

Code:
sub Poisoning()
  var P_Type = '0x0F0E'  ;тайп бутылок
  var P_Col = '0x0694'    ;цвет бутылок
  var W_Type = '0x0F4B' ;тайп оружия для протравки
  var W_Col = '0x0253'   ;цвет оружия
  var Bottle, Weapon
  repeat
    uo.deletejournal()
    uo.findtype( P_Type, P_Col )
    Bottle = uo.getSerial( "finditem" )
    uo.findtype( W_Type, W_Col )
    Weapon = uo.getSerial( "finditem" )
    uo.waittargetobject( Bottle, Weapon )
    uo.useskill('Poisoning')
    wait( 1500 )
    if uo.injournal('You succeed') then
      uo.print('Poison in complete!')
      wait( 10000 )
    endif
  until uo.dead()
end sub


Вот только я непонял, uo.waittargetobject работает только с сериалом итемов и просто тэйпа и цвета недостаточно?


Top
   
 Post subject:
PostPosted: 2008-09-16 08:14:13 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3207
http://yoko.com.ua/help/help.php?lang=r ... rgetobject

Оба аргумента - object. Что есть object - можно узнать клацнув на этот самый "object" на странице хелпа:

http://yoko.com.ua/help/help.php?lang=r ... tem=object

Всё более чем понятно, тебя интересует то, что в самом низу второй ссылки.

_________________
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Skype: d119060


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 23 posts ]  Go to page 1 2 Next

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited