Насмешка/taunt. Можно ли её добавить?

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

Zek13f1

Активный
11 Июл 2019
101
3
Я бы хотел спросить, знает ли кто как можно дать персонажу насмешку? Если да, то как? Я думал, может через OnHeroInGame, но как её туда засунуть? моделей насмешки я не нашёл в тулзе и вообще без понятие. Помогите, кому не сложно
 
Насмешка в доте это анимация + допольнитый модифаер активити.
Вот примец для Chaos Knight
Код:
LinkLuaModifier("modifier_chaos_knight_taunt", "heroes/hero_tangin/iron_curtain", LUA_MODIFIER_MOTION_NONE)


chaos_knight_taunt = class({})

function chaos_knight_taunt:OnSpellStart()
    local caster = self:GetCaster()
    local duration = self:GetSpecialValueFor("duration")

    EmitSoundOn("chaos_knight_taunt", caster)
    caster:AddNewModifier(caster, self, "modifier_chaos_knight_taunt", {duration = duration})
    caster:StartGestureWithPlaybackRate(ACT_DOTA_TAUNT, 1)
end

modifier_chaos_knight_taunt = class({
    IsHidden                = function(self) return false end,
    IsPurgable              = function(self) return false end,
    IsDebuff                = function(self) return false end,
    IsBuff                  = function(self) return true end,
    RemoveOnDeath           = function(self) return false end,
    DeclareFunctions        = function(self) return
    {
        MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS,
    } end,
})

function modifier_chaos_knight_taunt:GetActivityTranslationModifiers()
    return "ck_gesture"
end
 
Насмешка в доте это анимация + допольнитый модифаер активити.
Вот примец для Chaos Knight
Код:
LinkLuaModifier("modifier_chaos_knight_taunt", "heroes/hero_tangin/iron_curtain", LUA_MODIFIER_MOTION_NONE)


chaos_knight_taunt = class({})

function chaos_knight_taunt:OnSpellStart()
    local caster = self:GetCaster()
    local duration = self:GetSpecialValueFor("duration")

    EmitSoundOn("chaos_knight_taunt", caster)
    caster:AddNewModifier(caster, self, "modifier_chaos_knight_taunt", {duration = duration})
    caster:StartGestureWithPlaybackRate(ACT_DOTA_TAUNT, 1)
end

modifier_chaos_knight_taunt = class({
    IsHidden                = function(self) return false end,
    IsPurgable              = function(self) return false end,
    IsDebuff                = function(self) return false end,
    IsBuff                  = function(self) return true end,
    RemoveOnDeath           = function(self) return false end,
    DeclareFunctions        = function(self) return
    {
        MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS,
    } end,
})

function modifier_chaos_knight_taunt:GetActivityTranslationModifiers()
    return "ck_gesture"
end
Спасибо большое, а подскажи, пожалуйста, где это писать? Мне показалось, или нужно сначала скил написать, который будет работать от этого луа?
 
Сделай сначала как скил, нажимаешь и он проигрывается.
Когда поймешь принцип работы, то можешь оформить в виде чистого модифаера просто накидывая его
 
Сделай сначала как скил, нажимаешь и он проигрывается.
Когда поймешь принцип работы, то можешь оформить в виде чистого модифаера просто накидывая его
Если не сложно, напиши, пожалуйста, один любой готовый пример, я сам смогу его разобрать. Просто сейчас пытался сам это написать, ничего не работает. Очень тебя прошу помочь
 
Делаешь модификатор скрытый даешь его герою которому надо дать насмешку
В модификаторе у тебя главное это анимация ACT_DOTA_TAUNT и EmitSoundOn звук насмешки
Он также определяет функцию "GetActivityTranslationModifiers", которая возвращает строку "ck_gesture". Это позволяет использовать насмешки на героях Chaos Knight.
Конечно! Вот пример кода для добавления насмешки для героя Tinker:

LinkLuaModifier("modifier_tinker_taunt", "heroes/hero_tangin/iron_curtain", LUA_MODIFIER_MOTION_NONE)

tinker_taunt = class({})

function tinker_taunt:OnSpellStart()
local caster = self:GetCaster()
local duration = self:GetSpecialValueFor("duration")

