Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Наработка
Версия Warcraft:
1.26 и ниже
Собственно тот знаменитый хак на память который нам радостно предоставил DracoL1ch, который позволяет нам больше не морочится с системами отлова урона, или вовсе узнать координаты курсора без стороннего по.
Для сохранения требуется: экспериментальная версия pjass.exe
Причём не все подходят, меньше всего проблем было с этой версией
В хаке присутствует только 1 пример на изменение белой атаки у героя, остальные готовые функции можно найти на:
Хайве
Гитхабе
Просто копируем саму функцию, все остальное для её работы есть в наработке и сохраняем.
Так же на хайве есть инструкция по созданию собственных функций для чтения\изменения данных в памяти игры.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
16
5 лет назад
0
quq_CCCP, окей.
quq_CCCP, а сколько тиков занимает таймер на 0.00 сек.? В ассемблере, когда прогаешь микроконтроллеры, 1 операция = 1 тик. Возможно, тут тоже есть альтернативные способы? Например, вывод пустых строк в чат.
0
28
5 лет назад
Отредактирован PT153
0
Naadir, все таймеры запускаются после вызова функции, в котором их запустили. Я думаю, что при старте таймера делается такая проверка: если указанное время не больше 0 и коллбек не нулл, то запустить коллбек.
0
16
5 лет назад
0
PT153, т.е. 3 тика? Запуск, проверка, колбэк.
Погодь, или... Если после функции, то там дохера разное время может быть.
0
28
5 лет назад
Отредактирован PT153
0
Всё происходит вот так.
выполнение функции-действия триггера
какие-то операции
call TimerStart(timer, 0, false, callback)
какие-то операции без пауз
конец выполнения функции-действия триггера
запуск таймера timer
Или так.
выполнение функции-действия триггера
какие-то операции
call TimerStart(timer, 0, false, callback)
какие-то операции без пауз
пауза на любое время
запуск таймера timer
Между всеми указанными действиями нет никаких пауз, только стандартное время выполнения, что очень мало.
В момент запуска таймера и делается проверка, что я предположил.
при старте таймера делается такая проверка: если указанное время не больше 0 и коллбек не нулл, то запустить коллбек
0
16
5 лет назад
Отредактирован Naadir
0
PT153, окей.
quq_CCCP, ничего не работает, если нужно посайленсить одну абилку и снять сайленс с другой одновременно. Хз, почему.
Даже если занести эти действия в 2 разных таймера, получается херня.

Ребят, посмотрите, пожалуйста, мб я недопонимаю что-то. Клепаю новую версию своей карты. Код находится в подкомментарии "Технические" в папке "SkeletonBerserker". Для того, чтобы понять, что ничего не работает, достаточно запустить карту и попробовать применить способности последовательно. Они должны переключаться. Но они этого не делают. При этом с кулдаунами творится что-то совсем эпическое.
Загруженные файлы
0
32
5 лет назад
0
Naadir, ну для начала немного учимся работать с jass, то как бы ты не убил карту с такой манерой написания кода...
globals
    hashtable gamedata = InitHashtable( )
endglobals

function Trig_ToMelee_Conditions takes nothing returns boolean
    return ( GetSpellAbilityId() == 'A048' )
endfunction

function Timer_AddSilence_Expires takes nothing returns nothing
    local timer t  = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit enemy = LoadUnitHandle( gamedata, id, 0 )
    local integer spellid = LoadInteger( gamedata, id, 1 )
    
    call StartAbilityCooldown( enemy,'A049', -1 )
    set spellid = GetUnitAbility(enemy,spellid) // для начала нам нужно убедится что у юнита есть такая абилка и её адресс коректный.
    if spellid > 1 then //всегда проверяй корректность адрессов, мы нашли адресс способности в памяьти игры, адресс обьекта а не просто РО кода.
       call AddSilenceToAbility(spellid) // функция сайленса, берет адресс способности и записывает по оффсету в структуру способности сведенья о сайленсе, подумай что будет если адресс не верен?
    endif
    set enemy = null 
    set t = null
endfunction

function Trig_ToMelee_Actions takes nothing returns nothing
    local unit enemy = GetSpellAbilityUnit() // создадим переменную чтобы не мучится гуи пережитками...
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    call SetUnitArmor(enemy,GetUnitArmor(enemy)*2)
    // 2 = ranger, 1 = instante, 0 = melee, 5 = splash, 6 = mbounce,
    call SetUnitWeaponType(enemy,0)
    call SetUnitAttackRange1(enemy,128)
    call SaveUnitHandle( gamedata, id, 0, enemy )
    call SaveInteger( gamedata, id, 1, GetSpellAbilityId())
    call TimerStart( t, 0.00, false, function Timer_AddSilence_Expires)
    set t = null
    set enemy = null
endfunction

//===========================================================================
function InitTrig_ToMelee takes nothing returns nothing
    set gg_trg_ToMelee = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ToMelee, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_ToMelee, Condition( function Trig_ToMelee_Conditions ) )
    call TriggerAddAction( gg_trg_ToMelee, function Trig_ToMelee_Actions )
endfunction
Зачем столько триггеров для такого простого спелла переключателя? Достаточно одного.
Ну вот выбор одного из двух состояний, правда хз нах так было заморачиватся, просто морфы и все.
Ну и для переключателей и механик каста лучше использовать не сайленс а мут абилок, от сайленса он отличается тем что не прирывает каста абилки но не дает применять её в ручную. Подробнее можно глянуть в моей карте.
Загруженные файлы
0
16
5 лет назад
0
quq_CCCP, попробую разобраться. Заморачиваюсь, потому что хочу протестировать способности мемхака.
0
16
5 лет назад
0
Функции с уроном и хп вызывают фатал, с чем это может быть связано?
А, по-моему, это я алёшенька.
Ага.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.