Кастомные звуковые эффекты для рун

SomeKindOfNoName

Пользователь
23 Июл 2018
12
1
3
Реакции
1 0 0
#1
Хочу сделать кастомные звуки для рун. Инфы особо нигде не нашел (возможно плохо искал, не отрицаю).

Я вообще нуб, но все же...
попытался реализовать через триггер. Написал какой-то кривой скрипт:

Код:
function runeeffect( event )
    local activator = event.activator
    
    if event.activator:HasModifier("modifier_rune_double_damage") then
        event.activator:EmitSound("кастомный_звук")
    elseif event.activator:HasModifier("modifier_rune_invisibility") then
        event.activator:EmitSound("кастомный_звук")
    elseif event.activator:HasModifier("modifier_rune_haste") then
        event.activator:EmitSound("кастомный_звук")
    elseif event.activator:HasModifier("modifier_rune_heal") then
        event.activator:EmitSound("кастомный_звук")
    end
end
Суть в том, что триггер находится на спавне рун, отслеживает модификаторы на герое и, если видит нужный, воспроизводит звук.
Но способ почему-то не работает.
В чем может быть ошибка? Кривой скрипт или названия модификаторов от рун имеют другие названия (нашел на github какой-то файл). Или есть еще способы изменения дефолтных рун?

P.S. В Object Properties все привязал, настроил (вроде как XD), Precache сделал
 

Pudgergun

Пользователь
30 Июн 2018
20
4
3
21
Реакции
4 0 0
#2
Попробуй через фильтр GameRules:GetGameModeEntity():SetExecuteOrderFilter(Dynamic_Wrap(GameMode, 'ExecuteOrderFilter'), self)

DOTA_UNIT_ORDER_PICKUP_RUNE
 

SomeKindOfNoName

Пользователь
23 Июл 2018
12
1
3
Реакции
1 0 0
#3
Попробуй через фильтр GameRules:GetGameModeEntity():SetExecuteOrderFilter(Dynamic_Wrap(GameMode, 'ExecuteOrderFilter'), self)

DOTA_UNIT_ORDER_PICKUP_RUNE
Я посмотрел гайды, и снова что-то накалякал...

В консоли вылетает ошибка:
Script Runtime Error: ...game\dota_addons\mc\scripts\vscripts\addon_game_mode.lua:64: attempt to call method 'GetAbilityName' (a nil value) stack traceback: ...game\dota_addons\mc\scripts\vscripts\addon_game_mode.lua:64: in function <...game\dota_addons\mc\scripts\vscripts\addon_game_mode.lua:55>

Вот строка:
Код:
local itemName = tostring(self:GetAbilityName())
Я просто не знаю, как получить имя руны, подходящих команд не нашел
 

Pudgergun

Пользователь
30 Июн 2018
20
4
3
21
Реакции
4 0 0
#4
Я не вижу весь код, поэтому не знаю что это за self, но у него нет функции GetAbilityName.
А вообще попробуй посмотреть что там вообще в этом DOTA_UNIT_ORDER_PICKUP_RUNE
function GameMode:ExecuteOrderFilter( keys )
DeepPrintTable( keys )
 

SomeKindOfNoName

Пользователь
23 Июл 2018
12
1
3
Реакции
1 0 0
#5
Я не вижу весь код, поэтому не знаю что это за self, но у него нет функции GetAbilityName.
А вообще попробуй посмотреть что там вообще в этом DOTA_UNIT_ORDER_PICKUP_RUNE
function GameMode:ExecuteOrderFilter( keys )
DeepPrintTable( keys )
Код:
function CAddonTemplateGameMode:FilterExecuteOrder(filterTable)
    local order = filterTable["order_type"]
    local units_table = filterTable["units"]
    local runeName1 = "item_rune_double_damage"
    local runeName2 = "item_rune_haste"
    local runeName3 = "item_rune_invisibility"
    local runeName4 = "item_rune_heal"
    for key, hero in pairs(units_table) do
        if order == DOTA_UNIT_ORDER_PICKUP_RUNE then
            local itemName = tostring(self:GetAbilityName())
            if itemName == runeName1 then
                CAddonTemplateGameMode:EmitSound("mc.quaddamage")
                return true
            elseif itemName == runeName2 then
                CAddonTemplateGameMode:EmitSound("mc.haste")
                return true
            elseif itemName == runeName3 then
                CAddonTemplateGameMode:EmitSound("mc.invisibility")
                return true
            elseif itemName == runeName4 then
                CAddonTemplateGameMode:EmitSound("mc.regeneration")
                return true
            else
                return nil
            end
        end
    end
    return true
end
После добавления
Код:
function CAddonTemplateGameMode:FilterExecuteOrder(filterTable)
    for k, v in pairs(filterTable) do
          print(k, v)
     end
     return true
end
ошибка в консоли больше не появляется, а таблица постоянно выдает различные значения, например:
entindex_ability 0
sequence_number_const 21
queue 0
units table: 0x001fb3b0
entindex_target 135
position_z 0
position_x 0
order_type 15
position_y 0
issuer_player_id_const 0
 
Реклама:

Pudgergun

