Page 1 of 1

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

Posted: 2006-04-18 12:28:54
by Sanch
Собсно когда стоимость снаряжения выше стандартного и тебя пресуют 3 чела в окло, начинаю постоянно не на те кнопри жать и сам себе же касты сбиваю. Придумал как сделать выдержку перед кастом:

Code: Select all

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


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

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

Posted: 2006-04-18 12:54:23
by CFA
единственное что приходит в голову, через set/getGlobal сделать очередь. пример есть тут, только тут не очередь, а стек. очередь будет в реализации посложнее.

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

Posted: 2006-04-18 13:02:43
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

Posted: 2006-04-18 13:35:59
by Sanch
Сори, но понимание чужих скриптов мне плохо дается, тк писать я их начал недавно, хотел бы задать несколько глупых вопросов:

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

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

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

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

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

Posted: 2006-04-18 15:08:41
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

Posted: 2006-04-18 18:48:03
by Grin
Ели прикинуть просто то лутше пользоватся не стеком...
Потому что возникнет очередь и передить стек это будет дополнительная затрата мозгов во время пвп...
Гораздо лутше сделать 1 глобальную переменую котораяне даст вам кастовать пока 100%не произойдет событие сведельствующие обокончании каста...
Одноделочто это надокак то определять... в пвп привязыватся к изменению мваны очень черевато... в общем за висет от шарда...
а в каждыйскрипт качста добавить переменую проверки...
Для на дежности эту глобальную переменую можнообнулять как по событию так и по времени

Posted: 2006-04-18 19:08:19
by Edred
В свое время я писал подобный боевой скрипт, потом он погиб безвозвратно на винче, идея была такая:

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

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

Posted: 2006-04-18 19:42:45
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

Posted: 2006-04-19 01:07:32
by flake
Ребят, имхо это все лишние выкрутасы для дилетантов пвп.

Posted: 2006-04-19 09:09:23
by Sanch
Ребят, имхо это все лишние выкрутасы для дилетантов пвп.


Те люди которые к делетантам не относятся просто обставляют ящиками и вызрывают экспложенами.

Posted: 2006-04-19 09:21:31
by flake
Ну это уже особенности шардов.
Но из своего опыта в пвп я понял, что где можно обойтись простым скриптом на каст, лучше не делать всяких циклов, очередей и т.п.

Posted: 2006-04-19 09:28:33
by Sanch
Ну это уже особенности шардов.
Но из своего опыта в пвп я понял, что где можно обойтись простым скриптом на каст, лучше не делать всяких циклов, очередей и т.п.


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

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

Хочу спросить, допустим в журнале появилось сообщение о касте, моно определить кто кастует, можно ли определить в кого?

Posted: 2006-04-19 09:32:07
by flake
Когда ты привыкнешь, у тебя тоже будут на автомате пальцы, и получишь желанные 100мс. Ну может чуть больше :)
В кого стреляют - никак.