- 29 Окт 2018
- 5
- 0
- Проект
- дефенс-фармилочка
Новичок, сам пока не очень скриптю, пытаюсь собрать скилл как конструктор, что-то беру с разных скиллов, небольшая задумка: Blade Fury работает как переключаемый скилл(с этим я справился), и пока скилл работает, тратится мана, последнее не особо получилось, выдает ошибку. Вроде как крутится, мана тратится, но дамага с крутилки нет и выдает ошибку.
Lua:
modifier_juggernaut_blade_fury_lua = class({})
--------------------------------------------------------------------------------
-- Classifications
function modifier_juggernaut_blade_fury_lua:IsHidden()
return false
end
function modifier_juggernaut_blade_fury_lua:IsDebuff()
return false
end
function modifier_juggernaut_blade_fury_lua:IsPurgable()
return false
end
function modifier_juggernaut_blade_fury_lua:DestroyOnExpire()
return false
end
--------------------------------------------------------------------------------
-- Initializations
function modifier_juggernaut_blade_fury_lua:OnCreated( kv )
-- references
self.tick = self:GetAbility():GetSpecialValueFor( "blade_fury_damage_tick" )
self.radius = self:GetAbility():GetSpecialValueFor( "blade_fury_radius" )
self.dps = self:GetAbility():GetSpecialValueFor( "blade_fury_damage" )
self.manacost = self:GetAbility():GetSpecialValueFor( "mana_cost_per_second" )
local interval = 1
self.count = 0
-- Start interval
self:StartIntervalThink( interval )
if IsServer() then
-- precache damagetable
self.damageTable = {
-- victim = target,
attacker = self:GetParent(),
damage = self.dps * self.tick,
damage_type = DAMAGE_TYPE_MAGICAL,
ability = self:GetAbility(), --Optional.
}
self:StartIntervalThink( self.tick )
end
-- PlayEffects
self:PlayEffects()
end
function modifier_juggernaut_blade_fury_lua:OnRefresh( kv )
-- references
self.tick = self:GetAbility():GetSpecialValueFor( "blade_fury_damage_tick" )
self.radius = self:GetAbility():GetSpecialValueFor( "blade_fury_radius" )
self.dps = self:GetAbility():GetSpecialValueFor( "blade_fury_damage" )
self.manacost = self:GetAbility():GetSpecialValueFor( "mana_cost_per_second" )
self.count = 0
if IsServer() then
self.damageTable.damage = self.dps * self.tick
end
end
function modifier_juggernaut_blade_fury_lua:OnDestroy( kv )
-- Stop effects
local sound_cast = "Hero_Juggernaut.BladeFuryStart"
StopSoundOn( sound_cast, self:GetParent() )
end
--------------------------------------------------------------------------------
-- Modifier Effects
function modifier_juggernaut_blade_fury_lua:DeclareFunctions()
local funcs = {
MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_PHYSICAL,
}
return funcs
end
function modifier_juggernaut_blade_fury_lua:GetModifierProcAttack_BonusDamage_Physical( params )
return -params.damage
end
--------------------------------------------------------------------------------
-- Status Effects
function modifier_juggernaut_blade_fury_lua:CheckState()
local state = {
[MODIFIER_STATE_MAGIC_IMMUNE] = true
}
return state
end
--------------------------------------------------------------------------------
-- Interval Effects
function modifier_juggernaut_blade_fury_lua:OnIntervalThink()
-- Find enemies in radius
local enemies = FindUnitsInRadius(
self:GetCaster():GetTeamNumber(), -- int, your team number
self:GetParent():GetOrigin(), -- point, center point
nil, -- handle, cacheUnit. (not known)
self.radius, -- float, radius. or use FIND_UNITS_EVERYWHERE
DOTA_UNIT_TARGET_TEAM_ENEMY, -- int, team filter
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, -- int, type filter
0, -- int, flag filter
0, -- int, order filter
false -- bool, can grow cache
)
-- damage enemies
for _,enemy in pairs(enemies) do
self.damageTable.victim = enemy
ApplyDamage( self.damageTable )
-- Play effects
self:PlayEffects2( enemy )
end
-- counter
end
--------------------------------------------------------------------------------
-- Graphics & Animations
function modifier_juggernaut_blade_fury_lua:PlayEffects()
-- Get Resources
local particle_cast = "particles/units/heroes/hero_juggernaut/juggernaut_blade_fury.vpcf"
local sound_cast = "Hero_Juggernaut.BladeFuryStart"
-- Create Particle
local effect_cast = ParticleManager:CreateParticle( particle_cast, PATTACH_ABSORIGIN_FOLLOW, self:GetParent() )
ParticleManager:SetParticleControl( effect_cast, 5, Vector( self.radius, 0, 0 ) )
-- buff particle
self:AddParticle(
effect_cast,
false,
false,
-1,
false,
false
)
-- Emit sound
EmitSoundOn( sound_cast, self:GetParent() )
end
function modifier_juggernaut_blade_fury_lua:PlayEffects2( target )
local particle_cast = "particles/units/heroes/hero_juggernaut/juggernaut_blade_fury_tgt.vpcf"
local effect_cast = ParticleManager:CreateParticle( particle_cast, PATTACH_ABSORIGIN_FOLLOW, target )
ParticleManager:ReleaseParticleIndex( effect_cast )
end
--------------------------------------------------------------------------------
function modifier_juggernaut_blade_fury_lua:OnIntervalThink()
-- check mana
local mana = self:GetParent():GetMana()
if mana < self.manacost then
-- turn off
if self:GetAbility():GetToggleState() then
self:GetAbility():ToggleAbility()
end
return
end
-- damage
self:Burn()
end
function modifier_juggernaut_blade_fury_lua:Burn()
-- spend mana
self:GetParent():SpendMana( self.manacost, self:GetAbility() )
end
Lua:
"juggernaut_blade_fury_lua"
{
// Ability Technical Aspect
// base script folder : scripts/vscripts
// base texture folder : resource/flash3/images/spellicons
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "ability_lua"
"ScriptFile" "lua_abilities/juggernaut_blade_fury_lua/juggernaut_blade_fury_lua"
"AbilityTextureName" "custom/blade_fury_icon"
"FightRecapLevel" "1"
"MaxLevel" "6"
"precache"
{
"soundfile" "soundevents/game_sounds_heroes/game_sounds_juggernaut.vsndevts"
"particle" "particles/units/heroes/hero_juggernaut/juggernaut_blade_fury.vpcf"
"particle" "particles/units/heroes/hero_juggernaut/juggernaut_blade_fury_tgt.vpcf"
}
// Ability General
//-------------------------------------------------------------------------------------------------------------
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_TOGGLE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
// Ability Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "250"
// Ability Resource
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "0"
"AbilityManaCost" "0"
// Damage
//-------------------------------------------------------------------------------------------------------------
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_FLOAT"
"blade_fury_damage_tick" "0.1"
}
"02"
{
"var_type" "FIELD_INTEGER"
"blade_fury_radius" "200 300 400 550 750 1000"
}
"03"
{
"var_type" "FIELD_INTEGER"
"blade_fury_damage" "100 150 200 250 300 350"
}
"04"
{
"var_type" "FIELD_INTEGER"
"mana_cost_per_second" "2"
}
}
}
