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

Anything and all.

Moderators: Murderator+, Murderator

1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

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

Post by 1a2a3a4a5a6a »

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

Post by Edred »

И как ты себе представляешь искусственный интеллект, который отличает оружие от еды, например? Так что все равно придется массив всех возможных видов оружия и щитов делать... А дальше легкий перебор вариантов.
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

Edred wrote:И как ты себе представляешь искусственный интеллект, который отличает оружие от еды, например? Так что все равно придется массив всех возможных видов оружия и щитов делать... А дальше легкий перебор вариантов.

Вы мне покажите, как будет осуществляться это, а массив я заполню с типами оружия и щитов.
kotvsapogah
Posts: 17
Joined: 2006-03-29 14:24:09

Post by kotvsapogah »

А что ты будешь делать если у тебя в паке лук и меч?
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post 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
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post 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
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Code: Select all

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


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

Code: Select all

getweapon( tempfork, tempshield ) 
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

Угу, я уже пытался исправлять эту строчку. Но теперь он пишет, что ему не нравится 16 строка. Что это может быть?
yean
Posts: 9
Joined: 2006-03-29 13:07:47

Post by yean »

1a2a3a4a5a6a wrote:Угу, я уже пытался исправлять эту строчку. Но теперь он пишет, что ему не нравится 16 строка. Что это может быть?
ты изменил размер массивов, соответственно измени и эту строчку

Code: Select all

   for i = 0 to 29 
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

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

Code: Select all

   for i = 0 to 29 

Упс. :oops:
Ща попробую.
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post 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
OxoT_nik
Posts: 21
Joined: 2006-03-26 14:17:10

Post by OxoT_nik »

А не проще в хоткейсах забиндить usetype 'тип оржия'; usetype 'тип щита', м?
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

OxoT_nik wrote:А не проще в хоткейсах забиндить usetype 'тип оржия'; usetype 'тип щита', м?

А если у тебя в паке лежит меч и щит, а в бою у тебя нету времени определить их тип?
OxoT_nik
Posts: 21
Joined: 2006-03-26 14:17:10

Post by OxoT_nik »

Тогда просто заранее забинди в хоткейс тот тип оружия и щита, который тебе понадобится в бою.
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

OxoT_nik wrote:Тогда забинди 2 хоткейса. Логично?

Не логично будет перебиндить всю клавиатуру на все возможные типы оружия и щитов, когда можно попытаться сделать скрипт и внести туда все эти типы.
OxoT_nik
Posts: 21
Joined: 2006-03-26 14:17:10

Post by OxoT_nik »

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

Post 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
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

Вот строки из журнала:
Script Started
No! 0x1442
Yes! 0x1B77 0x402D0E65
Yes! 0x13B9 0x404C3151
invalid graphic: 0x404C3151
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post 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
1a2a3a4a5a6a
Posts: 173
Joined: 2006-02-10 13:26:37

Post by 1a2a3a4a5a6a »

Есть. Если обе руки пустые, то он берет оружие и щит. Но если одна из рук уже занята, то не берет, а пишет "nema!".
Post Reply