EmitSoundOn("tinker_taunt", caster)
caster:AddNewModifier(caster, self, "modifier_tinker_taunt", {duration = duration})
caster:StartGestureWithPlaybackRate(ACT_DOTA_TAUNT, 1)
end

modifier_tinker_taunt = class({
IsHidden = function(self) return false end,
IsPurgable = function(self) return false end,
IsDebuff = function(self) return false end,
IsBuff = function(self) return true end,
RemoveOnDeath = function(self) return false end,
DeclareFunctions = function(self) return
{
MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS,
} end,
})

function modifier_tinker_taunt:GetActivityTranslationModifiers()
return "tinker_gesture"
end

В этом коде мы создаем новый класс "tinker_taunt" для нашей насмешки Tinker. Он имеет те же функции, что и класс "chaos_knight_taunt", но с звуком "tinker_taunt" и строкой "tinker_gesture" для насмешки Tinker.

Чтобы использовать эту насмешку в кастомной игре, вы должны добавить этот код в файл с описанием героя Tinker в вашем проекте Dota 2. Затем вы можете использовать эту насмешку, активируя способность "tinker_taunt" для героя Tinker.
 
Делаешь модификатор скрытый даешь его герою которому надо дать насмешку
В модификаторе у тебя главное это анимация ACT_DOTA_TAUNT и EmitSoundOn звук насмешки
Он также определяет функцию "GetActivityTranslationModifiers", которая возвращает строку "ck_gesture". Это позволяет использовать насмешки на героях Chaos Knight.
Конечно! Вот пример кода для добавления насмешки для героя Tinker:

LinkLuaModifier("modifier_tinker_taunt", "heroes/hero_tangin/iron_curtain", LUA_MODIFIER_MOTION_NONE)

tinker_taunt = class({})

function tinker_taunt:OnSpellStart()
local caster = self:GetCaster()
local duration = self:GetSpecialValueFor("duration")

EmitSoundOn("tinker_taunt", caster)
caster:AddNewModifier(caster, self, "modifier_tinker_taunt", {duration = duration})
caster:StartGestureWithPlaybackRate(ACT_DOTA_TAUNT, 1)
end

modifier_tinker_taunt = class({
IsHidden = function(self) return false end,
IsPurgable = function(self) return false end,
IsDebuff = function(self) return false end,
IsBuff = function(self) return true end,
RemoveOnDeath = function(self) return false end,
DeclareFunctions = function(self) return
{
MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS,
} end,
})

function modifier_tinker_taunt:GetActivityTranslationModifiers()
return "tinker_gesture"
end

В этом коде мы создаем новый класс "tinker_taunt" для нашей насмешки Tinker. Он имеет те же функции, что и класс "chaos_knight_taunt", но с звуком "tinker_taunt" и строкой "tinker_gesture" для насмешки Tinker.

Чтобы использовать эту насмешку в кастомной игре, вы должны добавить этот код в файл с описанием героя Tinker в вашем проекте Dota 2. Затем вы можете использовать эту насмешку, активируя способность "tinker_taunt" для героя Tinker.
Чтобы использовать эту насмешку в кастомной игре, вы должны добавить этот код в файл с описанием героя Tinker в вашем проекте Dota 2. Имеется ввиду npc_heroes файл?
 
Чтобы использовать эту насмешку в кастомной игре, вы должны добавить этот код в файл с описанием героя Tinker в вашем проекте Dota 2. Имеется ввиду npc_heroes файл?
Человек, как ты выдаешь способности блять героям - насмешка это скрытая способность-модификатор зачем у меня спрашивать - как выдать способность
2 пути
1) через txt
2) через lua при спавне определенного героя

2 - более эффективный и не затратный по времени
 
Человек, как ты выдаешь способности блять героям - насмешка это скрытая способность-модификатор зачем у меня спрашивать - как выдать способность
2 пути
1) через txt
2) через lua при спавне определенного героя

2 - более эффективный и не затратный по времени
Мне 2 способ тоже больше нравится. Если не сложно, подскажи, пожалуйста, как это сделать
 
Добавляем слушатель если его нет в InitGameMode()
Lua:
-- Привязываем функцию к событию появления героя
ListenToGameEvent("npc_spawned", OnHeroSpawned, nil)

