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

юзай событие юнит получает урон навешанное на каждого юнита
а это ресурсозатратно
ерунду не неси
если хочешь сделать всё очень оптимально то узнай для начала как работает система событий
или вообще юзай екзекют
Diaboliko:
событие получения урона сразу для всех юнитов
это было и до мемхака
вообще бесит когда люди которые не шарят в работе вара начинают выдумывать проблемы а потом искать их решение
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
Похожие вопросы:

ответ
Ох уж эти отловы урона
ответ
событие - юнит получает урон
условие - юнит получивший урон имеет баф (баф стрелы)
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

20
Ну мемхак позволяет решать событие получения урона сразу для всех юнитов. Наноси весь магический урон от юнитов с москитами и будет тебе счастье. Также можно обойтись без мемхака и решать получение урона на каждого юнита в отдельности. Это позволит без лишних фильтров делать различные фичи. Добавляем сверху базу данных и отдельную бд для работы со временем. На эту порнографию уходит куча времени, но имхо оно того стоит :)
28
юзай событие юнит получает урон навешанное на каждого юнита
а это ресурсозатратно
ерунду не неси
если хочешь сделать всё очень оптимально то узнай для начала как работает система событий
или вообще юзай екзекют
Diaboliko:
событие получения урона сразу для всех юнитов
это было и до мемхака
вообще бесит когда люди которые не шарят в работе вара начинают выдумывать проблемы а потом искать их решение
Принятый ответ
32
Тут все дело в том, что такое событие - это охиреть как удобно для мили юнитов, т.е событие - Юнит успешно завершил атаку, позволит больше не трахать себе мозг всякими детектами урона и изи делать пассивки на подобии башей, орбов. Но это будет выглядеть не так:
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)
Код который бы брал хендл юнита и триггера и оставлял бы код на на этом внутреннем событии - Юнит успешно завершил атаку, который бы просто при срабатывании события запускал триггер и записывал в глобальные переменные необходимые данные...
Но увы где, что, как - еще не опубликовали. Ждемс...
21
nvc123, хорошо, просвети тогда и кинь ссылки, как работает система событий.
В моем понимании так - событие unit атакован при каждом атакованном юните будет проверять его на соответствие триггерным условиям, что создает нагрузку, т. к. оно будет проверяться при каждой атаке кого бы то ни было кем бы то ни было, а если таких триггеров много (пассивок, что-то делающих при атаке), результат очевиден.
В чем ошибка в этих рассуждениях? Которые проверены и на практике - сокращение подобных событий существенно повысило производительность, если это не списывать на глюки восприятия.
quq_CCCP~~, спасибо, приму к сведению... буду ждать или мб даже пытаться че-то копать лично...
Diaboliko, не вижу тут такого события, github.com/DracoL1ch/WC3Memory/blob/master/war3map.j , код бы, но в любом случае лучше напрямую отлавливать именно завершение атаки, а не урон
32
ClotPh, считай каждый раз когда по юнит начинает атаку, запускается список ссылок, который и дергает триггеры. Событий огромное множество, близарды почти нехрена для jass и не реализовали, в самом движке гораздо больше прибабахов.
Оказывается все аое спеллы юзают UnitDamageTarget но они могут передавать ей фильр, группу... А мы нет, поэтому это почти юзлесс функция которая дамажит всех.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.