254 lines
10 KiB
Lua
Executable File
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 |