Всем привет. В некоторых картах я видел предметы которые увеличивают наносимый урон магией. Например, в доте там есть предмет кайа, и вот она увеличивает магический урон 16%. Как это можно реализовать.

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

Вот я открыл детект урона на мемхаке, не знаю что там на последнем, тут есть все образцы
Это то, про что я говорил
DamageType у нас integer следовательно нанеси урон через
UnitDamageTarget(source,target,damage,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_W​HOKNOWS)
Это же понятно?
и убери всё, оставь
Ты получишь число, не знаю какое, ну допустим примерно вот такое 1632308045709 и дальше ты просто делаешь условие
if  DamageType==1632308045709 then
BJDebugMsg("Тип урона - магия")
end
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

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

ответ
Ловишь весь урон
@
Наносишь от источников дополнительный
ответ
Конечно можно, но триггерно. В варкравте нету дефолтных аур которые бы влияли на магический урон.
Раз в 2 сек. проверяешь есть ли у юнитов на карте бафф ауры пустышки (чародейской ауры или ауры ускорения, основа не важна). Если есть, но у юнита нету спеллбука с скиллом благословление элуный - который повышает урон от магии на n %, то вручаем запрещённый спеллбук этому юниту, если у юнита нету баффа ауры но есть спеллбук удаляем спеллбук. Все просто.

0
32
3 года назад
0
Наносит урон триггерно + отлов типа урона (возможно только в рефе или на мемхаке), а там просто формула если тип урона магический тогда урон=урон*1.16
2
48
3 года назад
Отредактирован N7 Molot
2
Bergi_Bear:
Наносит урон триггерно + отлов типа урона (возможно только в рефе или на мемхаке), а там просто формула если тип урона магический тогда урон=урон*1.16
Я сделал без отлова урона, и на 1.26, и на твоём любимом GUI, и без МХ, но там не как в доте, а через ауру.

Если подумать нормально, то можно и как в доте реализовать
0
32
3 года назад
0
Ага, а я делал это в патче 1.03 на 2х триггерах и без ауры, давайте посоревнуемся, чья реализация более древняя и с тонной ограничений. Разумеется это же не спроста всё придумали, нужно отслеживать урон с руки а не общий урон, а для этого нужен бафф яда, вводящий ограничения на другой урон
0
48
3 года назад
Отредактирован N7 Molot
0
Bergi_Bear:
Ну вот, а говоришь только на рефоге или с мх. Вздор, все ограничения и тонкости можно обойти, нужно только подумать и всё.

Я не спорю, с источником урона проще, там буквально пара строк.
0
32
3 года назад
0
Так вот именно, то что ты предлагаешь - костыли и реализации из 2005, а потом мы думаем - почему это мап мейкеры выраждаются и карты из года в год всё хуже и примитивней.
В любом случае, наше дело лишь предложить решение, а какое автор выберет для себя - решать уже ему, главное, чтобы это работало так, как он задумал
0
14
3 года назад
0
с мх да но там только показана как отловить не магический урон а просто с руки
    function GetDamageId takes integer dmg_t returns integer
        return log( dmg_t, 2 ) // Gets base 2 logarithm of WeaponType.
    endfunction

    function Damaged_Handler takes unit source, unit target, real dmg returns nothing
        local integer evnt  = GetDamageEventESPData( )
        local integer data  = ReadRealMemory( evnt + 0x00 )
        local real init_dmg = CleanReal( IndexToReal( ReadRealMemory( evnt + 0x04 ) ) )
        local integer pMod  = ReadRealMemory( evnt + 0x08 ) // Pointer to parametres or flag saved by damage source, results may vary!
        local integer flags = ReadRealMemory( data + 0x0C )
        local real real_dmg = CleanReal( IndexToReal( ReadRealMemory( data + 0x10 ) ) )
        local integer wpn_t = ReadRealMemory( data + 0x04 )
        local integer dmg_t = ReadRealMemory( data + 0x14 ) // Use GetDamageTypeByAddr( dmg_t ) to get Damage Type id.
        local integer atk_t = ReadRealMemory( data + 0x20 )

        // Attack Types: Spell = 0, Normal = 1, Piercing = 2, Siege = 3, Magic = 4, Chaos = 5, Hero = 6
        // Weapon Types: Melee = 0, Instant = 1, Ranged = 2, ?? = 3, ?? = 4, Splash = 5, Bounce = 6, ?? = 7, ?? = 8
        // 0x4 - DO NOT DEAL DAMAGE (?) | 0x8 - Multishot | 0x10 - Projectile | 0x20 - Penetrates invulnerability
        // 0x40 - DO NOT cause "unit attacked" for the owner (red blinking) (cleave & splash use it!)
        // 0x100 - Melee | 0x101 - Ranged
        // 0x200 - DO NOT cause "unit attacked" for the owner (minimap ping, etc) used in Cyclone (land), hex (end), etc, not sure
        // plain 0x40 == cleave, 0x141 == splash | 0x80 - autocast modifier? | 0x10 - slow aura flag (not a relevant damage? nullify any damage value)
        // Damage Types: ConvertDamageType( i ) = 2 ^ i => ConvertDamageType( 5 ) = 2 ^ 5 = 32 = DAMAGE_TYPE_ENHANCED | Thus reverse is MathLog( 32, 2 ) => 5

        if false then // Miscellaneous Checks
            if init_dmg == 0. and real_dmg == 0. and flags == 0x10 and pMod == ConvertHandle( target ) then // Check WindWalk | Thunderbolt
                
            endif
            
            if real_dmg == 0. and flags == 1 and atk_t == 0 and dmg_t == 0x20 and GetUnitAbilityLevel( source, 'NONE' ) > 0 then // Check Fan of Knives based on Id.
                // Change 'NONE' to your Fan of Knives id, to check if damage was caused by it.
            endif
        endif

        if ( IsFlagBitSet( flags, 0x100 ) or IsFlagBitSet( flags, 0x101 ) ) and atk_t != 0 then // Non-Spell Damage
            call DisplayTextToPlayer( GetLocalPlayer( ), 0, 0, "Attack Type: " + I2S( atk_t ) )
            call DisplayTextToPlayer( GetLocalPlayer( ), 0, 0, "Damage Type: " + I2S( dmg_t ) )
            call DisplayTextToPlayer( GetLocalPlayer( ), 0, 0, "Weapon Type: " + I2S( wpn_t ) )
        endif
    endfunction
