Как создать очередь кастов?

Ask for help

Moderators: Murderator+, Murderator

Post Reply
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Как создать очередь кастов?

Post by Sanch »

Собсно когда стоимость снаряжения выше стандартного и тебя пресуют 3 чела в окло, начинаю постоянно не на те кнопри жать и сам себе же касты сбиваю. Придумал как сделать выдержку перед кастом:

Code: Select all

while uo.getglobal('cast') == '1'
  wait(50)
wend
uo.setglobal('cast', '1')
кастую
uo.setglobal('cast', '0')


Вот только хотелось бы создать как нить очередь кастов, либо через дополнительный скрипт, либо через глобальные переменные, вот только как это реализовать я хз, хочу спросить совета у экспертов, зарание благодарю.
CFA
Posts: 64
Joined: 2006-02-03 06:53:36

Re: Как создать очередь кастов?

Post by CFA »

единственное что приходит в голову, через set/getGlobal сделать очередь. пример есть тут, только тут не очередь, а стек. очередь будет в реализации посложнее.
CFA
Posts: 64
Joined: 2006-02-03 06:53:36

Re: Как создать очередь кастов?

Post by CFA »

накидал быстренько, но не проверял :)

Code: Select all

sub fifoInit()
   uo.setGlobal('fifoHead', '0')
   uo.setGlobal('fifoTail', '0')
end sub

sub fifoPush(value)
   var head = val(uo.getGlobal('fifoHead'))
   uo.setGlobal('fifo' + str(head), value)
   uo.setGlobal('fifoHead', str(head+1))   
end sub

sub fifoPop()
   var head = val(uo.getGlobal('fifoHead'))
   var tail = val(uo.getGlobal('fifoTail'))
   
   if (head == tail) then
      #очередь пустая
      return ''
   end if
   
   var value = uo.getGlobal('fifo' + str(tail))
   tail = tail + 1
   
   if (tail == head) then
      #очередь пустая. ставим указатели в 0
      tail = 0
      head = 0
   end if
   
   uo.setGlobal('fifoHead', str(head))
   uo.setGlobal('fifoTail', str(tail))   
   
   return value
end sub
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

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

sub fifoPush(value) - откуда берется это vaule и что она делает, отдаленно я знаю что так переносятся переменные из одного скрипта в другой, при запуске второго из первого.

uo.setGlobal('fifo' + str(head), value) - непонятен смылс такого извращенного задания переменной, что это дает?

(head == tail) - скобки обязательны?

return value - в паре своих скриптов использовал просто "return" для выклучения скрипт, что же делает тобой напианая строка я не понимаю.

Оч признателен за помощь, но ты не мог бы в кратце изложить принцип работы сего творения?
CFA
Posts: 64
Joined: 2006-02-03 06:53:36

Post by CFA »

Sanch wrote:sub fifoPush(value) - откуда берется это vaule и что она делает, отдаленно я знаю что так переносятся переменные из одного скрипта в другой, при запуске второго из первого.

value - значение, которое надо положить в очередь. любая строка, например название каста - Greater Heal, Energy Bolt


Sanch wrote:uo.setGlobal('fifo' + str(head), value) - непонятен смылс такого извращенного задания переменной, что это дает?

в инжекте нету глобальных массивов. поэтому приходиться так вот извращаться.

Sanch wrote:(head == tail) - скобки обязательны?

точно не знаю, но вроде бы нет. просто привчка еще с паскаля

Sanch wrote:return value - в паре своих скриптов использовал просто "return" для выклучения скрипт, что же делает тобой напианая строка я не
понимаю.

return можно использовать не тока для выхода из функии, но и для возврата резултата. например:

Code: Select all

sub statCap()
    return uo.str + uo.dex + uo.int
end sub
...
    uo.print(str(statCap())) #сумма str, dex и int
...



Sanch wrote:Оч признателен за помощь, но ты не мог бы в кратце изложить принцип работы сего творения?


ну например

Code: Select all

sub energyBolt()
    fifoPush("'Energy Bolt' lasttarget")
end sub

sub lightnig()
    fifoPush("'Lightning'  lasttarget")
end sub

sub greaterHeal()
    fifoPush("'Greater Heal' self")
end sub

sub castManager()
    var spell
    repeat
        spell = fifoPop()
        if (spell <> '') then
           uo.exec('cast ' + spell)
           wait(5000)
        end if
        wait(100)
    until 0
end sub


lightning, greaterHeal, energyBolt - забиндены на кнопки. они просто запихиваю в очередь строчку с описанием каста.
castManager запущен постоянно. он пытаеться взять из очереди строку с описанием каста и если строка не пустая, то кастует. выдерживает паузу, и начинает с начала.

fifoInit - просто инициализация переменных.
fifoPush - ложит в очередь очередной элемент. просто создает очередную глобальную переменную fifoNNN - где NNN номер элемента
fifoPop - возвращает элемент из очереди, который был туда положен раньше других (самый старый).

иллюстрация работы очереди

