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

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
Шард [b]Антарес[/b]
[color=blue][b]Ururu[/b][/color]
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
Шард [b]Антарес[/b]
[color=blue][b]Ururu[/b][/color]
to4a
Posts: 265
Joined: 2006-03-10 00:19:11
Location: http://drw.ru/

Post by to4a »

ignore - забывает только для команды findtype...
[b][color=#666666][size=67]DRW - Glorior Belli[/size][/color][/b]
[url=http://tyv.name/action/][img]http://tyv.name/action/pishu.gif[/img][/url]
Ururu
Posts: 479
Joined: 2007-02-21 20:15:57

Post by Ururu »

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

Code: Select all

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

Post by to4a »

да и canceltarget там незачем, у тебя что есть какойто таргет когда ты прибегаешь?
[b][color=#666666][size=67]DRW - Glorior Belli[/size][/color][/b]
[url=http://tyv.name/action/][img]http://tyv.name/action/pishu.gif[/img][/url]
Ururu
Posts: 479
Joined: 2007-02-21 20:15:57

Post by Ururu »

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

Post by to4a »

Таргет - это прицел который появляется при использовании какогониубть скила/итема/магии или же посланный из инжи, команда canceltarget отменяет его, ты это не используешь в это скрипте - откуда у тебя будут братся таргеты? и к тому же наличия таргета в клиенте не отразится на атаке мобов... проблема скорее всего в другом
[b][color=#666666][size=67]DRW - Glorior Belli[/size][/color][/b]
[url=http://tyv.name/action/][img]http://tyv.name/action/pishu.gif[/img][/url]
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()
То он начал отвечать на атаку.
Возможно при атаке моба ловушка падает на него и после смерти чара на нем и остается? Непонял почему...
Шард [b]Антарес[/b]
[color=blue][b]Ururu[/b][/color]
to4a
Posts: 265
Joined: 2006-03-10 00:19:11
Location: http://drw.ru/

Post by to4a »

ну хз, раз помогло оставь canceltarget, а может просто совпадение
[b][color=#666666][size=67]DRW - Glorior Belli[/size][/color][/b]
[url=http://tyv.name/action/][img]http://tyv.name/action/pishu.gif[/img][/url]
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 »

Скрипт не претендует на лавры почета. Мобы агрессы, прибегая на место, я просто стою и жду пока сдохну отвечая на атаки. Все просто, а главное работает =) Тактика и реслинг прут потихоньку =)
Шард [b]Антарес[/b]
[color=blue][b]Ururu[/b][/color]
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