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мс. Ну может чуть больше
В кого стреляют - никак.