initial commit
This commit is contained in:
143
scripts/vscripts/abilities/abilityhina.lua
Executable file
143
scripts/vscripts/abilities/abilityhina.lua
Executable file
@@ -0,0 +1,143 @@
|
||||
|
||||
-- 特殊太卡,弃用
|
||||
function OnHina02Think(keys)
|
||||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||||
if keys.ability:GetLevel() < 1 then return end
|
||||
|
||||
-- caster:EmitSound("Hero_TrollWarlord.WhirlingAxes.Melee")
|
||||
|
||||
local effect = "particles/econ/items/troll_warlord/troll_ti10_shoulder/troll_ti10_whirling_axe_melee.vpcf"
|
||||
local damage = 1000
|
||||
local damage_tick = 0.1
|
||||
local damage_duration = 3.0
|
||||
local max_count = math.floor(damage_duration/damage_tick + 0.5)
|
||||
local radius = 1000 - 200
|
||||
local elapsed_duration = 0
|
||||
local enemies_hit = {}
|
||||
|
||||
local caster_pos = caster:GetAbsOrigin()
|
||||
local caster_direction = caster:GetForwardVector()
|
||||
local effectIndexList = {}
|
||||
local effectPointList = {}
|
||||
for i = 1,5 do
|
||||
local axe_target_point = RotatePosition(caster_pos, QAngle(0, i * 72, 0), caster_pos + caster_direction * 175)
|
||||
local effectIndex = ParticleManager:CreateParticle(effect, PATTACH_ABSORIGIN_FOLLOW, caster)
|
||||
ParticleManager:SetParticleControl(effectIndex, 0, caster_pos + Vector(0, 0, 100))
|
||||
ParticleManager:SetParticleControl(effectIndex, 1, axe_target_point + Vector(0, 0, 100))
|
||||
ParticleManager:SetParticleControl(effectIndex, 4, Vector(damage_duration, 0, 0))
|
||||
effectIndexList[i] = effectIndex
|
||||
effectPointList[i] = axe_target_point
|
||||
end
|
||||
|
||||
local count = 1
|
||||
caster:SetContextThink(DoUniqueString("dota_timer"),
|
||||
function()
|
||||
if GameRules:IsGamePaused() then return 0.1 end
|
||||
|
||||
for i = 1,5 do
|
||||
local axe_target_point = RotatePosition(caster_pos, QAngle(0, 360 * count/max_count, 0), effectPointList[i])
|
||||
axe_target_point = axe_target_point + (axe_target_point - caster_pos):Normalized() * radius * count/max_count
|
||||
ParticleManager:SetParticleControl(effectIndexList[i], 1, axe_target_point + Vector(0, 0, 100))
|
||||
end
|
||||
|
||||
local targets = THTD_FindUnitsInRadius(caster,caster_pos,1200)
|
||||
local damage = 1200
|
||||
for k,v in pairs(targets) do
|
||||
if v~=nil and v:IsNull()==false and v:IsAlive() then
|
||||
if enemies_hit[v:entindex()] ~= true then
|
||||
enemies_hit[v:entindex()] = true
|
||||
local DamageTable = {
|
||||
ability = keys.ability,
|
||||
victim = v,
|
||||
attacker = caster,
|
||||
damage = damage,
|
||||
damage_type = keys.ability:GetAbilityDamageType(),
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
||||
}
|
||||
UnitDamageTarget(DamageTable)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- If the duration is over, end
|
||||
if count < max_count then
|
||||
count = count + 1
|
||||
return damage_tick
|
||||
else
|
||||
for i = 1,5 do
|
||||
ParticleManager:ReleaseParticleIndex(effectIndexList[i])
|
||||
end
|
||||
return nil
|
||||
end
|
||||
end,
|
||||
0.1)
|
||||
end
|
||||
|
||||
|
||||
function OnSpellStartHina02(keys)
|
||||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||||
local targetPoint = keys.target_points[1]
|
||||
|
||||
local range = keys.range
|
||||
local bonus_crit = keys.bonus_crit
|
||||
local chance = keys.chance
|
||||
local duration = math.floor(keys.duration * 100 + 0.5)/100
|
||||
local tick = math.floor(keys.tick * 100 + 0.5)/100
|
||||
|
||||
local effect = "particles/econ/items/troll_warlord/troll_ti10_shoulder/troll_ti10_whirling_axe_melee.vpcf"
|
||||
local effectIndex = ParticleManager:CreateParticle(effect, PATTACH_ABSORIGIN_FOLLOW, caster)
|
||||
ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin() + Vector(0, 0, 100))
|
||||
ParticleManager:SetParticleControl(effectIndex, 1, targetPoint + Vector(0, 0, 100))
|
||||
ParticleManager:SetParticleControl(effectIndex, 4, Vector(duration + 4, 0, 0))
|
||||
|
||||
local powerChance = 0
|
||||
local pv = caster:GetAbilityPowerValue("thtd_hina_02")
|
||||
if pv ~= nil then
|
||||
powerChance = pv[1]
|
||||
end
|
||||
|
||||
local crit666 = 1
|
||||
if caster:IsPower666() then crit666 = 5 end
|
||||
|
||||
local time = duration
|
||||
caster:SetContextThink(DoUniqueString("dota_timer"),
|
||||
function()
|
||||
if GameRules:IsGamePaused() then return 0.1 end
|
||||
time = time - tick
|
||||
if time < 0 then
|
||||
ParticleManager:DestroyParticleSystem(effectIndex,true)
|
||||
return nil
|
||||
end
|
||||
|
||||
local targets = THTD_FindUnitsInRadius(caster,targetPoint,range)
|
||||
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability)
|
||||
for k,v in pairs(targets) do
|
||||
local crit = 1
|
||||
v.thtd_hina_02_debuff_count = math.min(999, (v.thtd_hina_02_debuff_count or 0) + 1)
|
||||
local count = v.thtd_hina_02_debuff_count
|
||||
if caster:IsPower999() then
|
||||
for _,tar in pairs(targets) do
|
||||
if v ~= tar then
|
||||
count = count + (tar.thtd_hina_02_debuff_count or 0) * 0.4
|
||||
end
|
||||
end
|
||||
end
|
||||
if RollPercentage(chance + powerChance) then
|
||||
crit = 1 + count * (bonus_crit + powerChance)/100
|
||||
end
|
||||
local DamageTable = {
|
||||
ability = keys.ability,
|
||||
victim = v,
|
||||
attacker = caster,
|
||||
damage = damage * crit * crit666,
|
||||
damage_type = keys.ability:GetAbilityDamageType(),
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
||||
}
|
||||
UnitDamageTarget(DamageTable)
|
||||
end
|
||||
|
||||
return tick
|
||||
end,
|
||||
tick)
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user