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