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

309 lines
10 KiB
Lua
Executable File

function OnJunko01SpellStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
-- if caster == target then return end
if not target:THTD_IsTower() then return end
if target:HasModifier("modifier_junko_01") then return end
if target:GetPlayerOwnerID() ~= caster:GetPlayerOwnerID() then return end
keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_junko_01", nil)
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_junko/ability_junko_01_buff.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControlEnt(effectIndex , 0, target, 5, "follow_origin", Vector(0,0,0), true)
local hasCombo = caster:HasModifier("modifier_thtd_junko_01_combo_buff")
if hasCombo then
if THTD_IsValid(caster.ability_junko_01_target1) == false then
caster.ability_junko_01_target1 = target
elseif THTD_IsValid(caster.ability_junko_01_target2) == false then
caster.ability_junko_01_target2 = target
else
caster.ability_junko_01_target1 = caster.ability_junko_01_target2
caster.ability_junko_01_target2 = target
end
else
caster.ability_junko_01_target1 = target
end
target:SetContextThink(DoUniqueString("modifier_junko_01"),
function()
if GameRules:IsGamePaused() then return 0.03 end
if target == nil or target:IsNull() or target:IsAlive() == false then
ParticleManager:DestroyParticleSystem(effectIndex,true)
if caster ~= nil and caster:IsNull() == false then
if caster.ability_junko_01_target1 == target then
caster.ability_junko_01_target1 = nil
elseif caster.ability_junko_01_target2 == target then
caster.ability_junko_01_target2 = nil
end
if caster.ability_junko_01_target1 == nil and caster.ability_junko_01_target2 == nil then
ParticleManager:DestroyParticleSystem(caster.ability_junko_01_effectIndex,true)
caster.ability_junko_01_effectIndex = nil
end
end
return nil
end
local isCancel = false
if THTD_IsValid(caster) == false then
isCancel = true
if caster ~= nil and caster:IsNull() == false then
caster.ability_junko_01_target1 = nil
caster.ability_junko_01_target2 = nil
end
else
if caster:HasModifier("modifier_thtd_junko_01_combo_buff") == false then
if caster.ability_junko_01_target2 ~= nil then
caster.ability_junko_01_target1 = caster.ability_junko_01_target2
caster.ability_junko_01_target2 = nil
end
end
isCancel = (caster.ability_junko_01_target1 ~= target and caster.ability_junko_01_target2 ~= target)
end
if isCancel then
if target:HasModifier("modifier_junko_01") then
target:RemoveModifierByName("modifier_junko_01")
end
ParticleManager:DestroyParticleSystem(effectIndex,true)
if caster ~= nil and caster:IsNull() == false then
if caster.ability_junko_01_target1 == target then
caster.ability_junko_01_target1 = nil
elseif caster.ability_junko_01_target2 == target then
caster.ability_junko_01_target2 = nil
end
end
if caster.ability_junko_01_target1 == nil and caster.ability_junko_01_target2 == nil then
ParticleManager:DestroyParticleSystem(caster.ability_junko_01_effectIndex,true)
caster.ability_junko_01_effectIndex = nil
end
return nil
end
return 0.2
end,
0.2)
end
function OnCreatedJunko01Buff(keys)
local target = keys.target
local bonus = 0
if target:GetUnitName() == "hecatia" then
bonus = keys.hecatia_up
else
bonus = keys.damage_up
end
target:AddDamageOutgoingPure(bonus, "thtd_junko_01_damage_up")
end
function OnUpgradeJunko01Buff(keys)
local caster = keys.caster
local targets = {}
if caster.ability_junko_01_target1 ~= nil then
table.insert(targets, caster.ability_junko_01_target1)
end
if caster.ability_junko_01_target2 ~= nil then
table.insert(targets, caster.ability_junko_01_target2)
end
for _,target in pairs(targets) do
local bonus = 0
if target:GetUnitName() == "hecatia" then
bonus = keys.hecatia_up
else
bonus = keys.damage_up
end
target:AddDamageOutgoingPure(bonus, "thtd_junko_01_damage_up")
end
targets = {}
end
function OnDestroyJunko01Buff(keys)
keys.target:AddDamageOutgoingPure("thtd_junko_01_damage_up")
end
function OnJunko02SpellStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local casterForward = caster:GetForwardVector()
local casterPoint = caster:GetOrigin()
local point = THTDSystem:FindRadiusOnePointPerfectAOE(caster, caster:Script_GetAttackRange(), 390 * 2)
if point ~= nil then
casterForward = (Vector(point.x, point.y,casterPoint.z) - casterPoint):Normalized()
end
local duration_time = math.floor(keys.duration_time * 100 + 0.5) / 100
local tick = math.floor(keys.tick * 100 + 0.5) / 100
local time = duration_time
caster:SetContextThink("modifier_junko_02_think",
function()
if GameRules:IsGamePaused() then return 0.03 end
if not THTD_IsValid(caster) then return nil end
if time <= 0 then return nil end
local forwardCos = casterForward.x
local forwardSin = casterForward.y
local angle = (39 - 6.5 * RandomInt(0,12)) / 180 * math.pi
local forward = Vector( math.cos(angle)*forwardCos - math.sin(angle)*forwardSin,
forwardSin*math.cos(angle) + forwardCos*math.sin(angle),0)
local info =
{
Ability = keys.ability,
EffectName = "particles/heroes/thtd_junko/ability_junko_02.vpcf",
vSpawnOrigin = casterPoint + forward * 500 - casterForward * 500 + Vector(0,0,128),
fDistance = 1200,
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, -- 解决撞击后消失
fExpireTime = GameRules:GetGameTime() + 10.0,
bDeleteOnHit = false,
vVelocity = casterForward * 1800,
bProvidesVision = true,
iVisionRadius = 1000,
iVisionTeamNumber = caster:GetTeamNumber()
}
local projectile = ProjectileManager:CreateLinearProjectile(info)
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
local targets =
FindUnitsInLine(
caster:GetTeamNumber(),
casterPoint,
casterPoint + casterForward * 1500,
nil,
390,
keys.ability:GetAbilityTargetTeam(),
keys.ability:GetAbilityTargetType(),
keys.ability:GetAbilityTargetFlags()
)
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability)
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
time = time - tick
return tick
end,
tick)
end
function OnJunko03SpellStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local friends = THTD_FindFriendlyUnitsAll(caster)
local duration_time = math.floor(keys.duration_time * 100 + 0.5) / 100
local damage_up = keys.damage_up
local power_suck = keys.power_suck
local modifier = caster:FindModifierByName("modifier_junko_03_buff")
if modifier == nil then
keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_junko_03_buff", nil)
else
modifier:SetDuration(duration_time, false)
end
local total = 0
for k,v in pairs(friends) do
if v ~= caster then
local power = v:THTD_GetBasePower()
local bonus_power = math.min(power, power_suck)
if bonus_power > 0 then
total = total + bonus_power
v:THTD_AddBasePower(-bonus_power)
v:SetContextThink(DoUniqueString("dota_timer"),
function()
if GameRules:IsGamePaused() then return 0.1 end
v:THTD_AddBasePower(bonus_power)
return nil
end,
duration_time)
end
end
end
if total > 0 then
caster:THTD_AddBasePower(total)
caster:SetContextThink(DoUniqueString("dota_timer"),
function()
if GameRules:IsGamePaused() then return 0.1 end
caster:THTD_AddBasePower(-total)
return nil
end,
duration_time)
end
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_junko/ability_junko_03.vpcf", PATTACH_CUSTOMORIGIN, nil)
ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin())
ParticleManager:DestroyParticleSystem(effectIndex,false)
end
function OnCreatedJunko03Buff(keys)
keys.target:AddDamageOutgoingAll(keys.damage_up, "thtd_junko_03_damage_up")
end
function OnDestroyJunko03Buff(keys)
keys.target:AddDamageOutgoingAll("thtd_junko_03_damage_up")
end
function OnJunko04SpellStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local targetPoint = keys.target_points[1]
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 1)
local targets = THTD_FindUnitsInRadius(caster,targetPoint,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)
if THTD_IsValid(v) and v:HasModifier("modifier_junko_04_debuff") == false then
keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_junko_04_debuff", nil)
end
end
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_junko/ability_junko_04.vpcf", PATTACH_CUSTOMORIGIN, nil)
ParticleManager:SetParticleControl(effectIndex, 0, targetPoint+Vector(0,0,64))
ParticleManager:SetParticleControl(effectIndex, 1, Vector(1,0,0))
ParticleManager:SetParticleControl(effectIndex, 2, Vector(255,255,255))
ParticleManager:SetParticleControl(effectIndex, 3, targetPoint)
ParticleManager:DestroyParticleSystem(effectIndex,false)
end
function OnThinkJunko04Debuff(keys)
local caster = keys.caster
local target = keys.target
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 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)
end