Урок Слушатели / Listeners . Я слежу за тобой .

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
"Слушатель это как смотритель маяка , который следит за всем , что происходит в бушующем море ..."
© Маяковский

Слушатели это обработчики событий.
Эти самые обработчики прислушиваются к какому-то определенному событию , и когда событие происходит , то выполняется функция , которую вы задали в слушателе.

Функция отвечающая за инициализацию слушателя - ListenToGameEvent(string1, handle1, handle2)
string1 - название события
handle1 - вызываемая функция
handle2 - класс в котором вызывается функция
Большинство нужных слушателей вы можете найти в barebones.lua , если он у вас подключен.
Весь список названий для событий слушателей находится тут
Код:
ListenToGameEvent('dota_player_gained_level', Dynamic_Wrap(GameMode, 'OnPlayerLevelUp'), GameMode) // Получение уровня
    ListenToGameEvent('dota_ability_channel_finished', Dynamic_Wrap(GameMode, 'OnAbilityChannelFinished'), GameMode) // Конец каста способности
    ListenToGameEvent('dota_player_learned_ability', Dynamic_Wrap(GameMode, 'OnPlayerLearnedAbility'), GameMode) // Изучение способности
    ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), GameMode) // Убийства любого юнита
    ListenToGameEvent('player_connect_full', Dynamic_Wrap(GameMode, 'OnConnectFull'), GameMode) // Подключение игрока
    ListenToGameEvent('player_disconnect', Dynamic_Wrap(GameMode, 'OnDisconnect'), GameMode) // Отключении игрока
    ListenToGameEvent('dota_item_purchased', Dynamic_Wrap(GameMode, 'OnItemPurchased'), GameMode) // Покупка предмета
    ListenToGameEvent('dota_item_picked_up', Dynamic_Wrap(GameMode, 'OnItemPickedUp'), GameMode) // Взять предмет
    ListenToGameEvent('last_hit', Dynamic_Wrap(GameMode, 'OnLastHit'), GameMode) // Добивание юнита
    ListenToGameEvent('dota_non_player_used_ability', Dynamic_Wrap(GameMode, 'OnNonPlayerUsedAbility'), GameMode) // Не игрок использовал способность
    ListenToGameEvent('player_changename', Dynamic_Wrap(GameMode, 'OnPlayerChangedName'), GameMode) // Игрок сменил имя
    ListenToGameEvent('dota_rune_activated_server', Dynamic_Wrap(GameMode, 'OnRuneActivated'), GameMode) // Взять руну
    ListenToGameEvent('dota_player_take_tower_damage', Dynamic_Wrap(GameMode, 'OnPlayerTakeTowerDamage'), GameMode) // Получение урона от башни
    ListenToGameEvent('tree_cut', Dynamic_Wrap(GameMode, 'OnTreeCut'), GameMode) // Дерево срублено
    ListenToGameEvent('entity_hurt', Dynamic_Wrap(GameMode, 'OnEntityHurt'), GameMode) // Получение урона
    ListenToGameEvent('player_connect', Dynamic_Wrap(GameMode, 'PlayerConnect'), GameMode) // Подключение
    ListenToGameEvent('dota_player_used_ability', Dynamic_Wrap(GameMode, 'OnAbilityUsed'), GameMode) // Использлвание способности
    ListenToGameEvent('game_rules_state_change', Dynamic_Wrap(GameMode, 'OnGameRulesStateChange'), GameMode) // Стадия игры
    ListenToGameEvent('npc_spawned', Dynamic_Wrap(GameMode, 'OnNPCSpawned'), GameMode) // Спаун любого юнита
    ListenToGameEvent('dota_player_pick_hero', Dynamic_Wrap(GameMode, 'OnPlayerPickHero'), GameMode) // Герой был пикнут
    ListenToGameEvent('dota_team_kill_credit', Dynamic_Wrap(GameMode, 'OnTeamKillCredit'), GameMode) // Изменение счетчика убийств ?
    ListenToGameEvent("player_reconnected", Dynamic_Wrap(GameMode, 'OnPlayerReconnect'), GameMode) // Переподключение
Приведу пример слушателей для двух событий.
1)Когда игра начнется ( 0:00 на таймере ) , то выведется сообщение в чат "Внимание игра началась !!! ".
2)Когда юнит умирает , то на его месте появляется треант ( аналог способности ульта Фуриона с Аганимом ).
Код:
    ListenToGameEvent('game_rules_state_change', Dynamic_Wrap(GameMode, 'OnGameRulesStateChange'), GameMode)
    ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), GameMode)
Код:
function GameMode:OnGameRulesStateChange(keys)
    local newState = GameRules:State_Get()
   
    if newState == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
        Say(nil,"Внимание игра началась !!!", false)
    end
end
Код:
function GameMode:OnEntityKilled( keys )
    local killedUnit = EntIndexToHScript( keys.entindex_killed )
    local team= killedUnit:GetTeam()
    local unit_position = killedUnit:GetAbsOrigin()
    if killedUnit:IsRealHero() then local unit = CreateUnitByName("npc_dota_furion_treant_large", unit_position + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) end
     else local unit = CreateUnitByName("npc_dota_furion_treant", unit_position + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team) end
   
end
Поздравляю ,теперь ты прокачан 8)
 
Последнее редактирование:
  • Нравится
Реакции: .F.R.I.D.
Реклама: