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

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