Добавлен , опубликован
Полезная функция для отображения урона с возможностью настройки:
Код функции
---@param showdamage boolean
---@param damage real
---@param damagetype damagetype
---@param attacktype attacktype
---@param weapontype weapontype
---@param showdamagetype boolean
---@param showattacktype boolean
---@param showweapontype boolean
function PrintDamage(showdamage, damage, damagetype, attacktype, weapontype, showdamagetype, showattacktype, showweapontype)
    if showdamage == true then
        print(damage)
    end
    if showdamagetype then
        if damagetype == DAMAGE_TYPE_UNKNOWN then
            print("DAMAGE_TYPE_UNKNOWN")
        elseif damagetype == DAMAGE_TYPE_NORMAL then
            print("DAMAGE_TYPE_NORMAL")
        elseif damagetype == DAMAGE_TYPE_ENHANCED then
            print("DAMAGE_TYPE_ENHANCED")
        elseif damagetype == DAMAGE_TYPE_FIRE then
            print("DAMAGE_TYPE_FIRE")
        elseif damagetype == DAMAGE_TYPE_COLD then
            print("DAMAGE_TYPE_COLD")
        elseif damagetype == DAMAGE_TYPE_LIGHTNING then
            print("DAMAGE_TYPE_LIGHTNING")
        elseif damagetype == DAMAGE_TYPE_POISON then
            print("DAMAGE_TYPE_POISON")
        elseif damagetype == DAMAGE_TYPE_DISEASE then
            print("DAMAGE_TYPE_")
        elseif damagetype == DAMAGE_TYPE_DIVINE then
            print("DAMAGE_TYPE_DIVINE")
        elseif damagetype == DAMAGE_TYPE_MAGIC then
            print("DAMAGE_TYPE_MAGIC")
        elseif damagetype == DAMAGE_TYPE_SONIC then
            print("DAMAGE_TYPE_SONIC")
        elseif damagetype == DAMAGE_TYPE_ACID then
            print("DAMAGE_TYPE_ACID")
        elseif damagetype == DAMAGE_TYPE_FORCE then
            print("DAMAGE_TYPE_FORCE")
        elseif damagetype == DAMAGE_TYPE_DEATH then
            print("DAMAGE_TYPE_DEATH")
        elseif damagetype == DAMAGE_TYPE_MIND then
            print("DAMAGE_TYPE_MIND")
        elseif damagetype == DAMAGE_TYPE_PLANT then
            print("DAMAGE_TYPE_PLANT")
        elseif damagetype == DAMAGE_TYPE_DEFENSIVE then
            print("DAMAGE_TYPE_DEFENSIVE")
        elseif damagetype == DAMAGE_TYPE_DEMOLITION then
            print("DAMAGE_TYPE_DEMOLITION")
        elseif damagetype == DAMAGE_TYPE_SLOW_POISON then
            print("DAMAGE_TYPE_SLOW_POISON")
        elseif damagetype == DAMAGE_TYPE_SPIRIT_LINK then
            print("DAMAGE_TYPE_SPIRIT_LINK")
        elseif damagetype == DAMAGE_TYPE_SHADOW_STRIKE then
            print("DAMAGE_TYPE_SHADOW_STRIKE")
        elseif damagetype == DAMAGE_TYPE_UNIVERSAL then
            print("DAMAGE_TYPE_UNIVERSAL")
        end
    end
    if showattacktype then
        if attacktype == ATTACK_TYPE_NORMAL then
            print("ATTACK_TYPE_NORMAL")
        elseif attacktype == ATTACK_TYPE_HERO then
            print("ATTACK_TYPE_HERO")
        elseif attacktype == ATTACK_TYPE_MELEE then
            print("ATTACK_TYPE_MELEE")
        elseif attacktype == ATTACK_TYPE_PIERCE then
            print("ATTACK_TYPE_PIERCE")
        elseif attacktype == ATTACK_TYPE_MAGIC then
            print("ATTACK_TYPE_MAGIC")
        elseif attacktype == ATTACK_TYPE_CHAOS then
            print("ATTACK_TYPE_CHAOS")
        elseif attacktype == ATTACK_TYPE_SIEGE then
            print("ATTACK_TYPE_SIEGE")
        end
    end
    if showweapontype then
        if weapontype == WEAPON_TYPE_WHOKNOWS then
            print("WEAPON_TYPE_WHOKNOWS")
        elseif weapontype == WEAPON_TYPE_METAL_LIGHT_CHOP then
            print("WEAPON_TYPE_METAL_LIGHT_CHOP")
        elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_CHOP then
            print("WEAPON_TYPE_METAL_MEDIUM_CHOP")
        elseif weapontype == WEAPON_TYPE_METAL_HEAVY_CHOP then
            print("WEAPON_TYPE_METAL_HEAVY_CHOP")
        elseif weapontype == WEAPON_TYPE_METAL_LIGHT_SLICE then
            print("WEAPON_TYPE_METAL_LIGHT_SLICE")
        elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_SLICE then
            print("WEAPON_TYPE_METAL_MEDIUM_SLICE")
        elseif weapontype == WEAPON_TYPE_METAL_HEAVY_SLICE then
            print("WEAPON_TYPE_METAL_HEAVY_SLICE")
        elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_BASH then
            print("WEAPON_TYPE_METAL_MEDIUM_BASH")
        elseif weapontype == WEAPON_TYPE_METAL_HEAVY_BASH then
            print("WEAPON_TYPE_METAL_HEAVY_BASH")
        elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_STAB then
            print("WEAPON_TYPE_METAL_MEDIUM_STAB")
        elseif weapontype == WEAPON_TYPE_METAL_HEAVY_STAB then
            print("WEAPON_TYPE_METAL_HEAVY_STAB")
        elseif weapontype == WEAPON_TYPE_WOOD_LIGHT_SLICE then
            print("WEAPON_TYPE_WOOD_LIGHT_SLICE")
        elseif weapontype == WEAPON_TYPE_WOOD_MEDIUM_SLICE then
            print("WEAPON_TYPE_WOOD_MEDIUM_SLICE")
        elseif weapontype == WEAPON_TYPE_WOOD_HEAVY_SLICE then
            print("WEAPON_TYPE_WOOD_HEAVY_SLICE")
        elseif weapontype == WEAPON_TYPE_WOOD_LIGHT_BASH then
            print("WEAPON_TYPE_WOOD_LIGHT_BASH")
        elseif weapontype == WEAPON_TYPE_WOOD_MEDIUM_BASH then
            print("WEAPON_TYPE_WOOD_MEDIUM_BASH")
        elseif weapontype == WEAPON_TYPE_WOOD_HEAVY_BASH then
            print("WEAPON_TYPE_WOOD_HEAVY_BASH")
        elseif weapontype == WEAPON_TYPE_WOOD_LIGHT_STAB then
            print("WEAPON_TYPE_WOOD_LIGHT_STAB")
        elseif weapontype == WEAPON_TYPE_WOOD_MEDIUM_STAB then
            print("WEAPON_TYPE_WOOD_MEDIUM_STAB")
        elseif weapontype == WEAPON_TYPE_CLAW_LIGHT_SLICE then
            print("WEAPON_TYPE_CLAW_LIGHT_SLICE")
        elseif weapontype == WEAPON_TYPE_CLAW_MEDIUM_SLICE then
            print("WEAPON_TYPE_CLAW_MEDIUM_SLICE")
        elseif weapontype == WEAPON_TYPE_CLAW_HEAVY_SLICE then
            print("WEAPON_TYPE_CLAW_HEAVY_SLICE")
        elseif weapontype == WEAPON_TYPE_AXE_MEDIUM_CHOP then
            print("WEAPON_TYPE_AXE_MEDIUM_CHOP")
        elseif weapontype == WEAPON_TYPE_ROCK_HEAVY_BASH then
            print("WEAPON_TYPE_ROCK_HEAVY_BASH")
        end
    end
