initial commit

This commit is contained in:
2021-10-24 15:36:18 -04:00
commit b9a5a8fe23
11982 changed files with 220468 additions and 0 deletions

View File

@@ -0,0 +1,324 @@
thtd_eirin_01 = class({})
function thtd_eirin_01:OnProjectileHit_ExtraData( hTarget, vLocation, data )
local caster = self:GetCaster()
local target = hTarget
-- local source = data.attacker -- 注意不支持 table类型数据会返回 nil
local source = EntIndexToHScript(data.attacker_entindex)
-- print("caster : ", caster:GetUnitName())
-- print("attacker : ", source:GetUnitName())
caster:RemoveGesture(ACT_DOTA_CAST_ABILITY_1)
if IsValidAlive(target) then
target:EmitSound("Sound_THTD.thtd_eirin_01.end")
local damage = caster:THTD_GetAbilityPowerDamage(caster:FindAbilityByName("thtd_eirin_01"))
local DamageTable = {
ability = self,
victim = target,
attacker = caster,
damage = damage,
damage_type = self:GetAbilityDamageType(),
damage_flags = DOTA_DAMAGE_FLAG_NONE
}
UnitDamageTarget(DamageTable)
Eirin01HitCount(caster)
end
return false
end
function OnEirin01TrackingProjectileToTarget(caster,target,attacker)
local ability = caster:FindAbilityByName("thtd_eirin_01")
local manaCost = ability:GetSpecialValueFor("mana_cost")
local manaBonus = ability:GetSpecialValueFor("mana_bonus")/100
local manaChance = ability:GetSpecialValueFor("mana_chance")
if caster:GetMana() >= manaCost then
if RollPercentage(caster:THTD_GetStar() * manaChance) then
caster:SetMana(math.min(caster:GetMaxMana(), caster:GetMana() - manaCost + caster:GetMaxMana() * manaBonus))
else
caster:SetMana(caster:GetMana() - manaCost)
end
local now = GameRules:GetGameTime()
if now - (target.thtd_eirin_01_project or 0) < 1 then
local delay = GetDistanceBetweenTwoVec2D(caster:GetAbsOrigin(), target:GetAbsOrigin()) / 1400
caster:SetContextThink(DoUniqueString("dota_timer"),
function()
if GameRules:IsGamePaused() then return 0.1 end
if IsValidAlive(target) then
local ability = caster:FindAbilityByName("thtd_eirin_01")
local damage = caster:THTD_GetAbilityPowerDamage(ability)
local DamageTable = {
ability = ability,
victim = target,
attacker = caster,
damage = damage,
damage_type = ability:GetAbilityDamageType(),
damage_flags = DOTA_DAMAGE_FLAG_NONE
}
UnitDamageTarget(DamageTable)
Eirin01HitCount(caster)
end
return nil
end,
delay)
return
end
target.thtd_eirin_01_project = now
caster:StartGesture(ACT_DOTA_CAST_ABILITY_1)
local info =
{
Target = target,
Source = caster,
Ability = ability,
EffectName = "particles/heroes/thtd_eirin/ability_eirin_01.vpcf",
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
ExtraData = { -- 注意,只支持简单类型,不支持 table数据
attacker_entindex = attacker:GetEntityIndex()
}
}
local projectile = ProjectileManager:CreateTrackingProjectile(info)
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
end
end
function OnDestroyEirin01Count(keys)
local caster = keys.caster
caster.thtd_eirin_01_count_lock = true
caster:SetContextThink(DoUniqueString("dota_timer"),
function()
if GameRules:IsGamePaused() then return 0.1 end
caster.thtd_eirin_01_count_lock = nil
return nil
end,
0.2)
local factor = math.floor(caster.thtd_eirin_01_count/50)
if factor > 0 then
local power = keys.power_bonus * factor
local crit = keys.crit_bonus * factor
local chance = keys.crit_chance * factor
caster:THTD_AddBasePower(power)
caster:THTD_AddBaseAttack(power)
caster:THTD_AddCritChance(chance)
caster:THTD_AddCritDamage(crit)
local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_legion_commander/legion_commander_duel_victory.vpcf", PATTACH_CUSTOMORIGIN, caster) --PATTACH_OVERHEAD_FOLLOW
ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin() + Vector(0, 0, 410))
local time = 25.0
caster:SetContextThink(DoUniqueString("dota_timer"),
function()
if GameRules:IsGamePaused() then return 0.1 end
if time < 0 then
caster:THTD_AddBasePower(-power)
caster:THTD_AddBaseAttack(-power)
caster:THTD_AddCritChance(-chance)
caster:THTD_AddCritDamage(-crit)
return nil
end
time = time - 0.2
return 0.2
end,
0)
end
ParticleManager:DestroyParticleSystem(caster.thtd_eirin_01_count_effect, true)
caster.thtd_eirin_01_count_effect = nil
caster.thtd_eirin_01_count = 0
end
function Eirin01HitCount(caster)
if caster.thtd_eirin_01_count_lock == true then
return
end
if not caster:HasModifier("modifier_eirin_01_count") then
caster:FindAbilityByName("thtd_eirin_02"):ApplyDataDrivenModifier(caster, caster, "modifier_eirin_01_count", {duration = SpawnSystem.CurTime})
local effectName = "particles/addons_gameplay/morokai_orb_overhead_counter.vpcf"
local effectIndex = ParticleManager:CreateParticle(effectName, PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin() + Vector(0, 0, 410))
ParticleManager:SetParticleControl(effectIndex, 2, Vector(1, 0, 0))
caster.thtd_eirin_01_count_effect = effectIndex
end
caster.thtd_eirin_01_count = (caster.thtd_eirin_01_count or 0) + 1
if caster.thtd_eirin_01_count > 500 then
caster.thtd_eirin_01_count = 500
return
end
local one = math.floor(caster.thtd_eirin_01_count/100)
local two = math.floor((caster.thtd_eirin_01_count - one * 100)/10)
local three = caster.thtd_eirin_01_count - one * 100 - two * 10
if three == 0 then three = 1 end
ParticleManager:SetParticleControl(caster.thtd_eirin_01_count_effect, 2, Vector(three, two, one))
end
function OnEirin02AttackLanded(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local range = caster:Script_GetAttackRange()
local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),range)
if #targets > 0 then
local target = nil
local index = RandomInt(1, #targets)
for k,v in pairs(targets) do
index = index - 1
if THTD_IsValid(v) and index == 0 then
target = v
break
end
end
local ability = caster:FindAbilityByName("thtd_eirin_01")
if target ~= nil and ability ~= nil then
OnEirin01TrackingProjectileToTarget(caster,target,keys.attacker)
end
end
end
function OnEirin03SpellStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local targetPoint = keys.target_points[1]
local hero = caster:GetOwner()
if hero.thtd_eirin_03_lock == nil then
hero.thtd_eirin_03_lock = false
end
if hero.thtd_eirin_03_lock == true then
return
end
hero.thtd_eirin_03_lock = true
caster:EmitSound("Sound_THTD.thtd_eirin_02")
local time = keys.duration_time
local range = keys.range
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_eirin/ability_eirin_03.vpcf", PATTACH_CUSTOMORIGIN, nil)
ParticleManager:SetParticleControl(effectIndex, 0, targetPoint)
ParticleManager:SetParticleControl(effectIndex, 1, Vector(range,0,0))
ParticleManager:SetParticleControl(effectIndex, 2, Vector(range,0,0))
ParticleManager:SetParticleControl(effectIndex, 4, targetPoint)
ParticleManager:SetParticleControl(effectIndex, 15, targetPoint)
local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/thtd_eirin/ability_eirin_03_aeons.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex2, 0, targetPoint)
ParticleManager:SetParticleControl(effectIndex2, 1, Vector(range,range,range))
local hitblockTag = DoUniqueString("hitblock")
local hitblock = {
circlePoint = targetPoint,
radius = range,
tag = hitblockTag,
}
table.insert(THTD_Custom_Hit_Block,hitblock)
caster:SetContextThink(DoUniqueString("thtd_eirin_03_spell_think"),
function()
if GameRules:IsGamePaused() then return 0.03 end
if time <= 0 then
ParticleManager:DestroyParticleSystem(effectIndex,true)
ParticleManager:DestroyParticleSystem(effectIndex2,true)
for index,block in pairs(THTD_Custom_Hit_Block) do
if block.tag == hitblockTag then
table.remove(THTD_Custom_Hit_Block,index)
end
end
hero.thtd_eirin_03_lock = false
return nil
end
time = time - 0.1
local targets = THTD_FindUnitsInRadius(caster,targetPoint,450)
for k,v in pairs(targets) do
if GetDistanceBetweenTwoVec2D(targetPoint, v:GetOrigin()) > range then
local forward = (v:GetAbsOrigin() - targetPoint):Normalized()
v:SetAbsOrigin(targetPoint+forward*range)
end
end
return 0.1
end,
0.1)
end
function OnEirin04SpellStart(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local vecCaster = keys.target_points[1]
local targetPoint = keys.target_points[1]
local pointRad = 0
if GetHitCustomBlock(vecCaster,targetPoint) ~= nil then
return
end
caster:EmitSound("Sound_THTD.thtd_eirin_04")
local maxRad = math.pi*150/180
for i=0,36 do
local forwardVec = Vector(math.cos(pointRad-maxRad/2+maxRad/12*i)*1500,math.sin(pointRad-maxRad/2+maxRad/12*i)*1500,0):Normalized()
local BulletTable = {
Ability = keys.ability,
EffectName = "particles/heroes/thtd_eirin/ability_eirin_04.vpcf",
vSpawnOrigin = vecCaster,
vSpawnOriginNew = vecCaster,
fDistance = 5000,
fStartRadius = 120,
fEndRadius = 120,
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 = false,
vVelocity = forwardVec,
bProvidesVision = true,
iVisionRadius = 400,
iVisionTeamNumber = caster:GetTeamNumber(),
iReflexCount = 0,
bReflexByBlock = true,
}
if i%2 == 0 then
BulletTable.EffectName = "particles/heroes/thtd_eirin/ability_eirin_04_red.vpcf"
end
CreateProjectileMoveToTargetPoint(BulletTable,caster,2000,0,0,
function(v,vecProjectile,reflexCount)
if v:IsNull()==false and v~=nil then
local damage_table = {
victim = v,
attacker = caster,
ability = keys.ability,
damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + reflexCount * keys.damage_up / 100),
damage_type = keys.ability:GetAbilityDamageType(),
damage_flags = keys.ability:GetAbilityTargetFlags()
}
UnitDamageTarget(damage_table)
end
end
)
end
end