359 lines
12 KiB
Lua
Executable File
359 lines
12 KiB
Lua
Executable File
function OnReimu01AttackLanded(keys)
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
local target = keys.target
|
||
|
||
if keys.ability:GetLevel() < 1 then return end
|
||
|
||
if caster.thtd_reimu_01_attack_count == nil then
|
||
caster.thtd_reimu_01_attack_count = 0
|
||
end
|
||
|
||
caster.thtd_reimu_01_attack_count = caster.thtd_reimu_01_attack_count + 1
|
||
|
||
if caster.thtd_reimu_01_attack_count >= keys.max_count then
|
||
caster.thtd_reimu_01_attack_count = 0
|
||
|
||
caster:EmitSound("Sound_THTD.thtd_reimu_01")
|
||
|
||
local count = 1
|
||
caster:SetContextThink(DoUniqueString("ability_reimu_01_projectile"),
|
||
function ()
|
||
if GameRules:IsGamePaused() then return 0.03 end
|
||
if count <= 3 then
|
||
Reimu01Projectile(keys,count)
|
||
count = count + 1
|
||
else
|
||
return nil
|
||
end
|
||
return 0.2
|
||
end,
|
||
0.2)
|
||
end
|
||
end
|
||
|
||
function OnReimu01ProjectileHit(keys)
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
local target = keys.target
|
||
|
||
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability)
|
||
local DamageTable = {
|
||
ability = keys.ability,
|
||
victim = target,
|
||
attacker = caster,
|
||
damage = damage * Reimu02GetChance(caster),
|
||
damage_type = keys.ability:GetAbilityDamageType(),
|
||
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
||
}
|
||
UnitDamageTarget(DamageTable)
|
||
end
|
||
|
||
function Reimu01Projectile(keys,count)
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
local target = keys.target
|
||
|
||
local rad = GetRadBetweenTwoVec2D(caster:GetOrigin(),target:GetOrigin())
|
||
|
||
local forward = Vector(math.cos(rad),math.sin(rad),caster:GetForwardVector().z)
|
||
|
||
local info =
|
||
{
|
||
Ability = keys.ability,
|
||
EffectName = "particles/heroes/thtd_reimu/ability_reimu_01_projectile.vpcf",
|
||
vSpawnOrigin = caster:GetOrigin() + Vector(0,0,128),
|
||
fDistance = 1000,
|
||
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 + DOTA_UNIT_TARGET_BASIC,
|
||
fExpireTime = GameRules:GetGameTime() + 10.0,
|
||
bDeleteOnHit = false,
|
||
vVelocity = forward * 1500,
|
||
bProvidesVision = true,
|
||
iVisionRadius = 1000,
|
||
iVisionTeamNumber = caster:GetTeamNumber()
|
||
}
|
||
local projectile = ProjectileManager:CreateLinearProjectile(info)
|
||
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
|
||
|
||
for i=1,count do
|
||
local iVec = Vector( math.cos(rad + math.pi/18*(i+0.5)) * 2000 , math.sin(rad + math.pi/18*(i+0.5)) * 2000 , caster:GetForwardVector().z )
|
||
info.vVelocity = iVec
|
||
projectile = ProjectileManager:CreateLinearProjectile(info)
|
||
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
|
||
iVec = Vector( math.cos(rad - math.pi/18*(i+0.5)) * 2000 , math.sin(rad - math.pi/18*(i+0.5)) * 2000 , caster:GetForwardVector().z )
|
||
info.vVelocity = iVec
|
||
projectile = ProjectileManager:CreateLinearProjectile(info)
|
||
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
|
||
end
|
||
end
|
||
|
||
function Reimu02GetChance(caster)
|
||
if caster.thtd_reimu_04_ball_count == nil then
|
||
caster.thtd_reimu_04_ball_count = 0
|
||
end
|
||
if caster.thtd_reimu_04_hot_duration == nil then
|
||
caster.thtd_reimu_04_hot_duration = 0
|
||
end
|
||
|
||
if RollPercentage(caster:GetAbilityValue("thtd_reimu_02", "chance")) then
|
||
if caster.thtd_reimu_04_ball_count < 7 then
|
||
caster:EmitSound("Sound_THTD.thtd_reimu_02")
|
||
caster.thtd_reimu_04_ball_count = caster.thtd_reimu_04_ball_count + 1
|
||
caster.thtd_reimu_04_hot_duration = 20.0
|
||
end
|
||
return 2.0
|
||
end
|
||
|
||
return 1.0
|
||
end
|
||
|
||
function OnReimu03SpellStart(keys)
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
local targetPoint = keys.target_points[1]
|
||
|
||
caster:EmitSound("Sound_THTD.thtd_reimu_03_01")
|
||
|
||
Reimu03ThrowBallToPoint(keys,caster:GetOrigin(),targetPoint,120,1)
|
||
end
|
||
|
||
function Reimu03ThrowBallToPoint(keys,origin,targetpoint,vhigh,count)
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
|
||
local curOrigin = Vector(origin.x,origin.y,origin.z)
|
||
|
||
local effectIndex = ParticleManager:CreateParticle("particles/heroes/reimu/reimu_01_ball.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
||
ParticleManager:SetParticleControl(effectIndex, 0, curOrigin)
|
||
ParticleManager:SetParticleControl(effectIndex, 1, Vector(1/count,0,0))
|
||
ParticleManager:SetParticleControl(effectIndex, 2, Vector(500/count,0,0))
|
||
|
||
local g = -10
|
||
local dis = GetDistanceBetweenTwoVec2D(origin,targetpoint)
|
||
local vh = vhigh
|
||
local t = math.abs(2*vh/g)
|
||
local speed = dis/t
|
||
local rad = GetRadBetweenTwoVec2D(origin,targetpoint)
|
||
|
||
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability)
|
||
caster:SetContextThink(DoUniqueString("ability_reimu_03"),
|
||
function()
|
||
if GameRules:IsGamePaused() then return 0.03 end
|
||
vh = vh + g
|
||
curOrigin = Vector(curOrigin.x + math.cos(rad) * speed,curOrigin.y + math.sin(rad) * speed,curOrigin.z + vh)
|
||
ParticleManager:SetParticleControl(effectIndex, 0, curOrigin)
|
||
if curOrigin.z >= caster:GetOrigin().z - 50 then
|
||
return 0.02
|
||
else
|
||
curOrigin.z = caster:GetOrigin().z
|
||
ParticleManager:DestroyParticleSystem(effectIndex,true)
|
||
local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/reimu/reimu_01_effect.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
||
ParticleManager:SetParticleControl(effectIndex2, 0, curOrigin)
|
||
ParticleManager:SetParticleControl(effectIndex2, 1, Vector(500/count,0,0))
|
||
ParticleManager:DestroyParticleSystem(effectIndex2,false)
|
||
|
||
local targets = THTD_FindUnitsInRadius(caster,curOrigin,keys.range/count)
|
||
for k,v in pairs(targets) do
|
||
local DamageTable = {
|
||
ability = keys.ability,
|
||
victim = v,
|
||
attacker = caster,
|
||
damage = math.floor((damage/count) * Reimu02GetChance(caster)),
|
||
damage_type = keys.ability:GetAbilityDamageType(),
|
||
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
||
}
|
||
UnitDamageTarget(DamageTable)
|
||
UnitStunTarget(caster,v,keys.stun_time/count)
|
||
end
|
||
|
||
if count < keys.max_count then
|
||
count = count + 1
|
||
for i=1,count do
|
||
Reimu03ThrowBallToPoint(keys,curOrigin,curOrigin+RandomVector(300-count*30),vhigh*400/442,count)
|
||
end
|
||
end
|
||
caster:EmitSound("Sound_THTD.thtd_reimu_03_02")
|
||
return nil
|
||
end
|
||
end,
|
||
0)
|
||
end
|
||
|
||
function OnReimu04SpellThink(keys)
|
||
if GameRules:IsGamePaused() then return end
|
||
if keys.ability:GetLevel() < 1 then return end
|
||
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
|
||
-- 初始化
|
||
if caster.thtd_reimu_04_ball_count == nil then
|
||
caster.thtd_reimu_04_ball_count = 0
|
||
end
|
||
|
||
if caster.thtd_reimu_04_think_count == nil then
|
||
caster.thtd_reimu_04_think_count = 0
|
||
end
|
||
|
||
if caster.thtd_reimu_04_think_count < 72 then
|
||
caster.thtd_reimu_04_think_count = caster.thtd_reimu_04_think_count + 1
|
||
else
|
||
caster.thtd_reimu_04_think_count = 0
|
||
end
|
||
|
||
if caster.thtd_reimu_04_ball_table == nil then
|
||
caster.thtd_reimu_04_ball_table = {}
|
||
end
|
||
|
||
for i=1,7 do
|
||
if caster.thtd_reimu_04_ball_table[i] == nil then
|
||
caster.thtd_reimu_04_ball_table[i] = {}
|
||
end
|
||
caster.thtd_reimu_04_ball_table[i]["origin"] =
|
||
caster:GetOrigin() +
|
||
Vector(
|
||
math.cos(i*2*math.pi/7 + caster.thtd_reimu_04_think_count * math.pi/36)*75,
|
||
math.sin(i*2*math.pi/7 + caster.thtd_reimu_04_think_count * math.pi/36)*75,
|
||
128)
|
||
end
|
||
|
||
-- 根据积累数量初始化光球
|
||
if caster.thtd_reimu_04_ball_count > 0 then
|
||
for i=1,caster.thtd_reimu_04_ball_count do
|
||
if caster.thtd_reimu_04_ball_table[i]["effectIndex"] == nil then
|
||
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_reimu/ability_reimu_04.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
||
ParticleManager:SetParticleControl(effectIndex, 1, Vector(1/12,0,0))
|
||
ParticleManager:SetParticleControl(effectIndex, 2, Vector(500/12,0,0))
|
||
caster.thtd_reimu_04_ball_table[i]["effectIndex"] = effectIndex
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 旋转光球
|
||
for i=1,7 do
|
||
if caster.thtd_reimu_04_ball_table[i]["effectIndex"] ~= nil then
|
||
ParticleManager:SetParticleControl(caster.thtd_reimu_04_ball_table[i]["effectIndex"], 0, caster.thtd_reimu_04_ball_table[i]["origin"] )
|
||
end
|
||
end
|
||
|
||
if caster.thtd_reimu_04_ball_count == 7 and caster.thtd_reimu_04_ball_7_bonus == nil then
|
||
caster.thtd_reimu_04_ball_7_bonus = keys.power_up
|
||
if caster:IsPower999() then caster.thtd_reimu_04_ball_7_bonus = caster.thtd_reimu_04_ball_7_bonus * 7 end
|
||
caster:THTD_AddPowerPercentage(caster.thtd_reimu_04_ball_7_bonus, "thtd_reimu_04_power_buff")
|
||
caster:SetContextThink(DoUniqueString("thtd_reimu_04_power_bonus"),
|
||
function ()
|
||
if GameRules:IsGamePaused() then return 0.03 end
|
||
caster:THTD_AddPowerPercentage("thtd_reimu_04_power_buff")
|
||
caster.thtd_reimu_04_ball_7_bonus = nil
|
||
return nil
|
||
end,
|
||
7.0)
|
||
end
|
||
|
||
local tick_count = 36
|
||
if caster:IsPower666() then tick_count = 12 end
|
||
|
||
-- 光球攻击行为
|
||
if caster.thtd_reimu_04_ball_count == 7 and caster.thtd_reimu_04_think_count%tick_count == 0 then -- 原始为8,卡顿改善及伤害系数平衡
|
||
if caster.thtd_reimu_04_think_count >= 72 then caster.thtd_reimu_04_think_count = 0 end -- 修复达到72后连续触发,0余数为0造成
|
||
Reimu04AttackTargetPoint(keys)
|
||
for i=1,7 do
|
||
if caster.thtd_reimu_04_ball_table[i]["effectIndex"] ~= nil then
|
||
ParticleManager:SetParticleControl(caster.thtd_reimu_04_ball_table[i]["effectIndex"], 3, Vector(1000/12,0,0))
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 保持热度时间,结束光球
|
||
if caster.thtd_reimu_04_hot_duration == nil then
|
||
caster.thtd_reimu_04_hot_duration = 0
|
||
end
|
||
|
||
caster.thtd_reimu_04_hot_duration = caster.thtd_reimu_04_hot_duration - 0.02
|
||
|
||
if caster.thtd_reimu_04_hot_duration < 0 then
|
||
Reimu04ReleaseBall(keys)
|
||
end
|
||
end
|
||
|
||
function Reimu04ReleaseBall(keys)
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
if caster.thtd_reimu_04_ball_table ~= nil then
|
||
caster.thtd_reimu_04_hot_duration = 0
|
||
caster.thtd_reimu_04_ball_count = 0
|
||
for i=1,7 do
|
||
if caster.thtd_reimu_04_ball_table[i]["effectIndex"] ~= nil then
|
||
ParticleManager:DestroyParticleSystem(caster.thtd_reimu_04_ball_table[i]["effectIndex"],true)
|
||
caster.thtd_reimu_04_ball_table[i]["effectIndex"] = nil
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
function Reimu04AttackTargetPoint(keys)
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),1000)
|
||
if targets[1]==nil then return end
|
||
|
||
caster:EmitSound("Sound_THTD.thtd_reimu_04_01")
|
||
|
||
local target = targets[1]
|
||
local vecCaster = caster.thtd_reimu_04_ball_table[RandomInt(1,7)]["origin"]
|
||
local pointRad = GetRadBetweenTwoVec2D(vecCaster,target:GetOrigin())
|
||
|
||
local randomPi = RandomFloat(-2*math.pi,2*math.pi)
|
||
local forwardVec = Vector(math.cos(pointRad+randomPi), math.sin(pointRad+randomPi),RandomFloat(0,1))
|
||
|
||
local BulletTable = {
|
||
Ability = keys.ability,
|
||
EffectName = "particles/heroes/thtd_reimu/ability_reimu_04_projectile.vpcf",
|
||
vSpawnOrigin = vecCaster,
|
||
vSpawnOriginNew = vecCaster,
|
||
fDistance = 5000,
|
||
fStartRadius = 60,
|
||
fEndRadius = 60,
|
||
Source = caster,
|
||
bHasFrontalCone = false,
|
||
bRepalceExisting = false,
|
||
iUnitTargetTeams = "DOTA_UNIT_TARGET_TEAM_ENEMY",
|
||
iUnitTargetTypes = "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP",
|
||
iUnitTargetFlags = "DOTA_UNIT_TARGET_FLAG_NONE",
|
||
fExpireTime = GameRules:GetGameTime() + 10.0,
|
||
bDeleteOnHit = true,
|
||
vVelocity = forwardVec,
|
||
bProvidesVision = true,
|
||
iVisionRadius = 400,
|
||
iVisionTeamNumber = caster:GetTeamNumber(),
|
||
}
|
||
|
||
local speed = 2000
|
||
local acc = 200
|
||
local iVelo = 1000
|
||
|
||
CreateProjectileMoveToTarget(BulletTable,caster,target,speed,iVelo,-acc,
|
||
function(unit,vec)
|
||
local targetpoint = Vector(vec.x,vec.y,caster:GetOrigin().z)
|
||
local targets = THTD_FindUnitsInRadius(caster,targetpoint,keys.range)
|
||
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability)
|
||
for k,v in pairs(targets) do
|
||
local damage_table = {
|
||
victim = v,
|
||
attacker = caster,
|
||
damage = damage * Reimu02GetChance(caster),
|
||
ability = keys.ability,
|
||
damage_type = keys.ability:GetAbilityDamageType(),
|
||
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
||
}
|
||
UnitDamageTarget(damage_table)
|
||
end
|
||
|
||
caster:EmitSound("Sound_THTD.thtd_reimu_04_02")
|
||
|
||
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_reimu/ability_reimu_04_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
||
ParticleManager:SetParticleControl(effectIndex, 0, targetpoint)
|
||
ParticleManager:SetParticleControl(effectIndex, 3, targetpoint)
|
||
ParticleManager:DestroyParticleSystem(effectIndex,false)
|
||
end
|
||
)
|
||
end |