end
Код вызова
-- Желательно расположить после всех манипуляций с уроном, чтобы избежать неправильного отображения количества
PrintDamage(true,GetEventDamage(), BlzGetEventDamageType(), BlzGetEventAttackType(), BlzGetEventWeaponType(), true, true, true)
Пример отлова и вывода урона
function Damage_Actions()
    local unit = BlzGetEventDamageTarget() -- юнит получающий урон
    local source = GetEventDamageSource() -- юнит наносящий урон
    local player = GetOwningPlayer(unit) --владелец получившего урон
    local sourceplayer = GetOwningPlayer(source) --владелец наносящего урон
    local damage = GetEventDamage() -- кол-во урона
    local damagetype = BlzGetEventDamageType() -- тип урона
    local attacktype = BlzGetEventAttackType() -- тип атаки
    local weapontype = BlzGetEventWeaponType() -- тип оружия
    PrintDamage(true, damage, damagetype, attacktype, weapontype, true, true, true) --функция вывода
end

function Damage()
    Trigger.Damage = CreateTrigger()
    TriggerAddAction(Trigger.Damage, Damage_Actions)
end

function EntireMap_Actions()
    TriggerRegisterUnitEvent(Trigger.Damage, GetTriggerUnit(), EVENT_UNIT_DAMAGED)
