Files
2HUCardTDGame/game/scripts/vscripts/abilities/abilityrumia.lua
2021-11-10 08:48:00 -05:00

343 lines
12 KiB
Lua
Executable File

function OnRumia01AttackLanded(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,
damage_type = keys.ability:GetAbilityDamageType(),
damage_flags = DOTA_DAMAGE_FLAG_NONE
}
UnitDamageTarget(DamageTable)
end
function OnRumia01Kill(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
if caster.rumia_01_bonus == nil then
caster.rumia_01_bonus = 0
end
if caster:IsPower999() then
if caster.rumia_01_bonus < keys.max_bonus * 10 then
caster.rumia_01_bonus = caster.rumia_01_bonus + 1
caster:THTD_AddBasePower(1)
end
else
if caster.rumia_01_bonus < keys.max_bonus then
caster.rumia_01_bonus = caster.rumia_01_bonus + 1
caster:THTD_AddBasePower(1)
elseif caster.rumia_01_bonus > keys.max_bonus then
caster:THTD_AddBasePower(-(caster.rumia_01_bonus - keys.max_bonus))
caster.rumia_01_bonus = keys.max_bonus
end
end
end
function OnRumia02AttackLanded(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
if keys.ability:GetLevel() < 1 then return end
if caster.rumia_02_attack_count == nil then
caster.rumia_02_attack_count = 0
end
local powerCount = 0
local pv = caster:GetAbilityPowerValue("thtd_rumia_02")
if pv ~= nil then
powerCount = pv[1]
end
caster.rumia_02_attack_count = caster.rumia_02_attack_count + 1
if caster.rumia_02_attack_count >= (keys.max_count - powerCount) then
RumiaProjectileStart(keys)
caster.rumia_02_attack_count = 0
end
end
function RumiaProjectileStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
caster:EmitSound("Sound_THTD.thtd_rumia_01")
for i=1,12 do
local forwardCos = caster:GetForwardVector().x
local forwardSin = caster:GetForwardVector().y
local angle = (39 - 6.5 * i) / 180 * math.pi
local forward = Vector( math.cos(angle)*forwardCos - math.sin(angle)*forwardSin,
forwardSin*math.cos(angle) + forwardCos*math.sin(angle),0)
local info =
{
Ability = keys.ability,
EffectName = "particles/heroes/rumia/ability_rumia_02_projectile.vpcf",
vSpawnOrigin = caster:GetOrigin() + forward * 500 - caster:GetForwardVector() * 500 + Vector(0,0,128),
fDistance = 800,
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 = true,
vVelocity = caster:GetForwardVector() * 1800,
bProvidesVision = true,
iVisionRadius = 1000,
iVisionTeamNumber = caster:GetTeamNumber()
}
if caster:THTD_IsTowerEx() == true then
info.EffectName = "particles/heroes/rumia/ability_rumia_02_ex_projectile.vpcf"
end
local projectile = ProjectileManager:CreateLinearProjectile(info)
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
end
end
function OnRumiaProjectileHit(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 1)
if caster:THTD_IsTowerEx() == true then
damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 2)
end
if caster:IsPower666() then damage = damage * 10 end
local DamageTable = {
ability = keys.ability,
victim = target,
attacker = caster,
damage = damage,
damage_type = keys.ability:GetAbilityDamageType(),
damage_flags = DOTA_DAMAGE_FLAG_NONE
}
UnitDamageTarget(DamageTable)
end
function OnRumia03AttackLanded(keys)
if keys.ability:GetLevel()<1 then return end
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
if target.thtd_damage_lock == true then return end
if target:GetHealthPercent() > 70 and RollPercentage(keys.chance) then
local targetPoint = target:GetOrigin()
keys.ability:ApplyDataDrivenModifier(caster,target,"modifier_rumia_03_pause",{})
local pointRad = GetRadBetweenTwoVec2D(caster:GetOrigin(),targetPoint)
local randomPi = -2*math.pi
if RandomInt(0,1) == 0 then
randomPi = -2*math.pi
else
randomPi = 2*math.pi
end
local forwardVec = Vector(math.cos(pointRad+randomPi), math.sin(pointRad+randomPi),RandomFloat(0,1))
local projectileTable = {
Ability = keys.ability,
EffectName = "particles/heroes/thtd_rumia/ability_rumia_03.vpcf",
vSpawnOrigin = caster:GetOrigin(),
vSpawnOriginNew = caster:GetOrigin(),
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 = 4000
local acceleration = -400
local iVelocity = 1000
local ishit = false
local effectIndex = ParticleManager:CreateParticle(projectileTable.EffectName, PATTACH_CUSTOMORIGIN, nil)
ParticleManager:SetParticleControlForward(effectIndex,3,(projectileTable.vVelocity*iVelocity/50 + speed/50 * (targetPoint - caster:GetOrigin()):Normalized()):Normalized())
local ability = projectileTable.Ability
local targets = {}
local targets_remove = {}
local totalDistance = 0
local time = 0
local high = 0
caster:SetContextThink(DoUniqueString("ability_caster_projectile"),
function()
if GameRules:IsGamePaused() then return 0.03 end
-- 向心力单位向量
local vecCentripetal = (projectileTable.vSpawnOriginNew - targetPoint):Normalized()
-- 向心力
local forceCentripetal = speed/50
-- 初速度单位向量
local vecInVelocity = projectileTable.vVelocity
-- 初始力
local forceIn = iVelocity/50
-- 投射物矢量
local vecProjectile = vecInVelocity * forceIn + forceCentripetal * vecCentripetal
local vec = projectileTable.vSpawnOriginNew + vecProjectile + Vector(0,0,high)
-- 投射物单位向量
local particleForward = vecProjectile:Normalized()
-- 目标和投射物距离
local dis = GetDistanceBetweenTwoVec2D(targetPoint,vec)
ParticleManager:SetParticleControlForward(effectIndex,3,particleForward)
totalDistance = totalDistance + math.sqrt(forceIn*forceIn + forceCentripetal*forceCentripetal)
if(dis<400)then
if ishit == false then
ishit = true
target:StartGesture(ACT_DOTA_FLAIL)
end
high = high + 25
target:SetAbsOrigin(projectileTable.vSpawnOriginNew+400*Vector(forwardVec.x,forwardVec.y,0)-Vector(0,0,50))
end
if(dis<projectileTable.fEndRadius)then
if(projectileTable.bDeleteOnHit)then
OnRumia03AbilityEnd(caster,target,keys.ability,effectIndex,time)
return nil
end
end
if(totalDistance<projectileTable.fDistance and dis>=projectileTable.fEndRadius)then
ParticleManager:SetParticleControl(effectIndex,3,vec)
projectileTable.vSpawnOriginNew = vec
speed = speed + acceleration
time = time + 0.02
return 0.02
else
if func then func(projectileTable.vSpawnOriginNew) end
ParticleManager:DestroyParticleSystem(effectIndex,true)
return nil
end
end,
0.02)
end
end
function OnRumia03AbilityEnd(caster,target,ability,effectIndex,time)
caster:SetContextThink(DoUniqueString("ability_caster_projectile_END"),
function()
if GameRules:IsGamePaused() then return 0.03 end
target:RemoveModifierByName("modifier_rumia_03_pause")
ParticleManager:DestroyParticleSystem(effectIndex,true)
local effectIndexEnd = ParticleManager:CreateParticle("particles/heroes/thtd_rumia/ability_rumia_04_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndexEnd, 0, target:GetOrigin())
ParticleManager:SetParticleControl(effectIndexEnd, 3, target:GetOrigin())
ParticleManager:DestroyParticleSystem(effectIndexEnd,false)
target:SetContextThink(DoUniqueString("ability_caster_projectile_END"),
function()
if GameRules:IsGamePaused() then return 0.03 end
if THTD_IsValid(target) then
FindClearSpaceForUnit(target, target:GetOrigin(), false)
end
return nil
end,
0.2)
caster:AbilityKill(target, ability)
if caster.rumia_01_bonus == nil then
caster.rumia_01_bonus = 0
end
if caster.rumia_01_bonus < caster:GetAbilityValue("thtd_rumia_01", "max_bonus") then
caster.rumia_01_bonus = caster.rumia_01_bonus + 1
caster:THTD_AddBasePower(1)
end
return nil
end,
1.5 - time)
end
function Rumia04AttackTargetPoint(keys)
if keys.ability:GetLevel() < 1 then return end
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
local vecCaster = caster:GetOrigin()
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_rumia/ability_rumia_04.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
CreateProjectileMoveToPoint(BulletTable,caster,target:GetOrigin(),speed,iVelo,-acc,
function(vec)
local powerDamage = 0
local pv = caster:GetAbilityPowerValue("thtd_rumia_04")
if pv ~= nil then
powerDamage = pv[1]
end
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) + powerDamage * caster:THTD_GetStarDamage()
for k,v in pairs(targets) do
local damage_table = {
victim = v,
attacker = caster,
damage = damage,
ability = keys.ability,
damage_type = keys.ability:GetAbilityDamageType(),
damage_flags = DOTA_DAMAGE_FLAG_NONE,
}
UnitDamageTarget(damage_table)
end
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_rumia/ability_rumia_04_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex, 0, targetpoint)
ParticleManager:SetParticleControl(effectIndex, 3, targetpoint)
ParticleManager:DestroyParticleSystem(effectIndex,false)
end
)
end