Добавлен
Есть уже мемхаком или еще как возможности отловить "unit атакует?"
А ещё лучше "unit завершает атаку".
Объясняю, зачем.
Во-первых, при unit атакован - если способность именно у атаковавшего - то регать надо ВСЕХ атакованных на карте на триггер способности или периодически таймером подошедших на расстояние атаки к обладателю способности, а это ресурсозатратно. При unit атакует триггеринг юнит был бы именно АТАКОВАВШИЙ (а атакованный тогда по-хорошему должен отлавливаться уже от него как attacked), и на событие можно было бы регать только его, что намного оптимальнее.
Во-вторых, при unit атакован событие можно абузить через stop и со всякими триггерными пассивками на атаку приходится ставить защиту от абуза или мириться с возможностью абуза. Если бы можно было отловить именно завершение атаки, то проблема бы исчезла.
PS систем с орбами и вообще триггерных не мемхачных систем не надо, с этим понятно, хотелось бы сразу поставить как юзабельное событие триггера, чтобы потом юзать его, как все остальные.

Принятый ответ

юзай событие юнит получает урон навешанное на каждого юнита
а это ресурсозатратно
ерунду не неси
если хочешь сделать всё очень оптимально то узнай для начала как работает система событий
или вообще юзай екзекют
Diaboliko:
событие получения урона сразу для всех юнитов
это было и до мемхака
вообще бесит когда люди которые не шарят в работе вара начинают выдумывать проблемы а потом искать их решение
0
19
7 лет назад
0
Похожие вопросы:

ответ
Ох уж эти отловы урона
ответ
событие - юнит получает урон
условие - юнит получивший урон имеет баф (баф стрелы)
Pippetz, лучше не яд а ледяные стрелы
ответ
было бы круто если бы ты их вспомнил а то я уже собираюсь весь ии переписать
ответ
Вместо
function InitTrig_CreepSpell takes nothing returns nothing
    set gg_trg_CreepSpell = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent(gg_trg_CreepSpell, Player(1), EVENT_PLAYER_UNIT_SPELL_EFFECT, function CreepSpellFilter) 
    call TriggerAddAction(gg_trg_CreepSpell, function CreepSpellActivation)
endfunction
сделай так:
function InitTrig_CreepSpell takes nothing returns nothing
    set gg_trg_CreepSpell = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent(gg_trg_CreepSpell, Player(1), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) //function CreepSpellFilter
    call TriggerAddCondition(gg_trg_CreepSpell, Condition(function CreepSpellFilter))
    call TriggerAddAction(gg_trg_CreepSpell, function CreepSpellActivation)
endfunction
и вот здесь:
if IsUnitEnemy(GetFilterUnit(), Player(10)) then
        set Dummy = CreateUnit(Player(1), 'e004', CasterX, CasterY, bj_RADTODEG*Atan2(TargetY - CasterY, TargetX - CasterX))
		call IssuePointOrder(Dummy, "attackground", TargetX, TargetY)
        call UnitApplyTimedLife(Dummy, 'BTLF', 3)
        set Dummy = null
    endif
поменяй местами IssuePointOrder и UnitApplyTimedLife, чтобы было вот так:
    if IsUnitEnemy(GetFilterUnit(), Player(10)) then
        set Dummy = CreateUnit(Player(1), 'e004', CasterX, CasterY, bj_RADTODEG*Atan2(TargetY - CasterY, TargetX - CasterX))
        call UnitApplyTimedLife(Dummy, 'BTLF', 3)
        call IssuePointOrder(Dummy, "attackground", TargetX, TargetY)
        set Dummy = null
    endif

3
20
7 лет назад
3
Ну мемхак позволяет решать событие получения урона сразу для всех юнитов. Наноси весь магический урон от юнитов с москитами и будет тебе счастье. Также можно обойтись без мемхака и решать получение урона на каждого юнита в отдельности. Это позволит без лишних фильтров делать различные фичи. Добавляем сверху базу данных и отдельную бд для работы со временем. На эту порнографию уходит куча времени, но имхо оно того стоит :)
2
28
7 лет назад
Отредактирован nvc123
2
юзай событие юнит получает урон навешанное на каждого юнита
а это ресурсозатратно
ерунду не неси
если хочешь сделать всё очень оптимально то узнай для начала как работает система событий
или вообще юзай екзекют
Diaboliko:
событие получения урона сразу для всех юнитов
это было и до мемхака
вообще бесит когда люди которые не шарят в работе вара начинают выдумывать проблемы а потом искать их решение
Принятый ответ
2
32
7 лет назад
2
Тут все дело в том, что такое событие - это охиреть как удобно для мили юнитов, т.е событие - Юнит успешно завершил атаку, позволит больше не трахать себе мозг всякими детектами урона и изи делать пассивки на подобии башей, орбов. Но это будет выглядеть не так:
call TriggerRegisterUnitEvent( trig, unit, EVENT_UNIT_ATTACK_FINISH )
А скорее вот так:
   local integer pUnitDamageHandler = pUnitVtable+0x120
    local integer oldprotection = ChangeOffsetProtection(pUnitDamageHandler,4,0x40)
    
    set Memory[pReservedMemoryForDamageHandler/4+0]=0xB890C08B
    set Memory[pReservedMemoryForDamageHandler/4+1]=pDamageTarget
    set Memory[pReservedMemoryForDamageHandler/4+2]=0xB8900889
    set Memory[pReservedMemoryForDamageHandler/4+3]=pDamageEspData
    set Memory[pReservedMemoryForDamageHandler/4+4]=0x68602089
    set Memory[pReservedMemoryForDamageHandler/4+5]=pTriggerHandle
    set Memory[pReservedMemoryForDamageHandler/4+6]=0xB890C08B
    set Memory[pReservedMemoryForDamageHandler/4+7]=pTriggerExecute
    set Memory[pReservedMemoryForDamageHandler/4+8]=0xC483D0FF
    set Memory[pReservedMemoryForDamageHandler/4+9]=0xB8906104
    set Memory[pReservedMemoryForDamageHandler/4+10]=pRealUnitDamageHandler
    set Memory[pReservedMemoryForDamageHandler/4+11]=0xCCCCE0FF
 
     //call BJDebugMsg(Int2Hex(pReservedMemoryForDamageHandler))
   
    call WMem(pUnitDamageHandler,pReservedMemoryForDamageHandler)
   
    set oldprotection = ChangeOffsetProtection(pUnitDamageHandler,4,oldprotection)
Код который бы брал хендл юнита и триггера и оставлял бы код на на этом внутреннем событии - Юнит успешно завершил атаку, который бы просто при срабатывании события запускал триггер и записывал в глобальные переменные необходимые данные...
Но увы где, что, как - еще не опубликовали. Ждемс...
0
21
7 лет назад
0
nvc123, хорошо, просвети тогда и кинь ссылки, как работает система событий.
В моем понимании так - событие unit атакован при каждом атакованном юните будет проверять его на соответствие триггерным условиям, что создает нагрузку, т. к. оно будет проверяться при каждой атаке кого бы то ни было кем бы то ни было, а если таких триггеров много (пассивок, что-то делающих при атаке), результат очевиден.
В чем ошибка в этих рассуждениях? Которые проверены и на практике - сокращение подобных событий существенно повысило производительность, если это не списывать на глюки восприятия.
quq_CCCP~~, спасибо, приму к сведению... буду ждать или мб даже пытаться че-то копать лично...
Diaboliko, не вижу тут такого события, github.com/DracoL1ch/WC3Memory/blob/master/war3map.j , код бы, но в любом случае лучше напрямую отлавливать именно завершение атаки, а не урон
0
32
7 лет назад
0
ClotPh, считай каждый раз когда по юнит начинает атаку, запускается список ссылок, который и дергает триггеры. Событий огромное множество, близарды почти нехрена для jass и не реализовали, в самом движке гораздо больше прибабахов.
Оказывается все аое спеллы юзают UnitDamageTarget но они могут передавать ей фильр, группу... А мы нет, поэтому это почти юзлесс функция которая дамажит всех.
0
20
7 лет назад
Отредактирован ssbbssc
0
ClotPh:
обрадую тебя - близзовские bj шки работают также, если не хуже
0
20
7 лет назад
0
но в любом случае лучше напрямую отлавливать именно завершение атаки, а не урон
Еще раз говорю - наноси весь урон не от атак триггерно от даммиков(либо меняй какую-то глобалку при каждом нанесении урона, однако нанесение урона от неуязвимого юнита не агрит мобов на героя. Агр можно сделать триггерным и зависящим от обзора и дистанции, что, имхо, лучше)).
Я не вижу никаких ограничений, связанных с таким подходом.
событие получения урона сразу для всех юнитов
это было и до мемхака
мм?
0
29
7 лет назад
Отредактирован 16GB
0
а если таких триггеров много (пассивок, что-то делающих при атаке)
Надо создавать триггеры только для выбранных героев/купленных предметов. Тогда активных триггеров будет меньше.
0
21
7 лет назад
0
16GB, так и делается (для всего нового точно, если там осталась часть старого, она постепенно переписывается в общую систему).
У меня вообще мысль давать всем, у кого могут быть нестанд. действия при атаке, абилу-пустышку-маркер "особая атака", единственным ифзенэлсом в основном триггере проверять ее наличие, а уж если она есть, плясать дальше, тогда основной ифзенэлс будет всего один и нагрузка, соответственно, малая
Diaboliko, при уроне от даммиков свои замороки: у меня еще достаточно дефолтных спеллов + всякие возвратки тогда надо правильно прописывать, чтобы они урон НЕ даммикам возвращали
Ну ладно, всем спасибо, из выложенного и предложенного буду раскуривать, как и всегда
Чтобы оставить комментарий, пожалуйста, войдите на сайт.