Выдаем при спавне герою который указан, так же через кучу if добавляешь других героев чтобы они независимо работали друг от друга
Lua:
function OnHeroSpawned(keys)
local hero = EntIndexToHScript(keys.entindex)
print("Сущность заспавнилась в мире")
-- Проверяем, является ли герой Bloodseeker
if hero:GetUnitName() == "npc_dota_hero_bloodseeker" then
    print(hero:GetUnitName() .. " заспавнился в мире")
  -- Ищем + подключаем без npc_abilities_custom.txt - lua модификатор
  LinkLuaModifier("modifier_bloodseeker_taunt", "heroes/hero_bloodseeker/bloodseeker_taunt", LUA_MODIFIER_MOTION_NONE)
  print("Нашли модификатор его насмешки")
  -- Выдаем скрытый модификатор герою
  hero:AddNewModifier(hero, nil, "modifier_bloodseeker_taunt", {})
  print("Выдали модификатор его насмешки")
end
end
npc_dota_hero_bloodseeker - наименование героя
modifier_bloodseeker_taunt - наименование модификатора
LinkLuaModifier("modifier_bloodseeker_taunt", "heroes/hero_bloodseeker/bloodseeker_taunt", LUA_MODIFIER_MOTION_NONE) - путь до lua

Lua:
LinkLuaModifier("modifier_bloodseeker_taunt", "heroes/hero_bloodseeker/bloodseeker_taunt", LUA_MODIFIER_MOTION_NONE)

bloodseeker_taunt = class({})

function bloodseeker_taunt:OnSpellStart()
    local caster = self:GetCaster()
    local duration = self:GetSpecialValueFor("duration")

    EmitSoundOn("bloodseeker_taunt", caster)
    caster:AddNewModifier(caster, self, "modifier_bloodseeker_taunt", {duration = duration})
    caster:StartGestureWithPlaybackRate(ACT_DOTA_TAUNT, 1)
end

modifier_bloodseeker_taunt = class({
    IsHidden = function(self) return true end,
    IsPurgable = function(self) return false end,
    IsDebuff = function(self) return false end,
    IsBuff = function(self) return true end,
    RemoveOnDeath = function(self) return false end,
    DeclareFunctions = function(self) return
    {
        MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS,
    } end,
})

function modifier_bloodseeker_taunt:GetActivityTranslationModifiers()
    return "bloodseeker_gesture"
end

В коде приведен пример, как без npc_abilities_custom.txt выдавать lua модификаторы
 
Лайфхак что-бы не засирать OnHeroSpawned(keys)
Lua:
function OnHeroSpawned(keys)
 local hero = EntIndexToHScript(keys.entindex)
 print("Сущность заспавнилась в мире")
 local taunts = require("taunts")(hero)
end

Создаем файл taunts.lua

Lua:
return function(hero)
-- Проверка героя
 if hero:GetUnitName() == "npc_dota_hero_bloodseeker" then
    print(hero:GetUnitName() .. " заспавнился в мире")
  -- Ищем + подключаем без txt - lua модификатор
  LinkLuaModifier("modifier_bloodseeker_taunt", "heroes/hero_bloodseeker/bloodseeker_taunt", LUA_MODIFIER_MOTION_NONE)
  print("Нашли модификатор его насмешки")
  -- Выдаем скрытый модификатор герою
  hero:AddNewModifier(hero, nil, "modifier_bloodseeker_taunt", {})
  print("Выдали модификатор его насмешки")
 end
-- Сюда другие if
end
 
Только я одно не вкуриваю до сих пор, у меня есть насмешка на блудсикере и она установлена, код что есть что его нет она все равно работает
Ща я посмотрю конечно на ЦК, ибо его у меня нет в тестовой карте
 
Как отдельную абилку хуй с ним это работает, ща надо подумать , как читать нажатие кнопки насмешки и вызывать OnSpellStart()
 
Хуй знает в общем я не нашел инфы которая отслеживает нажатие ебучей насмешки в доте - именно кнопка указанная в настройках 1691660836195.png

Отдельным спелом - работает ибо вызывается OnSpellStart(), а как её линкануть к кнопке насмешки уж соре моего опыта и способностей недостаточно
Ибо даже через отлов приказов https://customgames.ru/forum/threads/Гайд-barebones-Отлов-приказов.178/
DOTA_UNIT_ORDER_TAUNT = 22, я не могу увидеть действие - что при нажатии - как у меня выставлена 0, что-то происходило в консоли
 
