local thtd_hecatia_model_list = { [1] = "models/new_touhou_model/hecatia/hecatia_earth/hecatia_earth.vmdl", [2] = "models/new_touhou_model/hecatia/hecatia_moon/hecatia_moon.vmdl", [3] = "models/new_touhou_model/hecatia/hecatia.vmdl", } local HECATIA_TYPE_EARTH = 1 local HECATIA_TYPE_MOON = 2 local HECATIA_TYPE_OTHERWORLD = 3 function OnHecatia01SpellStart(keys) local caster = EntIndexToHScript(keys.caster_entindex) local targetPoint = keys.target_points[1] if caster.thtd_hecatia_ball_table == nil then caster.thtd_hecatia_ball_table = {} caster.thtd_hecatia_ball_table["earth"] = nil caster.thtd_hecatia_ball_table["moon"] = nil caster.thtd_hecatia_ball_table["otherworld"] = nil end caster.thtd_hecatia_01_think_count = 0 if caster.thtd_hecatia_ball_table["earth"] == nil then local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_01_earth.vpcf", PATTACH_CUSTOMORIGIN, caster) ParticleManager:SetParticleControl(effectIndex, 0, targetPoint + Vector(0,0,128)) ParticleManager:SetParticleControl(effectIndex, 1, Vector(0.4,0,0)) ParticleManager:SetParticleControl(effectIndex, 2, Vector(200,0,0)) caster.thtd_hecatia_ball_table["earth"] = { ["Vector"] = targetPoint + Vector(0,0,128), ["EffectIndex"] = effectIndex } else caster.thtd_hecatia_ball_table["earth"]["Vector"] = targetPoint + Vector(0,0,128) end end function OnHecatia02SpellStart(keys) local caster = EntIndexToHScript(keys.caster_entindex) local targetPoint = keys.target_points[1] if caster.thtd_hecatia_ball_table == nil then caster.thtd_hecatia_ball_table = {} caster.thtd_hecatia_ball_table["earth"] = nil caster.thtd_hecatia_ball_table["moon"] = nil caster.thtd_hecatia_ball_table["otherworld"] = nil end caster.thtd_hecatia_01_think_count = 0 if caster.thtd_hecatia_ball_table["moon"] == nil then local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_01_moon.vpcf", PATTACH_CUSTOMORIGIN, caster) ParticleManager:SetParticleControl(effectIndex, 0, targetPoint + Vector(0,0,128)) ParticleManager:SetParticleControl(effectIndex, 1, Vector(0.3,0,0)) ParticleManager:SetParticleControl(effectIndex, 2, Vector(150,0,0)) caster.thtd_hecatia_ball_table["moon"] = { ["Vector"] = targetPoint + Vector(0,0,128), ["EffectIndex"] = effectIndex } else caster.thtd_hecatia_ball_table["moon"]["Vector"] = targetPoint + Vector(0,0,128) end end function OnHecatia03SpellStart(keys) local caster = EntIndexToHScript(keys.caster_entindex) local targetPoint = keys.target_points[1] if caster.thtd_hecatia_ball_table == nil then caster.thtd_hecatia_ball_table = {} caster.thtd_hecatia_ball_table["earth"] = nil caster.thtd_hecatia_ball_table["moon"] = nil caster.thtd_hecatia_ball_table["otherworld"] = nil end caster.thtd_hecatia_01_think_count = 0 if caster.thtd_hecatia_ball_table["otherworld"] == nil then local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_01_otherworld.vpcf", PATTACH_CUSTOMORIGIN, caster) ParticleManager:SetParticleControl(effectIndex, 0, targetPoint + Vector(0,0,128)) ParticleManager:SetParticleControl(effectIndex, 1, Vector(0.4,0,0)) ParticleManager:SetParticleControl(effectIndex, 2, Vector(200,0,0)) caster.thtd_hecatia_ball_table["otherworld"] = { ["Vector"] = targetPoint + Vector(0,0,128), ["CurPoint"] = targetPoint + Vector(0,0,128), ["EffectIndex"] = effectIndex } else local hasCombo = caster:HasModifier("modifier_thtd_hecatia_03_combo_buff") if not hasCombo then caster.thtd_hecatia_ball_table["otherworld"]["Vector"] = targetPoint + Vector(0,0,128) else caster.thtd_hecatia_ball_table["otherworld"]["Vector"] = targetPoint + Vector(0,0,128) caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] = targetPoint + Vector(0,0,128) caster.thtd_hecatia_ball_midOrigin = targetPoint + Vector(0,0,128) ParticleManager:SetParticleControl(caster.thtd_hecatia_ball_table["otherworld"]["EffectIndex"], 0, targetPoint + Vector(0,0,128)) end end end function HecatiaRemoveAllBall(caster) if caster.thtd_hecatia_ball_table == nil then caster.thtd_hecatia_ball_table = {} caster.thtd_hecatia_ball_table["earth"] = nil caster.thtd_hecatia_ball_table["moon"] = nil caster.thtd_hecatia_ball_table["otherworld"] = nil end if caster.thtd_hecatia_ball_table["earth"] ~= nil then local effectIndex = caster.thtd_hecatia_ball_table["earth"]["EffectIndex"] ParticleManager:DestroyParticleSystem(effectIndex,true) end if caster.thtd_hecatia_ball_table["moon"] ~= nil then local effectIndex = caster.thtd_hecatia_ball_table["moon"]["EffectIndex"] ParticleManager:DestroyParticleSystem(effectIndex,true) end if caster.thtd_hecatia_ball_table["otherworld"] ~= nil then local effectIndex = caster.thtd_hecatia_ball_table["otherworld"]["EffectIndex"] ParticleManager:DestroyParticleSystem(effectIndex,true) end if caster.thtd_hecatia_ball_midOrigin ~= nil then caster.thtd_hecatia_ball_midOrigin = nil end if caster.thtd_hecatia_01_think_count ~= nil then caster.thtd_hecatia_01_think_count = nil end caster.thtd_hecatia_ball_table = {} end local MIN_RADIUS = 300 function OnHecatia01Think(keys) local caster = EntIndexToHScript(keys.caster_entindex) if caster.thtd_hecatia_ball_table == nil then caster.thtd_hecatia_ball_table = {} caster.thtd_hecatia_ball_table["earth"] = nil caster.thtd_hecatia_ball_table["moon"] = nil caster.thtd_hecatia_ball_table["otherworld"] = nil end if caster.cast_factor == nil then caster.cast_factor = 10 -- 卡顿优化,每0.3秒释放一次技能(原0.03) end if caster.thtd_hecatia_01_think_count == nil then caster.thtd_hecatia_01_think_count = 0 end if caster.thtd_hecatia_01_think_count < 360 then caster.thtd_hecatia_01_think_count = caster.thtd_hecatia_01_think_count + 1 else caster.thtd_hecatia_01_think_count = 0 end if caster.thtd_hecatia_01_think_count_moon == nil then caster.thtd_hecatia_01_think_count_moon = 0 end local hasCombo = caster:HasModifier("modifier_thtd_hecatia_03_combo_buff") if caster.thtd_hecatia_01_think_count_moon < 360 then if hasCombo then caster.thtd_hecatia_01_think_count_moon = caster.thtd_hecatia_01_think_count_moon + 2 else caster.thtd_hecatia_01_think_count_moon = caster.thtd_hecatia_01_think_count_moon + 1 end else caster.thtd_hecatia_01_think_count_moon = 0 end if caster==nil or caster:IsNull()==true or caster:IsAlive()==false or caster:THTD_IsHidden() then HecatiaRemoveAllBall(caster) end if caster:FindAbilityByName("thtd_hecatia_04"):GetLevel() >= 1 and caster.thtd_hecatia_04_lock ~= true then OnHecatiaTriggerTriangle(caster) end if caster.thtd_hecatia_ball_table ~= nil then if caster.thtd_hecatia_ball_table["earth"] ~= nil then if caster.thtd_hecatia_ball_table["otherworld"] ~= nil then if not hasCombo then local effectIndex = caster.thtd_hecatia_ball_table["earth"]["EffectIndex"] local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster.thtd_hecatia_ball_table["earth"]["Vector"], caster.thtd_hecatia_ball_table["otherworld"]["Vector"])) local midOrigin = (caster.thtd_hecatia_ball_table["earth"]["Vector"] + caster.thtd_hecatia_ball_table["otherworld"]["Vector"])/2 local point = midOrigin + Vector( math.cos(caster.thtd_hecatia_01_think_count * math.pi/180)*distance, math.sin(caster.thtd_hecatia_01_think_count * math.pi/180)*distance, 0) ParticleManager:SetParticleControl(effectIndex, 0, point) caster.thtd_hecatia_ball_table["earth"]["CurPoint"] = point if caster.thtd_hecatia_ball_midOrigin ~= midOrigin then caster.thtd_hecatia_ball_midOrigin = midOrigin end else local effectIndex = caster.thtd_hecatia_ball_table["earth"]["EffectIndex"] local distance = math.max(MIN_RADIUS * 2, GetDistanceBetweenTwoVec2D(caster.thtd_hecatia_ball_table["earth"]["Vector"], caster.thtd_hecatia_ball_table["otherworld"]["Vector"])) local curPoint = caster.thtd_hecatia_ball_table["otherworld"]["Vector"] if caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] ~= nil then curPoint = caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] end local point = curPoint + Vector( math.cos(caster.thtd_hecatia_01_think_count * math.pi/90)*distance, math.sin(caster.thtd_hecatia_01_think_count * math.pi/90)*distance, 0) ParticleManager:SetParticleControl(effectIndex, 0, point) caster.thtd_hecatia_ball_table["earth"]["CurPoint"] = point if caster.thtd_hecatia_ball_midOrigin ~= caster.thtd_hecatia_ball_table["otherworld"]["Vector"] then caster.thtd_hecatia_ball_midOrigin = caster.thtd_hecatia_ball_table["otherworld"]["Vector"] end end else local effectIndex = caster.thtd_hecatia_ball_table["earth"]["EffectIndex"] local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster:GetOrigin(), caster.thtd_hecatia_ball_table["earth"]["Vector"])) local point = caster:GetOrigin() + Vector( math.cos(caster.thtd_hecatia_01_think_count * math.pi/180)*distance, math.sin(caster.thtd_hecatia_01_think_count * math.pi/180)*distance, 128) ParticleManager:SetParticleControl(effectIndex, 0, point) caster.thtd_hecatia_ball_table["earth"]["CurPoint"] = point end if caster.cast_factor >= 10 then OnHecatiaEarthHit(caster) end end if caster.thtd_hecatia_ball_table["moon"] ~= nil then if caster.thtd_hecatia_ball_table["earth"] ~= nil then local effectIndex = caster.thtd_hecatia_ball_table["moon"]["EffectIndex"] local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster.thtd_hecatia_ball_table["earth"]["Vector"], caster.thtd_hecatia_ball_table["moon"]["Vector"])) local curPoint = caster.thtd_hecatia_ball_table["earth"]["Vector"] if caster.thtd_hecatia_ball_table["earth"]["CurPoint"] ~= nil then curPoint = caster.thtd_hecatia_ball_table["earth"]["CurPoint"] end local point = curPoint + Vector( math.cos(caster.thtd_hecatia_01_think_count_moon * math.pi/90)*distance, math.sin(caster.thtd_hecatia_01_think_count_moon * math.pi/90)*distance, 0) ParticleManager:SetParticleControl(effectIndex, 0, point) caster.thtd_hecatia_ball_table["moon"]["CurPoint"] = point else local effectIndex = caster.thtd_hecatia_ball_table["moon"]["EffectIndex"] local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster:GetOrigin(), caster.thtd_hecatia_ball_table["moon"]["Vector"])) local point = caster:GetOrigin() + Vector( math.cos(caster.thtd_hecatia_01_think_count * math.pi/90)*distance, math.sin(caster.thtd_hecatia_01_think_count * math.pi/90)*distance, 128) ParticleManager:SetParticleControl(effectIndex, 0, point) caster.thtd_hecatia_ball_table["moon"]["CurPoint"] = point end if caster.cast_factor >= 10 then OnHecatiaMoonHit(caster) end end if caster.thtd_hecatia_ball_table["otherworld"] ~= nil then if not hasCombo then if caster.thtd_hecatia_ball_table["earth"] ~= nil then local effectIndex = caster.thtd_hecatia_ball_table["otherworld"]["EffectIndex"] local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster.thtd_hecatia_ball_table["earth"]["Vector"], caster.thtd_hecatia_ball_table["otherworld"]["Vector"])) local midOrigin = (caster.thtd_hecatia_ball_table["earth"]["Vector"] + caster.thtd_hecatia_ball_table["otherworld"]["Vector"])/2 local point = midOrigin + Vector( math.cos((caster.thtd_hecatia_01_think_count + 180) * math.pi/180)*distance, math.sin((caster.thtd_hecatia_01_think_count + 180) * math.pi/180)*distance, 0) ParticleManager:SetParticleControl(effectIndex, 0, point) caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] = point if caster.thtd_hecatia_ball_midOrigin ~= midOrigin then caster.thtd_hecatia_ball_midOrigin = midOrigin end else local effectIndex = caster.thtd_hecatia_ball_table["otherworld"]["EffectIndex"] local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster:GetOrigin(), caster.thtd_hecatia_ball_table["otherworld"]["Vector"])) local point = caster:GetOrigin() + Vector( math.cos((caster.thtd_hecatia_01_think_count + 180) * math.pi/180)*distance, math.sin((caster.thtd_hecatia_01_think_count + 180) * math.pi/180)*distance, 128) ParticleManager:SetParticleControl(effectIndex, 0, point) caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] = point end else if caster.thtd_hecatia_ball_table["earth"] ~= nil then if caster.thtd_hecatia_ball_midOrigin ~= caster.thtd_hecatia_ball_table["otherworld"]["Vector"] then caster.thtd_hecatia_ball_midOrigin = caster.thtd_hecatia_ball_table["otherworld"]["Vector"] end end end if caster.cast_factor >= 10 then OnHecatiaOtherworldHit(caster) end end end if caster.cast_factor >= 10 then caster.cast_factor = 0 RefreshBonus(caster) else caster.cast_factor = caster.cast_factor + 1 end end function RefreshBonus(caster) if caster.thtd_hecatia_ball_table["earth"] ~= nil then caster:THTD_AddPowerPercentage(caster:GetAbilityValue("thtd_hecatia_01", "power_up"), "thtd_hecatia_01_bonus") else caster:THTD_AddPowerPercentage("thtd_hecatia_01_bonus") end if caster.thtd_hecatia_ball_table["moon"] ~= nil then caster:THTD_AddCritChance(caster:GetAbilityValue("thtd_hecatia_02", "chance"), "thtd_hecatia_02_bonus") caster:THTD_AddCritDamage(caster:GetAbilityValue("thtd_hecatia_02", "crit"), "thtd_hecatia_02_bonus") else caster:THTD_AddCritChance("thtd_hecatia_02_bonus") caster:THTD_AddCritDamage("thtd_hecatia_02_bonus") end if caster.thtd_hecatia_ball_table["otherworld"] ~= nil then caster:AddDamageOutgoingAll(caster:GetAbilityValue("thtd_hecatia_03", "damage_up"), "thtd_hecatia_03_bonus") else caster:AddDamageOutgoingAll("thtd_hecatia_03_bonus") end end function OnHecatiaEarthHit(caster) local earthOrigin = caster.thtd_hecatia_ball_table["earth"]["CurPoint"] local ability = caster:FindAbilityByName("thtd_hecatia_01") if caster.thtd_hecatia_change_type == HECATIA_TYPE_EARTH then if caster.thtd_hecatia_triangle_count == nil or caster.thtd_hecatia_triangle_count == 0 then OnHecatiaCreateTriangle(caster) end local damage = caster:THTD_GetAbilityPowerDamage(ability, 1) local range = ability:GetSpecialValueFor("range1") local targets = THTD_FindUnitsInRadius(caster,earthOrigin, range) for k,v in pairs(targets) do if not v:HasModifier("modifier_hecatia_01_earth_lock") then ability:ApplyDataDrivenModifier(caster, v, "modifier_hecatia_01_earth_lock", {}) ability:ApplyDataDrivenModifier(caster, v, "modifier_thtd_hecatia_01_debuff", {}) local DamageTable = { ability = ability, victim = v, attacker = caster, damage = damage, damage_type = ability:GetAbilityDamageType(), damage_flags = DOTA_DAMAGE_FLAG_NONE, } UnitDamageTarget(DamageTable) end end else local damage = caster:THTD_GetAbilityPowerDamage(ability, 2) local range = ability:GetSpecialValueFor("range2") local targets = THTD_FindUnitsInRadius(caster,earthOrigin, range) for k,v in pairs(targets) do local targetOrigin = v:GetOrigin() local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_earth_rain.vpcf", PATTACH_CUSTOMORIGIN, caster) ParticleManager:SetParticleControl(effectIndex , 0, targetOrigin) ParticleManager:DestroyParticleSystemTime(effectIndex,0.5) local DamageTable = { ability = ability, victim = v, attacker = caster, damage = damage, damage_type = ability:GetAbilityDamageType(), damage_flags = DOTA_DAMAGE_FLAG_NONE } UnitDamageTarget(DamageTable) end end end function OnHecatiaMoonHit(caster) local moonOrigin = caster.thtd_hecatia_ball_table["moon"]["CurPoint"] local ability = caster:FindAbilityByName("thtd_hecatia_02") if caster.thtd_hecatia_change_type == HECATIA_TYPE_MOON then if caster.thtd_hecatia_triangle_count == 1 then OnHecatiaCreateTriangle(caster) end local damage = caster:THTD_GetAbilityPowerDamage(ability, 1) local range = ability:GetSpecialValueFor("range1") local backDistance = ability:GetSpecialValueFor("back_distance") local targets = THTD_FindUnitsInRadius(caster,moonOrigin, range) for k,v in pairs(targets) do if not v:HasModifier("modifier_hecatia_01_moon_lock") then ability:ApplyDataDrivenModifier(caster, v, "modifier_hecatia_01_moon_lock", {}) local forward = (v:GetAbsOrigin()-Vector(moonOrigin.x,moonOrigin.y,0)):Normalized() v:SetAbsOrigin(v:GetOrigin()+forward*backDistance) FindClearSpaceForUnit(v, v:GetOrigin(), false) local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_moon_hit.vpcf", PATTACH_CUSTOMORIGIN, caster) ParticleManager:SetParticleControl(effectIndex , 0, moonOrigin+Vector(0,0,64)) ParticleManager:DestroyParticleSystem(effectIndex,false) local DamageTable = { ability = ability, victim = v, attacker = caster, damage = damage, damage_type = ability:GetAbilityDamageType(), damage_flags = DOTA_DAMAGE_FLAG_NONE, } UnitDamageTarget(DamageTable) end end else local damage = caster:THTD_GetAbilityPowerDamage(ability, 2) local range = ability:GetSpecialValueFor("range2") local targets = THTD_FindUnitsInRadius(caster,moonOrigin,range) if #targets > 0 then local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex.vpcf", PATTACH_CUSTOMORIGIN, caster) ParticleManager:SetParticleControl(effectIndex , 0, caster:GetOrigin()) ParticleManager:SetParticleControl(effectIndex , 1, moonOrigin+Vector(0,0,64)) ParticleManager:SetParticleControl(effectIndex , 9, caster:GetOrigin()) ParticleManager:DestroyParticleSystem(effectIndex,false) local targets = THTD_FindUnitsInRadius(caster,moonOrigin,range) local damage = caster:THTD_GetAbilityPowerDamage(ability, 2) for k,v in pairs(targets) do local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex.vpcf", PATTACH_CUSTOMORIGIN, caster) ParticleManager:SetParticleControl(effectIndex , 0, caster.thtd_hecatia_ball_table["moon"]["CurPoint"]+Vector(0,0,64)) ParticleManager:SetParticleControlEnt(effectIndex , 1, v, 5, "attach_hitloc", Vector(0,0,0), true) ParticleManager:SetParticleControl(effectIndex , 9, caster.thtd_hecatia_ball_table["moon"]["CurPoint"]+Vector(0,0,64)) ParticleManager:DestroyParticleSystem(effectIndex,false) local DamageTable = { ability = ability, victim = v, attacker = caster, damage = damage, damage_type = ability:GetAbilityDamageType(), damage_flags = DOTA_DAMAGE_FLAG_NONE } UnitDamageTarget(DamageTable) end end end end function OnHecatiaOtherworldHit(caster) local otherworldOrigin = caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] local ability = caster:FindAbilityByName("thtd_hecatia_03") if caster.thtd_hecatia_change_type == HECATIA_TYPE_OTHERWORLD then if caster.thtd_hecatia_triangle_count == 2 then OnHecatiaCreateTriangle(caster) end local damage = caster:THTD_GetAbilityPowerDamage(ability, 1) local activeRange = ability:GetSpecialValueFor("active_range") local fullRange = ability:GetSpecialValueFor("full_range") local suckTime = ability:GetSpecialValueFor("suck_duration") local targetsFirst = THTD_FindUnitsInRadius(caster,otherworldOrigin, activeRange) if #targetsFirst > 0 then if caster.thtd_hecatia_otherworld_think_lock ~= true then caster.thtd_hecatia_otherworld_think_lock = true local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_otherworld.vpcf", PATTACH_CUSTOMORIGIN, nil) local time = suckTime local clearGroup = {} THTD_SetSpellLock(caster, "thtd_hecatia_03", suckTime) caster:SetContextThink(DoUniqueString("ability_hecatia_otherworld_think"), function() if GameRules:IsGamePaused() then return 0.03 end if time <= 0 or caster==nil or caster:IsNull()==true or caster:IsAlive()==false or caster:THTD_IsHidden() then for k,v in pairs(clearGroup) do if v~=nil and v:IsNull()==false and v:IsAlive() then FindClearSpaceForUnit(v, v:GetOrigin(), false) end end clearGroup = {} caster.thtd_hecatia_otherworld_think_lock = false ParticleManager:DestroyParticleSystem(effectIndex,true) return nil end local cur_origin = caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] local targets = THTD_FindUnitsInRadius(caster,cur_origin, fullRange) clearGroup = targets for k,v in pairs(targets) do local forward = (Vector(cur_origin.x,cur_origin.y,0)-v:GetAbsOrigin()):Normalized() v:SetAbsOrigin(v:GetOrigin()+forward*100) UnitStunTarget(caster,v,0.2) local DamageTable = { ability = ability, victim = v, attacker = caster, damage = damage, damage_type = ability:GetAbilityDamageType(), damage_flags = DOTA_DAMAGE_FLAG_NONE } UnitDamageTarget(DamageTable) end ParticleManager:SetParticleControl(effectIndex , 0, cur_origin) ParticleManager:SetParticleControl(effectIndex , 2, cur_origin) time = time - 0.3 return 0.3 end, 0) end end else local range = ability:GetSpecialValueFor("range2") local targetsFirst = THTD_FindUnitsInRadius(caster,otherworldOrigin,range) if #targetsFirst > 0 then if caster.thtd_hecatia_otherworld_hit_lock ~= true then caster.thtd_hecatia_otherworld_hit_lock = true -- caster.thtd_hecatia_otherworld_hit_list = {} caster:SetContextThink(DoUniqueString("ability_hecatia_hit_delay"), function() if GameRules:IsGamePaused() then return 0.03 end local damage = caster:THTD_GetAbilityPowerDamage(ability, 2) local targets = THTD_FindUnitsInRadius(caster,otherworldOrigin,range) for k,v in pairs(targets) do local DamageTable = { ability = ability, victim = v, attacker = caster, damage = damage, damage_type = ability:GetAbilityDamageType(), damage_flags = DOTA_DAMAGE_FLAG_NONE } UnitDamageTarget(DamageTable) end caster.thtd_hecatia_otherworld_hit_lock = false return nil end, 0.5) local hasCombo = caster:HasModifier("modifier_thtd_hecatia_03_combo_buff") for i=1,12 do local forward1 = Vector(math.cos(i*math.pi/6),math.sin(i*math.pi/6),0) local forward2 = Vector(math.cos(i*math.pi/6+math.pi/2),math.sin(i*math.pi/6+math.pi/2),0) local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile.vpcf", PATTACH_CUSTOMORIGIN, caster) if hasCombo then ParticleManager:SetParticleControl(effectIndex, 0, otherworldOrigin + Vector(0,0,128)) else ParticleManager:SetParticleControl(effectIndex, 0, otherworldOrigin + forward1 * 150 + Vector(0,0,128)) end ParticleManager:SetParticleControl(effectIndex, 1, forward2 * 800) ParticleManager:DestroyParticleSystemTime(effectIndex, 0.9) end -- for i=1,12 do -- local forward1 = Vector(math.cos(i*math.pi/6),math.sin(i*math.pi/6),0) -- local forward2 = Vector(math.cos(i*math.pi/6+math.pi/2),math.sin(i*math.pi/6+math.pi/2),0) -- local info = -- { -- Ability = ability, -- EffectName = "particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile.vpcf", -- vSpawnOrigin = otherworldOrigin + forward1 * 100 + Vector(0,0,128), -- fDistance = range, -- fStartRadius = 150, -- fEndRadius = 150, -- Source = caster, -- bHasFrontalCone = false, -- bReplaceExisting = false, -- iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, -- iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, -- iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, -- fExpireTime = GameRules:GetGameTime() + 10.0, -- bDeleteOnHit = false, -- vVelocity = forward2 * 500, -- bProvidesVision = true, -- iVisionRadius = 1000, -- iVisionTeamNumber = caster:GetTeamNumber() -- } -- local projectile = ProjectileManager:CreateLinearProjectile(info) -- ParticleManager:DestroyLinearProjectileSystem(projectile,false) -- end end end end end -- function OnHecatiaProjectileHit(keys) -- local caster = EntIndexToHScript(keys.caster_entindex) -- local target = keys.target -- for k,v in pairs(caster.thtd_hecatia_otherworld_hit_list) do -- if v == target then -- return -- end -- end -- local damage = caster:THTD_GetAbilityPowerDamage(caster:FindAbilityByName("thtd_hecatia_03"), 2) -- local DamageTable = { -- ability = keys.ability, -- victim = target, -- attacker = caster, -- damage = damage, -- damage_type = keys.ability:GetAbilityDamageType(), -- damage_flags = DOTA_DAMAGE_FLAG_NONE, -- } -- UnitDamageTarget(DamageTable) -- table.insert(caster.thtd_hecatia_otherworld_hit_list, target) -- end function OnHecatia04Think(keys) local caster = EntIndexToHScript(keys.caster_entindex) if caster:GetTowerPowerLevel() >= 3 then if caster.thtd_hecatia_change_list == nil or #caster.thtd_hecatia_change_list == 0 then caster.thtd_hecatia_change_list = {HECATIA_TYPE_EARTH, HECATIA_TYPE_MOON, HECATIA_TYPE_OTHERWORLD, HECATIA_TYPE_EARTH, HECATIA_TYPE_MOON, HECATIA_TYPE_OTHERWORLD} end local index = RandomInt(1,#caster.thtd_hecatia_change_list) local randomType = caster.thtd_hecatia_change_list[index] table.remove(caster.thtd_hecatia_change_list, index) caster:SetModel(thtd_hecatia_model_list[randomType]) caster:SetOriginalModel(thtd_hecatia_model_list[randomType]) caster.thtd_hecatia_change_type = randomType return end local randomType = RandomInt(1,3) caster:SetModel(thtd_hecatia_model_list[randomType]) caster:SetOriginalModel(thtd_hecatia_model_list[randomType]) caster.thtd_hecatia_change_type = randomType -- local level = 1 -- if GetHecatiaBallCount(caster) == 3 then -- level = 2 -- end -- for i=1,4 do -- local ability = caster:FindAbilityByName("thtd_hecatia_0"..tostring(i)) -- if ability ~= nil and ability:GetLevel() ~= level then -- ability:SetLevel(level) -- end -- end end function OnHecatiaCreateTriangle(caster) if caster.thtd_hecatia_ball_midOrigin == nil then return end if caster.thtd_hecatia_triangle_count == nil then caster.thtd_hecatia_triangle_count = 0 end if caster.thtd_hecatia_triangle_table == nil then caster.thtd_hecatia_triangle_table = {} end if caster.thtd_hecatia_triangle_angle == nil then caster.thtd_hecatia_triangle_angle = RandomInt(0, 360) end if caster.thtd_hecatia_triangle_count < 3 then local radius = 900 local point = RotatePosition(caster.thtd_hecatia_ball_midOrigin, QAngle(0,caster.thtd_hecatia_triangle_angle,0), caster.thtd_hecatia_ball_midOrigin + Vector(0, radius, 0)) caster.thtd_hecatia_triangle_count = caster.thtd_hecatia_triangle_count + 1 if caster.thtd_hecatia_triangle_count == 2 then point = RotatePosition(caster.thtd_hecatia_ball_midOrigin, QAngle(0,120,0), point) elseif caster.thtd_hecatia_triangle_count == 3 then point = RotatePosition(caster.thtd_hecatia_ball_midOrigin, QAngle(0,240,0), point) end local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_triangle.vpcf", PATTACH_CUSTOMORIGIN, nil) ParticleManager:SetParticleControl(effectIndex , 0, point) ParticleManager:SetParticleControl(effectIndex , 3, point) caster.thtd_hecatia_triangle_table[caster.thtd_hecatia_triangle_count] = {} caster.thtd_hecatia_triangle_table[caster.thtd_hecatia_triangle_count]["EffectIndex"] = effectIndex caster.thtd_hecatia_triangle_table[caster.thtd_hecatia_triangle_count]["Origin"] = point end end function OnHecatiaTriggerTriangle(caster) if caster.thtd_hecatia_triangle_count == nil then caster.thtd_hecatia_triangle_count = 0 end if caster.thtd_hecatia_triangle_table == nil then caster.thtd_hecatia_triangle_table = {} end if caster.thtd_hecatia_triangle_count >= 3 and THTD_HasUnitsInRadius(caster, caster:GetAbsOrigin(), 1500) then local ability = caster:FindAbilityByName("thtd_hecatia_04") local duration = math.floor(ability:GetSpecialValueFor("duration_time") * 100 + 0.5)/100 local power_bonus = ability:GetSpecialValueFor("power_bonus") local durationDelay = 0 local delayCount = 0 local time = 0 local count = 0 local triangleTable = caster.thtd_hecatia_triangle_table caster.thtd_hecatia_04_lock = true caster:SetContextThink(DoUniqueString("ability_hecatia_triangle_think"), function() if GameRules:IsGamePaused() then return 0.03 end if time > duration + durationDelay or THTD_IsValid(caster) == false then ParticleManager:DestroyParticleSystem(caster.thtd_hecatia_triangle_table[1]["EffectIndex"],true) ParticleManager:DestroyParticleSystem(caster.thtd_hecatia_triangle_table[2]["EffectIndex"],true) ParticleManager:DestroyParticleSystem(caster.thtd_hecatia_triangle_table[3]["EffectIndex"],true) triangleTable = {} caster.thtd_hecatia_triangle_table = {} caster.thtd_hecatia_triangle_count = 0 caster.thtd_hecatia_triangle_angle = nil caster.thtd_hecatia_04_lock = false return nil end -- 改为三角连接和中心发射同时进行 count = count + 1 if count > 3 then count = 1 end local countNext = count + 1 if countNext > 3 then countNext = 1 end local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) ParticleManager:SetParticleControl(effectIndex , 0, triangleTable[count]["Origin"]) ParticleManager:SetParticleControl(effectIndex , 1, triangleTable[countNext]["Origin"]) ParticleManager:SetParticleControl(effectIndex , 9, triangleTable[count]["Origin"]) ParticleManager:DestroyParticleSystem(effectIndex,false) local distance = GetDistanceBetweenTwoVec2D(triangleTable[count]["Origin"], triangleTable[countNext]["Origin"]) local speed = 3000 local delayTime = distance / speed time = time + delayTime if delayCount < 3 then delayCount = delayCount + 1 durationDelay = delayTime if delayCount == 3 then caster:THTD_AddBasePower(power_bonus, "thtd_hecatia_04_buff") caster:SetContextThink(DoUniqueString("dota_timer"), function() if GameRules:IsGamePaused() then return 0.1 end if time > duration + durationDelay or THTD_IsValid(caster) == false then caster:THTD_AddBasePower("thtd_hecatia_04_buff") return nil end caster:SetContextThink(DoUniqueString("dota_timer"), function() local center,radius = GetCircleCenterAndRadius(triangleTable[1]["Origin"],triangleTable[2]["Origin"],triangleTable[3]["Origin"]) local targets = THTD_FindUnitsInRadius(caster,center,radius) local damage = caster:THTD_GetAbilityPowerDamage(ability) for k,v in pairs(targets) do if v ~= nil and v:IsNull() == false and v:IsAlive() and IsInTriangle(triangleTable[1]["Origin"],triangleTable[2]["Origin"],triangleTable[3]["Origin"],v:GetAbsOrigin()) then local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) ParticleManager:SetParticleControl(effectIndex , 0, center) ParticleManager:SetParticleControlEnt(effectIndex , 1, v, 5, "attach_hitloc", Vector(0,0,0), true) ParticleManager:SetParticleControl(effectIndex , 9, center) ParticleManager:DestroyParticleSystem(effectIndex,false) local DamageTable = { ability = ability, victim = v, attacker = caster, damage = damage, damage_type = ability:GetAbilityDamageType(), damage_flags = DOTA_DAMAGE_FLAG_NONE } UnitDamageTarget(DamageTable) end end return nil end, 0.3) return 0.5 end, 0) end end return delayTime -- 这个效果是三个三角依次连接后再从中心发射 -- if count < 3 then -- count = count + 1 -- local countNext = count + 1 -- if countNext > 3 then -- countNext = 1 -- end -- local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) -- ParticleManager:SetParticleControl(effectIndex , 0, triangleTable[count]["Origin"]) -- ParticleManager:SetParticleControl(effectIndex , 1, triangleTable[countNext]["Origin"]) -- ParticleManager:SetParticleControl(effectIndex , 9, triangleTable[count]["Origin"]) -- ParticleManager:DestroyParticleSystem(effectIndex,false) -- local distance = GetDistanceBetweenTwoVec2D(triangleTable[count]["Origin"], triangleTable[countNext]["Origin"]) -- local speed = 3000 -- local delayTime = distance / speed -- time = time - delayTime -- return delayTime -- else -- local center,radius = GetCircleCenterAndRadius(triangleTable[1]["Origin"],triangleTable[2]["Origin"],triangleTable[3]["Origin"]) -- local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) -- ParticleManager:SetParticleControl(effectIndex , 0, triangleTable[1]["Origin"]) -- ParticleManager:SetParticleControl(effectIndex , 1, caster.thtd_hecatia_ball_midOrigin) -- ParticleManager:SetParticleControl(effectIndex , 9, triangleTable[1]["Origin"]) -- ParticleManager:DestroyParticleSystem(effectIndex,false) -- local distance = GetDistanceBetweenTwoVec2D(triangleTable[1]["Origin"], caster.thtd_hecatia_ball_midOrigin) -- local speed = 3000 -- local delayTime = distance / speed -- caster:SetContextThink(DoUniqueString("ability_hecatia_04_delay"), -- function() -- if GameRules:IsGamePaused() then return 0.03 end -- local damage = caster:THTD_GetAbilityPowerDamage(ability) -- local targets = THTD_FindUnitsInRadius(caster,center,radius) -- for k,v in pairs(targets) do -- local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) -- ParticleManager:SetParticleControl(effectIndex , 0, caster.thtd_hecatia_ball_midOrigin) -- ParticleManager:SetParticleControlEnt(effectIndex , 1, v, 5, "attach_hitloc", Vector(0,0,0), true) -- ParticleManager:SetParticleControl(effectIndex , 9, caster.thtd_hecatia_ball_midOrigin) -- ParticleManager:DestroyParticleSystem(effectIndex,false) -- local DamageTable = { -- ability = ability, -- victim = v, -- attacker = caster, -- damage = damage, -- damage_type = ability:GetAbilityDamageType(), -- damage_flags = DOTA_DAMAGE_FLAG_NONE -- } -- UnitDamageTarget(DamageTable) -- end -- return nil -- end, -- delayTime) -- count = 0 -- time = time - tick -- return tick -- end end, 0) end end function GetHecatiaBallCount(caster) if caster.thtd_hecatia_ball_table == nil then return 0 end local count = 0 if caster.thtd_hecatia_ball_table["earth"] ~= nil then count = count + 1 end if caster.thtd_hecatia_ball_table["moon"] ~= nil then count = count + 1 end if caster.thtd_hecatia_ball_table["otherworld"] ~= nil then count = count + 1 end return count end