restructure
This commit is contained in:
271
game/scripts/vscripts/abilities/abilitysanae.lua
Executable file
271
game/scripts/vscripts/abilities/abilitysanae.lua
Executable file
@@ -0,0 +1,271 @@
|
||||
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
|
||||
Reference in New Issue
Block a user