Урок Вызов звуков, уже добавленных в код доты

  • Автор темы Автор темы ddd3m0s
  • Дата начала Дата начала

ddd3m0s

Пользователь
25 Апр 2024
11
2
Проект
anton_box
Прикрепляю уже существующий гайд как добавить звук в код доты
В доте существует несколько вариантов вызова звука при каких либо условиях, в том числе при использовании абилки, я расскажу про главные
1. Самый первый и самый надежный вызов звука через слушатели
С помощью этого способа можно вызвать звук при использовании абилки, смерти юнита, героя, тавера и при любых других условиях для которых создан слушатель
Полный список событий, которые могут использоваться в слушателях тут
Познакомиться с основными слушателями и их функциями тут
1) Нужно создать слушателей для своих собственных целей, как пример я буду использовать слушатели для использования абилки и для смерти юнита (второе чуть чуть посложнее)
Открываем addon_game_mode и в функцию InitGameMode вставляем слушатель
Lua:
function AddonGameMode:InitGameMode()
    ListenToGameEvent("dota_player_used_ability", Dynamic_Wrap(self, "abilka"), self)
    ListenToGameEvent("entity_killed", Dynamic_Wrap(self, "kill"), self)
end
(1 слушатель для абилок, 2 слушатель для смерти юнита)
2) Далее в этом же файле(для более продвинутых можно и в отдельном) пишем функцию которая будет вызывать наши "заданные функции"
Lua:
function AddonGameMode:abilka(data)
    DeepPrintTable(data)
    print(data.abilityname)
    if data.abilityname == "НАЗВАНИЕ ВАШЕЙ АБИЛКИ" then
        EmitGlobalSound("НАЗВАНИЕ ВАШЕГО ЗВУКА")
    end
end
Вторая и третья строчки помогут вам определить работает ваш слушатель или нет: вторая напишет вам в консоль всю информацию о кастованной абилке, а третья вынесет само название абилки
Четвертая - условие, в котором проверяется равенство вынесенного названия абилки и название абилки к которой вы хотите добавить звук. При положительном результате проверки указанный вами звук вызывается глобально(если хотите установить не глобальный вызов звука то пошарьтесь в Valve Api по этой ссылке)
А теперь код звука для убитого юнита
Lua:
function AddonGameMode:kill(data1)
    DeepPrintTable(data1)
    local entity = EntIndexToHScript(data1.entindex_killed):GetUnitName()
    print(entity)
    if entity == "НАЗВАНИЕ ВАШЕГО ЮНИТА" then
        EmitGlobalSound("НАВЗАНИЕ ВАШЕГО ЗВУКА")
    end
end
Вторая строчка помогает определить корректно ли работает слушатель, третья преобразовывает индекс убитого в название юнита, а четвертая его выводит в консоль, дабы вы смогли сверить. После чего условие при котором как и в прошлом примере вызывается ваш звук
ПРИМЕЧАНИЕ: Да, кому то это может показаться костылем, каждый раз писать условие для вызова звука, НО хочу отметить, что во многих старых исходниках от стандартных вольве скиллов не работают функции связанные с EmitSound
2. В исходном Lua коде для абилки можно указать ее звук
Lua:
AbilityName = class({})
function AbilityName:OnSpellStart()
    EmitGlobalSound("SoundName")
end
Не знаю по какой, но по какой то причине данная вариация кода не всегда работает для вольво или даже кастомных скиллов
3. Через (о нет) datadriven
Код:
"OnSpellStart"
    {
        "FireSound"
        {
            "EffectName"        "SoundName"
            "Target"             "CASTER"
        }
    }
Хоть datadriven и является вымирающим способом для создания кастомных скиллов по причине своей громоздкости и неудобности, но вызов звуков через него наиудобнейший: надежность и малое количество кода, да и не надо даже открывать Lua файлы
4. Собственно для чего и создавался данный гайд(OnAbilityPhaseStart), я обрыскал много гайдов и исходников в поисках этой функции и ничего не нашел, на Valve API особых надежд не было по причине большого количества устаревшего функционала там, что потом оказалось было зря. Вызов звука в начале подготовки каста абилки("AbilityCastPoint") как это реализовано в реквиеме сфа, эпицентре сенд кинга и в подобных им скиллах
1) Открываем исходный код Lua вашей абилки
2) Кодим функцию которая будет вызывать наш звук
Lua:
AbilityName = class({})
function AbilityName:OnAbilityPhaseStart()
    EmitGlobalSound("SoundName")
end
Как ни странно с этой функцией вызов звука в Lua коде работает исправно, но буквально в этом же скиле в функции OnSpellStart у меня не получилось вызвать звук))) Именно поэтому считаю, что вызов звука через слушателя всегда будет надёжнее
 
Последнее редактирование:
Реклама: