Files
2HUCardTDGame/game/scripts/vscripts/abilities/abilityyuuka.lua
2021-11-10 08:48:00 -05:00

504 lines
18 KiB
Lua
Executable File

function OnYuuka01SpellStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local vecCaster = caster:GetOrigin()
if caster.thtd_yuuka_seeds == nil then
caster.thtd_yuuka_seeds = {}
end
caster:EmitSound("Sound_THTD.thtd_yuuka_01")
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability)
local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(), keys.range)
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
for k,v in pairs(caster.thtd_yuuka_seeds) do
if v~=nil and GetDistanceBetweenTwoVec2D(v, caster:GetOrigin()) <= keys.range then
Yuuka02CreatePlant(keys,v,k)
caster.thtd_yuuka_seeds[k] = nil
end
end
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_01.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex, 0, vecCaster)
ParticleManager:SetParticleControl(effectIndex, 1, vecCaster)
ParticleManager:SetParticleControl(effectIndex, 2, vecCaster)
ParticleManager:SetParticleControl(effectIndex, 3, vecCaster)
ParticleManager:SetParticleControl(effectIndex, 7, vecCaster)
ParticleManager:DestroyParticleSystemTime(effectIndex,5.0)
end
function Yuuka02CreatePlant(keys,vec,seed)
local caster = EntIndexToHScript(keys.caster_entindex)
local flower = CreateUnitByName(
"yuuka_flower",
vec,
false,
caster:GetOwner(),
caster:GetOwner(),
caster:GetTeam()
)
ParticleManager:DestroyParticleSystem(seed,true)
flower.thtd_spawn_unit_owner = caster
flower:SetControllableByPlayer(caster:GetPlayerOwnerID(), true)
keys.ability:ApplyDataDrivenModifier(caster, flower, "modifier_yuuka_02_flower", nil)
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_01_spawn.vpcf", PATTACH_CUSTOMORIGIN, nil)
ParticleManager:SetParticleControl(effectIndex, 0, vec)
ParticleManager:DestroyParticleSystem(effectIndex,false)
local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_01_flower.vpcf", PATTACH_CUSTOMORIGIN, flower)
ParticleManager:SetParticleControlEnt(effectIndex2 , 0, flower, 5, "follow_origin", Vector(0,0,0), true)
ParticleManager:SetParticleControlEnt(effectIndex2 , 1, flower, 5, "follow_origin", Vector(0,0,0), true)
ParticleManager:SetParticleControlEnt(effectIndex2 , 2, flower, 5, "follow_origin", Vector(0,0,0), true)
ParticleManager:SetParticleControlEnt(effectIndex2 , 3, flower, 5, "follow_origin", Vector(0,0,0), true)
ParticleManager:DestroyParticleSystemTime(effectIndex2,5.0)
local count = 0
flower:SetContextThink(DoUniqueString("thtd_yuuka_02_plant"),
function()
local attack = caster:THTD_GetBaseAttack()
flower:SetBaseDamageMax(attack)
flower:SetBaseDamageMin(attack)
flower:InheritOwnerBuff(caster)
if count == 10 then
local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_techies/techies_land_mine_explode.vpcf",PATTACH_CUSTOMORIGIN,caster)
ParticleManager:SetParticleControl(particle,0,flower:GetOrigin()+Vector(0,0,64))
ParticleManager:DestroyParticleSystem(particle,false)
local targets = THTD_FindUnitsInRadius(caster,flower:GetAbsOrigin(),keys.radius)
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * keys.crit
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
elseif count > 10 then
flower:AddNoDraw()
flower:ForceKill(true)
return nil
else
if flower:IsAttacking() == false then
flower:MoveToPositionAggressive(flower:GetOrigin() + flower:GetForwardVector() * 100)
end
end
count = count + 1
return 0.5
end,
0)
end
function OnIntervalThinkYuuka02(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
if caster:THTD_IsHidden() then return end
local forward = nil
if IsValidAlive(caster.thtd_yuuka_03_illusion) then
forward = (caster.thtd_yuuka_03_illusion:GetAbsOrigin() - caster:GetAbsOrigin()):Normalized()
else
forward = caster:GetForwardVector()
end
if caster.thtd_yuuka_seeds == nil then
caster.thtd_yuuka_seeds = {}
end
local num = RandomInt(0,300)
local randomVector = caster:GetOrigin() + forward * 300 + RandomVector(num) + Vector(0,0,32)
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_02_seed.vpcf", PATTACH_CUSTOMORIGIN, nil)
ParticleManager:SetParticleControl(effectIndex, 0, randomVector)
caster.thtd_yuuka_seeds[effectIndex] = randomVector
-- caster:EmitSound("Sound_THTD.thtd_yuuka_02")
caster:GetOwner():SetContextThink(DoUniqueString("thtd_yuuka_02_seed_release"),
function()
if GameRules:IsGamePaused() then return 0.03 end
if caster~=nil and caster:IsNull()==false and caster:IsAlive() then
caster.thtd_yuuka_seeds[effectIndex] = nil
end
ParticleManager:DestroyParticleSystem(effectIndex,true)
return nil
end,
10.0)
end
-- 在本体和分身之间创建花田,若花田内有单位死亡,则增加花和花妈的属性
function OnSpellStartYuuka03(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local targetPoint = keys.target_points[1]
if caster.thtd_yuuka_03_illusion == nil or caster.thtd_yuuka_03_illusion:IsNull() or caster.thtd_yuuka_03_illusion:IsAlive()==false then
local illusion = CreateUnitByName(
"yuuka_illusion",
targetPoint,
false,
caster:GetOwner(),
caster:GetOwner(),
caster:GetTeam()
)
caster.thtd_yuuka_03_illusion = illusion
illusion.thtd_yuuka_03_owner = caster
ParticleManager:DestroyParticleSystem(seed,true)
illusion:SetControllableByPlayer(caster:GetPlayerOwnerID(), true)
keys.ability:ApplyDataDrivenModifier(caster, illusion, "modifier_yuuka_03_illusion", nil)
local midOrigin = (caster:GetAbsOrigin() + targetPoint)/2
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_03.vpcf", PATTACH_CUSTOMORIGIN, illusion)
ParticleManager:SetParticleControl(effectIndex, 0, midOrigin)
ParticleManager:SetParticleControl(effectIndex, 7, midOrigin)
illusion.effect = effectIndex
illusion:SetContextThink(DoUniqueString("thtd_yuuka_03_illusion"),
function()
if GameRules:IsGamePaused() then return 0.1 end
illusion:SetBaseDamageMax(caster:THTD_GetAttack())
illusion:SetBaseDamageMin(caster:THTD_GetAttack())
illusion:InheritOwnerBuff(caster)
if caster==nil or caster:IsNull() or caster:THTD_IsHidden() or caster:IsAlive()==false then
illusion:AddNoDraw()
illusion:ForceKill(true)
return nil
elseif illusion:IsAttacking() == false and caster:IsChanneling() == false and caster:THTD_IsAggressiveLock()==false then
illusion:MoveToPositionAggressive(illusion:GetOrigin() + illusion:GetForwardVector() * 100)
illusion:THTD_SetAggressiveLock()
end
return 0.5
end,
0)
else
local midOrigin = (caster:GetAbsOrigin() + targetPoint)/2
ParticleManager:SetParticleControl(caster.thtd_yuuka_03_illusion.effect, 0, midOrigin)
ParticleManager:SetParticleControl(caster.thtd_yuuka_03_illusion.effect, 7, midOrigin)
caster.thtd_yuuka_03_illusion:SetAbsOrigin(targetPoint)
FindClearSpaceForUnit(caster.thtd_yuuka_03_illusion, targetPoint, false)
end
end
function OnThinkYuuka03(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
if caster.thtd_yuuka_03_illusion ~= nil and caster.thtd_yuuka_03_illusion:IsNull()==false and caster.thtd_yuuka_03_illusion:IsAlive() then
local midOrigin = (caster:GetAbsOrigin() + caster.thtd_yuuka_03_illusion:GetAbsOrigin())/2
local dis = GetDistanceBetweenTwoEntity(caster,caster.thtd_yuuka_03_illusion)
local targets = THTD_FindUnitsInRadius(caster,midOrigin,dis/2)
local damage = math.floor(caster:THTD_GetAbilityPowerDamage(keys.ability) * keys.tick)
for k,v in pairs(targets) do
if IsValidAlive(v) then
local modifier = v:FindModifierByName("modifier_thtd_yuuka_03_death")
if modifier ~= nil then
modifier:SetDuration(keys.tick + 0.1, false)
else
keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_thtd_yuuka_03_death", {duration = keys.tick + 0.1})
end
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
end
end
end
function OnYuuka03Death(keys)
-- local caster = EntIndexToHScript(keys.caster_entindex)
-- local target = keys.unit
-- if caster == nil or caster:IsNull() or caster:IsAlive() == false then
-- return
-- end
-- if caster.thtd_yuuka_03_kill_count == nil then
-- caster.thtd_yuuka_03_kill_count = 0
-- end
-- if caster.thtd_yuuka_03_kill_count < keys.max_count then
-- caster.thtd_yuuka_03_kill_count = caster.thtd_yuuka_03_kill_count + 1
-- caster:AddDamageOutgoingAll(keys.damage_up, "thtd_yuuka_03_kill_bonus")
-- caster:THTD_AddBaseAttack(keys.damage_up, "thtd_yuuka_03_kill_bonus")
-- caster:THTD_AddBasePower(keys.damage_up, "thtd_yuuka_03_kill_bonus")
-- end
end
function OnYuuka04SpellStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local targetPoint = keys.target_points[1]
caster.cool_down_bonus_count = 0
if caster.ability_dummy_unit~=nil then
caster.ability_dummy_unit:RemoveSelf()
keys.ability.effectcircle = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectcircle,true)
keys.ability.effectIndex = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectIndex,true)
keys.ability.effectIndex_b = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectIndex_b,true)
end
local owner
if caster.thtd_yuuka_03_owner == nil then
owner = caster
else
owner = caster.thtd_yuuka_03_owner
end
local unit = CreateUnitByName(
"npc_dota2x_unit_yuuka04_spark"
,caster:GetOrigin()
,false
,caster
,caster
,caster:GetTeam()
)
local ability_dummy_unit = unit:FindAbilityByName("ability_dummy_unit")
ability_dummy_unit:SetLevel(1)
keys.ability.effectcircle = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/yuuka_04_spark_circle.vpcf", PATTACH_CUSTOMORIGIN, unit)
keys.ability.effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/yuuka_04_spark.vpcf", PATTACH_CUSTOMORIGIN, unit)
keys.ability.effectIndex_b = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind.vpcf", PATTACH_CUSTOMORIGIN, unit)
keys.ability:SetContextNum("ability_yuuka_04_spark_unit",unit:GetEntityIndex(),0)
YuukaSparkParticleControl(caster,keys.ability,targetPoint)
keys.ability:SetContextNum("ability_yuuka_04_spark_lock",0,0)
caster.thtd_Yuuka_04_count = 1
caster.thtd_Yuuka_04_last_distance = 10
caster.thtd_Yuuka_04_currentForward = caster:GetForwardVector()
caster.ability_dummy_unit = unit
if caster.thtd_yuuka_03_illusion ~= nil and caster.thtd_yuuka_03_illusion:IsNull()==false and caster.thtd_yuuka_03_illusion:IsAlive() then
local ability = caster.thtd_yuuka_03_illusion:FindAbilityByName("thtd_yuuka_04")
if ability == nil then
ability = caster.thtd_yuuka_03_illusion:AddAbility("thtd_yuuka_04")
end
if ability:GetLevel() ~= 1 then
ability:SetLevel(1)
end
ability:EndCooldown()
local count = 1
caster.thtd_yuuka_03_illusion:SetContextThink(DoUniqueString("thtd_yuuka_02_plant"),
function()
if GameRules:IsGamePaused() then return 0.03 end
if count > 50 then return nil end
if not ability:IsCooldownReady() then return nil end
caster.thtd_yuuka_03_illusion:CastAbilityOnPosition(targetPoint,ability,caster:GetPlayerOwnerID())
count = count + 1
return 0.1
end,
0)
end
end
function YuukaSparkParticleControl(caster,ability,targetPoint)
local unitIndex = ability:GetContext("ability_yuuka_04_spark_unit")
local unit = EntIndexToHScript(unitIndex)
if(ability.targetPoint == targetPoint)then
return
else
ability.targetPoint = targetPoint
end
if(unit == nil or ability.effectIndex == -1 or ability.effectcircle == -1)then
return
end
forwardRad = GetRadBetweenTwoVec2D(targetPoint,caster:GetOrigin())
vecForward = Vector(math.cos(math.pi/2 + forwardRad),math.sin(math.pi/2 + forwardRad),0)
unit:SetForwardVector(vecForward)
vecUnit = caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,160)
vecColor = Vector(255,255,255)
unit:SetAbsOrigin(vecUnit)
ParticleManager:SetParticleControl(ability.effectcircle, 0, caster:GetOrigin())
local effect2ForwardRad = GetRadBetweenTwoVec2D(caster:GetOrigin(),targetPoint)
local effect2VecForward = Vector(math.cos(effect2ForwardRad)*1400,math.sin(effect2ForwardRad)*1400,0) + caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,108)
ParticleManager:SetParticleControl(ability.effectIndex, 0, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 92,caster:GetForwardVector().y * 92,150))
ParticleManager:SetParticleControl(ability.effectIndex, 1, effect2VecForward)
ParticleManager:SetParticleControl(ability.effectIndex, 2, vecColor)
local forwardRadwind = forwardRad + math.pi
ParticleManager:SetParticleControl(ability.effectIndex, 8, Vector(math.cos(forwardRadwind),math.sin(forwardRadwind),0))
ParticleManager:SetParticleControl(ability.effectIndex, 9, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,108))
ParticleManager:SetParticleControl(ability.effectIndex_b, 0, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 92,caster:GetForwardVector().y * 92,150))
ParticleManager:SetParticleControlForward(ability.effectIndex_b, 3, Vector(math.cos(forwardRadwind),math.sin(forwardRadwind),0))
end
function OnYuuka04SpellRemove(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local unitIndex = keys.ability:GetContext("ability_yuuka_04_spark_unit")
local unit = EntIndexToHScript(unitIndex)
if unit~=nil then
unit:RemoveSelf()
keys.ability.effectcircle = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectcircle,true)
keys.ability.effectIndex = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectIndex,true)
keys.ability.effectIndex_b = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectIndex_b,true)
end
keys.ability:SetContextNum("ability_yuuka_04_spark_lock",1,0)
caster:StopSound("Sound_THTD.thtd_yuuka_04")
caster.ability_dummy_unit = nil
end
function OnYuuka04SpellThink(keys)
if GameRules:IsGamePaused() then return end
if (keys.ability:GetContext("ability_yuuka_04_spark_lock")==1) then
return
end
local caster = EntIndexToHScript(keys.caster_entindex)
local vecCaster = caster:GetOrigin()
local targetPoint = vecCaster + caster:GetForwardVector()
local nextForward,maxCount = FindYuuka04MaxCountEnemeiesForward(keys)
if nextForward ~= nil then
local forward = GetYuuka04ForwardMove(caster.thtd_Yuuka_04_currentForward,nextForward,caster.thtd_Yuuka_04_count * math.pi/180)
local distance = GetDistanceBetweenTwoVec2D(forward, nextForward)
if caster.thtd_Yuuka_04_last_distance <= distance then
caster.thtd_Yuuka_04_count = caster.thtd_Yuuka_04_count * - 1
end
caster.thtd_Yuuka_04_last_distance = distance
local NowDamageTargets =
FindUnitsInLine(
caster:GetTeamNumber(),
caster:GetOrigin(),
caster:GetOrigin() + keys.DamageLenth * caster.thtd_Yuuka_04_currentForward,
nil,
keys.DamageWidth,
keys.ability:GetAbilityTargetTeam(),
keys.ability:GetAbilityTargetType(),
keys.ability:GetAbilityTargetFlags()
)
local NowCount = 0
for k,v in pairs(NowDamageTargets) do
if v~=nil and v:IsNull()==false and v:IsAlive() then
NowCount = NowCount + 1
end
end
if distance > math.sin(math.pi/18) and distance < 1.86 and NowCount~=maxCount then
caster:SetForwardVector(forward)
caster.thtd_Yuuka_04_currentForward = forward
end
else
caster:SetForwardVector(caster.thtd_Yuuka_04_currentForward)
end
local targetPoint = vecCaster + caster.thtd_Yuuka_04_currentForward
if caster.thtd_effect_count == nil then
caster.thtd_effect_count = 0
end
if caster.thtd_effect_count >= 10 then
local attacker = caster
if caster.thtd_yuuka_03_owner~=nil then
attacker = caster.thtd_yuuka_03_owner
end
local DamageTargets =
FindUnitsInLine(
attacker:GetTeamNumber(),
caster:GetOrigin(),
caster:GetOrigin() + keys.DamageLenth * caster.thtd_Yuuka_04_currentForward,
nil,
keys.DamageWidth,
keys.ability:GetAbilityTargetTeam(),
keys.ability:GetAbilityTargetType(),
keys.ability:GetAbilityTargetFlags()
)
if #DamageTargets > 0 then
local damage = attacker:THTD_GetAbilityPowerDamage(keys.ability) / keys.times
for _,v in pairs(DamageTargets) do
local damage_table = {
ability = keys.ability,
victim = v,
attacker = attacker,
damage = damage,
damage_type = keys.ability:GetAbilityDamageType(),
damage_flags = DOTA_DAMAGE_FLAG_NONE
}
UnitDamageTarget(damage_table)
end
end
caster.thtd_effect_count = 0
else
caster.thtd_effect_count = caster.thtd_effect_count + 1
end
YuukaSparkParticleControl(caster,keys.ability,targetPoint)
end
function FindYuuka04MaxCountEnemeiesForward(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local forwardVector = caster.thtd_Yuuka_04_currentForward
local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),keys.DamageLenth)
if #targets <= 0 then
return nil,0
end
local maxCount = 0
for i=1,120 do
local sparkRad = math.pi * i/60
local count = 0
for k,v in pairs(targets) do
if v~=nil and v:IsNull()==false and v:IsAlive() then
if IsRadInRect(v:GetOrigin(),caster:GetOrigin(),keys.DamageWidth,keys.DamageLenth,sparkRad) then
count = count + 1
end
end
end
if count > maxCount then
forwardVector = Vector(math.cos(sparkRad),math.sin(sparkRad),forwardVector.z)
maxCount = count
end
end
return forwardVector,maxCount
end
function GetYuuka04ForwardMove(forward,nextForward,rad)
local forwardVector = Vector(math.cos(rad)*forward.x - math.sin(rad)*forward.y,
forward.y*math.cos(rad) + forward.x*math.sin(rad),
0)
return forwardVector
end