Пользователь
30 Июн 2018
20
4
3
21
Реакции
4 0 0
#6
Может руна один из юнитов, или entindex_target
EntIndexToHScript(filterTable.entindex_target) попробуй или перебери filterTable["units"]
 

SomeKindOfNoName

Пользователь
23 Июл 2018
12
1
3
Реакции
1 0 0
#7
Может руна один из юнитов, или entindex_target
EntIndexToHScript(filterTable.entindex_target) попробуй или перебери filterTable["units"]
Не знаю, правильно ли все сделал, но значение units одинаково. entindex_ability тоже. А вот entindex_target постоянно возрастает.
Так должно быть?
В гайде нашел упоминание:
Код:
entindex_target --[[ Индекс цели способности или иного действия если таковая имеется ]]
И казалось бы, что тогда должно работать, но нет

deep
{
entindex_ability = 0 (number)
sequence_number_const = 10 (number)
queue = 0 (number)
units = table: 0x001cfcc0 (table)
{
0 = 142 (number)
}
entindex_target = 80 (number)
position_z = 0 (number)
position_x = 0 (number)
order_type = 15 (number)
position_y = 0 (number)
issuer_player_id_const = 0 (number)
}
Units
0 142
deep
{
entindex_ability = 0 (number)
sequence_number_const = 11 (number)
queue = 0 (number)
units = table: 0x001ca818 (table)
{
0 = 142 (number)
}
entindex_target = 81 (number)
position_z = 0 (number)
position_x = 0 (number)
order_type = 15 (number)
position_y = 0 (number)
issuer_player_id_const = 0 (number)
}
Units
0 142
deep
{
entindex_ability = 0 (number)
sequence_number_const = 12 (number)
queue = 0 (number)
units = table: 0x001cf720 (table)
{
0 = 142 (number)
}
entindex_target = 82 (number)
position_z = 0 (number)
position_x = 0 (number)
order_type = 15 (number)
position_y = 0 (number)
issuer_player_id_const = 0 (number)
}
Units
0 142
deep
{
entindex_ability = 0 (number)
sequence_number_const = 13 (number)
queue = 0 (number)
units = table: 0x001c7918 (table)
{
0 = 142 (number)
}
entindex_target = 85 (number)
position_z = 0 (number)
position_x = 0 (number)
order_type = 15 (number)
position_y = 0 (number)
issuer_player_id_const = 0 (number)
}
Units
0 142
deep
{
entindex_ability = 0 (number)
sequence_number_const = 14 (number)
queue = 0 (number)
units = table: 0x001cf720 (table)
{
0 = 142 (number)
}
entindex_target = 86 (number)
position_z = 0 (number)
position_x = 0 (number)
order_type = 15 (number)
position_y = 0 (number)
issuer_player_id_const = 0 (number)
}
Units
0 142
 

Pudgergun

Пользователь
30 Июн 2018
20
4
3
21
Реакции
4 0 0
#8
Попробуй
local rune = EntIndexToHScript(filterTable.entindex_target)
print(rune:GetName())
 
Реклама:

SomeKindOfNoName

Пользователь
23 Июл 2018
12
1
3
Реакции
1 0 0
#11
и ошибки нет?
попробуй:
GetClassname()
GetDebugName()
GetUnitName()
Прописал print() по всей функции.

values
unit
order

classname
dota_item_rune
debugName
dota_item_rune
checkruneno

Все блоки циклов и условий выполняются. Получают имя GetClassname() и GetDebugName(). Но также выполняется конечная часть условия else, которая запрещает брать руны (которые я пока не убрал из спавна). Но она же сейчас запрещает брать доступные руны.
 

SomeKindOfNoName

Пользователь
23 Июл 2018
12
1
3
Реакции
1 0 0
#14
Я все-таки эту задачу решил.
Если кому надо только добавить звук при взятии, то это, как оказалось, можно сделать через Listener.
Код:
ListenToGameEvent('dota_rune_activated_server', Dynamic_Wrap(GameMode, 'OnRuneActivated'), self) --Собственно Listener в InitGameMode

function GameMode:OnRuneActivated (keys)    --функция
      local player = PlayerResource:GetPlayer(keys.PlayerID)
      local rune = keys.rune
      local runeName1 = 0 --id рун
      local runeName2 = 1
      local runeName3 = 3
      local runeName4 = 4
      print(rune)    --Можете посмотреть в консоли для какой руны это id. Выводит при взятии, само собой
      if rune == runeName1 then
          player:EmitSound("customsound")
      elseif rune == runeName2 then
          player:EmitSound("customsound")
      elseif rune == runeName3 then
          player:EmitSound("customsound")
      elseif rune == runeName4 then
          player:EmitSound("customsound")
      end
end
 
20 Дек 2016
526
94
28
10
Проект
DI:LS
Реакции
94 0 0
#15
Попробуй через фильтр GameRules:GetGameModeEntity():SetExecuteOrderFilter(Dynamic_Wrap(GameMode, 'ExecuteOrderFilter'), self)

DOTA_UNIT_ORDER_PICKUP_RUNE
Задачи, связанные с игровыми событиями, не стоит пытаться решать ордерфильтром.
 
Реклама:
Реклама:
//SNOW CHRISTMAS