Code: Select all

начальное состояние
  head
   |
[  0  ][  1  ][  2  ][  3  ][  4  ][  5  ][  6  ]
   |
  tail

push

         head
          |
[  0  ][  1  ][  2  ][  3  ][  4  ][  5  ][  6  ]
   |
  tail

push
                head
                 |
[  0  ][  1  ][  2  ][  3  ][  4  ][  5  ][  6  ]
   |
  tail

pop
                head
                 |
[  0  ][  1  ][  2  ][  3  ][  4  ][  5  ][  6  ]
          |
         tail

pop
                head
                 |
[  0  ][  1  ][  2  ][  3  ][  4  ][  5  ][  6  ]
                 |
                tail
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

Ели прикинуть просто то лутше пользоватся не стеком...
Потому что возникнет очередь и передить стек это будет дополнительная затрата мозгов во время пвп...
Гораздо лутше сделать 1 глобальную переменую котораяне даст вам кастовать пока 100%не произойдет событие сведельствующие обокончании каста...
Одноделочто это надокак то определять... в пвп привязыватся к изменению мваны очень черевато... в общем за висет от шарда...
а в каждыйскрипт качста добавить переменую проверки...
Для на дежности эту глобальную переменую можнообнулять как по событию так и по времени
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

В свое время я писал подобный боевой скрипт, потом он погиб безвозвратно на винче, идея была такая:

1. При старте инжекта создается глобальная переменная, в которую через пробел пишутся условные номера кастов (по собственной системе нумерации, я делал типа 41 - это четвертый уровень, первый закл и т.д.) В начале переменная пуста. В соседней переменной номер очередного каста (слова в первой переменной). И флаг занятости каста.

2. Далее у меня были бинды на касты, которые проверяли флаг каста, если занято - проверяли первую переменную, если пуста - записывали в нее свой номер и запускали скрипт на отложенный каст. Дальше все просто - скрипт на отложенный каст записывал в флаг занятости третье значение (не занято - 0, занято обычным кастом - 1, занято скриптом отложенного каста - 2), и начинал читать по словам переменную с кастами. При этом он выводил на экран принтом два следующих каста и счетчик времени. Был забинден еще маленький скриптик, который через глобалку передавал отложенному касту пропустить один каст или очистить всю очередь. По такому принципу.
CFA
Posts: 64
Joined: 2006-02-03 06:53:36

Post by CFA »

Grin wrote:...

вобщем согласен, очередь плохо себя будет вести довольно часто.

я исполльзую глобальный таймер -
в зависимости от того с чего кастуеться спелл - с регов, или с со скроллов - ставиться разная задержка до следующего каста.

Code: Select all

sub setTimer(timerName, expireTime)
   uo.setGlobal(timerName, str(uo.timer() + int(expireTime/100)))
end sub

sub isTimerExpire(timerName)
   var n = val(uo.getGlobal(timerName))
   return n <= uo.timer()
end sub

sub castLightning()
   if (isTimerExpire('castTimer')) then
      if (uo.count('lightScroll')) then
         uo.waitTargetObject('lasttarget')
         uo.useType('lightScroll')
         setTimer('castTimer', 1600)
      else
         uo.cast('Lightning', 'lasttarget')
         setTimer('castTimer', 2800)
      end if
   end if
end sub
flake
Expert!
Posts: 746
Joined: 2004-08-11 23:56:17
Location: The Citadel
Contact:

Post by flake »

Ребят, имхо это все лишние выкрутасы для дилетантов пвп.
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

Ребят, имхо это все лишние выкрутасы для дилетантов пвп.


Те люди которые к делетантам не относятся просто обставляют ящиками и вызрывают экспложенами.
flake
Expert!
Posts: 746
Joined: 2004-08-11 23:56:17
Location: The Citadel
Contact:

Post by flake »

Ну это уже особенности шардов.
Но из своего опыта в пвп я понял, что где можно обойтись простым скриптом на каст, лучше не делать всяких циклов, очередей и т.п.
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

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


Имхо было бы оч неплохо если промежутки между кастами были по 100мсек а не по 500-1000 при использовании рук, чтобы при физле сразу кастовать а не пока до тебя дойдет что у тебя физл, это то же потеря где то в 500-1000мсек.

А еще у нас на шарде не прокатывают скрипты на фс и лайтинги со скролов, тк есть такая вещь как антимагик класс, который зависит от армора на тебе, можешь ты по врагу кидать со скрола или нет.

Хочу спросить, допустим в журнале появилось сообщение о касте, моно определить кто кастует, можно ли определить в кого?
Last edited by Sanch on 2006-04-19 09:32:56, edited 1 time in total.
flake
Expert!
Posts: 746
Joined: 2004-08-11 23:56:17
Location: The Citadel
Contact:

Post by flake »

Когда ты привыкнешь, у тебя тоже будут на автомате пальцы, и получишь желанные 100мс. Ну может чуть больше :)
В кого стреляют - никак.
Post Reply