Yoko
http://forum.yoko.com.ua/

Как создать очередь кастов?
http://forum.yoko.com.ua/viewtopic.php?f=3&t=7411
Page 1 of 1

Author:  Sanch [ 2006-04-18 12:28:54 ]
Post subject:  Как создать очередь кастов?

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

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


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

Author:  CFA [ 2006-04-18 12:54:23 ]
Post subject:  Re: Как создать очередь кастов?

единственное что приходит в голову, через set/getGlobal сделать очередь. пример есть тут, только тут не очередь, а стек. очередь будет в реализации посложнее.

Author:  CFA [ 2006-04-18 13:02:43 ]
Post subject:  Re: Как создать очередь кастов?

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

Code:
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

Author:  Sanch [ 2006-04-18 13:35:59 ]
Post subject: 

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

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

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

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

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

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

Author:  CFA [ 2006-04-18 15:08:41 ]
Post subject: 

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:
sub statCap()
    return uo.str + uo.dex + uo.int
end sub
...
    uo.print(str(statCap())) #сумма str, dex и int
...



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


ну например

Code:
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:
начальное состояние
  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

Author:  Grin [ 2006-04-18 18:48:03 ]
Post subject: 

Ели прикинуть просто то лутше пользоватся не стеком...
Потому что возникнет очередь и передить стек это будет дополнительная затрата мозгов во время пвп...
Гораздо лутше сделать 1 глобальную переменую котораяне даст вам кастовать пока 100%не произойдет событие сведельствующие обокончании каста...
Одноделочто это надокак то определять... в пвп привязыватся к изменению мваны очень черевато... в общем за висет от шарда...
а в каждыйскрипт качста добавить переменую проверки...
Для на дежности эту глобальную переменую можнообнулять как по событию так и по времени

Author:  Edred [ 2006-04-18 19:08:19 ]
Post subject: 

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

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

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

Author:  CFA [ 2006-04-18 19:42:45 ]
Post subject: 

Grin wrote:
...

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

я исполльзую глобальный таймер -
в зависимости от того с чего кастуеться спелл - с регов, или с со скроллов - ставиться разная задержка до следующего каста.
Code:
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

Author:  flake [ 2006-04-19 01:07:32 ]
Post subject: 

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

Author:  Sanch [ 2006-04-19 09:09:23 ]
Post subject: 

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


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

Author:  flake [ 2006-04-19 09:21:31 ]
Post subject: 

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

Author:  Sanch [ 2006-04-19 09:28:33 ]
Post subject: 

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


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

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

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

Author:  flake [ 2006-04-19 09:32:07 ]
Post subject: 

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

Page 1 of 1 All times are UTC+02:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/