"Кот забрал новую партию сапог с чересседельником, но опять вернулся и уже не ворчит, а рычит - в первый же день сапоги расползлись".
Были надежды, что и Психопомпа наконец кроме других фиксов работает идеально, но нет.
Перезарядка-то теперь нормально вроде увеличивается (раньше она тоже увеличивалась, но неправильно, а еще раньше еще более неправильно), но после первой же игры благополучно после выхода из вара опять фатал.
ВСЕ.
ФАТАЛ БЫЛ ИЗ-ЗА ЗАПИСИ В SetAbilityCD ЗНАЧЕНИЙ С ТЫСЯЧНЫМИ ДОЛЯМИ.

/////////////////////////////////
Только что новая версия кода.
Первая игра с ПП 17 минут - фатала нет.
Вторая игра 16 минут 52 секунды - фатала нет.
Третья около 17 минут - фатала нет.
КОРОЧЕ, ВСЕ.
ФАТАЛ БЫЛ ИЗ-ЗА ЗАПИСИ В SetAbilityCD ЗНАЧЕНИЙ С ТЫСЯЧНЫМИ ДОЛЯМИ.
Уф.
Мб будет залито завтра или даже сегодня, просто для себя как минимум.
А себе на заметку - пока не влезать в лишнее тут, имеющегося хватает для многого.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
32
Фильтр страннооватый, сначала берёшь всех потом проверяешь на уровень абилки, сначала проверь что живые, не клоны. А потом смотри уже абилку. И почему одни юзы Gettriggerunit(), Getunitabilitylevel, заноси вначале триггера все значения в переменные, функции могут возвращать не то значение если вызвать повторное срабатывание триггеров.
globals
    unit bj_lastFilterUnit = null
    group TEMP_GROUP = CreateGroup( )
    real TEMP_REAL = 0.00
endglobals

function IsUnitDead takes unit u returns boolean
    return IsUnitType( u, UNIT_TYPE_DEAD ) or GetUnitTypeId( u ) < 1
endfunction

function Cond_Find_Alive_Hero_Units takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return IsUnitType( UNIT_TYPE_HERO bj_lastFilterUnit ) and not( IsUnitIllusion( bj_lastFilterUnit ) or IsUnitDead( bj_lastFilterUnit ) )
endfunction

function Group_Add_Effect_Enum takes nothing returns nothing
    local unit hero = GetEnumUnit( )
    local integer level = GetUnitAbilityLevel( hero, 'A27T'  )

    if  level > 0 then
        call DestroyEffect(AddSpecialEffectTarget("Psychopomp4.mdx", hero, "origin"))
        call SetUnitState( hero, UNIT_STATE_LIFE, GetUnitState( UNIR_STATE_LIFE ) + RMaxBJ( TEMP_REAL * level, 1.01  ) )
    endif
    
    set hero = null
endfunction


function PerceptionEffect takes nothing returns nothing
    local unit cast = GetSpellAbilityUnit( )
    local integer id = GetSpellAbilityId( )
    local integer level = GetUnitAbilityLevel( cast, id )
    local real cooldown 

    if level > 1 and not IsUnitDead( cast ) then
        set cooldown =  GetAbilityCD( id, level, cast ) 
    else
        set cooldown = 0.00
    endif

    if cooldown >= 1.01 then
        call GroupClear( TEMP_GROUP )
        call GroupEnumUnitsInRect( TEMP_GROUP, bj_mapInitialPlayableArea, Condition( function Cond_Find_Alive_Hero_Units ) )
        set TEMP_REAL = cooldown
        call ForGroup( TEMP_GROUP, function Group_Add_Effect_Enum )
    endif
    
    set cast = null
