Хочу сделать так, чтобы когда умирает крип, то с него падала вещь с некоторым шансом.
Рано такое делать значит. Читай гайды: http://dota2.ru/forum/threads/gajd-po-scripting-chast-2.602694/ там ссылка на первую часть.Извини, но я не знаю, что с этим делать.
local killedEntity = EntIndexToHScript(event.entindex_killed)
function OnEntityKilled (event)
local killedEntity = EntIndexToHScript(event.entindex_killed)
if killedEntity:GetUnitName() == "cow" then
CreateDrop("item_flask", killedEntity:GetAbsOrigin())
end
end
блин я не понимаю я пытаюсь это использовать но оно не работает при этом никаких ошибок в консоли нетВсе, разобрался. Нашел где-то на просторах инета такой вот метод GetUnitName().
Кому интересно, вот в итоге код обработчика:
Код:function OnEntityKilled (event) local killedEntity = EntIndexToHScript(event.entindex_killed) if killedEntity:GetUnitName() == "cow" then CreateDrop("item_flask", killedEntity:GetAbsOrigin()) end end
А ты зарегистрировал слушаетеля, прежде чем назначить на него функцию? Вот эта строчка должна быть внутри InitGameModeблин я не понимаю я пытаюсь это использовать но оно не работает при этом никаких ошибок в консоли нет
ещё я что-то в api доты не нашёл функцию CreateDrop, используй вместо неё DropItemAtPosition(killedEntity:GetAbsOrigin(), item)блин я не понимаю я пытаюсь это использовать но оно не работает при этом никаких ошибок в консоли нет
всё равно не помогло вроде всё без ошибок записалещё я что-то в api доты не нашёл функцию CreateDrop, используй вместо неё DropItemAtPosition(killedEntity:GetAbsOrigin(), item)
Надо чтобы у убитого юнита был в инвентаре нужный предмет, и собственно item=killedEntity:FindItemInInventory("item_flask")
if nestle == nil then
nestle = class({})
end
-- Create the game mode when we activate
function Activate()
nestle:InitGameMode()
end
function nestle:InitGameMode()
print( "Template addon is loaded." )
GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
GameRules:SetGoldTickTime(1)
GameRules:SetGoldPerTick(2)
GameRules:SetStartingGold(1500)
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 3)
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 3)
GameRules:GetGameModeEntity():SetFreeCourierModeEnabled(true)
GameRules:IsHeroRespawnEnabled(30)
GameRules:SetCreepSpawningEnabled(true)
GameRules:SetSafeToLeave(true)
GameRules:GetGameModeEntity():SetThink("OnThink", self, 1)
GameRules:SetUseUniversalShopMode(true)
ListenToGameEvent('entity_killed', 'OnEntityKilled', nestle)
end
-- Evaluate the state of the game
function nestle:OnThink()
if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
--print( "Template addon script is running." )
elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
return nil
end
return 1
end
function nestle:OnThink()
if GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
return nil
elseif GameRules:State_Get() ~= DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
return 1
end
for _, hero in pairs(HeroList:GetAllHeroes()) do
self:onThinkHero(hero)
end
return 1
end
function nestle:onThinkHero(hero)
local team = hero:GetTeamNumber()
hero:AddExperience(10, DOTA_ModifyXP_Unspecified, false, true)
end
function nestle:OnEntityKilled( data )
local killedEntity = EntIndexToHScript( data.entindex_killed )
item = killedEntity:FindItemInInventory("item_dagon_6")
if killedEntity:GetUnitName() == "npc_dota_neutral_ice_shaman" then
DropItemAtPosition(killedEntity:GetAbsOrigin(), item)
end
end
Когда ошибка находится в функции InitGameMode или в любой другой, которая вызывается при запуске кастомки, сообщение об ошибке в консоли улетает далеко вверхвсё равно не помогло вроде всё без ошибок записал
Код:if nestle == nil then nestle = class({}) end -- Create the game mode when we activate function Activate() nestle:InitGameMode() end function nestle:InitGameMode() print( "Template addon is loaded." ) GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 ) GameRules:SetGoldTickTime(1) GameRules:SetGoldPerTick(2) GameRules:SetStartingGold(1500) GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 3) GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 3) GameRules:GetGameModeEntity():SetFreeCourierModeEnabled(true) GameRules:IsHeroRespawnEnabled(30) GameRules:SetCreepSpawningEnabled(true) GameRules:SetSafeToLeave(true) GameRules:GetGameModeEntity():SetThink("OnThink", self, 1) GameRules:SetUseUniversalShopMode(true) ListenToGameEvent('entity_killed', 'OnEntityKilled', nestle) end -- Evaluate the state of the game function nestle:OnThink() if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then --print( "Template addon script is running." ) elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then return nil end return 1 end function nestle:OnThink() if GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then return nil elseif GameRules:State_Get() ~= DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then return 1 end for _, hero in pairs(HeroList:GetAllHeroes()) do self:onThinkHero(hero) end return 1 end function nestle:onThinkHero(hero) local team = hero:GetTeamNumber() hero:AddExperience(10, DOTA_ModifyXP_Unspecified, false, true) end function nestle:OnEntityKilled( data ) local killedEntity = EntIndexToHScript( data.entindex_killed ) item = killedEntity:FindItemInInventory("item_dagon_6") if killedEntity:GetUnitName() == "npc_dota_neutral_ice_shaman" then DropItemAtPosition(killedEntity:GetAbsOrigin(), item) end end
всё равно не работает я посмотрел в консоли мне выводит ошибку на 7 и 8 строчкуКогда ошибка находится в функции InitGameMode или в любой другой, которая вызывается при запуске кастомки, сообщение об ошибке в консоли улетает далеко вверх
В твоём коде ошибка скорее всего в регистрации слушателя, в старых гайдах описан нерабочий формат ListenToGameEvent('entity_killed', 'OnEntityKilled', nestle), сейчас нужно так
ListenToGameEvent( "entity_killed", Dynamic_Wrap(nestle, "OnEntityKilled" ), self )
В функции Activate у тебя должно быть 2 строчки:всё равно не работает я посмотрел в консоли мне выводит ошибку на 7 и 8 строчку
function Activate()
nestle:InitGameMode()
и на GameRules:IsHeroRespawnEnabled(30) (типо 2 аргумента должно быть) но предмет всё равно не выпадает
теперь выдаёт ошыбку на саму функцию вызываемую слушателем и на DropItemAtPosition(killedEntity:GetAbsOrigin(), item)В функции Activate у тебя должно быть 2 строчки:
GameRules.AddonTemplate = nestle()
GameRules.AddonTemplate:InitGameMode()
Если в функции InitGameMode будет ошибка, то последующие строчки после неё не будут исполняться. Такой уж язык - lua. У тебя проблема в том, что ты даёшь аргумент, который не требуется. Конкретно строка IsHeroRespawnEnabled() не способна установить какой-то геймрул, она возвращает true false - включён ли в игре респавн героев. Возможно тебе подойдёт SetFixedRespawnTime(fixedRespawnTime: float)
Покопался в шаблоне Виталика, можешь сделать тактеперь выдаёт ошыбку на саму функцию вызываемую слушателем и на DropItemAtPosition(killedEntity:GetAbsOrigin(), item)
function nestle:OnEntityKilled( data )
local killedEntity = EntIndexToHScript( data.entindex_killed )
item = killedEntity:FindItemInInventory("item_dagon_6")
if killedEntity:GetUnitName() == "npc_dota_neutral_ice_shaman" then
DropItemAtPosition(killedEntity:GetAbsOrigin(), item)
end
end
Прото вставить это заместо DropItemAtPosition(killedEntity:GetAbsOrigin(), item)?Покопался в шаблоне Виталика, можешь сделать так
local newItem = CreateItem( "item_dagon_6", nil, nil )
local drop = CreateItemOnPositionForLaunch( killedEntity:GetAbsOrigin(), newItem )