Хуй знает в общем я не нашел инфы которая отслеживает нажатие ебучей насмешки в доте - именно кнопка указанная в настройках Посмотреть вложение 1962

Отдельным спелом - работает ибо вызывается OnSpellStart(), а как её линкануть к кнопке насмешки уж соре моего опыта и способностей недостаточно
Ибо даже через отлов приказов https://customgames.ru/forum/threads/Гайд-barebones-Отлов-приказов.178/
DOTA_UNIT_ORDER_TAUNT = 22, я не могу увидеть действие - что при нажатии - как у меня выставлена 0, что-то происходило в консоли
В общем я хотел, чтобы насмешка проигрывалась сама, при убийстве героя и сделал вот так просто 1691671864490.png вот и, что оно не работает по моей задумки
 
В общем я хотел, чтобы насмешка проигрывалась сама, при убийстве героя и сделал вот так просто Посмотреть вложение 1963 вот и, что оно не работает по моей задумки
Потому-что надо накладывать модификатор при спавне, а OnSpellStart() в модификаторе воспроизводить при убийстве
 
Слушатели в InitGameMode()
ListenToGameEvent("entity_killed", OnEntityKilled, nil)
ListenToGameEvent("npc_spawned", OnHeroSpawned, nil)


Lua:
LinkLuaModifier("modifier_chaos_knight_taunt", "heroes/hero_chaos_knight/chaos_knight_taunt", LUA_MODIFIER_MOTION_NONE)

chaos_knight_taunt = class({})

modifier_chaos_knight_taunt = class({
    IsHidden                = function(self) return true end,
    IsPurgable              = function(self) return false end,
    IsDebuff                = function(self) return false end,
    IsBuff                  = function(self) return true end,
    RemoveOnDeath           = function(self) return false end,
    DeclareFunctions        = function(self) return
    {
        MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS,
    } end,
})

function modifier_chaos_knight_taunt:GetActivityTranslationModifiers()
    return "ck_gesture"
end

Lua:
function OnHeroSpawned(keys)
local hero = EntIndexToHScript(keys.entindex)
print("Сущность заспавнилась в мире")
local taunts = require("taunts")(hero)
end
taunts.lua
Lua:
return function(hero)

    if hero:GetUnitName() == "npc_dota_hero_chaos_knight" then
        print(hero:GetUnitName() .. " заспавнился в мире")
        -- Ищем + подключаем без txt - lua модификатор
        LinkLuaModifier("modifier_chaos_knight_taunt", "heroes/hero_chaos_knight/chaos_knight_taunt", LUA_MODIFIER_MOTION_NONE)
        print("Нашли модификатор его насмешки")
        -- Выдаем скрытый модификатор герою
        hero:AddNewModifier(hero, nil, "modifier_chaos_knight_taunt", {})
        print("Выдали модификатор его насмешки")
    end

end

Lua:
-- Обработчик события убийств
function OnEntityKilled(event)
    local killedUnit = EntIndexToHScript(event.entindex_killed)
    local killerEntity = nil

    if event.entindex_attacker then
        killerEntity = EntIndexToHScript(event.entindex_attacker)
    end

    if killedUnit:IsRealHero() and (killedUnit:IsOwnedByAnyPlayer() or not killedUnit:IsOwnedByAnyPlayer()) then
        -- Герой был убит
        local killers_taunts = require("killers_taunts")(killerEntity)
      
    end
end
killers_taunts.lua
Lua:
return function(killerEntity)

    if  killerEntity:GetUnitName() == "npc_dota_hero_chaos_knight" then
        EmitSoundOn("chaos_knight_taunt", killerEntity)        
        killerEntity:StartGestureWithPlaybackRate(ACT_DOTA_TAUNT, 1)
    end

end
 
Последнее редактирование:
Код работает, проверил в обе стороны, убил героем - героя бота, сработала насмешка, убил героем бота - своего героя у него сработала насмешка
1691677817557.png
1691677833198.png
1691677904177.png
 
Только есть одно но, если иллюзия убивает, а не сам персонаж игрока, то не сработает, для этого нужно модифицировать код
 
Реклама: