Как забыть чара?

Ask for help

Moderators: Murderator+, Murderator

Post Reply
Ururu
Posts: 479
Joined: 2007-02-21 20:15:57

Как забыть чара?

Post by Ururu »

Если меня аттачили и убили, то после реса чар помнит обидчика. Как его забыть и простить?
Возможно использовать это??

Code: Select all

................
uo.ignore('0x0190')
uo.ignore('0x0191')
uo.ignorereset()
uo.CancelTarget()
.................





Да а вот еще. У меня чар на скрипте идет по длинному коридору. Из пункта А в пункт Б. В коридоре много проходов в которые заходить нежелательно. Если коридор заблокирован(чары, мобы, стенка) то чар может туда свернуть. Как добится того чтобы чар эти проходы считал стеной и не лез туда? Ширина прохода 1 тайл. Использую ходилку по типу GoToTile( 1111, 2222, 1, False ). Ниже сама ходилка.

Code: Select all

======|проход|============|проход|=============
А                                         Б
==============|проход|=======================


Code: Select all

Sub GoToTile( OX, OY, N, S ) 
   VAR myx, myy, MD, J
   VAR Lx1, Ly1
   VAR Lx2, Ly2
   VAR Sx, Sy
   VAR T
   VAR Des = N
   VAR MoveDelay = 100
   J = 1
   MD = MoveDelay * 1.5
   myx = uo.getx()
   myy = uo.gety()
   MoveOnce( GetDir( uo.getx(), uo.gety(), ox, oy), MD, False)
   Sx = 0
   Sy = 0
   Lx1 = uo.getx() / 2
   Ly1 = uo.gety() / 2
   Lx2 = Lx1 / 2
   Ly2 = Ly1 / 2
   T = UO.Timer()
   If (GetDistance(ox, oy) <> N) OR ( (NOT S) AND GetDistance(ox, oy) > N ) Then
      UO.Exec('exec PermResend')
   EndIf
   While ( (GetDistance(ox, oy) <> N) OR ((NOT S) and GetDistance(ox, oy) > N) ) and ( OX >= 0 ) and ( OY >= 0 )
      If ( (UO.Timer() - T) * 15 > MoveDelay ) Then
         T = UO.Timer()
         Lx2 = Lx1
         Ly2 = Ly1
         Lx1 = myx
         Ly1 = myy
         myx = uo.getx()
         myy = uo.gety()
      endIf
      MD=MoveDelay
      If ((OX-uo.getx())*(OX-uo.getx())+(OY-uo.gety())*(OY-uo.gety())>0) Then
         MD = MD * 3 / GetDistance( ox, oy )
      EndIf
      wait(MD)
      If GetDistance( OX, OY ) > Des Then
         MoveOnce(GetDir(uo.GetX(),uo.GetY(),ox,oy),MD,False)
      Else
         If S Then
            If GetDistance(OX,OY)<Des Then
               If GetDistance(OX,OY)<>0 Then
                  MoveOnce(GetDir(ox,oy,uo.GetX(),uo.GetY()),MD,False)
               Else
                  MoveOnce(GetDir(uo.GetX(),uo.GetY(),Lx2,Ly2),MD,False)
               EndIf
            EndIf
         EndIf
      EndIf
      If GetDistance(OX,OY)<>Des Then
         If (Lx2==uo.getx()) and (Ly2==uo.gety()) Then
            If (Sx<>uo.getx()) or (Sy<>uo.gety()) Then
               J=1
            EndIf
            J=J+1
            UO.Resend()
            Sx = uo.getx()
            Sy = uo.gety()
            Stun(ox,oy,J)
         EndIf
      EndIf
   Wend
   UO.Exec( 'terminate PermResend' )
endsub
;
; ============ MOVEONCE ===
; Процедура MoveOnce - хождение в определённую сторону
; Направления:
; Система направлений по клавишам Нумпада
; 8 = 1 | 2 = -1
; 9 = 2 | 1 = -2
; 6 = 3 | 4 = -3
; 3 = 4 | 7 = -4
;
; Такая система позволяет с лёгкостью получать направление, обратное
; данному...
;
Sub MoveOnce( Dir, Del, Rev )
   VAR Num
   Var MoveNumber = 1
   If Rev Then
      Num = MoveNumber + 1
   Else
      Num = MoveNumber
   EndIf
   If ( Num > 0 ) and ( Dir <> 0 ) Then
      If Dir == 1 Then
         UO.Press( 38, Num, Del )
      EndIf
      If Dir == 2 Then
         UO.Press( 33, Num, Del )
      EndIf
      If Dir == 3 Then
         UO.Press( 39, Num, Del )
      EndIf
      If Dir == 4 Then
         UO.Press( 34, Num, Del )
      EndIf
      If Dir == -1 Then
         UO.Press( 40, Num-1, Del )
      EndIf
      If Dir == -2 Then
         UO.Press( 35, Num, Del )
      EndIf
      If Dir == -3 Then
         UO.Press( 37, Num, Del )
      EndIf
      If Dir == -4 Then
         UO.Press( 36, Num, Del )
      EndIf
      If Rev Then
         If Dir <> -1 Then
            UO.Press( 40, 1, Del )
         EndIf
      EndIf
   EndIf
endsub
;
; ============== GETDIR ===
; Функция GetDir возвращает направление, по которому надо идти
; к координате
;
Sub GetDir( myx, myy, ox, oy )
   VAR I, J
   J = 0
   VAR X = ox - myx
   VAR Y = oy - myy
   I = GetQDir( Abs(X), Abs(Y) )
   If X >= 0 Then
      If Y >= 0 Then
         If I == 1 Then
            J = -2
         Else
            If I == 2 Then
               J = -1
            Else
               If I == 3 Then
                  J = 4
               EndIf
            EndIf
         EndIf
      Else
         If I == 1 Then
            J = 2
         Else
            If I == 2 Then
               J = 3
            Else
               If I == 3 Then
                  J = 4
               EndIf
            EndIf
         EndIf
      EndIf
   Else
      If Y >= 0 Then
         If I == 1 Then
            J = -2
         Else
            If I == 2 Then
               J = -3
            Else
               If I == 3 Then
                  J = -4
               EndIf
            EndIf
         EndIf
      Else
         If I == 1 Then
            J = 2
         Else
            If I == 2 Then
               J = 1
            Else
               If I == 3 Then
                  J = -4
               EndIf
            EndIf
         EndIf
      EndIf
   EndIf
   RETURN J
endsub
;
; =============== GETQDIR ===
;
;
Sub GetQDir( x, y )
   VAR Ep = 0.172
   VAR J = 0
   If X == 0 Then
      J = 1
   Else
      If ( Y / X ) < Ep Then
         J = 3
      Else
         If ( X / Y ) < Ep Then
            J = 1
         Else
            J = 2
         EndIf
      EndIf
   EndIf
   RETURN J
endsub
;
; ============== GETDISTANCE ===
; Функция GetDistance возвращает расстояние до координат
; (как UO.GetDistance - до объекта)
;
; Почему так - потому что учим математику :)
;
Sub GetDistance( X, Y )
   VAR A, B, C
   A = abs( X - UO.GetX() )
   B = abs( Y - UO.GetY() )
   If A > B Then
      C = A
   Else
      C = B
   EndIf
   Return C
endsub
;
; ============= PERP ===
; Функция Perp возвращает направление, перпендикулярное введённому
;
Sub Perp( Dir )
   VAR D = Dir
   If Dir == 1 Then
      D = 3
   EndIf
   If Dir == 2 Then
      D = 4
   EndIf
   If Dir == 3 Then
      D = -1
   EndIf
   If Dir == 4 Then
      D = -2
   EndIf
   If Dir == -1 Then
      D = -3
   EndIf
   If Dir == -2 Then
      D = -4
   EndIf
   If Dir == -3 Then
      D = 1
   EndIf
   If Dir == -4 Then
      D = 2
   EndIf
   RETURN D
endsub
;
; =============== STUN ===
; Обход препятствий
;
Sub Stun( X, Y, N )
   VAR I
   VAR myx
   VAR myy
   VAR MoveDelay = 100
   myx = uo.getx()
   myy = uo.gety()
   For I=1 to N
      MoveOnce(perp(GetDir(myx,myy,x,y)),MoveDelay,False)
   Next
   Wait(MoveDelay)
   UO.Resend()
   If (myx==uo.getx()) and (myy==uo.gety()) Then
      For I=1 to N
         MoveOnce(-perp(GetDir(myx,myy,x,y)),MoveDelay,False)
      Next
      Wait(MoveDelay)
      UO.Resend()
   EndIf
   If (myx==uo.getx()) and (myy==uo.gety()) Then
      For I=1 to N
         MoveOnce(-GetDir(myx,myy,x,y),MoveDelay,False)
      Next
      Wait(MoveDelay)
      Stun(x,y,N)
   EndIf   
endsub
;
; ============= ABS ===
; Убирает знак минуса в отрицательных числах
;
Sub abs( a )
   VAR b
   If a < 0 Then
      b = -a
   Else
      b = a
   endif
   return b
endsub
;
; ============== PERMRESEND ===
;
Sub PermResend()
   Var Mn = 9
   VAR MoveDelay = 100
   Repeat
      UO.Resend()
      Wait( MoveDelay * Mn )
   Until ( 1 > 2 )
endsub
Шард Антарес
Ururu
to4a
Posts: 265
Joined: 2006-03-10 00:19:11
Location: http://drw.ru/

Post by to4a »

Code: Select all

................
uo.ignore('0x0190')
uo.ignore('0x0191')
uo.ignorereset()
uo.CancelTarget()
.................

1. Параметр игнора - айди а не тип!
2. даже если бы тут был указан айди всё равно это не имеет смысла, ты игноришь когонибуть, и тут же после этого сбрасываешь игнор, смысл?
3. Чтото я не пойму смысла, что должно забыть клиент или скрипт? если скрипт то давай его сюда
Ururu
Posts: 479
Joined: 2007-02-21 20:15:57

Post by Ururu »

Смысл чар бежит по координатам. Прибежал и ждет, на атаку отвечает атакой. Если умер, бежит ресатся. Проблема в том, что если по пути к мобам один из них меня бьет, то таргет на него. А нужно чтоб он отвечал мобам только когда на место прибежит. А не пытался аттачить когото далеко.

Code: Select all

sub start()
VAR i
while i > 0
main()
wend
endsub

Sub main()
GoToTile( 5544, 1881, 1, False ) ; бежим к мобам
GoToTile( 5552, 1881, 1, False )
GoToTile( 5562, 1881, 1, False )
GoToTile( 5562, 1865, 1, False )
GoToTile( 5562, 1842, 1, False )

uo.ignore('0x0011') ; пытаемя забыть их
uo.ignore('0x001C')
uo.ignorereset()
uo.CancelTarget()

repeat ; стоим, если меня бьют, бью и я
wait(500)
until UO.Dead()

UO.WarMode(0)
GoToTile( 5562, 1864, 1, False ) ; бежим ресатся
GoToTile( 5562, 1881, 1, False )
GoToTile( 5551, 1881, 1, False )
GoToTile( 5543, 1881, 1, False )
GoToTile( 5537, 1881, 1, False )

While UO.Dead() ; ресаемся
UO.WarMode(0)
uo.usefromground('0x0420')
wait(500)
Wend

While uo.gethp()<150 ; ждем роста ХП
wait(500)
Wend

uo.ignore('0x0011') ; пытаемся забыть
uo.ignore('0x001C')
uo.ignorereset()
uo.CancelTarget()
endsub
Шард Антарес
Ururu
to4a
Posts: 265
Joined: 2006-03-10 00:19:11
Location: http://drw.ru/

Post by to4a »

ignore - забывает только для команды findtype...
DRW - Glorior Belli
Image
Ururu
Posts: 479
Joined: 2007-02-21 20:15:57

Post by Ururu »

тоесть можно оставить только это?

Code: Select all

uo.CancelTarget()

Скрипт работает, но хочется грамотно =)
Спасибо.
Шард Антарес
Ururu
to4a
Posts: 265
Joined: 2006-03-10 00:19:11
Location: http://drw.ru/

Post by to4a »

да и canceltarget там незачем, у тебя что есть какойто таргет когда ты прибегаешь?
DRW - Glorior Belli
Image
Ururu
Posts: 479
Joined: 2007-02-21 20:15:57

Post by Ururu »

Есть. Меня убил этот моб, я реснулся но новых мобов не атакую,а аттачу того кто меня убил или кого я аттачил последнего. Поэтому когда прибегаю на место, то тупо стою и втыкаю, пока меня валят.
Шард Антарес
Ururu
to4a
Posts: 265
Joined: 2006-03-10 00:19:11
Location: http://drw.ru/

Post by to4a »

Таргет - это прицел который появляется при использовании какогониубть скила/итема/магии или же посланный из инжи, команда canceltarget отменяет его, ты это не используешь в это скрипте - откуда у тебя будут братся таргеты? и к тому же наличия таргета в клиенте не отразится на атаке мобов... проблема скорее всего в другом
DRW - Glorior Belli
Image
Ururu
Posts: 479
Joined: 2007-02-21 20:15:57

Post by Ururu »

Ну сначало чар просто тупо стоял и ждал пока его убьют.
А как вставил это:

Code: Select all

uo.ignore('0x0011') ; пытаемя забыть их 
uo.ignore('0x001C')
uo.ignorereset()
uo.CancelTarget()

То он начал отвечать на атаку.
Возможно при атаке моба ловушка падает на него и после смерти чара на нем и остается? Непонял почему...
Шард Антарес
Ururu
to4a
Posts: 265
Joined: 2006-03-10 00:19:11
Location: http://drw.ru/

Post by to4a »

ну хз, раз помогло оставь canceltarget, а может просто совпадение
DRW - Glorior Belli
Image
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

Лудше напиши что твой скрипт должен делать, по пунктам, а то из вашего диалога я не много понял. Когда прибегаешь на место сделай поиск моба на расстоянии одного тайтла по типу, если их несколько видов используй массив, как только моб будет найден на расстоянии 1го тайтла записывай его ID, как моба который тебя атаковал + добавь предварительную проверку журнала на то что ты ему сразу не понравился как только он тебя увидел, имея его ID можешь его либо отправить в игнор при последующем поиске, либо убрать его из игнора.

Лично у меня uo.warmode() работает не так так надо, я предпочитаю использовать uo.exec('warmode 0'), не знаю на скок правильно, содрал из чьего-то скрипта на спарринг.

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

Чтобы твой чар не отвечал на атаки мобов пока бежит на место поставь uo.exec('warmode 0') в цикл во время хотьбы из пунткта А в пункт Б.

А вообще лудше когда прибегаешь на место, задай максимальную дистанцию поиска, перепиши ID всех мобов, подбеги к каждому и дай в лоб.
Last edited by Sanch on 2007-04-18 15:21:34, edited 1 time in total.
Ururu
Posts: 479
Joined: 2007-02-21 20:15:57

Post by Ururu »

Скрипт не претендует на лавры почета. Мобы агрессы, прибегая на место, я просто стою и жду пока сдохну отвечая на атаки. Все просто, а главное работает =) Тактика и реслинг прут потихоньку =)
Шард Антарес
Ururu
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

У тя там траблы с атаками были, ты их решил?

Ниже кусок моего скрипта на скупку регов, правда я его еще не тестил, но в теории все должно работать, чар рекольтся по руне, находит всех хуманоидов в радиусе 5 тайтлов, полходит к каждому с помощью ходилки go(x,y), закупает то что надо, тебе нужно то же самое, только с возвращение на место в котором изначально производился поиск + атака мобов когда подойдешь к нему + увеличить количество возможных целей, у меня их 3. Лишним для тебя тут еще является проверка наличия ПК в магазине.

Code: Select all

sub CheckNPC() 
VAR a, x, y, vendor1, vendor2, vendor3, select = 1, done = 0, find = 0, name
uo.set('finddistance', '5')
uo.ignore('self', 'on')
DIM Chars[2]
Chars[0] = '0x0190' #тип игрока мужского пола#
Chars[1] = '0x0191' #тип игрока женского пола#
repeat
  for a = 0 to 1       
    uo.findtype(Chars[a], '-1', '1') 
    if uo.findcount() > 0 then
      if uo.getnotoriety('finditem') < 5 then
        if uo.getz('finditem') == uo.getz('self') then
          if select = 1 then
            vendor1 = uo.getserial('finditem')
            find = 1
          else
            wait(50)
          endif
          if select = 2 then
            vendor2 = uo.getserial('finditem')
            find = 2
          else
            wait(50)
          endif
          if select = 3 then
            vendor3 = uo.getserial('finditem')
            find = 3
          else
            wait(50)
          endif
          select = select + 1
          if select > 3 then
            done = 1
          else
            wait(50)
          endif
        else
          wait(50)
        endif
      else
        uo.exec('exec RegTeleport')
        return
      endif
    else
      wait(50)
    endif
  next
until done == 1 or uo.findcount() == 0
if find > 0 then
  x = uo.getx('vendor1')
  y = uo.gety('vendor1')
  go(x,y)
  name = uo.getname('vendor1')
  uo.say(name+' buy')
  wait(500)
  checklag()
  uo.buy('regi')
  wait(500)
  uo.say('bye')
  if uo.weight > 600 then
    uo.exec('exec GoHome')
    return
  else
    wait(50)
  endif
  if find == 2 then
    x = uo.getx('vendor2')
    y = uo.gety('vendor2')
    go(x,y)
    name = uo.getname('vendor2')
    uo.say(name+' buy')
    wait(500)
    checklag()
    uo.buy('regi')
    wait(500)
    uo.say('bye')
    if uo.weight > 600 then
      uo.exec('exec GoHome')
      return
    else
      wait(50)
    endif
    if find == 3 then
      x = uo.getx('vendor3')
      y = uo.gety('vendor3')
      go(x,y)
      name = uo.getname('vendor3')
      uo.say(name+' buy')
      wait(500)
      checklag()
      uo.buy('regi')
      wait(500)
      uo.say('bye')
      if uo.weight > 600 then
        uo.exec('exec GoHome')
        return
      else
        wait(50)
      endif
    else
      wait(50)
    endif
  else
    wait(50)
  endif
endif
uo.exec('exec RegTeleport')
end sub
Post Reply