CustomGames.ru - Dota 2 пользовательские игры

Как создать через скрипт функцию создания существа?

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Danis

  • Продвинутый
  • 278
  • Мощь: 2
Как создать существо через скрипт с кастомными характеристиками как у форжей инвока,только без функции сдыхания через время.
Пытался сделать но не очень получилось
Код
local caster = keys.caster
local ability = keys.ability
local TowerBuff = "modifier_tinker_tower_summon"
local player = caster:GetPlayerOwnerID()
local tower_hp = ability:GetSpecialValueFor("tower_hp", ability:GetLevel()-1)
local tower_mana = ability:GetSpecialValueFor("tower_mana", ability:GetLevel()-1)
local tower_armor = ability:GetSpecialValueFor("tower_armor", ability:GetLevel()-1)
local tower_dmg = ability:GetSpecialValueFor("tower_dmg", ability:GetLevel()-1)
local tower_bat = ability:GetSpecialValueFor("tower_bat", ability:GetLevel()-1)
local tower_atk_speed = ability:GetSpecialValueFor("bonus_atk_speed", ability:GetLevel()-1)

if TowerLevel >= 1 and TowerLevel <= 14 then
local Tower = CreateUnitByName("tinker_tower", TowerLevel, keys.target_points[1], false, keys.caster, keys.caster, keys.caster:GetTeam())
Tower:SetControllableByPlayer(keys.caster:GetPlayerID(), true)
Tower:SetOwner(keys.caster)
Tower:SetBaseMaxHealth(tower_hp)
Tower:SetMana(tower_mana)

--Display particle effects for Venomancer as well as the plague ward.
local Tower_cast_particle = ParticleManager:CreateParticle("particles/units/heroes/hero_venomancer/venomancer_ward_cast.vpcf", PATTACH_ABSORIGIN, keys.caster)
local Tower_spawn_particle = ParticleManager:CreateParticle("particles/units/heroes/hero_venomancer/venomancer_ward_spawn.vpcf", PATTACH_ABSORIGIN, plague_ward_unit)

Tower:ApplyDataDrivenModifier(Tower, ability, "modifier_tinker_tower_summon", {})
end
В игре ошибку не пишет но юнит просто не спавнится.
Создай Героя
Мод  - steamcommunity.com/...ils/?id=750146414
[свернуть]

Оффлайн ZLOY

  • Супермодератор
  • 452
  • Мощь: 6
ability:GetSpecialValueFor принимает 1 аргумент

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
ability:GetLevelSpecialValueFor("reduce_percent", ability:GetLevel() - 1)
ability:GetSpecialValueFor("reduce_percent")

Оффлайн ZLOY

  • Супермодератор
  • 452
  • Мощь: 6
ability:GetLevelSpecialValueFor("reduce_percent", ability:GetLevel() - 1)
Как-будто в 2014 побывал

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
Как-будто в 2014 побывал
offtop
олдфааааааааааааааааааааааааг :D
[свернуть]

Оффлайн ZLOY

  • Супермодератор
  • 452
  • Мощь: 6
Ну суть в той что сейчас юзать такую конструкцию бессмысленно

Оффлайн Danis

  • Продвинутый
  • 278
  • Мощь: 2
убрал level и проверку лвла юнита но не работает так же, и ошибку не выдает.
P.S. прекаш модельки юнита сделал
Создай Героя
Мод  - steamcommunity.com/...ils/?id=750146414
[свернуть]

Оффлайн Илья

  • Супермодератор
  • 2133
  • Мощь: 21
Понапроверяй принтами места, где проходит компилятор, и где нет.

Оффлайн Илья

  • Супермодератор
  • 2133
  • Мощь: 21
И чет я не вижу у тебя определения переменной "TowerLevel".

Оффлайн Danis

  • Продвинутый
  • 278
  • Мощь: 2
теперь функция вызывается только оно не может определить:
Спойлер
Код
[ W VScript              ]: Script Runtime Error: ...est01\scripts\vscripts\abilities\tinker_tower_summon.lua:34: attempt to index local 'tower_unit' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]: ...est01\scripts\vscripts\abilities\tinker_tower_summon.lua:34: in function <...est01\scripts\vscripts\abilities\tinker_tower_summon.lua:1>
[свернуть]
И вот код того что оно не может определить:
Спойлер
Код
local tower_unit = CreateUnitByName("tinker_" .. tinker_tower_level .. "_tower", keys.target_points[1], false, keys.caster, keys.caster, keys.caster:GetTeamNumber())
tower_unit:SetControllableByPlayer(keys.caster:GetPlayerID(), true)
tower_unit:SetOwner(keys.caster)
tower_unit:SetBaseMaxHealth(tower_hp)
tower_unit:SetMana(tower_mana)
[свернуть]
Создай Героя
Мод  - steamcommunity.com/...ils/?id=750146414
[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
теперь функция вызывается только оно не может определить:
Спойлер
Код
[ W VScript              ]: Script Runtime Error: ...est01\scripts\vscripts\abilities\tinker_tower_summon.lua:34: attempt to index local 'tower_unit' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]: ...est01\scripts\vscripts\abilities\tinker_tower_summon.lua:34: in function <...est01\scripts\vscripts\abilities\tinker_tower_summon.lua:1>
[свернуть]
И вот код того что оно не может определить:
Спойлер
Код
local tower_unit = CreateUnitByName("tinker_" .. tinker_tower_level .. "_tower", keys.target_points[1], false, keys.caster, keys.caster, keys.caster:GetTeamNumber())
tower_unit:SetControllableByPlayer(keys.caster:GetPlayerID(), true)
tower_unit:SetOwner(keys.caster)
tower_unit:SetBaseMaxHealth(tower_hp)
tower_unit:SetMana(tower_mana)
[свернуть]
Потому что время на создания юнита >> времени выполнения следующей строки

Оффлайн ZLOY

  • Супермодератор
  • 452
  • Мощь: 6
Потому что время на создания юнита >> времени выполнения следующей строки
Бред
Большинство функций из АПИ синхронные и CreateUnitByName не исключение

Оффлайн ZLOY

  • Супермодератор
  • 452
  • Мощь: 6
Ты уверен что юнит с именем "tinker_" .. tinker_tower_level .. "_tower" вообще существует в kv-файле?

Оффлайн Илья

  • Супермодератор
  • 2133
  • Мощь: 21
Наскольк я помню, подобное склеивание не срабатывает в обе стороны:

Код
"tinker_" .. tinker_tower_level .. "_tower"

И синтаксис луа немного другой. Проверь это.

Оффлайн I_GRIN_I

  • Продвинутый
  • 616
  • Мощь: 11
  • Научиться бы скриптить...
Почему просто не создать в кв файле несколбко юнитов и не призывать их в зависимости от уровня? И попробуй призывать юнитов через датадрайвен. Еще посмотри в лиа, как у тимбера реализован завод.