Добавлен
Всем привет, сделал таймер на 45 минут и хочу что бы через 30 секунд появилось сообщение, но почему-то не работает, помогите пожалуйста!
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
Происходящее здесь напомнило мне один случай из моего далекого прошлого. В те времена я еще только начинал осваивать редактор. Одна из тем, которая меня заинтересовала и по которой мне не удалось найти достаточно полной информации - утечки. Тогда я пошел на один форум и задал простой вопрос о том, как определить наличие и степень серьезности утечек в карте, не перебирая весь код. В результате я получил тонну флуда и "ответ от профи", с которым все в итоге согласились - фрагмент кода с ценным указанием "если это число растет быстро - утечек много, если медленно - мало или нет вовсе". Код представлял из себя таймер с малым периодом, который создавал объект, брал его хендл, писал в чат и удалял объект, но был один нюанс - создаваемый объект утекал на каждой итерации таймера.
ответ
Ну с таймером я хз, проверял раз 10 карту, никаких проблем не было, по поводу тренировочного лагеря, если без костылей, тут нужна хэш-таблица, а её я могу юзать только через код
код
define{void = nothing; int = integer; bool = boolean}
library mylib initializer init{
    private trigger trg = CreateTrigger()
    private hashtable H = InitHashtable()
    
    private void act(){
        unit u = GetEventDamageSource(); int i = GetHandleId(u), c = LoadInteger(H,i,0)+1
        texttag tt = CreateTextTag()
        
        SetTextTagText(tt,I2S(c)+"/3",.0276)
        SetTextTagPosUnit(tt,u,0)
        SetTextTagColor(tt,255,0,255,0)
        SetTextTagVelocity(tt,.05325*Cos(1.570788),.05325*Sin(1.570788))
        SetTextTagPermanent(tt,false)
        SetTextTagLifespan(tt,1.)
        SetTextTagFadepoint(tt,.0)
        
        if c >= 3{
            SetHeroStr(u,GetHeroStr(u,false)+10,true)
            DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIsm\\AIsmTarget.mdl",u,"origin"))
            c = 0
        }
        SaveInteger(H,i,0,c)
        
        u = null; tt = null
    }
    
    private void eee(){
        TriggerRegisterUnitEvent(trg,GetEnumUnit(),EVENT_UNIT_DAMAGED)
    }
    private bool mycond1(){
        return IsUnitType(GetEventDamageSource(),UNIT_TYPE_HERO) && GetEventDamage() > 0
    }
    private bool mycond(){
        return GetUnitTypeId(GetFilterUnit()) == 'h000'
    }
    private void init(){
        group g = CreateGroup()
        boolexpr b = Condition(function mycond)
        
        GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,b)
        ForGroup(g,function eee)
        DestroyBoolExpr(b); b = Condition(function mycond1)
        TriggerAddCondition(trg,b)
        TriggerAddAction(trg,function act)
        
        DestroyBoolExpr(b)
        GroupClear(g); DestroyGroup(g)
        trg = null; b = null; g = null
    }
}
ответ
зависит от твоих нужд
например, мне нужно хранить последние 5 секунд позиций нескольких юнитов, т.е. разбитые на участки по 0.25 секунд снимки хп/мп/координат каждого из них
это 5*4 = 20 значений каждого, итого 80
когда мы доходим до секунды 5.25, то надо сдвигать все предыдущие на единичку назад, и вставлять текущие данные на последний слот
это 79*4 операций чтения и 80*4 записей (считаю грубо, всё для примера)
когда это делается в хештбалице, нагрузка значительно выше выходит, чем если делать на массивах (хт перебирает ключи как ассоциативный массив, а обычный массив просто обращается к памяти с указанным адресом, в разы быстрее).
Но чтобы делать эту процедуру на массивах, тебе нужен индексатор этих самых юнитов, чтобы их уникальный ключ не превышал лимит массива. Это дополнительный код, который тебе нужно реализовать с нуля. Но после реализации система становится быстрее.
Была она до этого медленной? да. Влияло ли это на игру? Нет, это 100-200 микросекунд.
Опять же, когда у тебя есть пре-процессор типа vJASS + сниппеты типа Table , которые имитируют массив самостоятельно, они снимают с тебя часть обязанностей. Но из-за того, что они созданы для ОБЩЕГО случая, они все равно не дадут того выигрыша в скорости, который можешь ожидать.
Используй то, что тебе удобнее, и оптимизируй только когда это реально влияет на игру. habr.com/ru/post/550926
И не забывай, что дота стала популярной еще во времена, когда была написана почти целиком на ГУИ и нихера в ней не пахло даже оптимизацией.
ответ
Таймеры не могут создаваться при инициализации карты, так как действия инициализации проходят не тогда, когда проходит загрузка и запускается сама карта, а сразу как начинается загрузка.
ответ
period - 0.05, период обновления
cd - длительность, сколько должен заполнятся хп бар
это у меня был фрейм перезарядки, слева направо адаптируйте под себя
function StartFrameCD(cd, fh,period)
    local amount = period*100 / cd
    local full = 0

    TimerStart(CreateTimer(), period, true, function()
        full = full + amount
        BlzFrameSetValue(fh, full)
        if full >= 100 then
            DestroyTimer(GetExpiredTimer())
            full = 0
        end
    end)
end

Это работает железно, я так делаю каст бары из фреймов или эффектов, вот ещё пример

28
а ты вообще дебажил что показывает "истекшее время таймера"? может там вообще другое число
но в принципе, суть в том, что триггер срабатывает при инициализации и изначально он выключен, как оно должно работать?
8
Использовать событие времени прошло 30 секунд, по событию - выводить сообщение 😒
С таймером особого смысла это связывать и вовсе нет, но можно, в принципе стартануть таймер на 30 секунд, по истечению времени вывести сообщение и стартануть таймер уже на 45 минут минус 30 секунд.
1
а ты вообще дебажил что показывает "истекшее время таймера"? может там вообще другое число
но в принципе, суть в том, что триггер срабатывает при инициализации и изначально он выключен, как оно должно работать?
А что тогда лучше поставить в событие?
28
Dnepr333, тебе уже сказали выше, делать 2 таймера и использовать смещение в 30 секунд
Чтобы оставить комментарий, пожалуйста, войдите на сайт.