Хроносфера на луа

EYEOFLIE

Активный
28 Янв 2018
137
4
Собственно решил переписать хроносферу войда, с использованием по большей части луа на примере дота имба.

Вопрос почему при активации, скилл не создает хроносферу, и что за ошибка в консоли, т.к если закомментить 28-ю строку (AddFOWViewer) то ошибки нет, но и скилл так-же не работает.
Код LUA: chronosphere_datadriven_new.lua
chronosphere_datadriven_new = class({})

LinkLuaModifier("chronosphere_datadriven_new_aura", "hero/chronosphere_datadriven_new.lua", LUA_MODIFIER_MOTION_NONE) Handle applier
LinkLuaModifier("chronosphere_datadriven_new_handler", "hero/chronosphere_datadriven_new.lua", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("chronosphere_datadriven_new_caster_buff", "hero/chronosphere_datadriven_new.lua", LUA_MODIFIER_MOTION_NONE)

function chronosphere_datadriven_new:GetCooldown(nLevel)
if self:GetCaster():HasScepter() then
return self:GetSpecialValueFor( "cooldown_scepter" )
end
return self.BaseClass.GetCooldown( self, nLevel )
end

function chronosphere_datadriven_new:GetAOERadius()
return self:GetSpecialValueFor( "radius" )
end

function chronosphere_datadriven_new:OnSpellStart()
local caster = self:GetCaster()
local ability = self
local chrono_center = self:GetAbsOrigin()
local duration = self:GetSpecialValueFor( "duration" )
local vision_radius = self:GetSpecialValueFor("vision_radius")
local radius = self:GetSpecialValueFor("radius")
if caster:HasScepter() then
return self:GetSpecialValueFor( "duration_scepter" )
end

AddFOWViewer(caster:GetTeamNumber(), chrono_center, vision_radius, radius, duration, false)

local mod = CreateModifierThinker(caster, ability, "chronosphere_datadriven_new_aura",
{duration = duration}, chrono_center, vision_radius, caster:GetTeamNumber(), false)
end

modifier_chronosphere_datadriven_new_aura = class({})

function modifier_chronosphere_datadriven_new_aura:IsPurgable() return false end
function modifier_chronosphere_datadriven_new_aura:IsHidden() return true end
function modifier_chronosphere_datadriven_new_aura:IsAura() return true end

function modifier_chronosphere_datadriven_new_aura:GetAuraSearchTeam()
return DOTA_UNIT_TARGET_TEAM_BOTH
end

function modifier_chronosphere_datadriven_new_aura:GetAuraSearchFlags()
return DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE
end

function modifier_chronosphere_datadriven_new_aura:GetAuraSearchType()
return DOTA_UNIT_TARGET_CREEP + DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BUILDING + DOTA_UNIT_TARGET_OTHER
end

function modifier_chronosphere_datadriven_new_aura:GetModifierAura()
return "modifier_chronosphere_datadriven_new_handler"
end

function modifier_chronosphere_datadriven_new_aura:GetAuraRadius()
return self.radius
end

function modifier_chronosphere_datadriven_new_aura:OnCreated()
if IsServer() then
self.caster = self:GetCaster()
self.ability = self:GetAbility()
self.parent = self:GetParent()
self.radius = self.ability:GetSpecialValueFor("radius")

local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_faceless_void/faceless_void_chronosphere.vpcf", PATTACH_WORLDORIGIN, self.parent)
ParticleManager:SetParticleControl(particle, 0, self.parent:GetAbsOrigin())
ParticleManager:SetParticleControl(particle, 1, Vector(self.radius, self.radius, self.radius))
self:AddParticle(particle, false, false, -1, false, false)

Timers:CreateTimer(FrameTime(), function()
if self:GetStackCount() > 0 then
self:StartIntervalThink(0.1)
self.modifiers = {}
end
end)
end
end

function modifier_chronosphere_datadriven_new_aura:OnRemoved()
if IsServer() then
if self.modifiers then
for _,mod in pairs(self.modifiers) do
if not mod:IsNull() then mod:Destroy() end
end
end
end
end

function modifier_chronosphere_datadriven_new_aura:OnIntervalThink()
local radius = self:GetAuraRadius()
local caster = self:GetCaster()
-- Find the caster and unit under their control under the Chronosphere, and give them the attack speed bonus modifier
local units = FindUnitsInRadius(caster:GetTeamNumber(), self:GetParent():GetAbsOrigin(), nil, radius, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_ANY_ORDER, false)
for _,unit in ipairs(units) do
if unit == caster or unit:GetPlayerOwner() == caster:GetPlayerOwner() then
if not self.modifiers[unit:GetEntityIndex()] then
local mod = unit:AddNewModifier(caster, self:GetAbility(), "modifier_chronosphere_datadriven_new_caster_buff", {})
table.insert(self.modifiers, unit:GetEntityIndex(),mod)
end
end
end

-- Iterate through the units belonging to the caster and see if they're inside the Chronosphere. If not, remove the modifier.
local parent = self:GetParent()
for id,mod in pairs(self.modifiers) do
local unit = EntIndexToHScript(id)
if CalcDistanceBetweenEntityOBB(parent, unit) > self:GetAuraRadius() then
if not mod:IsNull() then mod:Destroy() end
self.modifiers[id] = nil -- table.remove(self.modifiers, id) didn't work
end
end
end

modifier_chronosphere_datadriven_new_handler = class({})
function modifier_chronosphere_datadriven_new_handler:IsHidden() return true end
function modifier_chronosphere_datadriven_new_handler:IsPurgable() return false end

function modifier_chronosphere_datadriven_new_handler:IsDebuff()
if self:GetStackCount() == 1 or self:GetStackCount() == 4 then
return false end
return true
end

function modifier_chronosphere_datadriven_new_handler:OnCreated()
if IsServer() then
self.parent = self:GetParent()
self.caster = self:GetCaster()

if self.parent == self.caster or self.parent:GetPlayerOwner() == self.caster:GetPlayerOwner() then
self:SetStackCount(0)
end
self:StartIntervalThink(FrameTime())
end
end

function modifier_chronosphere_datadriven_new_handler:OnIntervalThink()
if IsServer() then

-- Normal frozen enemy gets interrupted all the time
if self:GetStackCount() == 0 then

-- Make certain people are stunned
self.parent:AddNewModifier(self.caster, self:GetAbility(), "modifier_stunned", {duration = FrameTime()})


self.parent:InterruptMotionControllers(true)


local modifiers = self.parent:FindAllModifiers()
for _,modifier in pairs(modifiers) do
if modifier.IsMotionController then
if modifier:IsMotionController() then
modifier:Destroy()
end
end
end
end
end
end
function modifier_chronosphere_datadriven_new_handler:DeclareFunctions()
local funcs ={ MODIFIER_EVENT_ON_ORDER,
MODIFIER_PROPERTY_MOVESPEED_MAX,
}

return funcs
end

function modifier_chronosphere_datadriven_new_handler:CheckState()
local stacks = self:GetStackCount()
local state = {}

if stacks == 0 then
if self:GetParent():HasModifier("modifier_slark_shadow_dance") then
state = {[MODIFIER_STATE_STUNNED] = true,
[MODIFIER_STATE_FROZEN] = true}
end

state = { [MODIFIER_STATE_FROZEN] = true,
[MODIFIER_STATE_ROOTED] = true,
[MODIFIER_STATE_STUNNED] = true,
[MODIFIER_STATE_SILENCED] = true,
[MODIFIER_STATE_INVISIBLE] = false,}
elseif stacks == 1 or stacks == 4 then
state = { [MODIFIER_STATE_NO_UNIT_COLLISION] = true,
[MODIFIER_STATE_FLYING_FOR_PATHING_PURPOSES_ONLY] = true, }
end
return state
end

function modifier_chronosphere_datadriven_new_handler:GetPriority()
if self:GetStackCount() == 0 then
return MODIFIER_PRIORITY_HIGH end
end

function modifier_chronosphere_datadriven_new_handler:GetModifierMoveSpeed_Max()
if self:GetStackCount() == 0 or self:GetStackCount() == 0 then
return self:GetAbility():GetSpecialValueFor("movement_speed") end
end

modifier_chronosphere_datadriven_new_caster_buff = class({})
function modifier_chronosphere_datadriven_new_caster_buff:IsPurgable() return false end
function modifier_chronosphere_datadriven_new_caster_buff:IsHidden() return false end
function modifier_chronosphere_datadriven_new_caster_buff:IsDebuff() return false end

function modifier_chronosphere_datadriven_new_caster_buff:GetEffectName()
return "particles/units/heroes/hero_faceless_void/faceless_void_chrono_speed.vpcf"
end

function modifier_chronosphere_datadriven_new_caster_buff:GetEffectAttachType()
return PATTACH_ABSORIGIN_FOLLOW
end


Код ошибки из консоли:
[ W VScript ]: Script Runtime Error: ...p1\scripts\vscripts\hero\chronosphere_datadriven_new.lua:29: AddFOWViewer called with 6 arguments - expected 5
[ W VScript ]: stack traceback:
[ W VScript ]: [C]: in function 'AddFOWViewer'
[ W VScript ]: ...p1\scripts\vscripts\hero\chronosphere_datadriven_new.lua:29: in function <...p1\scripts\vscripts\hero\chronosphere_datadriven_new.lua:18>
 

EYEOFLIE

Активный
28 Янв 2018
137
4
Что ты хочешь сделать ?
Создать хроно, я же вроде описал, по логике, создать партикль, создать ауру задав ей функции стана, заморозки, и ну в общем хроно...., попробывал и то что вышло из рук выше под спойлером.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Тебе пишет, что AddFOWViewer вызван с 6-ю параметрами, а ожидается пять.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
А почему при комментировании строчки с AddFOWViewer скилл вдруг перестает работать хрен знает. Абилка не прозрачно написана, кода много, читать в данный момент времени нет и лень. Может позже почитаю, если меня не опередят. Но в любом случае - скинь код и подключаемых модификаторов, и код в кв файле, и код, где герою абилку задаешь.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
М, модификаторы там есть, вижу. Тогда ток место, гед используешь абилку и кв её.
 

EYEOFLIE

Активный
28 Янв 2018
137
4
А почему при комментировании строчки с AddFOWViewer скилл вдруг перестает работать хрен знает. Абилка не прозрачно написана, кода много, читать в данный момент времени нет и лень. Может позже почитаю, если меня не опередят. Но в любом случае - скинь код и подключаемых модификаторов, и код в кв файле, и код, где герою абилку задаешь.
Он и без этого не работает, просто при активации способности она уходит на кд, ничего не происходит, но если строка AddFOWViewer есть, то всё тоже самое но выводит ошибку, что ошибка в этой строке, приложил консось же
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Он и без этого не работает, просто при активации способности она уходит на кд, ничего не происходит, но если строка AddFOWViewer есть, то всё тоже самое но выводит ошибку, что ошибка в этой строке, приложил консось же

Яж тебе уже ответил по поводу ошибки....
 

EYEOFLIE

Активный
28 Янв 2018
137
4
М, модификаторы там есть, вижу. Тогда ток место, гед используешь абилку и кв её.
Вот:
Из custom abilities
"chronosphere_datadriven_new"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "ability_lua"
"ScriptFile" "hero/chronosphere_datadriven_new.lua"
//"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_ALL"
"AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"FightRecapLevel" "2"
"AbilityTextureName" "faceless_void_chronosphere"

"HasScepterUpgrade" "1"
// Precache
//-------------------------------------------------------------------------------------------------------------
"precache"
{
"soundfile" "soundevents/game_sounds_heroes/game_sounds_faceless_void.vsndevts"
"particle" "particles/status_fx/status_effect_faceless_chronosphere.vpcf"
"particle" "particles/units/heroes/hero_faceless_void/faceless_void_chronosphere.vpcf"
"particle" "particles/units/heroes/hero_faceless_void/faceless_void_chrono_speed.vpcf"
}

// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "600"
"AbilityCastPoint" "0.35"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"AbilityCooldown" "140.0 125.0 110.0"
"AbilityManaCost" "150 225 300"
"MaxLevel" "3"

"HasScepterUpgrade" "1"


// Special
//-------------------------------------------------------------------------------------------------------------
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_FLOAT"
"duration" "4 4.5 5"
}
"02"
{
"var_type" "FIELD_INTEGER"
"radius" "425"
}
"03"
{
"var_type" "FIELD_FLOAT"
"cooldown_scepter" "60"
}
"04"
{
"var_type" "FIELD_FLOAT"
"duration_scepter" "10.0 11.0 12.0"
}
"05"
{
"var_type" "FIELD_INTEGER"
"vision_radius" "500"
}
"06"
{
"var_type" "FIELD_FLOAT"
"aura_interval" "0.1"
}
"07"
{
"var_type" "FIELD_INTEGER"
"movement_speed" "1000"
}
}
}
 

