По идее достаточно одного таймера и случайного погодного эффекта. Например, есть у тебя таймер, который запускаешь на случайное время, по истечению таймера запускается дождь и таймер опять запускается на случайное время, по истечению дождя удаляется этот погодный эффект и устанавливается другой случайный тоже на случайное время таймера и так далее.
ResumeTimer() не запускает остановленный таймер, вернее запускает, но через пару тиков останавливает, только через отельные функции получается надо делать. Одного таймера не достаточно, если один то придется все время на каждый эффект создавать и удлять таймеры.
Castiel, не совсем понял, как работают триггеры. Вот есть у тебя ветер, снег, дождь, солнечные лучи и лунные лучи. Для каждого из них работает таймер, который в случайный момент включает эффект, прерывая предыдущий, а по окончанию продолжает его?
ну есть таймер, который по истечении создает допустим дождь, мы паузим таймер, запускаем сначала слабый дождь, спустя случайное время запускаем сильный дождь, спустя случайное время опять слабый дождь, по истечении времени таймера запускаем таймер который создает случайный погодный эффект. То есть хотелось бы сделать через 2 таймера, не с подсчетом в 1 секунду и локалкой, чисто таймер допустим на 30 секунд с false. не хотелось бы создавать таймер внутри таймера внутри таймера внутри таймера. По этому я и создавал отдельные функции, а не безымянные прям таймере.
ну допустим мне его надо запаузить, а потом возобновить другим таймером
Так используйте функции
PauseTimer()
ResumeTimer()
Как же я забыл про ресюме таймера ) спс бро! Ты мозг великий ) Просто как бы мне было удобней таймер ставить на большое время, а не по одной секунде считать)
Создавал погодные эффекты, по этому всегда нужно было иметь разное время таймера после его перезапуска.
И вот зачем городить такие костыли, если вс решается довольно таки просто?
do
local InitGlobalsOrigin = InitGlobals
function InitGlobals()
InitGlobalsOrigin()
local i = math.random(5, 10)
TimerStart(CreateTimer(), 1, true, function()
i = i - 1
if i == 0 then
print('Смена эффекта')
i = math.random(5, 10)
end
end)
end
end
ну допустим мне его надо запаузить, а потом возобновить другим таймером
Castiel, он имеет в виду, какую игровую задачу ты решал, создавая этот код.
я понимаю)) Создавал погодные эффекты, по этому всегда нужно было иметь разное время таймера после его перезапуска. На джассе делаю так и оно работает, а на луа этот же таймер из этого же таймера запустить с другим временем чет не получается....По этому и задал тут вопрос. Но мне не нужно удалять таймер.
Castiel, объясни что ты пытаешься сделать этим таймером. Запустить то таймер изнутри таймера можно, но не факт что это действительно решает твою задачу.
могу просто скинуть код но его много) Суть: запускаем функцию №1 она выбирает случайный таймер из 5 и запускает его, в свою очередь каждый таймер вызывает себя по несколько раз(имено важно вызвать самого себя), а когда будет вызван последний раз, запускает таймер который использует функцию №1. Что то типа этого:
function BLABLA()
local T_1=CreateTimer()
local T_2=CreateTimer()
local count
FUNC_2=function()
count=count+1
if count=10 then
TimerStart(T_1,math.random(10,20),false,FUNC_1)
else
TimerStart(T_2,math.random(10,20),false,FUNC_2)
end
end
FUNC_1=function()
count=0
TimerStart(T_2,math.random(10,20),true,FUNC_2)
end
TimerStart(T_1,math.random(10,20),false,FUNC_1)
end
do
local i, a, b = 0, math.random(5, 10), math.random(5, 10)
TimerStart(CreateTimer(), 1, true, function()
i = i + 1
if i == a then
print('a')
elseif i == a + b then
print('b')
PauseTimer(GetExpiredTimer())
DestroyTimer(GetExpiredTimer())
end
end)
end
Эммм....обьяснить сможешь ? Мне нужно чтоб один и тот же таймер с одной и той же функцией всегда имел разное время) Мне не нужно удалять таймер, потому что есть другие функции, которые запускают этот же таймер ...
И еще хотелось бы узнать есть ли разница между вот TimerStart(t,1,true,и вот эта вот функция допустим до 60 сек.) или TimerStart(t,60,false,function())
Steal nerves, подобную систему никто не сайте не делал ранее? Может есть что-то похожее?
На 1.31 через EVENT_PLAYER_UNIT_DAMAGING спокойно можно запилить самому подходящую систему. Без выдачи способностей...Разница между EVENT_PLAYER_UNIT_DAMAGING от EVENT_PLAYER_UNIT_DAMAGED в том, что EVENT_PLAYER_UNIT_DAMAGING ловит именно нанесенный урон до снижения из разных источников, будь то броня или сопротивление магии или щит наги или каменная броня и тип брони и прочее-прочее...
Субанимации, они же анимационные таги, работают на эффектах аналогично тому как они работают на юнитах. Но если юниту часто достаточно выдать таг, то эффекту надо сперва выдать таг, а потом проиграть нужную анимацию.
Дружище я уже это видел и оно все равно от предметов не действует ))) только от дополнительной характеристики. Вот беру я рукавицы огра + 3 силы и оно работает как только беру когти +15 атаки и оно не добавляет!
На 1.31 есть новая пассивка у рыцарей, которая делает именно это.
Да кстати, а есть еще EVENT_PLAYER_UNIT_DAMAGING - она отлавливает урон до брони и прочего, что как то влияет на снижение урона, будь то щит наги, броня, магическое ссопротивление и тд. То есть можно раскрывает весь потенциал использования урона...
Castiel, как я уже сказал, можно даже ничего не передавать, а использовать GetTriggerUnit и прочее в самом фильтре. Можно передавать глобалками (или через таблицы Lua), тоже будет верно.
Циклом будет быстрее, удобнее и порой надёжнее, если операции внутри цикла короткие. Лично я фильтр использую там, где операции долгие, так как фильтр создаёт поток на каждого юнита.
Я так понял единственный по ходу способ это через цикл...Что же лучше и быстрее перебирать через фильтр или через цикл ?
Просто мне очень понравилось, что GroupEnumUnitsInRange(group,500,500,500,Condition(function() ) может использовать все локалки триггера, это очень круто и удобно, другими способами заносить лишь в глобалки игроков и другие нужные данные, которые будут использоваться на группе... prog:
Castiel, выбор стоит или глобалки или утечки. Если грамотно все сделать - проблем с передачей данных через глобалки не будет, пример выше в комментариях... И, кстати, варовские хештаблицы не нужны в Lua.
По подробней про ненадобность хеш таблицы ? Можно глобалку сделать GLOBAL[GetHanldeId(T)] ? А если там номер ключ 5782857? ничего страшного ?
В Lua текут, в JASS нет, выясняли уже.
И лучше заносить фильтры в глобалки, тогда они доступны везде, даже до место определения фильтра. А вместо Condition советую использовать Filter, букв меньше.
Все конечно хорошо, но если Filter(function()) будет занесена глобалку,вне триггера, то использовать локалки триггера в фильтре уже не возможно и нужно нужное заносить в глобалки. А если допустим таймер каждые 0.05 сек вызывает группу, то если все локалки будут заменены глобалками и использованы в глобальном фильтре, не будет ли фарша, когда глобалка перебивается другим игроком вызвавшим таймер, вот к примеру
P=nil
F=Filter(function())
local f=GetFilterUnit()
if IsUnitAlly(f,P) then
какой то код
end
end)
function TRG()
local ab=GetSpellAbilityId()
local u=GetTriggerUnit()
if ab==A000 then
local t=CreateTimer()
SavePlayerHandle(hash,GetHandleId(t),0,GetOwningPlayer(u))
TimerStart(,0.05,true,function()
local t=GetExpiredTimer()
local p=LoadPH(hash,GetHandleId(t),0)
local g=CreateGroup()
P=p
GroupEnumUnitsInRange(group,500,500,500,F)
DestroyGroup(g)
if какое то условие then
DestroyTimer(t)
Flush....
end
end)
end
Castiel, окей. И что мешает это сделать? Для этого нужна одна переменная (можно две - одну для ключа и одну для значения), один цикл, один if внутри цикла и пара присвоений переменной. Для нумерованного массива цикл по индексу, для ассоциативного - по ключам через pairs.
Так я уже сделал, написал просто что изначально затупил и не првильно подешел к этому )))
local key_count=0
local j=COUNT[0]
for i=1,6 do
if j<COUNT[i]then
j=COUNT[i]
key_count=i
end
end
Замена строковых ключей числовыми мало чем поможет - теперь это просто нумерованный массив целых чисел, который можно отсортировать, но результат сортировки будет немного другим и явно не тем который нужен.
table[0]=10
table[1]=5
table[2]=4
table[3]=3
table[4]=1
Впрочем, для получения двух верхних элементов массива тоже не нужна полная сортировка массива, хватит все того-же одного прохода по массиву, но если для получения верхнего элемента нужна минимум одна переменная, то для получения двух верхних нужно минимум две переменных.
Мне нужно узнать просто ключ самого высого числа! А потом по этому ключу проверить через if then end Вот и все ) изначально просто не правильно подошел к этому..
Castiel, смотря чего добиться в итоге надо - все можно, от конкретной задачи зависит, а я не экстрасенс чтобы угадать. Но поиск максимального значения в массиве обычно и так использует переменную объявленную до цикла чтобы хранить это значение, или индекс этого значения или ключ или несколько переменных.
короче я просто затупил, я ключи пронумеровал и отсортировал, суть в том, что мне нужно было узнать именно ключ самого большого числа! и потом еще раз сравнить со вторым по счету после сортировки! то есть
table[0]=3
table[1]=10
table[2]=5
table[3]=4
table[4]=1
итог:
table[1]=10
table[2]=5
table[3]=4
table[0]=3
table[4]=1
вот примерно так должно быть и узнать именно ключ самого высокго числа в этом случае table[1]
Просто я х3 может на луа есть какие то фичи этого)
Castiel, перебор ассоциативного массива через pairs выглядит так
for key,value in pairs(t) do
В переменную key по очереди будет записан каждый ключ из таблицы t а в value - каждое значение.
А поиск самого большого значения в массиве... Гугл в помощь, это простейшая задача, одинаковая почти в любом языке.
А потом их сравнить можно будет по ключу типа if "Petia" then elseif "Vasia" then end ? или самое большое занести в отдельную локалку и потом сравнить ??
У вас строки используются в качестве ключей в таблице. Такое сортировке не подлежит потому как ассоциативные массивы не гарантируют порядок элементов.
Их можно перебрать через цикл по pairs. Для поиска самого большого значения этого хватит, сортировка не нужна для этого.
Если нужна именно сортировка - нужна таблица представляющая собой обычный нумерованный массив, в ячейках которого будут лежать таблицы с именами и другими значениями - такую конструкцию можно сортировать потому как обычный массив знает порядок элементов.
Бро как тогда найти самое высокое значение )))? именно через pairs! и как именно вывести самый высокий! чет пробую никак не выходит!
» WarCraft 3 / [lua] Фрэймы
» WarCraft 3 / запустить таймер из таймера
» WarCraft 3 / запустить таймер из таймера
Отредактирован Castiel
» WarCraft 3 / запустить таймер из таймера
» WarCraft 3 / запустить таймер из таймера
Отредактирован Castiel
» WarCraft 3 / запустить таймер из таймера
» WarCraft 3 / запустить таймер из таймера
Отредактирован Castiel
» WarCraft 3 / запустить таймер из таймера
» WarCraft 3 / запустить таймер из таймера
Отредактирован Castiel
» WarCraft 3 / запустить таймер из таймера
Отредактирован Castiel
» WarCraft 3 / запустить таймер из таймера
И еще хотелось бы узнать есть ли разница между вот TimerStart(t,1,true,и вот эта вот функция допустим до 60 сек.) или TimerStart(t,60,false,function())
Отредактирован Castiel
» WarCraft 3 / О критических ударах и уклонениях...
Отредактирован Castiel
» WarCraft 3 / как у спецэффекта проиграть анимацию типа Slam? (1.31)
Отредактирован Castiel
» WarCraft 3 / BlzGetUnitBaseDamage, BlzGetUnitDiceNumber, BlzGetUnitDiceSides
» WarCraft 3 / Увеличенный урон по определенному типу юнитов через способоность
» WarCraft 3 / war3tft editor ?уровень угрозы для ИИ войск игрока
» WarCraft 3 / wc3 1.31 и lua
» WarCraft 3 / wc3 1.31 и lua
Просто мне очень понравилось, что GroupEnumUnitsInRange(group,500,500,500,Condition(function() ) может использовать все локалки триггера, это очень круто и удобно, другими способами заносить лишь в глобалки игроков и другие нужные данные, которые будут использоваться на группе...
prog: По подробней про ненадобность хеш таблицы ? Можно глобалку сделать GLOBAL[GetHanldeId(T)] ? А если там номер ключ 5782857? ничего страшного ?
Отредактирован Castiel
» WarCraft 3 / wc3 1.31 и lua
» WarCraft 3 / Сортировка на Lua
» WarCraft 3 / Сортировка на Lua
local key_count=0
local j=COUNT[0]
for i=1,6 do
if j<COUNT[i]then
j=COUNT[i]
key_count=i
end
end
так или чет не то ?
Отредактирован Castiel
» WarCraft 3 / Сортировка на Lua
Отредактирован Castiel
» WarCraft 3 / Сортировка на Lua
table[0]=3
table[1]=10
table[2]=5
table[3]=4
table[4]=1
итог:
table[1]=10
table[2]=5
table[3]=4
table[0]=3
table[4]=1
вот примерно так должно быть и узнать именно ключ самого высокго числа в этом случае table[1]
Просто я х3 может на луа есть какие то фичи этого)
Отредактирован Castiel
» WarCraft 3 / Сортировка на Lua
Отредактирован Castiel
» WarCraft 3 / Сортировка на Lua