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