end

function EntireMap()
    Trigger.EntireMap = CreateTrigger()
    TriggerRegisterEnterRectSimple(Trigger.EntireMap, GetPlayableMapRect())
    TriggerAddAction(Trigger.EntireMap, EntireMap_Actions)
end
showdamage - показывать количество урона true/false
showdamagetype - показывать тип урона true/false
showattacktype - показывать тип атаки true/false
showweapontype - показывать тип оружия true/false
Инструкция по установке
Располагаете код функции у себя в карте, выше, чем место, где расположен код вызова
Код вызова функции используется в событии получения урона желательно в самой нижней части
Обновление 1.01 - Функции конверта типа в строку
---@param weapontype weapontype
---@return string string
function ConvertWeaponTypeToString(weapontype)
    if weapontype == WEAPON_TYPE_WHOKNOWS then
        return "WEAPON_TYPE_WHOKNOWS"
    elseif weapontype == WEAPON_TYPE_METAL_LIGHT_CHOP then
        return "WEAPON_TYPE_METAL_LIGHT_CHOP"
    elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_CHOP then
        return "WEAPON_TYPE_METAL_MEDIUM_CHOP"
    elseif weapontype == WEAPON_TYPE_METAL_HEAVY_CHOP then
        return "WEAPON_TYPE_METAL_HEAVY_CHOP"
    elseif weapontype == WEAPON_TYPE_METAL_LIGHT_SLICE then
        return "WEAPON_TYPE_METAL_LIGHT_SLICE"
    elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_SLICE then
        return "WEAPON_TYPE_METAL_MEDIUM_SLICE"
    elseif weapontype == WEAPON_TYPE_METAL_HEAVY_SLICE then
        return "WEAPON_TYPE_METAL_HEAVY_SLICE"
    elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_BASH then
        return "WEAPON_TYPE_METAL_MEDIUM_BASH"
    elseif weapontype == WEAPON_TYPE_METAL_HEAVY_BASH then
        return "WEAPON_TYPE_METAL_HEAVY_BASH"
    elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_STAB then
        return "WEAPON_TYPE_METAL_MEDIUM_STAB"
    elseif weapontype == WEAPON_TYPE_METAL_HEAVY_STAB then
        return "WEAPON_TYPE_METAL_HEAVY_STAB"
    elseif weapontype == WEAPON_TYPE_WOOD_LIGHT_SLICE then
        return "WEAPON_TYPE_WOOD_LIGHT_SLICE"
    elseif weapontype == WEAPON_TYPE_WOOD_MEDIUM_SLICE then
        return "WEAPON_TYPE_WOOD_MEDIUM_SLICE"
    elseif weapontype == WEAPON_TYPE_WOOD_HEAVY_SLICE then
        return "WEAPON_TYPE_WOOD_HEAVY_SLICE"
    elseif weapontype == WEAPON_TYPE_WOOD_LIGHT_BASH then
        return "WEAPON_TYPE_WOOD_LIGHT_BASH"
    elseif weapontype == WEAPON_TYPE_WOOD_MEDIUM_BASH then
        return "WEAPON_TYPE_WOOD_MEDIUM_BASH"
    elseif weapontype == WEAPON_TYPE_WOOD_HEAVY_BASH then
        return "WEAPON_TYPE_WOOD_HEAVY_BASH"
    elseif weapontype == WEAPON_TYPE_WOOD_LIGHT_STAB then
        return "WEAPON_TYPE_WOOD_LIGHT_STAB"
    elseif weapontype == WEAPON_TYPE_WOOD_MEDIUM_STAB then
        return "WEAPON_TYPE_WOOD_MEDIUM_STAB"
    elseif weapontype == WEAPON_TYPE_CLAW_LIGHT_SLICE then
        return "WEAPON_TYPE_CLAW_LIGHT_SLICE"
    elseif weapontype == WEAPON_TYPE_CLAW_MEDIUM_SLICE then
        return "WEAPON_TYPE_CLAW_MEDIUM_SLICE"
    elseif weapontype == WEAPON_TYPE_CLAW_HEAVY_SLICE then
        return "WEAPON_TYPE_CLAW_HEAVY_SLICE"
    elseif weapontype == WEAPON_TYPE_AXE_MEDIUM_CHOP then
        return "WEAPON_TYPE_AXE_MEDIUM_CHOP"
    elseif weapontype == WEAPON_TYPE_ROCK_HEAVY_BASH then
        return "WEAPON_TYPE_ROCK_HEAVY_BASH"
    end
