Files
2HUCardTDGame/scripts/vscripts/abilities/abilitymarisa.lua
2021-10-24 15:36:18 -04:00

369 lines
13 KiB
Lua
Executable File

local marisa_star_table =
{
"particles/heroes/thtd_marisa/ability_marisa_02.vpcf",
"particles/heroes/thtd_marisa/ability_marisa_02_pink.vpcf",
"particles/heroes/thtd_marisa/ability_marisa_02_blue.vpcf",
"particles/heroes/thtd_marisa/ability_marisa_02_normal.vpcf",
}
function OnMarisa01SpellStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local targetPoint = keys.target_points[1]
if caster.spelling_lock == true then return end
caster.factor = 0
if caster.ability_dummy_unit~=nil then
caster.ability_dummy_unit:RemoveSelf()
keys.ability.effectcircle = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectcircle,true)
keys.ability.effectIndex = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectIndex,true)
keys.ability.effectIndex_b = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectIndex_b,true)
end
local unit = CreateUnitByName(
"npc_dota2x_unit_marisa04_spark"
,caster:GetOrigin()
,false
,caster
,caster
,caster:GetTeam()
)
local ability_dummy_unit = unit:FindAbilityByName("ability_dummy_unit")
ability_dummy_unit:SetLevel(1)
keys.ability.effectcircle = ParticleManager:CreateParticle("particles/heroes/marisa/marisa_04_spark_circle.vpcf", PATTACH_CUSTOMORIGIN, unit)
keys.ability.effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/marisa/marisa_04_spark.vpcf", PATTACH_CUSTOMORIGIN, unit)
keys.ability.effectIndex_b = ParticleManager:CreateParticle("particles/thd2/heroes/marisa/marisa_04_spark_wind_b.vpcf", PATTACH_CUSTOMORIGIN, unit)
keys.ability:SetContextNum("ability_marisa_04_spark_unit",unit:GetEntityIndex(),0)
MarisaSparkParticleControl(caster,keys.ability,targetPoint)
keys.ability:SetContextNum("ability_marisa_04_spark_lock",0,0)
caster.thtd_marisa_01_count = 1
caster.thtd_marisa_01_last_distance = 10
caster.thtd_marisa_01_currentForward = caster:GetForwardVector()
caster.ability_dummy_unit = unit
caster.spelling_lock = true
local locktime = keys.channel_time
caster:SetContextThink(DoUniqueString("thtd_marisa_lock"),
function()
if GameRules:IsGamePaused() then return 0.03 end
if caster.spelling_lock == true then return nil end
if caster == nil or caster:IsNull() or caster:IsAlive() == false then return nil end
caster.spelling_lock = false
return nil
end,
locktime)
end
function MarisaSparkParticleControl(caster,ability,targetPoint)
local unitIndex = ability:GetContext("ability_marisa_04_spark_unit")
local unit = EntIndexToHScript(unitIndex)
if(ability.targetPoint == targetPoint)then
return
else
ability.targetPoint = targetPoint
end
if(unit == nil or ability.effectIndex == -1 or ability.effectcircle == -1)then
return
end
forwardRad = GetRadBetweenTwoVec2D(targetPoint,caster:GetOrigin())
vecForward = Vector(math.cos(math.pi/2 + forwardRad),math.sin(math.pi/2 + forwardRad),0)
unit:SetForwardVector(vecForward)
vecUnit = caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,160)
vecColor = Vector(255,255,255)
unit:SetAbsOrigin(vecUnit)
ParticleManager:SetParticleControl(ability.effectcircle, 0, caster:GetOrigin())
local effect2ForwardRad = GetRadBetweenTwoVec2D(caster:GetOrigin(),targetPoint)
local effect2VecForward = Vector(math.cos(effect2ForwardRad)*1400,math.sin(effect2ForwardRad)*1400,0) + caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,108)
ParticleManager:SetParticleControl(ability.effectIndex, 0, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 92,caster:GetForwardVector().y * 92,150))
ParticleManager:SetParticleControl(ability.effectIndex, 1, effect2VecForward)
ParticleManager:SetParticleControl(ability.effectIndex, 2, vecColor)
local forwardRadwind = forwardRad + math.pi
ParticleManager:SetParticleControl(ability.effectIndex, 8, Vector(math.cos(forwardRadwind),math.sin(forwardRadwind),0))
ParticleManager:SetParticleControl(ability.effectIndex, 9, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,108))
ParticleManager:SetParticleControl(ability.effectIndex_b, 0, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 92,caster:GetForwardVector().y * 92,150))
ParticleManager:SetParticleControlForward(ability.effectIndex_b, 3, Vector(math.cos(forwardRadwind),math.sin(forwardRadwind),0))
end
function OnMarisa01SpellRemove(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
caster:THTD_AddPowerPercentage("thtd_marisa_03_bonus")
local unitIndex = keys.ability:GetContext("ability_marisa_04_spark_unit")
local unit = EntIndexToHScript(unitIndex)
if unit~=nil then
unit:RemoveSelf()
keys.ability.effectcircle = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectcircle,true)
keys.ability.effectIndex = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectIndex,true)
keys.ability.effectIndex_b = -1
ParticleManager:DestroyParticleSystem(keys.ability.effectIndex_b,true)
end
keys.ability:SetContextNum("ability_marisa_04_spark_lock",1,0)
if keys.ability:GetAbilityName() == "thtd_marisa_03" then
caster:StopSound("Sound_THTD.thtd_marisa_03")
else
caster:StopSound("Sound_THTD.thtd_marisa_01")
end
caster.ability_dummy_unit = nil
caster.spelling_lock = false
end
function FindMarisa01MaxCountEnemeiesForward(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local forwardVector = caster.thtd_marisa_01_currentForward
local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),keys.DamageLenth)
if #targets <= 0 then
return nil,0
end
local maxCount = 0
for i=1,120 do
local sparkRad = math.pi * i/60
local count = 0
for k,v in pairs(targets) do
if v~=nil and v:IsNull()==false and v:IsAlive() then
if IsRadInRect(v:GetOrigin(),caster:GetOrigin(),keys.DamageWidth,keys.DamageLenth,sparkRad) then
count = count + 1
end
end
end
if count > maxCount then
forwardVector = Vector(math.cos(sparkRad),math.sin(sparkRad),forwardVector.z)
maxCount = count
end
end
return forwardVector,maxCount
end
function GetMarisa01ForwardMove(forward,nextForward,rad)
local forwardVector = Vector(math.cos(rad)*forward.x - math.sin(rad)*forward.y,
forward.y*math.cos(rad) + forward.x*math.sin(rad),
0)
return forwardVector
end
function OnMarisa01SpellThink(keys)
if GameRules:IsGamePaused() then return end
if(keys.ability:GetContext("ability_marisa_04_spark_lock")==1)then
return
end
local caster = EntIndexToHScript(keys.caster_entindex)
local vecCaster = caster:GetOrigin()
if caster.factor == nil then
caster.factor = 0
end
if keys.ability:GetAbilityName() == "thtd_marisa_03" then
local nextForward,maxCount = FindMarisa01MaxCountEnemeiesForward(keys)
if nextForward ~= nil then
local forward = GetMarisa01ForwardMove(caster.thtd_marisa_01_currentForward,nextForward,caster.thtd_marisa_01_count * math.pi/180)
local distance = GetDistanceBetweenTwoVec2D(forward, nextForward)
if caster.thtd_marisa_01_last_distance <= distance then
caster.thtd_marisa_01_count = caster.thtd_marisa_01_count * -1
end
caster.thtd_marisa_01_last_distance = distance
local NowDamageTargets =
FindUnitsInLine(
caster:GetTeamNumber(),
caster:GetOrigin(),
caster:GetOrigin() + keys.DamageLenth * caster.thtd_marisa_01_currentForward,
nil,
keys.DamageWidth,
keys.ability:GetAbilityTargetTeam(),
keys.ability:GetAbilityTargetType(),
keys.ability:GetAbilityTargetFlags()
)
local NowCount = 0
for k,v in pairs(NowDamageTargets) do
if v~=nil and v:IsNull()==false and v:IsAlive() then
NowCount = NowCount + 1
end
end
if distance > math.sin(math.pi/18) and distance < 1.86 and NowCount~=maxCount then
caster:SetForwardVector(forward)
caster.thtd_marisa_01_currentForward = forward
end
else
caster:SetForwardVector(caster.thtd_marisa_01_currentForward)
end
if caster.factor == 100 then
local powerUp = 0
local pv = caster:GetAbilityPowerValue("thtd_marisa_03")
if pv ~= nil then
powerUp = pv[2]
end
local bonus = keys.power_up + powerUp
if caster:IsPower666() then
bonus = bonus * 2
end
caster:THTD_AddPowerPercentage(bonus, "thtd_marisa_03_bonus")
end
end
local targetPoint = vecCaster + caster.thtd_marisa_01_currentForward
if caster.factor % 10 == 0 then
local DamageTargets =
FindUnitsInLine(
caster:GetTeamNumber(),
caster:GetOrigin(),
caster:GetOrigin() + keys.DamageLenth * caster.thtd_marisa_01_currentForward,
nil,
keys.DamageWidth,
keys.ability:GetAbilityTargetTeam(),
keys.ability:GetAbilityTargetType(),
keys.ability:GetAbilityTargetFlags()
)
if #DamageTargets > 0 then
local powerDamage = 0
local pv = caster:GetAbilityPowerValue("thtd_marisa_03")
if pv ~= nil then
powerDamage = pv[1]
end
local deal_damage = (caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage()) * 0.2
if caster:FindAbilityByName("thtd_marisa_02"):GetLevel() > 1 then
deal_damage = deal_damage * (1 + 0.01 * caster.factor)
end
if caster:IsPower666() then deal_damage = deal_damage * 2 end
if caster:IsPower999() then deal_damage = deal_damage * 4 end
for _,v in pairs(DamageTargets) do
local info =
{
Target = v,
Source = caster,
Ability = keys.ability,
EffectName = marisa_star_table[RandomInt(1,#marisa_star_table)],
iMoveSpeed = 1400,
vSourceLoc= caster:GetAbsOrigin(), -- 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, -- Optional
iVisionRadius = 400, -- Optional
iVisionTeamNumber = caster:GetTeamNumber() -- Optional
}
local projectile = ProjectileManager:CreateTrackingProjectile(info)
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
local damage_table = {
ability = keys.ability,
victim = v,
attacker = caster,
damage = deal_damage,
damage_type = keys.ability:GetAbilityDamageType(),
damage_flags = DOTA_DAMAGE_FLAG_NONE
}
UnitDamageTarget(damage_table)
end
end
end
caster.factor = caster.factor + 1
MarisaSparkParticleControl(caster,keys.ability,targetPoint)
end
function OnMarisa02AttackLanded(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
local targetPoint = target:GetOrigin()
if keys.ability:GetLevel() < 1 then return end
local count = 2
local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),caster:Script_GetAttackRange())
caster:SetContextThink(DoUniqueString("thtd_marisa02_projectile"),
function()
if GameRules:IsGamePaused() then return 0.03 end
if #targets > 0 then
local index = RandomInt(1,#targets)
local info =
{
Target = targets[index],
Source = caster,
Ability = keys.ability,
EffectName = marisa_star_table[RandomInt(1,#marisa_star_table)],
iMoveSpeed = 1400,
vSourceLoc= caster:GetAbsOrigin(), -- 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, -- Optional
iVisionRadius = 400, -- Optional
iVisionTeamNumber = caster:GetTeamNumber() -- Optional
}
local projectile = ProjectileManager:CreateTrackingProjectile(info)
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
caster:EmitSound("Hero_Marisa.PreAttack")
if count > 0 then
count = count - 1
return 0.1
end
end
return nil
end,
0.1)
end
function OnMarisa02SpellHit(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
target:EmitSound("Hero_Marisa.ProjectileImpact")
local powerDamage = 0
local pv = caster:GetAbilityPowerValue("thtd_marisa_02")
if pv ~= nil then
powerDamage = pv[1]
end
local DamageTable = {
ability = keys.ability,
victim = target,
attacker = caster,
damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + powerDamage/100),
damage_type = keys.ability:GetAbilityDamageType(),
damage_flags = DOTA_DAMAGE_FLAG_NONE
}
UnitDamageTarget(DamageTable)
if keys.ability:GetAbilityName() == "thtd_marisa_02" then
caster:GiveMana(eys.mana)
end
end