Всем привет. В некоторых картах я видел предметы которые увеличивают наносимый урон магией. Например, в доте там есть предмет кайа, и вот она увеличивает магический урон 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
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
33
Так вот именно, то что ты предлагаешь - костыли и реализации из 2005, а потом мы думаем - почему это мап мейкеры выраждаются и карты из года в год всё хуже и примитивней.
В любом случае, наше дело лишь предложить решение, а какое автор выберет для себя - решать уже ему, главное, чтобы это работало так, как он задумал
14
с мх да но там только показана как отловить не магический урон а просто с руки
    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

но это только урон с руки а как сделать эти проверки для магического урона не знаю
33
Могу показать только на примере рефа, потому что помню его наизусть
Вот так вот наносишь урон, типом урона магия, не типом атаки а типом урона 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 строчки, можно завязать на типе атаке, тогда будет магический урон с руки проходить, но лучше ещё соединить с типом оружия, чтобы полностью исключить реальные повторения из РО
43
Bergi_Bear:
ни знаю что ты триггеришся, или я. Автор ж не написало на какой версии и с чем он работает. Если бы он написал только 1,26 без мх, то можно. Если 1,26 + мх, то тоже можно. Если реф, то вообще изи. Ты ж написал, только реф или мх. Ай ай...
14
Bergi_Bear:
да на мх есть проверка урона но все ли способности в РО наносят магический урон? если это делается так как ты показал то и сам смогу

N7 Molot:
Bergi_Bear:
Автор ж не написало на какой версии и с чем он работает.
не у всех есть возможность иметь реф, а если хотят что то на уровне рефа делают. Это на мх или никак, а костыли это не очень, что бы получить одно, нужно отказываться от другого.
43
Гуванч:
не ужели так сложно ставить точки с запятыми...
Костыли - наше всё. Любая игра, любой движок имеет костыли. Без них не куда.
14
N7 Molot:
Гуванч:
не ужели так сложно ставить точки с запятыми...
Костыли - наше всё. Любая игра, любой движок имеет костыли. Без них не куда.
не все владеют хорошо русским и я не исключение)
43
Гуванч:
не все владеют хорошо русским и я не исключение)
ну понятие где конец предложения ж есть?
33
да на мх есть проверка урона но все ли способности в РО наносят магический урон?
В от то и дело что нет, на хайве есть таблица типов урона от стандартных спелов (лень искать сами ищите), хочешь сделать что-то толкове и выйти из 2005 - не юзай РО
14
N7 Molot:
Гуванч:
не все владеют хорошо русским и я не исключение)
ну понятие где конец предложения ж есть?
ну вы же меня понимаете

Bergi_Bear:
Гуванч:
хочешь сделать что-то толкове и выйти из 2005 - не юзай РО
пытаюсь
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.