вот я не очень разбираюсь в этом но я сделал следующее
function Kenn_W_Damage takes nothing returns nothing

    local unit source = GetEventDamageSource()
    local unit target = GetTriggerUnit()
    local integer id = GetHandleId(source)
    local integer Count
    local real damage = GetHeroAgi(source,true) * (GetUnitAbilityLevel(source,'A001') * 0.5)
    
    if GetUnitAbilityLevel(source,'A001') > 0 then
        set Count = LoadInteger(Hash,id,StringHash("Count2")) + 1
        call SaveInteger(Hash,id,StringHash("Count2"),Count)
        
        if Count >= 4 then
        set damage = 20 + (GetUnitAbilityLevel(source,'A001') * 5) + (GetHeroAgi(source,true) * 0.50)
        call UnitDamageTarget(source,target,damage,false,false,ATTACK_TYPE_HERO,DAMAGE_TYPE_UNKNOWN,null)
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl",GetUnitX(target),GetUnitY(target)))
        call SaveInteger(Hash,id,StringHash("Count2"),0)
        endif
        
    endif
    
    
        
    if GetUnitAbilityLevel(source,'B001') > 0 then
        set Count = LoadInteger(Hash,id,StringHash("Count3")) + 1
        call SaveInteger(Hash,id,StringHash("Count3"),Count)
        if Count <= 6 then
        
        
        
        set damage = 30 + (GetUnitAbilityLevel(source,'A001') * 10) + (GetHeroAgi(source,true) * 1.10)
        call UnitDamageTarget(source,target,damage,false,false,ATTACK_TYPE_HERO,DAMAGE_TYPE_UNKNOWN,null)
    
        set bj_lastCreatedEffect = AddSpecialEffect("CriticalSrike.mdx",GetUnitX(target),GetUnitY(target))
        call SetEffectFacing(bj_lastCreatedEffect,GetUnitFacing(target) + 90)
        call SetEffectScale(bj_lastCreatedEffect,1.5)
        call EffectTimer(bj_lastCreatedEffect,1.00)
        
        elseif Count > 6 and GetUnitAbilityLevel(source,'B001') > 0 then
        call UnitRemoveAbility(source,'B001')
        call SaveInteger(Hash,id,StringHash("Count3"),0)
        
    endif
    endif
        
        
        
        
        
        
        

    set source = null
    set target = null
endfunction

но это только урон с руки а как сделать эти проверки для магического урона не знаю
0
32
3 года назад
0
Могу показать только на примере рефа, потому что помню его наизусть
Вот так вот наносишь урон, типом урона магия, не типом атаки а типом урона DAMAGE_TYPE_MAGIC
UnitDamageTarget(source,target,damage,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_WHOKNOWS)
и в функции получения урона делаешь проверку
if BlzGetEventDamageType()==DAMAGE_TYPE_MAGIC then
    BlzSetEventDamage(GetEventDamage()*1.16)
end
4 строчки в рефе это, но и в мемхаке будут всё те же 4 строчки, можно завязать на типе атаке, тогда будет магический урон с руки проходить, но лучше ещё соединить с типом оружия, чтобы полностью исключить реальные повторения из РО
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.