Не могу получить контроль над юнитом (на форуме искал, нащёл похожее, не помогло)

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

TRex

Пользователь
8 Авг 2018
38
0
Есть предмет который ставит башню, он ставит башню и я спокойно получаю контроль над башней.
1534869350433.png
У башни есть скилл грейдануть башню, тоже работает
1534869435839.png

1534869547444.png
но контроль над этой башней я уже не имею, потому что не могу прожать её скилл

-- Константу пишем тут, чтобы была на виду
PLACED_BUILDING_RADIUS = 80;
function placeBuilding(keys) -- Для предмета
local caster = keys.caster
-- Нам потребуется несколько переменных, они должны быть понятны
blocking_counter = 0
attempt_place_location = keys.target_points[1]
-- Как же сложно! В основном, эта строка находит все объекты внутри PLACED_BUILDING_RADIUS от того, где мы хотим поставить башню
-- Цикл для подсчета
for _,thing in pairs(Entities:FindAllInSphere(GetGroundPosition(attempt_place_location, nil), PLACED_BUILDING_RADIUS) ) do
blocking_counter = blocking_counter + 1
end
print(blocking_counter .. " blockers")

-- Если есть объекты, которые мешают размещению башни, тогда не строим здесь, иначе - размещаем
if( blocking_counter < 1) then
local tower = CreateUnitByName("npc_dota_tower_lvl1", keys.target_points[1], true, nil, nil,caster:GetPlayerOwner():GetTeam() )

Timers:CreateTimer(0.1, function()

tower:SetControllableByPlayer(caster:GetPlayerID(), true)
tower:SetOwner(caster)
return nil
end)
else
local item = CreateItem("item_place_tower", caster, caster)
caster:AddItem(item)
end
--local item = CreateItem("item_clarity", hero, hero)
--hero:AddItem(item)
end

function replaceTower(keys) -- Для способности "Улучшить башню"
local caster = keys.caster
local origin = caster:GetAbsOrigin()
local owner = caster:GetPlayerOwner()
if caster:GetUnitName() == "npc_dota_tower_lvl1" then towerz = "towerlvl2" end
if caster:GetUnitName() == "towerlvl2" then towerz = "towerlvl3" end
local towerB = towerz
caster:AddNewModifier(caster, nil, "modifier_kill", {duration = 0.03})
Timers:CreateTimer(0.035, function()
local tower2 = CreateUnitByName(towerB, origin, true, nil, nil,caster:GetPlayerOwner():GetTeam() )
return nil
end)
Timers:CreateTimer(0.5, function()
tower2:SetControllableByPlayer(owner:GetPlayerID(), true)
tower2:SetOwner(owner)
return nil
end)


end
 
Есть предмет который ставит башню, он ставит башню и я спокойно получаю контроль над башней.
У башни есть скилл грейдануть башню, тоже работает
но контроль над этой башней я уже не имею, потому что не могу прожать её скилл

-- Константу пишем тут, чтобы была на виду
PLACED_BUILDING_RADIUS = 80;
function placeBuilding(keys) -- Для предмета
local caster = keys.caster
-- Нам потребуется несколько переменных, они должны быть понятны
blocking_counter = 0
attempt_place_location = keys.target_points[1]
-- Как же сложно! В основном, эта строка находит все объекты внутри PLACED_BUILDING_RADIUS от того, где мы хотим поставить башню
-- Цикл для подсчета
for _,thing in pairs(Entities:FindAllInSphere(GetGroundPosition(attempt_place_location, nil), PLACED_BUILDING_RADIUS) ) do
blocking_counter = blocking_counter + 1
end
print(blocking_counter .. " blockers")

-- Если есть объекты, которые мешают размещению башни, тогда не строим здесь, иначе - размещаем
if( blocking_counter < 1) then
local tower = CreateUnitByName("npc_dota_tower_lvl1", keys.target_points[1], true, nil, nil,caster:GetPlayerOwner():GetTeam() )

Timers:CreateTimer(0.1, function()

tower:SetControllableByPlayer(caster:GetPlayerID(), true)
tower:SetOwner(caster)
return nil
end)
else
local item = CreateItem("item_place_tower", caster, caster)
caster:AddItem(item)
end
--local item = CreateItem("item_clarity", hero, hero)
--hero:AddItem(item)
end

function replaceTower(keys) -- Для способности "Улучшить башню"
local caster = keys.caster
local origin = caster:GetAbsOrigin()
local owner = caster:GetPlayerOwner()
if caster:GetUnitName() == "npc_dota_tower_lvl1" then towerz = "towerlvl2" end
if caster:GetUnitName() == "towerlvl2" then towerz = "towerlvl3" end
local towerB = towerz
caster:AddNewModifier(caster, nil, "modifier_kill", {duration = 0.03})
Timers:CreateTimer(0.035, function()
local tower2 = CreateUnitByName(towerB, origin, true, nil, nil,caster:GetPlayerOwner():GetTeam() )
return nil
end)
Timers:CreateTimer(0.5, function()
tower2:SetControllableByPlayer(owner:GetPlayerID(), true)
tower2:SetOwner(owner)
return nil
end)


end
Во второй функции,создаёшь башню,а контроль для героя не прописываешь вот и ошибка
 
Картинки здесь ни к чему, тут нужно смотреть код предмета создания башни и её грейда и сравнивать какие функции были использованы для того, чтобы дать контроль игроку.
Странно, что : tower2:SetControllableByPlayer(owner:GetPlayerID(), true) не сработало. Надо перепроверять код.
 
Картинки здесь ни к чему, тут нужно смотреть код предмета создания башни и её грейда и сравнивать какие функции были использованы для того, чтобы дать контроль игроку.
Странно, что : tower2:SetControllableByPlayer(owner:GetPlayerID(), true) не сработало. Надо перепроверять код.
ну сверху код предмета в коде а снизу для способности
 
сначала было без таймеров и вообще фигня терь хотяб на половину работает
Бывает, когда фиксишь одно - ломаешь другое. Чекай что происходит при выдаче контроля от абилки,по кускам.
 
Убери таймеры и все заработает.
Область видимости переменной мешает, потому что ты создаешь переменную в одном таймере, и пытаешься использовать в другом. (А там её уже нет)

ПС: когда тестишь, очень помогает функция print, которая выводит переменные в консоль.
И script_reload, советую научиться пользоваться. Крайне полезная штука, позволяет перезагрузить скрипты не загружая проект по новой.
 
Зачем ты добавляешь предмет снова? Если это для теста, то ладно.
Если же предмет с такой механикой, то сделай его перманентным, без зарядов.
 
Зачем ты добавляешь предмет снова? Если это для теста, то ладно.
Если же предмет с такой механикой, то сделай его перманентным, без зарядов.
если поставить башню там где стоит препятствие то она просто исчезает, поэтому добавляю обратно
 
Реклама: