Page 1 of 2

Скрипт на одевание любого оружия с пака

Posted: 2006-04-15 22:16:25
by 1a2a3a4a5a6a
Нужен скрипт, который будет одевать любое имеющееся оружие в паке и любой имеющийся щит в паке.

Posted: 2006-04-15 23:36:43
by Edred
И как ты себе представляешь искусственный интеллект, который отличает оружие от еды, например? Так что все равно придется массив всех возможных видов оружия и щитов делать... А дальше легкий перебор вариантов.

Posted: 2006-04-16 09:22:13
by 1a2a3a4a5a6a
Edred wrote:И как ты себе представляешь искусственный интеллект, который отличает оружие от еды, например? Так что все равно придется массив всех возможных видов оружия и щитов делать... А дальше легкий перебор вариантов.

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

Posted: 2006-04-16 10:49:42
by kotvsapogah
А что ты будешь делать если у тебя в паке лук и меч?

Posted: 2006-04-16 11:12:23
by Edred
Сваял на коленке, тести сам. Функцию взял из своих стандартных, сверху приклепал поиск оружия и щитов в паке. Если нету либо оружия, либо щита, скрипт скажет тебе 'nema!'. По идее, надо если есть только одно и брать это одно, но для этого надо в функцию дописать проверку на пустой параметр и посылать ей этот пустой параметр, а мне лень... Учись сам писать, тогда сделаешь все что хошь.


Code: Select all

sub ArmUp()
   DIM fork[30], shield[30]
   fork[0] = '0x0000'
   ...
   fork[29] = '0x0000'
   shield[0] = '0x0000'
   ...
   shield[29] = '0x0000'
   VAR i, tempfork, tempshield, flagfork = 0, flagshield = 0
   ; далее поиск циклом
   for i = 0 to 29
      if flagfork == 1 and flagshield == 1 then
         ; чтобы не был пустой цикл
         wait(20)
      endif
      if flagfork == 0 then
         uo.findtype( fork[i] )
         if uo.findcount() then
            flagfork = 1
            tempfork = uo.getserial( 'finditem' )
         endif
      endif
      if flagshield == 0 then
         uo.findtype( shield[i] )
         if uo.findcount() then
            flagshield = 1
            tempshield = uo.getserial( 'finditem' )
         endif
      endif
   next
   if flagfork == 1 and flagshield == 1 then
      ; все хорошо, прекрасная маркиза
      getweapon( tempfork. tempshield )
   else
      ; чего-то нету
      uo.print( 'nema!' )
   endif
endsub

Sub GetWeapon( Fork, Shield )
   ; берем в руки оружие и щит. Динамические паузы и оптимитизация.
   If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield Then
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; уже в руках все
         return
      Else
         ; надо взять в руки только оружие, щит не надо
         UO.Equipt( 'Rhand', Fork )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork
      Endif
   Else
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; в руках только оружие, надо еще щит взять
         UO.Equipt( 'Lhand', Shield )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
      Else
         ; в руках нет ни оружия, ни щита
         UO.Equipt( 'Rhand', Fork )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork         
         UO.Equipt( 'Lhand', Shield )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
      Endif
   Endif
endsub

Posted: 2006-04-16 22:47:20
by 1a2a3a4a5a6a
Line 32: Parse Error
Вот код:

Code: Select all

sub ArmUp() 
   DIM fork[2], shield[2]
   fork[0] = '0x1442'
   fork[1] = '0x13B9'

   shield[0] = '0x1B77'
   shield[1] = '0x1B76'
   VAR i, tempfork, tempshield, flagfork = 0, flagshield = 0
   ; далее поиск циклом
   for i = 0 to 29
      if flagfork == 1 and flagshield == 1 then
         ; чтобы не был пустой цикл
         wait(20)
      endif
      if flagfork == 0 then
         uo.findtype( fork[i] )
         if uo.findcount() then
            flagfork = 1
            tempfork = uo.getserial( 'finditem' )
         endif
      endif
      if flagshield == 0 then
         uo.findtype( shield[i] )
         if uo.findcount() then
            flagshield = 1
            tempshield = uo.getserial( 'finditem' )
         endif
      endif
   next
   if flagfork == 1 and flagshield == 1 then
      ; все хорошо, прекрасная маркиза
      getweapon( tempfork. tempshield )
   else
      ; чего-то нету
      uo.print( 'nema!' )
   endif
endsub

Sub GetWeapon( Fork, Shield )
   ; берем в руки оружие и щит. Динамические паузы и оптимитизация.
   If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield Then
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; уже в руках все
         return
      Else
         ; надо взять в руки только оружие, щит не надо
         UO.Equipt( 'Rhand', Fork )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork
      Endif
   Else
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; в руках только оружие, надо еще щит взять
         UO.Equipt( 'Lhand', Shield )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
      Else
         ; в руках нет ни оружия, ни щита
         UO.Equipt( 'Rhand', Fork )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork         
         UO.Equipt( 'Lhand', Shield )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
      Endif
   Endif
endsub

Posted: 2006-04-16 23:29:06
by Edred

Code: Select all

if flagfork == 1 and flagshield == 1 then 
      ; все хорошо, прекрасная маркиза
      getweapon( tempfork. tempshield )
   else


В этом месте параметры в функции точкой разделил, должна быть запятая. Поправь:

Code: Select all

getweapon( tempfork, tempshield ) 

Posted: 2006-04-17 19:36:19
by 1a2a3a4a5a6a
Угу, я уже пытался исправлять эту строчку. Но теперь он пишет, что ему не нравится 16 строка. Что это может быть?

Posted: 2006-04-17 21:33:25
by yean
1a2a3a4a5a6a wrote:Угу, я уже пытался исправлять эту строчку. Но теперь он пишет, что ему не нравится 16 строка. Что это может быть?
ты изменил размер массивов, соответственно измени и эту строчку

Code: Select all

   for i = 0 to 29 

Posted: 2006-04-17 21:35:03
by 1a2a3a4a5a6a
yean wrote:
1a2a3a4a5a6a wrote:Угу, я уже пытался исправлять эту строчку. Но теперь он пишет, что ему не нравится 16 строка. Что это может быть?
ты изменил размер массивов, соответственно измени и эту строчку

Code: Select all

   for i = 0 to 29 

Упс. :oops:
Ща попробую.

Posted: 2006-04-17 21:39:11
by 1a2a3a4a5a6a
Вот, пишет "nema!", хотя все должно быть верно. И щит и оружие данного типа в паке находятся.

Code: Select all

sub ArmUp() 
   DIM fork[2], shield[2]
   fork[0] = '0x1442'
   fork[1] = '0x13B9'

   shield[0] = '0x1B77'
   shield[1] = '0x1B76'
   VAR i, tempfork, tempshield, flagfork = 0, flagshield = 0
   ; далее поиск циклом
   for i = 0 to 1
      if flagfork == 1 and flagshield == 1 then
         ; чтобы не был пустой цикл
         wait(20)
      endif
      if flagfork == 0 then
         uo.findtype( fork[i] )
         if uo.findcount() then
            flagfork = 1
            tempfork = uo.getserial( 'finditem' )
         endif
      endif
      if flagshield == 0 then
         uo.findtype( shield[i] )
         if uo.findcount() then
            flagshield = 1
            tempshield = uo.getserial( 'finditem' )
         endif
      endif
   next
   if flagfork == 1 and flagshield == 1 then
      ; все хорошо, прекрасная маркиза
      getweapon( tempfork, tempshield )
   else
      ; чего-то нету
      uo.print( 'nema!' )
   endif
endsub

Sub GetWeapon( Fork, Shield )
   ; берем в руки оружие и щит. Динамические паузы и оптимитизация.
   If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield Then
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; уже в руках все
         return
      Else
         ; надо взять в руки только оружие, щит не надо
         UO.Equipt( 'Rhand', Fork )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork
      Endif
   Else
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; в руках только оружие, надо еще щит взять
         UO.Equipt( 'Lhand', Shield )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
      Else
         ; в руках нет ни оружия, ни щита
         UO.Equipt( 'Rhand', Fork )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork         
         UO.Equipt( 'Lhand', Shield )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
      Endif
   Endif
endsub

Posted: 2006-04-17 21:43:22
by OxoT_nik
А не проще в хоткейсах забиндить usetype 'тип оржия'; usetype 'тип щита', м?

Posted: 2006-04-17 21:51:34
by 1a2a3a4a5a6a
OxoT_nik wrote:А не проще в хоткейсах забиндить usetype 'тип оржия'; usetype 'тип щита', м?

А если у тебя в паке лежит меч и щит, а в бою у тебя нету времени определить их тип?

Posted: 2006-04-17 21:52:19
by OxoT_nik
Тогда просто заранее забинди в хоткейс тот тип оружия и щита, который тебе понадобится в бою.

Posted: 2006-04-17 21:55:02
by 1a2a3a4a5a6a
OxoT_nik wrote:Тогда забинди 2 хоткейса. Логично?

Не логично будет перебиндить всю клавиатуру на все возможные типы оружия и щитов, когда можно попытаться сделать скрипт и внести туда все эти типы.

Posted: 2006-04-17 21:55:24
by OxoT_nik
А если нужно будет например сначала викингом с щитом, а потом алебой добить, то просто забинди 2 хота и вперед в бой. ;)

Posted: 2006-04-17 23:05:36
by Edred
1a2a3a4a5a6a wrote:Вот, пишет "nema!", хотя все должно быть верно. И щит и оружие данного типа в паке находятся.


