Итак, сейчас расскажу как застанить всех героев до начала игры и как добавить им в инвентарь предмет (-ы).
Для начала, в функции инициализации аддона (MyAddon:InitGameMode к примеру) создадим таблицу heroes, она, естественно, будет пока пустой:
self.heroes = {}
Также нам понадобится событие npc_spawned, создадим функцию:
function MyAddon:OnNPCSpawned( keys )
local unit = EntIndexToHScript( keys.entindex ) -- Преобразуем числовое значение в таблицу
if unit:IsRealHero() then -- Проверяем, герой ли это
local item = CreateItem("item_blink", unit, unit) -- Создадим предмет с названием "item_blink" и делаем юнита владельцем
unit:AddItem(item) -- Добавляем созданный выше предмет в инвентарь герою
table.insert(self.heroes, unit) -- Добавляем героя в таблицу
end
end
Прослушаем это событие:
ListenToGameEvent('npc_spawned', Dynamic_Wrap(MyAddon, 'OnNPCSpawned'), self)
В функции MyAddon:Think пишем:
if GameRules:State_Get() <= DOTA_GAMERULES_STATE_PRE_GAME then -- Проверяем состояние игры, если это подготовка к игре или раньше, то продолжаем
for k,v in pairs(self.heroes) do -- Выполняем итерацию по заданной выше таблице
if not v:HasModifier("modifier_stunned") then -- Проверяем, нет ли уже у героя модификатора
v:AddNewModifier(v, nil, "modifier_stunned", {}) -- Если нет, то добавляем ему этот модификатор
end
end
elseif GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then -- Если игра уже началась
for k,v in pairs(self.heroes) do -- Итерируем таблицу снова
if v:HasModifier("modifier_stunned") then -- Проверям, имеет ли герой модификатор
v:RemoveModifierByName("modifier_stunned") -- Если имеет, то удаляем его
end
end
elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
return nil
end
return 1
И не забываем в функции инициализации аддона написать следующее:
GameMode:SetContextThink( "MyAddon:Think", function() return self:Think() end, 0.25 ) -- 0.25 - время между каждым вызовом функции (в секундах)
Весь код: http://pastebin.com/rQQURSpj
Или, на всякий случай, под споилером
if MyAddon == nil then
MyAddon = class({})
end
function Precache( context )
end
function Activate()
GameRules.AddonTemplate = MyAddon()
GameRules.AddonTemplate:InitGameMode()
end
function MyAddon:InitGameMode()
local GameMode = GameRules:GetGameModeEntity()
GameMode:SetContextThink( "MyAddon:OnThink", function() return self:Think() end, 0.25 )
ListenToGameEvent('npc_spawned', Dynamic_Wrap(MyAddon, 'OnNPCSpawn'), self)
self.heroes = {}
end
function MyAddon:OnNPCSpawn( keys )
local unit = EntIndexToHScript(keys.entindex)
print("PLAYER OWNER ID: ", unit:GetPlayerOwnerID())
print("PLAYER OWNER: ", unit:GetOwner())
print("UNIT INDEX: ", keys.entindex)
print("UNIT HSCRIPT: ", unit)
if unit:IsRealHero() then
local item = CreateItem("item_blink", unit, unit)
print("ITEM CREATED: ", item)
unit:AddItem(item)
print("ITEM ADDED TO INVENTORY")
table.insert(self.heroes, unit)
end
end
function MyAddon:Think()
if GameRules:State_Get() <= DOTA_GAMERULES_STATE_PRE_GAME then
for k,v in pairs(self.heroes) do
if not v:HasModifier("modifier_stunned") then
v:AddNewModifier(v, nil, "modifier_stunned", {})
end
end
elseif GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
for k,v in pairs(self.heroes) do
if v:HasModifier("modifier_stunned") then
v:RemoveModifierByName("modifier_stunned")
end
end
elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
return nil
end
return 1
end