endfunction
Попробуй вот так, на вид куда понятнее, да и покороче...
21
quq_CCCP, спс, насчёт переменных самый толковый совет, мб в "возврате не того значения" собака и зарыта
Короче, пока поставлю доп. реалки на лвлы и кд абилы (это как минимум уменьшение обфускации кода) и фильтр на мертвеца, там видно будет. Если что, тема продолжит развитие.
Если совсем надоест, я просто поменяю ульту, т. к. 90%, что дело в ней.
32
ClotPh, ты нормально напиши как я скинул спелл, то если у тебя весь код такой, не удивительно что проблемы...
21
quq_CCCP, у меня шаблон.
У тебя как минимум подсказок нет, а без них не могу.
Некоторые проблемы именно у Психопомпы, так что у нее и буду решать.
Замечания справедливые, соответственно им отредактирую, но свой шаблон.
У тебя куча функций и еще и глобалки используются...
16
стек значений Get*() остается тем же по ходу функции, за это переживать не стоит.
кинь мне в личку всю карту
32
ClotPh, а чем это плохо? Глобалки? Создавать каждый раз группу глупо, достаточно одной для всех дейсвий, брать всех и перебирать в цикле? Нафиг надо, это не быстрее,не лучше ни коим образом, разве что удобнее, так же у меня везде есть проверки на корректность результатов выполнения функций, чего у тебя нету, RMaxBJ - не даст поставить юниту 0 хп если что то пойдет не так, хил возможен только выше 1.00.
Так же зачем брать кд абилки каждый раз, это не шибко быстрая функция, лучше запиши её результат в переменную.
Фильтр удалять ненужно, он не утекает, 1 и тот же boolexpr можно использовать многократно для разных целей.
Так же отсеиваем клонов.
DracoL1ch, у тебя же у самого была проблема с GetTriggerEventId() С возвращением.
21
quq_CCCP, я запишу кд абилки, это правильно, и уровень сразу запишу, и проверку на мертвость добавлю, а все остальное не считаю, что у тебя оптимальнее, хз.
DracoL1ch, кинуть всю карту просто так не получится, там наркомания, многие данные в MPQ, карта отдельно просто не работает. Бтв, карты с Психопомпой отдельно просто уже не существует (хотя сделать займёт макс. несколько часов, один из которых займет открытие основной карты).
Если не проблема и не влом качать > 2.5 гб, то пожалста, сорс давно не скрывается, вот весь перекромсанный саморедактируемый вар с сорсами, мемхаком, дллкой на безлим размер по сети и еще дохрена с чем (аудасити прямо в папке вара, баттон менеджер, JNGP и т. д.), который называется BFS, отдельно от него отстегнуть что-нибудь уже затруднительно, это саморазвивающийся уже организм:
Опенсорсы в папке BFS Open Maps.
В кастом коде все функции легко отыщутся.
Уж ты разберешься, доту явно хакать тяжелее. Можешь war3map.j открыть, можешь просто прогрузить карту (что она грузится XX минут, это нормально, в итоге загружается. Можно английскую опен открыть, отличий в коде мало, а грузится минимум втрое быстрее)
Можешь и сам в оптимизированной (т. е. нормально-игровой) карте за Психопомпу поиграть и увидеть, что после выхода из игры бывает фатал.
16
а есть просто .j ? как-то 2 гига ради 3 мб качать..
21
.j достаточно? Да пожалуйста, сейчас будет.
Только так ты и .j можешь посмотреть, и сам поиграть, и карту открыть любую.
Но выложить .j офк не помешает тебе это и в будущем сделать, сейчас... знаю, что там страх, какая-то часть вообще осталась гуишная, но суть-то в конкретной функции, ну или... в общем, вот.
Лол. 6 метров.
Файл.
P. S. В коде это все-таки чуть удобоваримее выглядит - по папочкам разбито и т. д., хотя офк еще причесывать можно очень долго.
Загруженные файлы
16
ну конкретно в ульте проблем не вижу, getAbilCD никак не задевает память напрямую, да и действия банальны. кинь файлы .txt из папки errors, которые были вызваны картой
21
Как будут, кину, а то каждый раз удаляю папку Errors, она меня бесит.
Скорее всего максимум завтра-послезавтра кину.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.