271 lines
9.6 KiB
Lua
Executable File
271 lines
9.6 KiB
Lua
Executable File
thtd_sanae_01 = class({})
|
|
|
|
LinkLuaModifier("modifier_sanae_01", "abilities/abilitySanae", LUA_MODIFIER_MOTION_NONE)
|
|
|
|
function thtd_sanae_01:OnSpellStart()
|
|
local caster = self:GetCaster()
|
|
local target = self:GetCursorTarget()
|
|
|
|
-- AI需要改动的地方
|
|
caster.thtd_last_cast_unit = target
|
|
|
|
local ExtraData = {
|
|
count=0
|
|
}
|
|
|
|
self:Sanae01PassToNextUnit(caster,caster:GetOrigin(),target,ExtraData)
|
|
end
|
|
|
|
|
|
function thtd_sanae_01:Sanae01PassToNextUnit(source,loction,target,data)
|
|
local caster = self:GetCaster()
|
|
|
|
local info =
|
|
{
|
|
Target = target,
|
|
Source = source,
|
|
Ability = self,
|
|
EffectName = "particles/heroes/sanae/ability_sanae_01.vpcf",
|
|
iMoveSpeed = 1400,
|
|
vSourceLoc= loction, -- Optional (HOW)
|
|
bDrawsOnMinimap = false, -- Optional
|
|
bDodgeable = true, -- Optional
|
|
bIsAttack = false, -- Optional
|
|
bVisibleToEnemies = true, -- Optional
|
|
bReplaceExisting = false, -- Optional
|
|
flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended
|
|
bProvidesVision = true,
|
|
iVisionRadius = 400,
|
|
iVisionTeamNumber = caster:GetTeamNumber(),
|
|
ExtraData = {
|
|
count = data.count + 1
|
|
}
|
|
}
|
|
projectile = ProjectileManager:CreateTrackingProjectile(info)
|
|
end
|
|
|
|
|
|
function thtd_sanae_01:OnProjectileHit_ExtraData(hTarget, vLocation, data)
|
|
local caster = self:GetCaster()
|
|
local target = hTarget
|
|
|
|
if target:THTD_IsTower() and target.thtd_sanae_01_power_bonus == nil then
|
|
local duration_time = self:GetSpecialValueFor("duration_time")
|
|
target.thtd_sanae_01_power_bonus = math.max(1, math.floor(self:GetSpecialValueFor("power_bonus") * (1 - self:GetSpecialValueFor("down_percent")/100)^(data.count - 1)))
|
|
target:AddNewModifier(caster, self, "modifier_sanae_01", {duration = duration_time})
|
|
|
|
local effectIndex = ParticleManager:CreateParticle("particles/heroes/sanae/ability_sanae_01_effect.vpcf", PATTACH_CUSTOMORIGIN, target)
|
|
ParticleManager:SetParticleControlEnt(effectIndex , 0, target, 5, "follow_origin", Vector(0,0,0), true)
|
|
ParticleManager:DestroyParticleSystemTime(effectIndex, duration_time)
|
|
end
|
|
|
|
if data.count < self:GetSpecialValueFor("max_count") then
|
|
local targets =
|
|
FindUnitsInRadius(
|
|
caster:GetTeamNumber(),
|
|
caster:GetOrigin(),
|
|
nil,
|
|
self:GetSpecialValueFor("range"),
|
|
self:GetAbilityTargetTeam(),
|
|
self:GetAbilityTargetType(),
|
|
self:GetAbilityTargetFlags(),
|
|
FIND_ANY_ORDER,
|
|
false
|
|
)
|
|
for k,v in pairs(targets) do
|
|
if v~=nil and v~=target and v:THTD_IsTower() and v:HasModifier("modifier_sanae_01") == false then
|
|
self:Sanae01PassToNextUnit(target,vLocation,v,data)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
modifier_sanae_01 = class({})
|
|
|
|
function modifier_sanae_01:OnCreated( kv )
|
|
if IsServer() then
|
|
local target = self:GetParent()
|
|
target:THTD_AddBasePower(target.thtd_sanae_01_power_bonus)
|
|
end
|
|
end
|
|
|
|
function modifier_sanae_01:OnDestroy()
|
|
if IsServer() then
|
|
local target = self:GetParent()
|
|
target:THTD_AddBasePower(-target.thtd_sanae_01_power_bonus)
|
|
target.thtd_sanae_01_power_bonus = nil
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function OnSanae02SpellStart(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local targetPoint = keys.target_points[1]
|
|
|
|
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_sanae/ability_sanae_02.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
|
ParticleManager:SetParticleControl(effectIndex, 0, targetPoint)
|
|
ParticleManager:DestroyParticleSystemTime(effectIndex, keys.duration_time)
|
|
|
|
effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_sanae/ability_sanae_02_p.vpcf", PATTACH_CUSTOMORIGIN, nil)
|
|
ParticleManager:SetParticleControl(effectIndex, 0, targetPoint)
|
|
ParticleManager:DestroyParticleSystemTime(effectIndex, keys.duration_time)
|
|
|
|
local time = keys.duration_time
|
|
|
|
caster:SetContextThink(DoUniqueString("thtd_patchouli04_spell_start"),
|
|
function()
|
|
if GameRules:IsGamePaused() then return 0.03 end
|
|
if time <= 0 then return nil end
|
|
|
|
local targets = THTD_FindUnitsInRadius(caster, targetPoint, keys.range)
|
|
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2
|
|
for k,v in pairs(targets) do
|
|
local modifier = v:FindModifierByName("modifier_sanae_debuff")
|
|
if modifier == nil then
|
|
keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_sanae_debuff", {duration=0.2})
|
|
else
|
|
modifier:SetDuration(0.2,false)
|
|
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
|
|
time = time - 0.2
|
|
return 0.2
|
|
end,
|
|
0)
|
|
end
|
|
|
|
function OnSanae03SpellStart(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local targetPoint = keys.target_points[1]
|
|
|
|
local time = keys.duration_time
|
|
|
|
local vec = targetPoint + RandomVector(keys.range)
|
|
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_sanae_03/ability_sanae_03.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
|
ParticleManager:SetParticleControl(effectIndex, 0, vec)
|
|
ParticleManager:SetParticleControl(effectIndex, 1, vec)
|
|
ParticleManager:SetParticleControl(effectIndex, 3, vec)
|
|
ParticleManager:SetParticleControl(effectIndex, 4, vec)
|
|
ParticleManager:SetParticleControl(effectIndex, 5, vec)
|
|
ParticleManager:SetParticleControl(effectIndex, 6, vec)
|
|
ParticleManager:DestroyParticleSystem(effectIndex,false)
|
|
|
|
caster:SetContextThink(DoUniqueString("thtd_patchouli04_spell_start"),
|
|
function()
|
|
if GameRules:IsGamePaused() then return 0.03 end
|
|
if time <= 0 then return nil end
|
|
|
|
local targets = THTD_FindUnitsInRadius(caster,vec,keys.range)
|
|
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + caster:THTD_GetFaith() * keys.damage_up/100)
|
|
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)
|
|
UnitStunTarget(caster,v, keys.stun_time * (1 + caster:THTD_GetFaith() * keys.stun_up/100))
|
|
end
|
|
vec = targetPoint + RandomVector(keys.range)
|
|
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_sanae_03/ability_sanae_03.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
|
ParticleManager:SetParticleControl(effectIndex, 0, vec)
|
|
ParticleManager:SetParticleControl(effectIndex, 1, vec)
|
|
ParticleManager:SetParticleControl(effectIndex, 3, vec)
|
|
ParticleManager:SetParticleControl(effectIndex, 4, vec)
|
|
ParticleManager:SetParticleControl(effectIndex, 5, vec)
|
|
ParticleManager:SetParticleControl(effectIndex, 6, vec)
|
|
ParticleManager:DestroyParticleSystem(effectIndex,false)
|
|
time = time - 0.2
|
|
return 0.2
|
|
end,
|
|
0)
|
|
end
|
|
|
|
function OnSanae04SpellStart(keys)
|
|
local caster = keys.caster
|
|
|
|
local effectIndex = ParticleManager:CreateParticle("particles/heroes/sanae/ability_sanea_04_effect_b.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
|
ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin())
|
|
ParticleManager:DestroyParticleSystemTime(effectIndex, keys.duration_time)
|
|
|
|
if keys.ability:GetLevel() < 2 then return end
|
|
|
|
local hero = GameRules.HeroList[caster:GetPlayerOwnerID()]
|
|
if hero == nil then return end
|
|
for k,v in pairs(hero.thtd_hero_tower_list) do
|
|
local unitName = v:GetUnitName()
|
|
if unitName == "sanae" or unitName == "kanako" or unitName == "suwako" then
|
|
keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_sanae_04_buff", nil)
|
|
end
|
|
end
|
|
end
|
|
|
|
function OnCreatedSanae04Buff(keys)
|
|
keys.target:THTD_AddBasePower(keys.power_bonus * keys.target:THTD_GetFaith()/3, "thtd_sanae_04_buff")
|
|
end
|
|
|
|
function OnDestroySanae04Buff(keys)
|
|
keys.target:THTD_AddBasePower("thtd_sanae_04_buff")
|
|
end
|
|
|
|
function OnSanae04Created(keys)
|
|
-- local caster = EntIndexToHScript(keys.caster_entindex) 与下面一样
|
|
local caster = keys.caster
|
|
local target = keys.target
|
|
|
|
local unitName = target:GetUnitName()
|
|
if unitName == "sanae" or unitName == "kanako" or unitName == "suwako" then
|
|
if not target:HasModifier("modifier_sanae_04_combo_buff") then
|
|
local modifier = keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_sanae_04_combo_buff", nil)
|
|
local hero = GameRules.HeroList[caster:GetPlayerOwnerID()]
|
|
if hero ~= nil and hero.thtd_ss_faith ~= nil and hero.thtd_ss_faith > 0 then
|
|
modifier:SetStackCount(hero.thtd_ss_faith)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function OnSanae04Destroy(keys)
|
|
local caster = keys.caster
|
|
local target = keys.target
|
|
|
|
local unitName = target:GetUnitName()
|
|
if unitName == "sanae" or unitName == "kanako" or unitName == "suwako" then
|
|
if target:HasModifier("modifier_sanae_04_combo_buff") then
|
|
target:RemoveModifierByName("modifier_sanae_04_combo_buff")
|
|
end
|
|
if target:HasModifier("modifier_sanae_04_buff") then
|
|
target:RemoveModifierByName("modifier_sanae_04_buff")
|
|
end
|
|
end
|
|
end
|
|
|
|
function OnCreatedSanae04ComboBuff(keys)
|
|
keys.target:THTD_AddBasePower(math.floor(keys.target:THTD_GetFaith()/3), "thtd_sanae_04_combo_buff", "thtd_sanae_04_combo_buff")
|
|
end
|
|
|
|
function OnDestroySanae04ComboBuff(keys)
|
|
keys.target:THTD_AddBasePower("thtd_sanae_04_combo_buff")
|
|
end
|
|
|
|
function OnSanaeKill(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
caster:THTD_AddFaith()
|
|
end |