end
---@param attacktype attacktype
---@return string string
function ConvertAttackTypeToString(attacktype)
    if attacktype == ATTACK_TYPE_NORMAL then
        return "ATTACK_TYPE_NORMAL"
    elseif attacktype == ATTACK_TYPE_HERO then
        return "ATTACK_TYPE_HERO"
    elseif attacktype == ATTACK_TYPE_MELEE then
        return "ATTACK_TYPE_MELEE"
    elseif attacktype == ATTACK_TYPE_PIERCE then
        return "ATTACK_TYPE_PIERCE"
    elseif attacktype == ATTACK_TYPE_MAGIC then
        return "ATTACK_TYPE_MAGIC"
    elseif attacktype == ATTACK_TYPE_CHAOS then
        return "ATTACK_TYPE_CHAOS"
    elseif attacktype == ATTACK_TYPE_SIEGE then
        return "ATTACK_TYPE_SIEGE"
    end
end
---@param damagetype damagetype
---@return string string
function ConvertDamageTypeToString(damagetype)
    if damagetype == DAMAGE_TYPE_UNKNOWN then
        return "DAMAGE_TYPE_UNKNOWN"
    elseif damagetype == DAMAGE_TYPE_NORMAL then
        return "DAMAGE_TYPE_NORMAL"
    elseif damagetype == DAMAGE_TYPE_ENHANCED then
        return "DAMAGE_TYPE_ENHANCED"
    elseif damagetype == DAMAGE_TYPE_FIRE then
        return "DAMAGE_TYPE_FIRE"
    elseif damagetype == DAMAGE_TYPE_COLD then
        return "DAMAGE_TYPE_COLD"
    elseif damagetype == DAMAGE_TYPE_LIGHTNING then
        return "DAMAGE_TYPE_LIGHTNING"
    elseif damagetype == DAMAGE_TYPE_POISON then
        return "DAMAGE_TYPE_POISON"
    elseif damagetype == DAMAGE_TYPE_DISEASE then
        return "DAMAGE_TYPE_"
    elseif damagetype == DAMAGE_TYPE_DIVINE then
        return "DAMAGE_TYPE_DIVINE"
    elseif damagetype == DAMAGE_TYPE_MAGIC then
        return "DAMAGE_TYPE_MAGIC"
    elseif damagetype == DAMAGE_TYPE_SONIC then
        return "DAMAGE_TYPE_SONIC"
    elseif damagetype == DAMAGE_TYPE_ACID then
        return "DAMAGE_TYPE_ACID"
    elseif damagetype == DAMAGE_TYPE_FORCE then
        return "DAMAGE_TYPE_FORCE"
    elseif damagetype == DAMAGE_TYPE_DEATH then
        return "DAMAGE_TYPE_DEATH"
    elseif damagetype == DAMAGE_TYPE_MIND then
        return "DAMAGE_TYPE_MIND"
    elseif damagetype == DAMAGE_TYPE_PLANT then
        return "DAMAGE_TYPE_PLANT"
    elseif damagetype == DAMAGE_TYPE_DEFENSIVE then
        return "DAMAGE_TYPE_DEFENSIVE"
    elseif damagetype == DAMAGE_TYPE_DEMOLITION then
        return "DAMAGE_TYPE_DEMOLITION"
    elseif damagetype == DAMAGE_TYPE_SLOW_POISON then
        return "DAMAGE_TYPE_SLOW_POISON"
    elseif damagetype == DAMAGE_TYPE_SPIRIT_LINK then
        return "DAMAGE_TYPE_SPIRIT_LINK"
    elseif damagetype == DAMAGE_TYPE_SHADOW_STRIKE then
        return "DAMAGE_TYPE_SHADOW_STRIKE"
    elseif damagetype == DAMAGE_TYPE_UNIVERSAL then
        return "DAMAGE_TYPE_UNIVERSAL"
    end
end
Пример использования конвертации
function Damage_Actions() --функция при получении урона
    local damagetype = BlzGetEventDamageType() -- тип урона
    local attacktype = BlzGetEventAttackType() -- тип атаки
    local weapontype = BlzGetEventWeaponType() -- тип оружия
    print(ConvertDamageTypeToString(damagetype)) -- конвертация типа урона в строку
	print(ConvertAttackTypeToString(attacktype)) -- конвертация типа атаки в строку
	print(ConvertWeaponTypeToString(weapontype)) -- конвертация типа оружия в строку
end
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
4 года назад
Отредактирован Берги
0
Сам хотел сделать и выложить, ибо каждый через это проходит, когда хочет посмотреть на все типы урона от стандартных заклинаний, но..
Нужно ещё добавить само событие урона, вдруг человек не знает как его добавлять.. и ну и карту.. Можно ссылкой на гитхаб, чтобы приучать к правильному
0
27
4 года назад
0
Bergi_Bear, да, надо бы апгрейд сделать
0
27
4 года назад
Отредактирован Феникс
0
Добавил функции конвертации типа урона в строку, пример отлова урона через регистрацию ивента при входе в карту. Прикрепил файл к ресурсу.
Как я юзаю это?
У меня есть классы для типов урона с соответствующим названием в таблице, конвертация нужна для вывода урона вида:
id = GetHandleId(BlzGetEventDamageTarget()) -- id юнита получающего урон
damage = BlzGetEventDamage() -- кол-во урона
damagetype = BlzGetEventDamageType() -- тип урона
str = ConvertDamageTypeToString(damagetype) -- конвертируем в строку
damage = damage * Hero[id].Resist[srt] -- где резист коэфицент вида 0.5 например
Имея таблицу вида:
Hero[id] = {
	Resist = {
		DAMAGE_TYPE_MAGIC = 1
	}
}
Мы получим возможность контролировать весь входящий урон с помощью функции конвертации типа в строку
0
17
4 года назад
Отредактирован GetLocalPlayer
0
Спойлер
do
    function string.startsWith(str, sub)
        return string.sub(str, 1, string.len(sub)) == sub
    end

    local weaponTypeNames = {}

    for k, v in pairs(_G) do
        if k:startsWith("WEAPON_TYPE_") then
            weaponTypeNames[v] = k
        end
    end
    
    _G["WeaponType2String"] = function(wp)
        return weaponTypeNames[wp]
    end
end
0
23
4 года назад
0
феня изврашенец =)
0
27
4 года назад
0
GetLocalPlayer, шо это, как это использовать?)
7
17
4 года назад
7
шо это
Ищем среди глобальных переменных те, чьи имена начинаются с "WEAPON_TYPE_".
Записываем совпадения в новую таблицу, используя значения этих переменных как ключ, а имена как значение.
При получении урона, достаем из созданной таблицы имя типа урона по типу урона.
0
21
4 года назад
0
GetLocalPlayer, может у меня комп слабый или я хз, но когда я последний раз перебирал _G были жесткие фризы.
3
17
4 года назад
Отредактирован GetLocalPlayer
3
может у меня комп слабый или я хз, но когда я последний раз перебирал _G были жесткие фризы.
Даже будь оно и так (хотя, как мне кажется, под "перебирал" подразумевается print гигантского массива информации), таблицы из моего примера с типами урона/атаки/оружия создаются единожды, в процессе инициализации карты. В процессе игры обход _G не осуществляется, соответственно и фризов быть не может.
0
22
3 года назад
Отредактирован PROSHELDOTU
0
Лол, не так давно для себя такое же сделал, и подумывал выложить, но всё как-то лень было ;D и тут бамс
Чтобы оставить комментарий, пожалуйста, войдите на сайт.