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!".