EYEOFLIE

Активный
28 Янв 2018
137
4
Яж тебе уже ответил по поводу ошибки....
Сорян не заметил, ну по коду ошибки я тоже понял что это параметры, суть в том что параметр vision_radius никак не воспринимает, тоесть сам код не поддерживает больше 5 параметров что-ли...
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Ошибку с AddFOWViewer исправь и отпишись о результатах. Ну а так: может стоит попробовать самому с нуля написать хроно? А то ответы могут затянутся, исходя из объема кода.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Сорян не заметил, ну по коду ошибки я тоже понял что это параметры, суть в том что параметр vision_radius никак не воспринимает, тоесть сам код не поддерживает больше 5 параметров что-ли...

Ты похоже не понял ошибку: тебе говорят, что нужно не 6 прааметров, а 5.

Вот они:
void AddFOWViewer(int int_1, Vector Vector_2, float float_3, float float_4, bool bool_5)


Почаще заглядывай сюда.
 

EYEOFLIE

Активный
28 Янв 2018
137
4
Ошибку с AddFOWViewer исправь и отпишись о результатах. Ну а так: может стоит попробовать
AddFOWViewer - Исправил
CreateModifierThinker - Исправил (Появилась после исправления Предыдущей)
Ошибок не выдает но и хроно нет...
 

