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 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