Ок, давай проверим. Запусти так и скинь сюда кусок журнала с сообщениями (,showjournal 100):

Code: Select all

sub ArmUp() 
   DIM fork[2], shield[2]
   fork[0] = '0x1442'
   fork[1] = '0x13B9'

   shield[0] = '0x1B77'
   shield[1] = '0x1B76'
   VAR i, tempfork, tempshield, flagfork = 0, flagshield = 0
   UO.Print( 'Script started' )
   ; далее поиск циклом
   for i = 0 to 1
      if flagfork == 1 and flagshield == 1 then
         ; чтобы не был пустой цикл
         wait(20)
      endif
      if flagfork == 0 then
         uo.findtype( fork[i] )
         if uo.findcount() then
            flagfork = 1
            tempfork = uo.getserial( 'finditem' )
            uo.print( 'Yes! ' + fork[i] + ' ' + tempfork )
         else
            uo.print( 'No! ' + fork[i] )
         endif
      endif
      if flagshield == 0 then
         uo.findtype( shield[i] )
         if uo.findcount() then
            flagshield = 1
            tempshield = uo.getserial( 'finditem' )
            uo.print( 'Yes! ' + shield[i] + ' ' + tempshield )
         else
            uo.print( 'No! ' + shield[i] )
         endif
      endif
   next
   if flagfork == 1 and flagshield == 1 then
      ; все хорошо, прекрасная маркиза
      getweapon( tempfork, tempshield )
   else
      ; чего-то нету
      uo.print( 'nema!' )
   endif
   UO.Print( 'Script finished' )
endsub

Sub GetWeapon( Fork, Shield )
   ; берем в руки оружие и щит. Динамические паузы и оптимитизация.
   If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield Then
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; уже в руках все
         return
      Else
         ; надо взять в руки только оружие, щит не надо
         UO.Equipt( 'Rhand', Fork )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork
      Endif
   Else
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; в руках только оружие, надо еще щит взять
         UO.Equipt( 'Lhand', Shield )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
      Else
         ; в руках нет ни оружия, ни щита
         UO.Equipt( 'Rhand', Fork )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork         
         UO.Equipt( 'Lhand', Shield )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
      Endif
   Endif
endsub

Posted: 2006-04-18 07:05:55
by 1a2a3a4a5a6a
Вот строки из журнала:
Script Started
No! 0x1442
Yes! 0x1B77 0x402D0E65
Yes! 0x13B9 0x404C3151
invalid graphic: 0x404C3151

Posted: 2006-04-18 08:24:33
by Edred
Ясен пень. Пробуй:

Code: Select all

sub ArmUp() 
   DIM fork[2], shield[2]
   fork[0] = '0x1442'
   fork[1] = '0x13B9'

   shield[0] = '0x1B77'
   shield[1] = '0x1B76'
   VAR i, tempfork, tempshield, flagfork = 0, flagshield = 0
   UO.Print( 'Script started' )
   ; далее поиск циклом
   for i = 0 to 1
      if flagfork == 1 and flagshield == 1 then
         ; чтобы не был пустой цикл
         wait(20)
      endif
      if flagfork == 0 then
         uo.findtype( fork[i] )
         if uo.findcount() then
            flagfork = 1
            tempfork = fork[i]
            uo.print( 'Yes! ' + fork[i] )
         else
            uo.print( 'No! ' + fork[i] )
         endif
      endif
      if flagshield == 0 then
         uo.findtype( shield[i] )
         if uo.findcount() then
            flagshield = 1
            tempshield = shield[i]
            uo.print( 'Yes! ' + shield[i] )
         else
            uo.print( 'No! ' + shield[i] )
         endif
      endif
   next
   if flagfork == 1 and flagshield == 1 then
      ; все хорошо, прекрасная маркиза
      getweapon( tempfork, tempshield )
   else
      ; чего-то нету
      uo.print( 'nema!' )
   endif
   UO.Print( 'Script finished' )
endsub

Sub GetWeapon( Fork, Shield )
   ; берем в руки оружие и щит. Динамические паузы и оптимитизация.
   If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield Then
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; уже в руках все
         return
      Else
         ; надо взять в руки только оружие, щит не надо
         UO.Equipt( 'Rhand', Fork )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork
      Endif
   Else
      If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
         ; в руках только оружие, надо еще щит взять
         UO.Equipt( 'Lhand', Shield )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
      Else
         ; в руках нет ни оружия, ни щита
         UO.Equipt( 'Rhand', Fork )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork         
         UO.Equipt( 'Lhand', Shield )
         repeat
            wait(100)
         until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
      Endif
   Endif
endsub

Posted: 2006-04-18 12:53:24
by 1a2a3a4a5a6a
Есть. Если обе руки пустые, то он берет оружие и щит. Но если одна из рук уже занята, то не берет, а пишет "nema!".