local suika_model_scale_table = { [1] = 0.5, [2] = 0.7, [3] = 0.8, [4] = 1.0, [5] = 1.2, [6] = 2.0, [7] = 3.0, } local suika_count_table = { [1] = 7, [2] = 3, [3] = 1, [4] = 0, [5] = 0, [6] = 0, [7] = 0, } local suika_damage_increase = { [1] = 0.125, [2] = 0.25, [3] = 0.5, [4] = 1, [5] = 2, [6] = 4, [7] = 8, } local suika_damage_chance = { [1] = 50, [2] = 50, [3] = 50, [4] = 50, [5] = 25, [6] = 12.5, [7] = 6.25, } local suika_damage_radius = { [1] = 200, [2] = 200, [3] = 200, [4] = 400, [5] = 600, [6] = 800, [7] = 1000, } function OnSuika01SpellStartUp(keys) local caster = EntIndexToHScript(keys.caster_entindex) if caster.thtd_suika_01_scale == nil then caster.thtd_suika_01_scale = 4 end if caster.thtd_suika_01_scale > 1 then caster.thtd_suika_01_scale = caster.thtd_suika_01_scale - 1 caster:SetModelScale(suika_model_scale_table[caster.thtd_suika_01_scale]) RemoveAllSuikaTinySuika(keys) SuikaCreateTinySuika(keys) end end function OnSuika01SpellStartDown(keys) local caster = EntIndexToHScript(keys.caster_entindex) if caster.thtd_suika_01_scale == nil then caster.thtd_suika_01_scale = 4 end if caster.thtd_suika_01_scale < 7 then caster.thtd_suika_01_scale = caster.thtd_suika_01_scale + 1 caster:SetModelScale(suika_model_scale_table[caster.thtd_suika_01_scale]) RemoveAllSuikaTinySuika(keys) SuikaCreateTinySuika(keys) end end function RemoveAllSuikaTinySuika(keys) local caster = EntIndexToHScript(keys.caster_entindex) if caster.thtd_suika_01_tiny_suika_table == nil then caster.thtd_suika_01_tiny_suika_table = {} end for k,v in pairs(caster.thtd_suika_01_tiny_suika_table) do if v~=nil and v:IsNull() == false and v:IsAlive() then v:AddNoDraw() v:ForceKill(true) end end caster.thtd_suika_01_tiny_suika_table = {} end function SuikaCreateTinySuika(keys) local caster = EntIndexToHScript(keys.caster_entindex) local count = suika_count_table[caster.thtd_suika_01_scale] if caster.thtd_suika_01_tiny_suika_table == nil then caster.thtd_suika_01_tiny_suika_table = {} end local particle = ParticleManager:CreateParticle("particles/heroes/thtd_suika/ability_suika_01_smoke.vpcf",PATTACH_CUSTOMORIGIN,caster) ParticleManager:SetParticleControl(particle,0,caster:GetOrigin()) ParticleManager:SetParticleControl(particle,1,Vector(100,100,100)) ParticleManager:DestroyParticleSystem(particle,false) for i=1,count do local offset = 100 local rad = math.pi/2 if i > 3 then offset = 200 rad = rad - math.pi/4 - 3*math.pi/2 end local tinySuika = CreateUnitByName( "tiny_suika", caster:GetOrigin() + Vector(math.cos(rad*(i+1)),math.sin(rad*(i+1)),0)*offset, false, caster:GetOwner(), caster:GetOwner(), caster:GetTeam() ) tinySuika.thtd_spawn_unit_owner = caster local suikaAbility01 = caster:FindAbilityByName("thtd_suika_01") if suikaAbility01~=nil then suikaAbility01:ApplyDataDrivenModifier(caster, tinySuika, "passive_suika_01_attack_landed", nil) end keys.ability:ApplyDataDrivenModifier(caster, tinySuika, "modifier_suika_02_illusion", nil) tinySuika:SetControllableByPlayer(caster:GetPlayerOwnerID(), true) tinySuika:SetBaseDamageMax(caster:THTD_GetAttack()) tinySuika:SetBaseDamageMin(caster:THTD_GetAttack()) tinySuika:SetModelScale(suika_model_scale_table[caster.thtd_suika_01_scale]) tinySuika:SetForwardVector(caster:GetForwardVector()) table.insert(caster.thtd_suika_01_tiny_suika_table,tinySuika) local particle = ParticleManager:CreateParticle("particles/heroes/thtd_suika/ability_suika_01_smoke.vpcf",PATTACH_CUSTOMORIGIN,tinySuika) ParticleManager:SetParticleControl(particle,0,tinySuika:GetOrigin()) ParticleManager:SetParticleControl(particle,1,Vector(100,100,100)) ParticleManager:DestroyParticleSystem(particle,false) end end function OnSuika01AttackLanded(keys) local caster = EntIndexToHScript(keys.caster_entindex) local target = keys.target if caster:GetUnitName() == "tiny_suika" then caster = caster.thtd_spawn_unit_owner end if caster.thtd_suika_01_scale == nil then caster.thtd_suika_01_scale = 4 end if RandomInt(1,100) < suika_damage_chance[caster.thtd_suika_01_scale] then local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),suika_damage_radius[caster.thtd_suika_01_scale]) local damage = caster:THTD_GetAbilityPowerDamage(keys.ability)*suika_damage_increase[caster.thtd_suika_01_scale] for k,v in pairs(targets) do local damage_table = { victim = v, attacker = caster, damage = damage, ability = keys.ability, damage_type = keys.ability:GetAbilityDamageType(), damage_flags = DOTA_DAMAGE_FLAG_NONE, } UnitDamageTarget(damage_table) local suikaAbility01 = caster:FindAbilityByName("thtd_suika_01") if suikaAbility01~=nil then suikaAbility01:ApplyDataDrivenModifier(caster, v, "modifier_suika_01_slow_debuff", {Duration = 5.0}) end end local particle = ParticleManager:CreateParticle("particles/heroes/thtd_suika/ability_suika_01.vpcf",PATTACH_CUSTOMORIGIN,caster) ParticleManager:SetParticleControl(particle,0,target:GetOrigin()+Vector(0,0,64)) ParticleManager:SetParticleControl(particle,1,Vector(suika_damage_radius[caster.thtd_suika_01_scale],suika_damage_radius[caster.thtd_suika_01_scale],suika_damage_radius[caster.thtd_suika_01_scale])) ParticleManager:DestroyParticleSystem(particle,false) end end function OnSuika01Think(keys) local caster = EntIndexToHScript(keys.caster_entindex) if caster==nil or caster:IsNull() or caster:IsAlive() == false or caster:THTD_IsHidden() then RemoveAllSuikaTinySuika(keys) end end function OnSuika03SpellStart(keys) local caster = EntIndexToHScript(keys.caster_entindex) local targetPoint = keys.target_points[1] if caster.thtd_suika_01_scale == nil then caster.thtd_suika_01_scale = 4 end if caster.thtd_suika_01_tiny_suika_table == nil then caster.thtd_suika_01_tiny_suika_table = {} end Suika03ThrowBallToPoint(keys,caster:GetOrigin(),targetPoint,120) local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),1000) for k,v in pairs(caster.thtd_suika_01_tiny_suika_table) do if v~=nil and v:IsNull() == false and v:IsAlive() and #targets>0 then Suika03ThrowBallToPoint(keys,v:GetOrigin(),targets[RandomInt(1,#targets)]:GetOrigin(),120) end end end function Suika03ThrowBallToPoint(keys,origin,targetpoint,vhigh) local caster = EntIndexToHScript(keys.caster_entindex) local curOrigin = Vector(origin.x,origin.y,origin.z) local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_suika/ability_suika_03.vpcf", PATTACH_CUSTOMORIGIN, caster) ParticleManager:SetParticleControl(effectIndex, 0, curOrigin) ParticleManager:SetParticleControl(effectIndex, 1, Vector(suika_damage_radius[caster.thtd_suika_01_scale]/1000,0,0)) ParticleManager:SetParticleControl(effectIndex, 2, Vector(suika_damage_radius[caster.thtd_suika_01_scale]/2,0,0)) local g = -10 local dis = GetDistanceBetweenTwoVec2D(origin,targetpoint) local vh = vhigh local t = math.abs(2*vh/g) local speed = dis/t local rad = GetRadBetweenTwoVec2D(origin,targetpoint) local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * suika_damage_increase[caster.thtd_suika_01_scale] caster:SetContextThink(DoUniqueString("ability_suika_03"), function() if GameRules:IsGamePaused() then return 0.03 end vh = vh + g curOrigin = Vector(curOrigin.x + math.cos(rad) * speed,curOrigin.y + math.sin(rad) * speed,curOrigin.z + vh) ParticleManager:SetParticleControl(effectIndex, 0, curOrigin) if curOrigin.z >= caster:GetOrigin().z - 50 then return 0.02 else curOrigin.z = caster:GetOrigin().z ParticleManager:DestroyParticleSystem(effectIndex,true) local effectIndex2 = ParticleManager:CreateParticle("particles/thd2/heroes/suika/ability_suika_04_effect.vpcf", PATTACH_CUSTOMORIGIN, caster) ParticleManager:SetParticleControl(effectIndex2, 0, curOrigin) ParticleManager:DestroyParticleSystem(effectIndex2,false) local targets = THTD_FindUnitsInRadius(caster,curOrigin,suika_damage_radius[caster.thtd_suika_01_scale]/2) for k,v in pairs(targets) do local DamageTable = { ability = keys.ability, victim = v, attacker = caster, damage = damage, damage_type = keys.ability:GetAbilityDamageType(), damage_flags = DOTA_DAMAGE_FLAG_NONE } UnitDamageTarget(DamageTable) end return nil end end, 0) end function OnSuika04SpellStart(keys) local caster = EntIndexToHScript(keys.caster_entindex) local target = keys.target if caster.thtd_suika_01_scale == nil then caster.thtd_suika_01_scale = 4 end if caster.thtd_suika_01_tiny_suika_table == nil then caster.thtd_suika_01_tiny_suika_table = {} end local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),keys.range) if #targets>0 then for index,lockTarget in pairs(targets) do if lockTarget.thtd_suika_04_lock~=true then lockTarget.thtd_suika_04_lock = true OnSuika04LockToTarget(keys,caster,lockTarget) end end end for k,v in pairs(caster.thtd_suika_01_tiny_suika_table) do if v~=nil and v:IsNull() == false and v:IsAlive() then local targets = THTD_FindUnitsInRadius(caster,v:GetOrigin(),keys.range) if #targets>0 then for index,lockTarget in pairs(targets) do if lockTarget.thtd_suika_04_lock~=true then lockTarget.thtd_suika_04_lock = true OnSuika04LockToTarget(keys,v,lockTarget) end end end end end end function OnSuika04LockToTarget(keys,caster,target) local originalCaster = EntIndexToHScript(keys.caster_entindex) local vecHook = target:GetOrigin() local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_suika/ability_suika_04.vpcf", PATTACH_CUSTOMORIGIN, nil) ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "attach_hitloc", Vector(0,0,0), true) ParticleManager:SetParticleControl(effectIndex, 1, vecHook) ParticleManager:SetParticleControlEnt(effectIndex , 3, target, 5, "attach_hitloc", Vector(0,0,0), true) ParticleManager:SetParticleControl(effectIndex, 4, Vector(2400,0,0)) ParticleManager:SetParticleControl(effectIndex, 5, Vector(2400,0,0)) ParticleManager:SetParticleControl(effectIndex, 6, vecHook) local timecount = keys.duration_time local range = keys.range ParticleManager:DestroyParticleSystemTime(effectIndex,timecount) caster:SetContextThink(DoUniqueString("ability_suika_04"), function() if GameRules:IsGamePaused() then return 0.03 end if timecount <= 0 or target==nil or target:IsNull() or target:IsAlive()==false then ParticleManager:DestroyParticleSystem(effectIndex, true) if THTD_IsValid(target) then FindClearSpaceForUnit(target, target:GetOrigin(), false) target.thtd_suika_04_lock = false end return nil end if GetDistanceBetweenTwoVec2D(caster:GetOrigin(), target:GetOrigin()) > range then local forward = (target:GetOrigin() - caster:GetAbsOrigin()):Normalized() target:SetAbsOrigin(caster:GetOrigin()+forward*range) local damage = originalCaster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 * suika_damage_increase[originalCaster.thtd_suika_01_scale] if originalCaster == caster then if not (RandomInt(1,100) <= suika_damage_chance[caster.thtd_suika_01_scale]) then damage = originalCaster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 end end local DamageTable = { ability = keys.ability, victim = target, attacker = originalCaster, damage = damage, damage_type = keys.ability:GetAbilityDamageType(), damage_flags = DOTA_DAMAGE_FLAG_NONE } UnitDamageTarget(DamageTable) end local damage = originalCaster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 * suika_damage_increase[originalCaster.thtd_suika_01_scale] if originalCaster == caster then if RandomInt(1,100) > suika_damage_chance[caster.thtd_suika_01_scale] then damage = originalCaster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 end end local DamageTable = { ability = keys.ability, victim = target, attacker = originalCaster, damage = damage, damage_type = keys.ability:GetAbilityDamageType(), damage_flags = DOTA_DAMAGE_FLAG_NONE } UnitDamageTarget(DamageTable) timecount = timecount - 0.2 return 0.2 end, 0) end