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

254 lines
10 KiB
Lua
Executable File

function OnRemilia01SpellStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local ability = keys.ability
local targetPoint = keys.target:GetOrigin()
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_remilia/ability_remilia_03_end.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex, 3, caster:GetOrigin())
ParticleManager:DestroyParticleSystem(effectIndex,false)
effectIndex = ParticleManager:CreateParticle("particles/heroes/moluo/abiilty_moluo_014.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex, 0, targetPoint)
ParticleManager:DestroyParticleSystem(effectIndex,false)
local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range)
local damage = caster:THTD_GetAbilityPowerDamage(ability)
local powerBonus = #targets * keys.power_bonus
local duration_time = math.floor(keys.duration_time * 100 + 0.5) / 100
for k,target in pairs(targets) do
local effectIndex = ParticleManager:CreateParticle("particles/heroes/moluo/ability_moluo01_explosion_vip.vpcf",PATTACH_CUSTOMORIGIN,caster)
ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "follow_origin", Vector(0,0,0), true)
ParticleManager:SetParticleControlEnt(effectIndex , 1, caster, 5, "follow_origin", Vector(0,0,0), true)
ParticleManager:SetParticleControlEnt(effectIndex , 2, target, 5, "follow_origin", Vector(0,0,0), true)
ParticleManager:SetParticleControlForward(effectIndex, 2, caster:GetForwardVector())
ParticleManager:SetParticleControlEnt(effectIndex , 5, caster, 5, "follow_origin", Vector(0,0,0), true)
ParticleManager:SetParticleControlEnt(effectIndex , 7, caster, 5, "follow_origin", Vector(0,0,0), true)
ParticleManager:SetParticleControlEnt(effectIndex , 10, caster, 5, "follow_origin", Vector(0,0,0), true)
local crit = 1
if target:HasModifier("modifier_remilia_03_debuff") then
crit = 10
end
local damage_table={
ability = ability,
victim=target,
attacker=caster,
damage=damage * crit,
damage_type=ability:GetAbilityDamageType(),
damage_flags=ability:GetAbilityTargetFlags()
}
UnitDamageTarget(damage_table)
OnRemilia02SpellStart(caster)
end
if powerBonus > 0 then
caster:THTD_AddBasePower(powerBonus)
caster:SetContextThink(DoUniqueString("dota_timer"),
function()
if GameRules:IsGamePaused() then return 0.1 end
caster:THTD_AddBasePower(-powerBonus)
return nil
end,
duration_time)
end
end
function OnRemilia02SpellStart(caster)
local step = caster:GetAbilityValue("thtd_remilia_02", "damage_up")
local maxUp = caster:GetAbilityValue("thtd_remilia_02", "max_up")
local duration = caster:GetAbilityValue("thtd_remilia_02", "duration_time")
if caster.thtd_remilia_02_outgoing == nil then
caster.thtd_remilia_02_outgoing = 0
end
local count = math.min(step, maxUp - caster.thtd_remilia_02_outgoing)
if count > 0 then
caster:AddDamageOutgoingMagical(count)
caster.thtd_remilia_02_outgoing = caster.thtd_remilia_02_outgoing + count
caster:SetContextThink(DoUniqueString("modifier_reimilia_02_buff_count"),
function()
if GameRules:IsGamePaused() then return 0.03 end
caster:AddDamageOutgoingMagical(-count)
caster.thtd_remilia_02_outgoing = caster.thtd_remilia_02_outgoing - count
return nil
end,
duration)
end
end
function OnRemilia03SpellStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
local targetPoint = keys.target_points[1]
local forward = (keys.target_points[1] - caster:GetOrigin()):Normalized()
local effectIndex = ParticleManager:CreateParticle("particles/heroes/remilia/ability_remilia_03_spark.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin() + Vector(forward.x * 92,forward.y * 92,150))
ParticleManager:SetParticleControl(effectIndex, 8, Vector(forward.x,forward.y,0))
ParticleManager:DestroyParticleSystem(effectIndex,false)
effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_remilia/ability_remilia_03_end.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex, 3, caster:GetOrigin())
ParticleManager:DestroyParticleSystem(effectIndex,false)
local info =
{
Ability = keys.ability,
EffectName = "particles/heroes/remilia/ability_remilia_01.vpcf",
vSpawnOrigin = caster:GetOrigin()+Vector(0,0,30),
fDistance = keys.distance,
fStartRadius = 300,
fEndRadius = 300,
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 = forward * 4000,
bProvidesVision = true,
iVisionRadius = 1000,
iVisionTeamNumber = caster:GetTeamNumber()
}
local projectile = ProjectileManager:CreateLinearProjectile(info)
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
end
function OnRemilia03SpellHit(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
local targetPoint = target:GetOrigin()
local effectIndex = ParticleManager:CreateParticle("particles/heroes/remilia/ability_remilia_01_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex, 0, targetPoint)
ParticleManager:SetParticleControl(effectIndex, 1, targetPoint)
ParticleManager:SetParticleControl(effectIndex, 3, targetPoint)
ParticleManager:SetParticleControl(effectIndex, 5, targetPoint)
ParticleManager:DestroyParticleSystem(effectIndex,false)
if caster.thtd_remilia_03_chance_count == nil then
caster.thtd_remilia_03_chance_count = 0
end
local chance = caster:GetAbilityValue("thtd_remilia_04", "chance")
local success = RollPercentage(chance)
if caster.thtd_remilia_03_chance_count >= 100/chance then
success = true
end
if success then
caster.thtd_remilia_03_chance_count = 0
else
caster.thtd_remilia_03_chance_count = caster.thtd_remilia_03_chance_count + 1
end
local damage = 0
local ability4 = caster:FindAbilityByName("thtd_remilia_04")
if ability4:GetLevel() > 0 and success then
damage = ability4:GetSpecialValueFor("power_damage_03") * caster:THTD_GetStarDamage()
if not target:HasModifier("modifier_remilia_03_debuff") then
keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_remilia_03_debuff",nil)
end
else
damage = caster:THTD_GetAbilityPowerDamage(keys.ability)
end
local crit = 1
if target:HasModifier("modifier_remilia_03_debuff") then
crit = 10
end
local damage_table = {
ability = keys.ability,
victim = target,
attacker = caster,
damage = damage * crit,
damage_type = keys.ability:GetAbilityDamageType(),
amage_flags = keys.ability:GetAbilityTargetFlags()
}
UnitDamageTarget(damage_table)
OnRemilia02SpellStart(caster)
end
function OnRemilia03Created(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
target:RemoveMagicalResist()
target:RemovePhysicalArmor()
local bonus = caster:GetAbilityValue("thtd_remilia_04", "damage_up")
target:AddDamageIncomingPhysical(bonus, "thtd_remilia_03_damage_up")
target:AddDamageIncomingMagical(bonus, "thtd_remilia_03_damage_up")
end
function OnRemilia03Destroy(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.unit
local targetPoint = target:GetOrigin()
local effectIndex = ParticleManager:CreateParticle("particles/heroes/remilia/ability_remilia_04_laser.vpcf",PATTACH_CUSTOMORIGIN,caster)
ParticleManager:SetParticleControl(effectIndex, 0, targetPoint+Vector(0,0,700))
ParticleManager:SetParticleControl(effectIndex, 1, targetPoint+Vector(800,0,800))
ParticleManager:SetParticleControl(effectIndex, 2, targetPoint+Vector(0,0,0))
ParticleManager:SetParticleControl(effectIndex, 3, targetPoint+Vector(-800,0,800))
ParticleManager:SetParticleControl(effectIndex, 4, targetPoint+Vector(0,0,1600))
ParticleManager:SetParticleControl(effectIndex, 6, targetPoint)
ParticleManager:DestroyParticleSystem(effectIndex,false)
local effectIndexSmoke = ParticleManager:CreateParticle("particles/heroes/remilia/ability_remilia_04_laser_rocket.vpcf",PATTACH_CUSTOMORIGIN,caster)
ParticleManager:SetParticleControl(effectIndexSmoke, 0, targetPoint+Vector(0,0,700))
ParticleManager:SetParticleControl(effectIndexSmoke, 1, Vector(1,0,0))
ParticleManager:SetParticleControl(effectIndexSmoke, 2, Vector(-1,0,0))
ParticleManager:SetParticleControl(effectIndexSmoke, 3, Vector(0,0,0.5))
ParticleManager:SetParticleControl(effectIndexSmoke, 4, Vector(0,0,-1))
ParticleManager:DestroyParticleSystem(effectIndexSmoke,false)
local ability = caster:FindAbilityByName("thtd_remilia_04")
local time = math.floor(ability:GetSpecialValueFor("duration_time") * 100 + 0.5) / 100
local tick = math.floor(ability:GetSpecialValueFor("tick_time") * 100 + 0.5) / 100
local range = ability:GetSpecialValueFor("range")
caster:EmitSound("Sound_THTD.thtd_remilia_04")
caster:SetContextThink(DoUniqueString("ability_remilia_03_effect_destroy"),
function()
if GameRules:IsGamePaused() then return 0.03 end
if time <= 0 then return nil end
if not THTD_IsValid(caster) then
ParticleManager:DestroyParticleSystem(effectIndex,true)
ParticleManager:DestroyParticleSystem(effectIndexSmoke,true)
return nil
end
local damage = caster:THTD_GetAbilityPowerDamage(ability)
local targets = THTD_FindUnitsInRadius(caster,targetPoint,range)
for k,v in pairs(targets) do
local crit = 1
if v:HasModifier("modifier_remilia_03_debuff") then
crit = 10
end
local damage_table={
ability = ability,
victim = v,
attacker = caster,
damage = damage * crit,
damage_type = ability:GetAbilityDamageType(),
damage_flags = ability:GetAbilityTargetFlags()
}
UnitDamageTarget(damage_table)
end
OnRemilia02SpellStart(caster)
time = time - tick
return tick
end,
0)
end