Илья

Друзья CG
25 Сен 2015
2,348
41
А что есть?
Ты код в блок code оформляешь, или ток в спойлеры?
 

EYEOFLIE

Активный
28 Янв 2018
137
4
А что есть?
Ты код в блок code оформляешь, или ток в спойлеры?

Код:
Заметил что при активации появляются непонятные цифры белым и красным шрифтом в месте применения, изменяющиеся при изменении положения персонажа на карте
[/code
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Какая-то ерись, надо код разбирать.

Если на форуме нарушено отображение синтаксиса в блоке code, то скинь тогда код через ссылку на https://hastebin.com/.
Ну или скринами, или если ничего не менял - ссылку на источник.
 

EYEOFLIE

Активный
28 Янв 2018
137
4
А что есть?
Ты код в блок code оформляешь, или ток в спойлеры?
Какая-то ерись, надо код разбирать.

Если на форуме нарушено отображение синтаксиса в блоке code, то скинь тогда код через ссылку на https://hastebin.com/.
Ну или скринами, или если ничего не менял - ссылку на источник.
Я еще раз попробую переписать, может что получится, если что скину в блоке code
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Я еще раз попробую переписать, может что получится, если что скину в блоке code

Да в случае, если ошибок не пишет, но не работает и лень разбираться, сделал бы свою хроно. От этого гораздо больше пользы, чем если ты разберешься в чужом коде. А ты вроде из тех ребят, что готов учиться.

Сделал бы абилку, что кастуется на точку.
Затем добавил бы ей АОЕ радиус.
Затем добавил бы отлов юнитов, что попали в радиус (ну там в консоль имена их выводил, допустим)
Затем добавил бы навешивание на юнитов модификатор какой и т.д.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Вот кстати заморозка: MODIFIER_STATE_FROZEN .

А этот код далеко не идеальный.
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Вообще какаято жепа, а не код лол. Хроно пишется на луа, с использованием таймеров очень легко, лучше перепиши, чем это вот оставлять
 
Реклама: