initial commit

This commit is contained in:
achmad
2026-05-29 15:11:31 +07:00
commit 777ee9bad8
1539 changed files with 172449 additions and 0 deletions
+19
View File
@@ -0,0 +1,19 @@
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
{
custom_net_tables =
[
"custom_stats",
"crystal_currency",
"cards",
"player_info",
"cooldown_info",
"sound_cooldowns",
"rubick_stolen_abilities",
"ability_alt_cast_states",
"arsenal_catalog",
"arsenal_loadouts",
"arsenal_inventory",
"arsenal_market",
"death_sentence_contracts",
]
}
@@ -0,0 +1,985 @@
dotaa_abilities
{
"witch_base"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/witch_base"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityValues"
{
"amp_death_bonus" "15"
"attack_death_bonus" "25"
"health_death_bonus" "200"
"armor_death_bonus" "1"
}
}
"kaban_rofl_ability"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/kaban_rofl_ability"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
}
"chicken_attack"
{
"BaseClass" "beastmaster_hawk_dive"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"MaxLevel" "1"
"FightRecapLevel" "1"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "350"
"AbilityCastPoint" "0.0"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "4"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "0"
"AbilityValues"
{
"precast_warning_time" "0.35"
}
}
"pig_charge"
{
"BaseClass" "primal_beast_onslaught" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats.
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_HERO"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilityCastPoint" "0"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
"AbilityCastGestureSlot" "DEFAULT"
//"AbilityCastRange" "2000"
"AbilityCooldown" "5"
"AbilityManaCost" "0"
"AbilityValues"
{
"charge_speed" "460"
"chargeup_time" "0.45"
"knockback_radius" "100"
"max_distance" "400"
"knockback_distance" "110"
"knockback_damage" "65"
"knockback_duration" "0.2"
"max_charge_time" "0.4"
"turn_rate" "70"
"base_power" "0.05"
"movement_turn_rate" "50"
"stun_duration" "0.2"
}
}
"sheep_coil"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/sheep_coil"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilityCastRange" "600"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "2.5"
"AbilityManaCost" "25"
"AbilityValues"
{
"radius" "125"
"damage" "15"
"projectile_speed" "1000"
"slow_duration" "2.5"
"movement_slow" "-5"
"precast_warning_time" "0.3"
}
}
"boss_nevermore_coil_wave"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/boss_nevermore_coil_wave"
"AbilityTextureName" "nevermore_shadowraze1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityCastRange" "10000"
"AbilityCastPoint" "0.4"
"AbilityCooldown" "0"
"AbilityManaCost" "0"
"AbilityValues"
{
"radius" "160"
"damage" "160"
"start_delay" "0.9"
"pulse_count" "4"
"step_distance" "340"
"projectile_speed" "1100"
"precast_warning_time" "0.9"
"debuff_duration" "5.0"
"coil_stack_bonus_damage" "20"
"coil_slow_per_stack" "3"
}
"AbilityCastAnimation" "ACT_DOTA_RAZE_1"
}
"boss_nevermore_coil_beam"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/boss_nevermore_coil_beam"
"AbilityTextureName" "nevermore_shadowraze3"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityCastRange" "10000"
"AbilityCastPoint" "0.4"
"AbilityCooldown" "0"
"AbilityManaCost" "0"
"AbilityValues"
{
"radius" "160"
"start_delay" "0.9"
"precast_warning_time" "0.85"
"second_wave_delay" "1.0"
"lane_slot_count" "12"
"lane_slot_phase_bonus" "2"
"beam_start_dist" "140"
"beam_step" "195"
"knockback_distance" "900"
"knockback_duration" "0.42"
"coil_stack_bonus_damage" "20"
"coil_slow_per_stack" "3"
}
"AbilityCastAnimation" "ACT_DOTA_RAZE_1"
}
"boss_nevermore_hub_crossburst"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/boss_nevermore_hub_crossburst"
"AbilityTextureName" "nevermore_shadowraze2"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityCastRange" "10000"
"AbilityCastPoint" "0.35"
"AbilityCooldown" "0"
"AbilityManaCost" "0"
"AbilityValues"
{
"radius" "165"
"spawn_pick_radius" "1500"
"ring_count" "7"
"ring_count_phase_bonus" "1"
"ring_step" "190"
"ring_start_dist" "90"
"ring_interval" "0.52"
"first_ring_delay" "0.55"
"precast_warning_time" "0.82"
"knockback_distance" "650"
"knockback_duration" "0.38"
"coil_stack_bonus_damage" "20"
"coil_slow_per_stack" "3"
}
"AbilityCastAnimation" "ACT_DOTA_RAZE_1"
}
"boss_nevermore_triple_coil_aoe"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/boss_nevermore_triple_coil_aoe"
"AbilityTextureName" "nevermore_shadowraze2"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityCastRange" "10000"
"AbilityCastPoint" "0.4"
"AbilityCooldown" "0"
"AbilityManaCost" "0"
"AbilityValues"
{
"radius" "300"
"damage" "120"
"delay" "0.9"
"precast_warning_time" "0.9"
"side_offset" "170"
"forward_offset" "170"
"coil_radius" "120"
"debuff_duration" "5.0"
"coil_stack_bonus_damage" "20"
"coil_slow_per_stack" "3"
}
"AbilityCastAnimation" "ACT_DOTA_RAZE_2"
}
"boss_nevermore_requiem_barrage"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/boss_nevermore_requiem_barrage"
"AbilityTextureName" "nevermore_requiem"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityCastRange" "12000"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "0"
"AbilityManaCost" "0"
"AbilityValues"
{
"channel_time" "12.8"
"wave_interval" "0.88"
"wave_distance" "7200"
"wave_speed" "1120"
"wave_speed_min" "832"
"wave_speed_max" "1568"
"wave_preview_time" "0.5"
"wave_width_start" "112"
"wave_width_end" "112"
"damage" "272"
"permanent_magic_resist_reduce_per_hit" "24"
"radius" "400"
}
}
"boss_nevermore_time_walk"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/boss_nevermore_time_walk"
"AbilityTextureName" "faceless_void_time_walk"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityCastRange" "9000"
"AbilityCastPoint" "0.25"
"AbilityCooldown" "0"
"AbilityManaCost" "0"
"AbilityValues"
{
"range" "9000"
"speed" "1500"
"radius" "220"
"damage" "180"
"coil_interval" "0.2"
"side_wave_interval" "0.35"
}
"AbilityCastAnimation" "ACT_DOTA_FLAIL"
}
"terrorblade_terror_wave"
{
// General
//-------------------------------------------------------------------------------------------------------------
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"MaxLevel" "1"
"FightRecapLevel" "1"
"IsGrantedByScepter" "0"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "0"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "0"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"fear_duration" "1.22"
"scepter_radius"
{
"value" "7000"
"affected_by_aoe_increase" "1"
}
"damage" "500"
"scepter_speed" "1000"
"scepter_spawn_delay" "0.6"
"scepter_meta_duration" "15"
}
}
"agro_leader"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/agro_leader"
"MaxLevel" "1"
"AbilityCooldown" "8"
"AbilityCastPoint" "0.8"
"AbilityTextureName" "axe_berserkers_call"
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityValues"
{
"radius" "700"
"duration" "3"
}
}
"thief_arrow"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/thief_arrow"
"AbilityTextureName" "mirana_arrow"
"MaxLevel" "1"
// Ability General
//-------------------------------------------------------------------------------------------------------------
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
// Ability Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "600"
"AbilityCastPoint" "0.8"
// Ability Resource
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "1.5"
"AbilityManaCost" "0"
// Damage
//-------------------------------------------------------------------------------------------------------------
"AbilityDamage" "100"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"arrow_speed" "857.0"
"arrow_width" "115"
"arrow_range" "1100"
}
}
"thief_charge"
{
"BaseClass" "spirit_breaker_charge_of_darkness"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Spirit_Breaker.ChargeOfDarkness"
"HasShardUpgrade" "1"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastPoint" "0.1"
"AbilityCastRange" "0"
// Time
//-------------------------------------------------------------------------------------------------------------
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "0"
// Stats
//-------------------------------------------------------------------------------------------------------------
"AbilityModifierSupportValue" ".30" // applies multiple modifiers
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"movement_speed" "1420"
"stun_duration" "1"
"bash_radius" "300"
"vision_radius" "400 400 400 400"
"vision_duration" "0.94 0.94 0.94 0.94"
"AbilityCooldown" "5"
"out_of_world_time" "0"
"guaranteed_bash_time" "0"
"reveal_charge" "0"
"windup_time" "0.5"
"min_movespeed_bonus_pct" "25"
"linger_time_min" "0"
"linger_time_max" "0"
"charge_for_max_linger" "0"
"precast_warning_time" "0.5"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"black_dragon_fireball"
{
// General
//-------------------------------------------------------------------------------------------------------------
"MaxLevel" "1"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"FightRecapLevel" "1"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "500"
"AbilityCastPoint" "0.3"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "5"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "25"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"radius"
{
"value" "300"
"affected_by_aoe_increase" "1"
}
"damage" "225"
"duration" "2.5"
"burn_interval" "0.5"
"precast_warning_time" "1"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"black_dragon_dragonhide_aura"
{
// General
//-------------------------------------------------------------------------------------------------------------
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
"IsBreakable" "1"
"AbilityValues"
{
"bonus_armor"
{
"value" "12"
}
"radius"
{
"value" "650"
"affected_by_aoe_increase" "1"
}
}
}
"spawnlord_master_stomp"
{
// General
//-------------------------------------------------------------------------------------------------------------
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
// Stats
//-------------------------------------------------------------------------------------------------------------
"AbilityCastPoint" "0.65"
"AbilityCooldown" "12.0"
"AbilityManaCost" "100"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
"AbilityValues"
{
"radius" "400"
"damage"
{
"value" "400"
}
"duration"
{
"value" "6"
}
"armor_reduction_pct"
{
"value" "50"
}
"precast_warning_time" "0"
}
}
"spawnlord_master_freeze"
{
// General
//-------------------------------------------------------------------------------------------------------------
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST | DOTA_ABILITY_BEHAVIOR_ATTACK"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "15"
"AbilityCastRange" "650"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
"AbilityValues"
{
"duration"
{
"value" "1.5"
}
"damage"
{
"value" "100"
}
"tick_interval"
{
"value" "0.1"
}
"health_threshold_pct"
{
"value" "100" // 100 disables
}
}
}
"frogmen_acid_jump"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/frogmen_acid_jump"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityTextureName" "frogmen_arm_of_the_deep"
"AbilityCastRange" "600"
"AbilityCooldown" "6"
"AbilityManaCost" "0"
"AbilityCastPoint" "0.2"
"AbilityValues"
{
"radius" "225"
"stun_duration" "1.0"
"land_damage" "80"
"duration" "0.45"
"precast_warning_time" "0.15"
}
}
"mini_frog_catchy_lick"
{
"BaseClass" "largo_catchy_lick"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilitySound" "Hero_Largo.CatchyLick.Target.Layer1"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
"AbilityCastPoint" "0.2"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "3"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "05"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"AbilityCastRange" "700"
"damage" "175"
"pull_distance" "25"
"pull_distance_ally"
{
"value" "375"
"special_bonus_unique_largo_4" "+50"
}
"pull_duration" "0.15"
"strong_dispel"
{
"value" "0"
}
"dispel_hp_regen" "4 7 10 13"
"buff_duration" "10"
"AbilityCharges" "0"
"precast_warning_time" "0.15"
}
}
"frog_magi_wave"
{
"BaseClass" "kunkka_tidal_wave"
// General
//-------------------------------------------------------------------------------------------------------------
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_SHOW_IN_GUIDES"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"MaxLevel" "1"
"FightRecapLevel" "1"
"IsGrantedByShard" "0"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "600" // if changing this, change wave_distance_tooltip
"AbilityCastPoint" "0.2"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "12"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "0"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"speed" "1000"
"radius"
{
"value" "250"
"affected_by_aoe_increase" "1"
}
"damage" "480"
"duration" "1.0"
"wave_distance_tooltip" "600"
"knockback_distance" "300"
}
}
"frog_magi_torrent"
{
"BaseClass" "kunkka_torrent"
// General
//-------------------------------------------------------------------------------------------------------------
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilitySound" "Ability.Torrent"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "1300"
"AbilityCastPoint" "0.4"
// Time
//-------------------------------------------------------------------------------------------------------------
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "0"
// Stats
//-------------------------------------------------------------------------------------------------------------
"AbilityModifierSupportValue" "0.5" // applies 2 modifiers
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"radius" "200"
"movespeed_bonus" "-70"
"slow_duration" "3"
"stun_duration" "0"
"delay" "0"
"torrent_damage" "600"
"percent_instant" "0"
"damage_tick_interval" "0.2"
"AbilityCooldown" "7"
"precast_warning_time" "0.25"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"venomancer_poison"
{
"BaseClass" "venomancer_poison_sting"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"IsBreakable" "1"
"AbilityValues"
{
"duration" "3"
"damage" "140"
"movement_speed" "-14"
"hp_regen_reduction" "30"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"venomous_gale"
{
"BaseClass" "venomancer_venomous_gale"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Venomancer.VenomousGale"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
"AbilityCastGestureSlot" "DEFAULT"
"AbilityCastRange" "800"
"AbilityCastPoint" "0.0 0.0 0.0 0.0"
"AbilityManaCost" "100"
"AbilityValues"
{
"duration" "15"
"strike_damage" "500"
"tick_damage" "50"
"tick_interval" "1.0"
"movement_slow" "-50"
"radius" "125"
"speed" "1200"
"create_wards" "0"
"num_created_wards_tooltip" "0"
"ward_hp_dmg_pct" "0"
"AbilityCooldown" "10"
"explosion_damage" "300"
"explosion_stun_duration" "1.6"
"precast_warning_time" "0.1"
}
}
"spider_bite"
{
"BaseClass" "broodmother_incapacitating_bite"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"IsBreakable" "1"
"AbilityValues"
{
"miss_chance" "40"
"bonus_movespeed" "-15 -20 -25 -30"
"duration" "2.0 2.0 2.0 2.0"
"attack_damage" "0"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"spider_hunger"
{
"BaseClass" "broodmother_insatiable_hunger"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"FightRecapLevel" "2"
"HasShardUpgrade" "1"
"AbilityCastPoint" "0.2 0.2 0.2"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"AbilityCooldown" "10"
"AbilityManaCost" "0"
"AbilityValues"
{
"bonus_damage" "500"
"lifesteal_pct" "500"
"duration" "8"
"bat_bonus" "0"
"shard_damage_per_tick" "0"
"shard_damage_tick_interval" "0"
"aura_radius" "0"
}
}
"back_stun"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/demon_dragon_satyr/back_stun"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityTextureName" "centaur_hoof_stomp"
"MaxLevel" "1"
"AbilityCooldown" "5"
"AbilityManaCost" "0"
"AbilityCastPoint" "1.87"
"AbilityValues"
{
"cast_range" "600"
"duration" "2"
"damage" "300"
}
"precache"
{
"particle" "particles/generic_gameplay/generic_stunned.vpcf"
"soundfile" "soundevents/game_sounds_heroes/game_sounds_centaur.vsndevts"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_6"
}
"face_stun"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/demon_dragon_satyr/face_stun"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityTextureName" "centaur_hoof_stomp"
"MaxLevel" "1"
"AbilityCooldown" "5"
"AbilityManaCost" "0"
"AbilityCastPoint" "1.30"
"AbilityValues"
{
"cast_range" "300"
"duration" "2"
"damage" "300"
}
"precache"
{
"particle" "particles/generic_gameplay/generic_stunned.vpcf"
"soundfile" "soundevents/game_sounds_heroes/game_sounds_centaur.vsndevts"
}
"AbilityCastAnimation" "ACT_DOTA_LEAP_STUN"
}
"fear"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/demon_dragon_satyr/fear"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityTextureName" "night_stalker_void"
"MaxLevel" "1"
"AbilityCooldown" "25"
"AbilityManaCost" "0"
"AbilityCastPoint" "0.9"
"AbilityValues"
{
"cast_range" "1200"
"duration" "2.0"
}
"precache"
{
"particle" "particles/generic_gameplay/generic_feared.vpcf"
"soundfile" "soundevents/game_sounds_heroes/game_sounds_nightstalker.vsndevts"
}
"AbilityCastAnimation" "ACT_DOTA_AREA_DENY"
}
"ability_animation"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/demon_dragon_satyr/animation"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityTextureName" "centaur_return"
"MaxLevel" "1"
}
"ability_grab"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/demon_dragon_satyr/grab"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED"
"AbilityTextureName" "centaur_khan_war_stomp"
"MaxLevel" "1"
"AbilityCooldown" "12"
"AbilityManaCost" "0"
"AbilityCastPoint" "0.67"
"AbilityChannelTime" "5.0"
"AbilityValues"
{
"cast_range" "150"
"damage" "900"
}
"precache"
{
"particle" "particles/generic_gameplay/generic_stunned.vpcf"
}
"AbilityCastAnimation" "ACT_DOTA_NIAN_PIN_START"
}
}
@@ -0,0 +1,472 @@
dotaa_abilities
{
"zombie_virus"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/zombie_virus.lua"
"AbilityTextureName" "life_stealer_open_wounds"
"MaxLevel" "1"
"DamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityValues"
{
"damage" "1"
"tick_interval" "1"
"duration" "3"
"chance" "75"
"slow_movespeed" "15"
"armor" "1"
}
}
"zombie_armor_decress"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/zombie_armor_decress.lua"
"AbilityTextureName" "item_assault"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityValues"
{
"corruption_duration" "20"
"armor_debuff" "-3"
}
}
"ghost_evasive"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/ghost_evasive.lua"
"AbilityTextureName" "item_assault"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityValues"
{
"evasive" "33"
}
}
"wave_phasing_march"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/wave_phasing_march.lua"
"AbilityTextureName" "item_phase_boots"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityValues"
{
"bonus_movement_speed" "100"
}
}
"toxin"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/toxin.lua"
"AbilityTextureName" "viper_nethertoxin"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityValues"
{
"damage" "120"
"radius" "150"
"duration" "3"
"armor_magic_reduce_per_stack" "0.5"
"merge_radius_bonus"
{
"value" "45"
}
"merge_duration_bonus"
{
"value" "1"
}
}
}
"contract_head_leap"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/contract_head_leap.lua"
"AbilityTextureName" "monkey_king_tree_dance"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityValues"
{
"search_radius" "550"
"leap_interval" "2.4"
"leap_damage" "35"
"damage_from_attack_pct" "25"
"jump_duration" "0.45"
"height_above_hero" "140"
"damage_radius" "220"
"precast_warning_time" "0.85"
}
}
"bone_armor"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/bone_armor.lua"
"AbilityTextureName" "skeleton_king_mortal_strike"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityValues"
{
"armor_bonus" "12"
"damage_reflect_chance" "50"
"damage_reflect_pct" "25"
"hero_proximity_radius" "350"
"isolated_damage_multiplier" "1"
}
}
"skeleton_archer_fire_arrow"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/skeleton_archer.lua"
"AbilityTextureName" "clinkz_searing_arrows"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"AbilityValues"
{
"bonus_damage" "75"
}
}
"weaking_impetus"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/weaking_impetus.lua"
"AbilityTextureName" "enchantress_impetus"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"AbilityManaCost" "40"
"AbilityValues"
{
"damage_reduction" "5"
"debuff_duration" "5"
"mana_hit" "40"
"max_stacks" "10"
}
}
"zombie_rage"
{
"BaseClass" "life_stealer_rage"
// General
//-------------------------------------------------------------------------------------------------------------
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilitySound" "Hero_LifeStealer.Rage"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastPoint" "0"
"AbilityCastRange" "0"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "20"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "0"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"duration" "3.0"
"magic_resist"
{
"value" "80"
}
"status_resist"
{
"value" "50"
}
"debuff_immunity"
{
"value" "1"
}
"bonus_armor"
{
"value" "20"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"zombie_feast"
{
"BaseClass" "life_stealer_feast"
// General
//-------------------------------------------------------------------------------------------------------------
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"MaxLevel" "4"
"Innate" "1"
"DependentOnAbility" "life_stealer_infest"
"IsBreakable" "1"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"hp_leech_percent" "2.5"
"hp_damage_percent" "2.5"
"bonus_hp_per_hero" "10 10 10 10"
"bonus_hp_per_creep" "1"
"creep_deny_percent" "75"
"bonus_hp_total"
{
"dynamic_value" "true"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"zombie_open_wounds"
{
"BaseClass" "life_stealer_open_wounds"
// General
//-------------------------------------------------------------------------------------------------------------
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilitySound" "Hero_LifeStealer.OpenWounds.Cast"
"MaxLevel" "4"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastPoint" "0.2"
"AbilityCastRange" "300 400 500 600"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "30 25 20 15"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "100"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"duration" "7"
"slow_steps"
{
"value" "-50 -50 -40 -30 -20 -10 -10 -10"
"special_bonus_unique_lifestealer_4" "-15"
}
"heal_percent"
{
"value" "20 30 40 50"
"special_bonus_unique_lifestealer_6" "+25"
}
"max_health_as_damage_pct" "0"
"spread_radius"
{
"value" "700"
"affected_by_aoe_increase" "1"
}
"slow_step_pct_of_max" "70 80 90 100"
"slow_tooltip"
{
"value" "35 40 45 50"
"special_bonus_unique_lifestealer_4" "+15"
}
"reset_cooldown_on_kill"
{
"value" "0"
"special_bonus_facet_life_stealer_fleshfeast" "+1"
}
}
}
"skeleton_blast"
{
"BaseClass" "skeleton_king_hellfire_blast"
// General
//-------------------------------------------------------------------------------------------------------------
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG"
"FightRecapLevel" "1"
"AbilitySound" "Hero_SkeletonKing.Hellfire_Blast"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "525"
"AbilityCastPoint" "0.35 0.35 0.35 0.35"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "14 12 10 8"
// Damage.
//-------------------------------------------------------------------------------------------------------------
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "95 110 125 140"
// Stats
//-------------------------------------------------------------------------------------------------------------
"AbilityModifierSupportValue" "0.5" // Applies two modifiers
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"blast_speed" "1200"
"blast_stun_duration"
{
"value" "1.0 1.2 1.4 1.6"
"special_bonus_unique_wraith_king_11" "+1"
}
"blast_dot_duration"
{
"value" "2.0"
"special_bonus_facet_skeleton_king_facet_bone_guard"
{
"value" "+0"
"special_bonus_unique_wraith_king_facet_1" "+2"
}
}
"blast_slow" "-20"
"damage"
{
"value" "80 100 120 140"
}
"blast_dot_damage"
{
"value" "20 40 60 80"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"skeleton_king_mortal_strike"
{
// General
//-------------------------------------------------------------------------------------------------------------
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"AbilitySound" "Hero_SkeletonKing.CriticalStrike"
"HasShardUpgrade" "1"
"IsBreakable" "1"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"crit_mult" "200"
"wraith_cd_mult"
{
"value" "1"
}
"wraith_crit_bonus" "0"
"AbilityCooldown" "4.5"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"suicide_boys"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/zombie/Boss/suicide_boys.lua"
"AbilityTextureName" "techies_suicide"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"AbilityCooldown" "8"
"AbilityManaCost" "0"
"AbilityCastPoint" "0.0"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
"AbilityValues"
{
"radius" "2000"
"toss_damage" "0"
}
}
"wave_full_brutality"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/wave_full_brutality.lua"
"AbilityTextureName" "ogre_magi_bloodlust"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityValues"
{
"bonus_pct" "100"
}
}
"wave_desperate_vampirism"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/wave_desperate_vampirism.lua"
"AbilityTextureName" "life_stealer_feast"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityValues"
{
"hp_threshold_pct" "50"
"vamp_pct" "100"
}
}
"zombie_death_explosion"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/creep/zombie_death_explosion.lua"
"AbilityTextureName" "techies_remote_mines"
"MaxLevel" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityValues"
{
"radius" "200"
"explosion_damage" "220"
}
}
}
+106
View File
@@ -0,0 +1,106 @@
"DOTAAbilities"
{
"npc_squirrel_event"
{
"BaseClass" "npc_dota_creature"
"Model" "models/items/courier/hamster_courier/hamster_courier_lv1.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" "1.25"
"ArmorPhysical" "0"
"MagicalResistance" "0"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "1"
"StatusHealthRegen" "0"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
"Creature"
{
}
}
"npc_pig_event"
{
"BaseClass" "npc_dota_creature"
"Model" "models/items/courier/d2l_steambear/d2l_steambear.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" "1.25"
"ArmorPhysical" "0"
"MagicalResistance" "0"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "1"
"StatusHealthRegen" "0"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
"Creature"
{
}
}
"npc_wolf_event"
{
"BaseClass" "npc_dota_creature"
"Model" "models/pets/icewrack_wolf_alt/icewrack_wolf_alt.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" "1.25"
"ArmorPhysical" "0"
"MagicalResistance" "0"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "1"
"StatusHealthRegen" "0"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
"Creature"
{
}
}
}
+215
View File
@@ -0,0 +1,215 @@
"DOTAAbilities"
{
//=================================================================================================================
// Axe — кастомные ключи (*_custom), иконки ванильные (AbilityTextureName)
//=================================================================================================================
"axe_berserkers_call_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/axe/axe_berserkers_call_custom"
"AbilityTextureName" "axe_berserkers_call"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Axe.Berserkers_Call"
"HasShardUpgrade" "1"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "17 15 13 11"
"AbilityManaCost" "25"
"AbilityValues"
{
"radius"
{
"value" "315"
"special_bonus_unique_axe_5" "+85"
}
"bonus_armor"
{
"value" "10 15 20 25"
"special_bonus_unique_axe_7" "+10"
}
"duration" "5"
"shard_hunger_duration" "12"
}
"AbilityCastAnimation" "ACT_DOTA_OVERRIDE_ABILITY_1"
}
"axe_battle_hunger_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/axe/axe_battle_hunger_custom"
"AbilityTextureName" "axe_battle_hunger"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Axe.Battle_Hunger"
"MaxLevel" "4"
"AbilityCastRange" "750"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "24 18 12 6"
"AbilityManaCost" "35"
"AbilityValues"
{
"slow" "12"
"damage_per_second"
{
"value" "16 32 56 72"
"special_bonus_unique_axe_4" "+28"
}
"armor_mult" "100"
"speed_bonus" "8 10 12 14"
"speed_per_enemy_pct" "12"
"duration" "12"
}
"AbilityCastAnimation" "ACT_DOTA_OVERRIDE_ABILITY_2"
}
"axe_counter_helix_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/axe/axe_counter_helix_custom"
"AbilityTextureName" "axe_counter_helix"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"MaxLevel" "4"
"AbilityValues"
{
"damage"
{
"value" "55 90 125 160"
"special_bonus_unique_axe" "+160"
}
"radius" "275"
"trigger_chance" "14 18 22 26"
"duration" "0.3"
}
}
"axe_culling_blade_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/axe/axe_culling_blade_custom"
"AbilityTextureName" "axe_culling_blade"
"AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"FightRecapLevel" "2"
"AbilitySound" "Hero_Axe.Culling_Blade"
"MaxLevel" "3"
"RequiredLevel" "6"
"LevelsBetweenUpgrades" "6"
"HasScepterUpgrade" "1"
"AbilityCastRange" "400"
"AbilityCastPoint" "0.4"
"AbilityManaCost" "50"
"AbilityCooldown" "0"
"AbilityValues"
{
"cull_radius"
{
"value" "175"
"affected_by_aoe_increase" "1"
"special_bonus_unique_axe_2" "+150"
}
"speed_bonus" "20 25 30"
"attack_speed_bonus" "20 25 30"
"speed_duration"
{
"value" "6"
"special_bonus_unique_axe_culling_blade_speed_duration" "+3"
}
"speed_aoe" "900"
"scepter_speed_duration" "12"
"armor_per_stack" "1"
"armor_per_creep_kill" "0.1"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
}
"axe_one_man_army_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/axe/axe_one_man_army_custom"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE"
"MaxLevel" "1"
"Innate" "1"
"IsBreakable" "1"
"AbilityValues"
{
"radius" "700"
"armor_to_str"
{
"value" "0.5"
"special_bonus_unique_axe_8" "+0.2"
}
"linger_duration" "3"
}
}
"special_bonus_unique_axe_culling_blade_speed_duration"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_axe_8"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_axe"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_axe_7"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_axe_4"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_axe_2"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_axe_5"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
@@ -0,0 +1,275 @@
"DOTAAbilities"
{
"ability_bloodrage"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/bloodhunter/ability_bloodrage.lua"
"AbilityTextureName" "old_heroes/bloodrage"
"FightRecapLevel" "1"
"MaxLevel" "4"
"RequiredLevel" "1"
"HasScepterUpgrade" "1"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityHealthCost" "20 40 60 120"
"precache"
{
"particle" "particles/units/heroes/hero_centaur/centaur_shard_buff_strength_counter_stack.vpcf"
}
"AbilityValues"
{
"AbilityCooldown" "40"
"duration"
{
"value" "12"
"special_bonus_unique_blood_hunter_duration_blood" "+4"
}
"stack_damage" "4 6 8 10"
"stack_attackspeed" "4 6 8 10"
"bonus_damage" "20 40 60 80"
"bonus_attack_speed" "20 30 40 50"
"stack"
{
"value" "2"
"special_bonus_scepter" "+3"
}
"physical_vampirism" "16"
"stack_duration" "20"
}
}
"ability_bloodstained_memory"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/bloodhunter/ability_bloodstained_memory.lua"
"AbilityTextureName" "old_heroes/bloodstained_memory"
"FightRecapLevel" "1"
"MaxLevel" "4"
"RequiredLevel" "1"
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityValues"
{
"healthbonus"
{
"value" "2 3 4 5"
"special_bonus_unique_blood_hunter_bloodstained_health" "+2"
}
"movespeed" "5"
}
}
"ability_illusion_of_blood"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/bloodhunter/ability_illusion_of_blood.lua"
"AbilityTextureName" "old_heroes/illusions_of_blood"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"MaxLevel" "4"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO"
"AbilityCastRange" "1200"
"HasScepterUpgrade" "0"
"AbilitySound" "Hero_ChaosKnight.Phantasm"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastPoint" "0.4 0.4 0.4"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityHealthCost" "0 15 30 45"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"images_count"
{
"value" "2"
"special_bonus_unique_blood_hunter_blood_of_illusions_count" "+2"
}
"illusion_duration" "30"
"outgoing_damage" "400 605 800 1000"
"incoming_damage"
{
"value" "120 140 160 180"
"special_bonus_unique_blood_hunter_blood_of_illusions_incoming_damage" "-25"
}
"invuln_duration" "0.2"
"vision_radius" "400"
"magic_resistance" "75"
"blood" "15 30 45 60"
}
}
"ability_sacrifice_revenge"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/bloodhunter/ability_sacrifice_revenge.lua"
"AbilityTextureName" "old_heroes/sacrifice_revenge"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"MaxLevel" "3"
"AbilitySound" "Hero_Alchemist.ChemicalRage.Cast"
"HasShardUpgrade" "1"
"AbilityCooldown" "40"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastPoint" "0.0"
"AbilityCastAnimation" "ACT_INVALID"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "0"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityHealthCost" "150"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"duration"
{
"value" "25"
"special_bonus_unique_blood_hunter_sacrifice_revenge_duration" "+15"
}
"transformation_time" "0.2"
"base_attack_time" "1.35 1.3 1.25"
"bonus_armor" "-1 -1.5 -2"
"pure_damage"
{
"value" "1 2 3"
"special_bonus_shard" "6"
"special_bonus_unique_blood_hunter_pure_damage_bonus" "+10"
}
}
}
"ability_ring_of_corrosive"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/bloodhunter/ability_ring_of_corrosive.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
"AbilityTextureName" "old_heroes/ring_of_corrosive"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"MaxLevel" "3"
"RequiredLevel" "10"
"LevelsBetweenUpgrades" "10"
"AbilityCooldown" "210"
"AbilityHealthCost" "666"
"AbilityValues"
{
"duration" "8 9 10"
"damage" "666"
"damage_mult" "300"
"radius" "600"
"tick_rate" "0.25"
}
}
"special_bonus_unique_blood_hunter_bloodstained_health"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_blood_hunter_duration_blood"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_blood_hunter_blood_of_illusions_count"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_blood_hunter_blood_of_illusions_incoming_damage"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_blood_hunter_pure_damage_bonus"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_blood_hunter_sacrifice_revenge_duration"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
@@ -0,0 +1,219 @@
"DOTAAbilities"
{
"bristleback_viscous_nasal_goo_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/bristleback/bristleback_viscous_nasal_goo_custom"
"AbilityTextureName" "bristleback_viscous_nasal_goo"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Bristleback.ViscousGoo.Cast"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "0"
"AbilityManaCost" "10"
"AbilityValues"
{
"goo_speed" "1000"
"goo_duration" "5.0"
"base_armor_pct" "8 10 12 15"
"armor_per_stack_pct" "1.5 2 2.5 3"
"base_move_slow" "10"
"move_slow_per_stack" "3 6 9 12"
"radius"
{
"value" "200"
"special_bonus_unique_bristleback_custom_6" "+200"
"affected_by_aoe_increase" "1"
}
"goo_duration_creep" "10.0"
"AbilityCastRange" "650"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"bristleback_quill_spray_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/bristleback/bristleback_quill_spray_custom"
"AbilityTextureName" "bristleback_quill_spray"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_AUTOCAST"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Bristleback.QuillSpray"
"HasScepterUpgrade" "1"
"AbilityCastAnimation" "ACT_INVALID"
"AbilityCastPoint" "0.0 0.0 0.0 0.0"
"AbilityCooldown" "2.5"
"AbilityManaCost" "10"
"AbilityValues"
{
"radius"
{
"value" "700"
"affected_by_aoe_increase" "1"
}
"quill_base_damage"
{
"value" "12 16 20 24"
"special_bonus_unique_bristleback_custom_3" "+16"
"special_bonus_scepter" "+27.5"
}
"quill_stack_damage"
{
"value" "30.0 35.0 40.0"
"special_bonus_unique_bristleback_custom_5" "+40.0"
"special_bonus_scepter" "+7.5"
}
"quill_stack_duration"
{
"value" "15.0"
"special_bonus_scepter" "+17.5"
}
"attack_damage_bonus_pct" "25"
"max_damage"
{
"value" "1250"
"special_bonus_unique_bristleback_custom_3" "+750"
"CalculateSpellDamageTooltip" "1"
}
"projectile_speed" "2400"
}
}
"bristleback_bristleback_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/bristleback/bristleback_bristleback_custom"
"AbilityTextureName" "bristleback_bristleback"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilitySound" "Hero_Bristleback.Bristleback"
"HasScepterUpgrade" "1"
"AbilityCastPoint" "0"
"IsBreakable" "1"
"AbilityValues"
{
"side_damage_reduction"
{
"value" "8 12 16 20"
}
"back_damage_reduction"
{
"value" "14 18 22 26"
}
"side_angle" "110"
"back_angle" "70"
"quill_release_threshold" "275 250 225 200"
"quill_release_interval" "0.1"
"quill_release_threshold_scepter1" "400"
"quill_release_threshold_scepter2" "600"
"quill_release_threshold_scepter3" "800"
"quill_release_threshold_scepter4" "1000"
}
"AbilityCastAnimation" "ACT_DOTA_SPAWN"
}
"bristleback_hairball_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/bristleback/bristleback_hairball_custom"
"AbilityTextureName" "bristleback_hairball"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_SHOW_IN_GUIDES"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"MaxLevel" "1"
"FightRecapLevel" "1"
"IsGrantedByShard" "1"
"AbilityCastRange" "750"
"AbilityCastPoint" "0.1"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"AbilityCooldown" "13"
"AbilityManaCost" "60"
"AbilityValues"
{
"projectile_speed" "1200"
"radius"
{
"value" "700"
"affected_by_aoe_increase" "1"
}
"quill_stacks" "3"
"goo_stacks" "2"
}
}
"bristleback_warpath"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/bristleback/bristleback_warpath_custom"
"AbilityTextureName" "bristleback_warpath"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5"
"IsBreakable" "1"
"Innate" "1"
"MaxLevel" "1"
"AbilityValues"
{
"damage_per_stack_base" "20"
"damage_per_stack_per_hero_level" "0.69"
"damage_per_stack"
{
"value" "0"
"special_bonus_unique_bristleback_3" "+25"
}
"move_speed_per_stack_base" "2"
"move_speed_per_stack_per_hero_level" "0.034"
"max_stacks_base" "8"
"max_stacks_per_hero_level" "0.14"
"stack_duration_base" "16"
"stack_duration_per_hero_level" "0.14"
}
}
"bristleback_rage_fortitude_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/bristleback/bristleback_rage_fortitude_custom"
"AbilityTextureName" "bristleback_warpath"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"IsBreakable" "1"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_6"
"AbilityValues"
{
"rage_threshold" "50"
"bonus_armor" "15 30 45"
"bonus_magic_resist" "15 20 25"
}
}
"special_bonus_unique_bristleback_custom_3"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_bristleback_custom_5"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_bristleback_custom_6"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
}
@@ -0,0 +1,259 @@
"DOTAAbilities"
{
"ability_crystal_maiden_crystal_nova_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/crystal_maiden/ability_crystal_maiden_crystal_nova_custom"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"AbilityTextureName" "crystal_maiden_crystal_nova"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Crystal.CrystalNova"
"MaxLevel" "4"
"AbilityCastRange" "700"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "14 11 8 5"
"AbilityManaCost" "55 70 95 115"
"AbilityValues"
{
"radius"
{
"value" "425"
"affected_by_aoe_increase" "1"
}
"damage"
{
"value" "125 175 225 275"
}
"heal"
{
"value" "100 150 200 250"
}
"intellect_per_damage"
{
"value" "0.5"
}
"slow_duration" "1"
"frost_stacks_per_level" "11 18 25 32"
"max_shield_pct" "70"
"shield_duration" "10"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"ability_crystal_maiden_frostbite_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/crystal_maiden/ability_crystal_maiden_frostbite_custom"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_ALT_CASTABLE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"AbilityTextureName" "crystal_maiden_frostbite"
"AbilityAlternativeTextureName" "crystal_maiden_frostbite"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Crystal.Frostbite"
"MaxLevel" "4"
"HasShardUpgrade" "1"
"AbilityCastRange" "500 600 700 800"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "8 7 6 5"
"AbilityManaCost" "70 140 210 280"
"AbilityValues"
{
"cast_range"
{
"value" "500 600 700 800"
}
"radius"
{
"value" "250 275 300 325"
"affected_by_aoe_increase" "1"
}
"duration"
{
"value" "3.0 3.5 4.0 4.5"
}
"damage"
{
"value" "50 100 150 200"
}
"heal_per_second"
{
"value" "50 75 100 125"
}
"frost_stacks_per_level" "5 7 9 11"
"execute_threshold_pct" "30"
"explosion_radius" "200"
"damage_per_mana" "2.5 5 7.5 10"
"incoming_damage_pct"
{
"value" "5 7 9 11"
"special_bonus_shard" "9"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_crystal_maiden_brilliance_aura_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/crystal_maiden/ability_crystal_maiden_brilliance_aura_custom"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_ALT_CASTABLE"
"AbilityTextureName" "crystal_maiden_brilliance_aura"
"SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Crystal.Brilliance"
"MaxLevel" "4"
"AbilityCastPoint" "0.0"
"AbilityCooldown" "6"
"AbilityValues"
{
"mana_cost_pct"
{
"value" "15 20 25 30"
}
"aura_radius"
{
"value" "1200"
}
"active_radius"
{
"value" "450"
"affected_by_aoe_increase" "1"
}
"duration"
{
"value" "6.0"
}
"damage"
{
"value" "150 200 250 300"
}
"frost_stacks_per_level"
{
"value" "2 4 6 8"
}
"intellect_per_damage"
{
"value" "0.5"
}
"slow_duration"
{
"value" "1.0"
}
"mana_regen_pct"
{
"value" "0.5 1.0 1.5 2.0"
}
"teleport_range"
{
"value" "300"
}
"crystal_aspect_enabled" "1"
"crystal_explosion_radius" "200"
"crystal_damage" "75"
"crystal_frost_stacks" "2"
"crystal_duration" "15"
"max_crystals" "5"
"pct_25_mana_damage" "25"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"ability_crystal_maiden_freezing_field_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/crystal_maiden/ability_crystal_maiden_freezing_field_custom"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"AbilityTextureName" "crystal_maiden_freezing_field"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Crystal.FreezingField"
"MaxLevel" "3"
"HasScepterUpgrade" "1"
"AbilityCastPoint" "0.0"
"AbilityChannelTime" "10.0"
"AbilityCooldown" "90 80 70"
"AbilityManaCost" "200 300 400"
"AbilityValues"
{
"radius"
{
"value" "835"
"affected_by_aoe_increase" "1"
}
"damage_per_second"
{
"value" "105 170 250"
}
"explosion_interval"
{
"value" "0.1"
}
"explosion_radius"
{
"value" "400"
"affected_by_aoe_increase" "1"
}
"explosion_damage"
{
"value" "50 80 110"
}
"frost_stacks_per_explosion"
{
"value" "3 5 7"
}
"slow_duration"
{
"value" "1.0"
}
"intellect_per_damage"
{
"value" "0.5"
}
"mini_nova_pct"
{
"value" "50"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
}
//=================================================================================================================
// Crystal Maiden: Innate mana regen multiplier
//=================================================================================================================
"crystal_maiden_blueheart_floe"
{
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_SKIP_FOR_KEYBINDS | DOTA_ABILITY_BEHAVIOR_INNATE_UI"
"AbilityTextureName" "crystal_maiden_let_it_go"
"MaxLevel" "4"
"Innate" "1"
"DependentOnAbility" "ability_crystal_maiden_freezing_field_custom"
"IsBreakable" "1"
"AbilityValues"
{
"mana_regen_multiplier"
{
"value" "25 50 75 100"
}
}
}
}
@@ -0,0 +1,192 @@
"DOTAAbilities"
{
"ability_drow_ranger_frost_arrows_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/drow_ranger/ability_drow_ranger_frost_arrows_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityTextureName" "drow_ranger_frost_arrows"
"HasScepterUpgrade" "1"
"MaxLevel" "4"
"AbilityValues"
{
"damage_pct"
{
"value" "12 24 36 48"
"special_bonus_unique_drow_ranger_frost_arrow_damage_pct" "+12"
}
"frost_stacks_per_level" "1 2 3 4"
"AbilityCooldown" "0"
"AbilityManaCost" "0"
"crit_multiplier" "0"
"ricochet_chance" "4 8 12 16"
}
}
"ability_drow_ranger_gust_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/drow_ranger/ability_drow_ranger_gust_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"AbilityTextureName" "drow_ranger_wave_of_silence"
"MaxLevel" "4"
"AbilityCastRange" "900"
"AbilityCastPoint" "0.25"
"AbilityCooldown" "10 8 6 4"
"AbilityManaCost" "90 100 110 120"
"AbilityValues"
{
"gust_speed" "1400"
"gust_width" "250"
"gust_distance" "900"
"knockback_distance" "90"
"knockback_duration" "0.2"
"damage" "180 240 300 360"
"frost_stacks_per_level"
{
"value" "12 18 24 30"
"special_bonus_unique_drow_ranger_gust_frozen_stack" "+12"
}
"frozen_son_duration" "1.25"
}
}
"ability_drow_ranger_multishot_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/drow_ranger/ability_drow_ranger_multishot_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_CHANNELLED"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityTextureName" "drow_ranger_multishot"
"MaxLevel" "4"
"AbilityCastRange" "1200"
"AbilityCastPoint" "0.0"
"AbilityChannelTime" "1.75"
"AbilityManaCost" "80 100 120 140"
"AbilityValues"
{
"wave_count" "3"
"piercing_arrows" "1"
"arrow_count_per_wave"
{
"value" "4"
"special_bonus_unique_drow_ranger_arrow_count_per_wave" "+1"
}
"arrow_damage_pct"
{
"value" "45 75 105 135"
"special_bonus_unique_drow_ranger_arrow_damage_pct" "+45"
}
"arrow_width" "90"
"arrow_speed" "1300"
"arrow_range_multiplier" "1.75"
"arrow_angle" "50"
"bypass_block" "1"
"AbilityCooldown"
{
"value" "26 22 18 14"
"special_bonus_unique_drow_ranger_AbilityCooldown" "-6"
}
"frost_stacks_per_level" "1 2 3 4"
}
"AbilityCastAnimation" "ACT_DOTA_CHANNEL_ABILITY_3"
}
"ability_drow_ranger_marksmanship_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/drow_ranger/ability_drow_ranger_marksmanship_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityTextureName" "drow_ranger_marksmanship"
"MaxLevel" "3"
"AbilityValues"
{
"bonus_agility_pct" "25 45 65"
"bonus_damage" "120 200 280"
"disable_range" "250"
"hits" "3"
"marksmanship_master" "1"
}
}
"drow_ranger_trueshot"
{
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_INNATE_UI | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_SKIP_FOR_KEYBINDS "
"Innate" "1"
"MaxLevel" "4"
"DependentOnAbility" "ability_drow_ranger_marksmanship_custom"
"IsBreakable" "1"
"AbilityValues"
{
"radius"
{
"value" "1200"
"affected_by_aoe_increase" "1"
}
"trueshot_agi_bonus_base" "8 12 16 20"
"trueshot_agi_bonus_per_level" "2.5"
"trueshot_agi_bonus_allies_pct" "50"
"agi_bonus_pct_tooltip"
{
"dynamic_value" "true"
}
}
}
"special_bonus_unique_drow_ranger_AbilityCooldown"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_drow_ranger_arrow_count_per_wave"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_drow_ranger_arrow_damage_pct"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_drow_ranger_gust_frozen_stack"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_drow_ranger_frost_arrow_damage_pct"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+292
View File
@@ -0,0 +1,292 @@
"DOTAAbilities"
{
"hoodwink_acorn_shot_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/hoodwink/hoodwink_acorn_shot_custom"
"AbilityTextureName" "hoodwink_acorn_shot"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityCooldown" "16 14 12 10"
"AbilityCastRange" "575"
"AbilityCastPoint" "0.2"
"AbilityManaCost" "85 90 95 100"
"HasScepterUpgrade" "1"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
"AbilityValues"
{
"acorn_shot_damage"
{
"value" "80 130 180 230"
"CalculateSpellDamageTooltip" "0"
}
"base_damage_pct"
{
"value" "100 110 120 130"
"CalculateSpellDamageTooltip" "0"
}
"bounce_count"
{
"value" "5 6 7 8"
"special_bonus_unique_hoodwink_acorn_shot_bounces" "+2"
}
"bounce_range"
{
"value" "525"
"affected_by_aoe_increase" "1"
}
"tree_duration" "20"
"tree_radius" "300"
"debuff_duration" "0.3"
"slow" "100"
"bounce_delay" "0.1"
"projectile_speed" "2200"
"can_bounce_off_of_trees"
{
"value" "0"
"special_bonus_unique_hoodwink_1_1" "+1"
}
"bounce_count_scepter"
{
"value" "0"
"special_bonus_scepter" "+3"
}
"scepter_chance"
{
"value" "0"
"special_bonus_scepter" "+15"
}
"reduce_cooldown_ultimate"
{
"value" "0"
"special_bonus_unique_hoodwink_4_1" "+1"
}
}
}
"hoodwink_bushwhack_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/hoodwink/hoodwink_bushwhack_custom"
"HasShardUpgrade" "1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG"
"AbilityTextureName" "hoodwink_bushwhack"
"AbilityCastRange" "1000"
"AbilityCastPoint" "0.2"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
"AbilityCooldown" "14"
"AbilityManaCost" "90 100 110 120"
"AbilityValues"
{
"radius"
{
"value" "265"
"affected_by_aoe_increase" "1"
}
"duration" "1.4 1.6 1.8 2.0"
"projectile_speed" "1300"
"interval" "0.3"
"damage_multiplier" "25"
"total_damage"
{
"value" "125 250 375 500"
"CalculateSpellDamageTooltip" "1"
"special_bonus_unique_hoodwink_bushwhack_damage" "+240"
}
}
}
"hoodwink_scurry_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/hoodwink/hoodwink_scurry_custom"
"AbilityTextureName" "hoodwink_scurry"
"AbilityManaCost" "35"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityValues"
{
"movement_speed_pct" "20 25 30 35"
"duration"
{
"value" "2.0 2.5 3.0 3.5"
"special_bonus_unique_hoodwink_scurry_duration" "+1"
}
"radius"
{
"value" "225"
"affected_by_aoe_increase" "1"
}
"AbilityCharges"
{
"value" "1 2 3 4"
"special_bonus_unique_hoodwink_scurry_charges" "+1"
}
"AbilityChargeRestoreTime"
{
"value" "24 20 16 12"
}
"bonus_attack_speed"
{
"value" "15 28 46 64"
"special_bonus_unique_hoodwink_3_1" "+50%"
}
"bonus_damage"
{
"value" "20 45 65 80"
"special_bonus_unique_hoodwink_3_1" "+50%"
}
"luck_evasion_multiplier" "1"
"max_luck_evasion" "75"
"incoming_damage_reduction_pct"
{
"value" "4 5 6 7"
"special_bonus_unique_hoodwink_3_1" "+50%"
}
"current_aoe_bonus"
{
"dynamic_value" "true"
}
}
}
"hoodwink_lucky_innate_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/hoodwink/hoodwink_lucky_innate_custom"
"AbilityTextureName" "hoodwink_scurry"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE"
"MaxLevel" "1"
"Innate" "1"
"IsBreakable" "0"
"AbilityValues"
{
"luck_per_level" "0.25"
}
}
"hoodwink_sharpshooter_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/hoodwink/hoodwink_sharpshooter_custom"
"AbilityTextureName" "hoodwink_sharpshooter"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityCastRange" "3000"
"AbilityCastPoint" "0.0"
"AbilityCooldown" "25"
"AbilityManaCost" "100 150 200"
"AbilityCastAnimation" "ACT_DOTA_CHANNEL_ABILITY_6"
"AbilityValues"
{
"arrow_speed"
{
"value" "2200"
}
"arrow_width"
{
"value" "125"
"affected_by_aoe_increase" "1"
}
"arrow_range" "3000"
"arrow_vision"
{
"value" "350"
"affected_by_aoe_increase" "1"
}
"max_charge_time" "3.0"
"damage_multiplier" "200 300 400"
"max_damage"
{
"value" "600 950 1300"
"special_bonus_unique_hoodwink_sharpshooter_damage" "+900"
}
"recoil_distance" "350"
"recoil_height" "75"
"recoil_duration" "0.4"
"max_slow_debuff_duration" "5.0"
"misfire_time" "5.0"
"slow_move_pct" "30 40 50"
"turn_rate" "60"
"base_power" "0.2"
}
}
"hoodwink_sharpshooter_release_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/hoodwink/hoodwink_sharpshooter_custom"
"AbilityTextureName" "hoodwink_sharpshooter_release"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityCastPoint" "0.0"
"AbilityCastRange" "999999"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_7"
"MaxLevel" "3"
"DependentOnAbility" "hoodwink_sharpshooter_custom"
}
"special_bonus_unique_hoodwink_1_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_hoodwink_3_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_hoodwink_4_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_hoodwink_scurry_charges"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_hoodwink_bushwhack_damage"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_hoodwink_acorn_shot_bounces"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_hoodwink_sharpshooter_damage"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_hoodwink_scurry_duration"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
}
+188
View File
@@ -0,0 +1,188 @@
"DOTAAbilities"
{
"ability_juggernaut_blade_fury_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/juggernaut/ability_juggernaut_blade_fury_custom.lua"
"AbilityTextureName" "juggernaut_blade_fury"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_ALT_CASTABLE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"HasShardUpgrade" "1"
"AbilityCastPoint" "0.0"
"AbilityCooldown" "20"
"AbilityManaCost" "60"
"AbilityValues"
{
"AbilityCastRange" "600"
"duration"
{
"value" "5"
"special_bonus_shard" "+2"
}
"radius"
{
"value" "250"
"special_bonus_unique_juggernaut_blade_fury_radius_custom" "+125"
}
"damage_per_tick"
{
"value" "50 70 90 110"
"special_bonus_shard" "+110"
}
"attack_damage" "25"
"proc_chance" "15"
"leap_sword" "1"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"ability_juggernaut_healing_ward_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/juggernaut/ability_juggernaut_healing_ward_custom.lua"
"AbilityTextureName" "juggernaut_healing_ward"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "40 35 30 25"
"AbilityManaCost" "30"
"AbilityValues"
{
"ward_duration"
{
"value" "10.0"
"special_bonus_unique_juggernaut_healing_ward_duration_custom" "+15"
}
"heal_radius" "500"
"heal_per_second" "2 3 4 5"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_juggernaut_blade_dance_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/juggernaut/ability_juggernaut_blade_dance_custom.lua"
"AbilityTextureName" "new_heroes/juggernaut_blade_dance_custom_alt"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_ALT_CASTABLE"
"AbilityCastRange" "800"
"AbilityCastPoint" "0.0"
"AbilityCooldown" "0"
"AbilityManaCost" "15"
"AbilityValues"
{
"AbilityCharges" "1 2 3 4"
"AbilityChargeRestoreTime" "19 14 11 7"
"lifesteal_percent"
{
"value" "0"
"special_bonus_unique_juggernaut_blade_dance_lifesteal_custom" "20"
}
"crit_chance" "35"
"crit_mult" "145 175 205 225"
"juggernaut_blade_dance_jugg_step" "1"
"astral_slash_attack_count" "1 2 3 4"
"min_travel_distance" "200"
"max_travel_distance" "800"
"astral_slash_radius" "100"
"astral_slash_debuff_duration" "4.5"
"juggernaut_blade_dance_jugg_step_armor_reduce" "10"
}
}
"ability_juggernaut_omnislash_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/juggernaut/ability_juggernaut_omnislash_custom.lua"
"AbilityTextureName" "juggernaut_omni_slash"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"MaxLevel" "3"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "80 60 40"
"AbilityManaCost" "25 50 75"
"AbilityCastRange" "600"
"AbilityValues"
{
"duration" "1.5 2 2.5"
"slash_interval_mult" "1.4"
"bounce_radius" "425"
"damage" "200 250 300"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
}
"ability_juggernaut_miniomnislash_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/juggernaut/ability_juggernaut_omnislash_custom.lua"
"AbilityTextureName" "juggernaut_swift_slash"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"MaxLevel" "1"
"IsGrantedByScepter" "1"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "40"
"AbilityManaCost" "25"
"AbilityCastRange" "600"
"AbilityValues"
{
"duration" "1"
"slash_interval_mult" "2.8"
"bounce_radius" "425"
"damage" "300"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
}
"ability_juggernaut_samurai_soul"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/juggernaut/ability_juggernaut_samurai_soul.lua"
"AbilityTextureName" "new_heroes/juggernaut_miracle"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"MaxLevel" "1"
"Innate" "1"
"IsBreakable" "0"
"AbilityValues"
{
"cooldown" "15.0"
"max_restore_count" "2"
"debuff_pct" "50"
}
}
"special_bonus_unique_juggernaut_healing_ward_duration_custom"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_juggernaut_blade_dance_lifesteal_custom"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_juggernaut_blade_fury_radius_custom"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_facet_juggernaut_blade_dance_astral_slash"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
@@ -0,0 +1,273 @@
"DOTAAbilities"
{
"keeper_of_the_light_illuminate_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/keeper_of_the_light/keeper_of_the_light_illuminate_custom"
"AbilityTextureName" "keeper_of_the_light_illuminate"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"FightRecapLevel" "1"
"AbilitySound" "Hero_KeeperOfTheLight.Illuminate.Discharge"
"LinkedAbility" "keeper_of_the_light_illuminate_end"
"AbilityCastRange" "1800"
"AbilityCastPoint" "0"
"AbilityChannelTime" "3"
"AbilityManaCost" "100 125 150 175"
"AbilityValues"
{
"max_damage"
{
"value" "200 315 430 550"
"special_bonus_unique_keeper_of_the_light" "+300"
"CalculateSpellDamageTooltip" "1"
}
"min_damage"
{
"value" "75 150 225 300"
"special_bonus_unique_keeper_of_the_light" "+150"
"CalculateSpellDamageTooltip" "1"
}
"heal_percent"
{
"value" "35"
"special_bonus_unique_keeper_of_the_light_1_1" "+20"
}
"mana_damage_from_current_pct" "50"
"radius"
{
"value" "400"
"affected_by_aoe_increase" "1"
}
"speed" "900"
"vision_radius" "800"
"AbilityCooldown"
{
"value" "13"
"special_bonus_unique_keeper_of_the_light_illuminate_cooldown" "-2"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"keeper_of_the_light_illuminate_end"
{
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK"
"LinkedAbility" "keeper_of_the_light_illuminate_custom"
"AbilityCastPoint" "0.0 0.0 0.0 0.0"
"AbilityCastAnimation" "ACT_INVALID"
}
"keeper_of_the_light_blinding_light_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/keeper_of_the_light/keeper_of_the_light_blinding_light_custom"
"AbilityTextureName" "keeper_of_the_light_blinding_light"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilityCastRange" "400 500 600 700"
"AbilityCastPoint" "0.3"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5"
"AbilityManaCost" "120 130 140 150"
"AbilityValues"
{
"duration_stack" "6"
"radius"
{
"value" "425 450 475 500"
"affected_by_aoe_increase" "1"
}
"knockback_duration" "0.6"
"knockback_distance"
{
"value" "400"
"affected_by_aoe_increase" "1"
}
"miss_stack" "2"
"miss_stack_boss" "1"
"miss_pct" "100"
"damage"
{
"value" "100 200 300 400"
"CalculateSpellDamageTooltip" "1"
}
"AbilityCooldown"
{
"value" "24 21 18 15"
"special_bonus_unique_keeper_of_the_light_5" "-5"
}
}
}
"keeper_of_the_light_chakra_magic_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/keeper_of_the_light/keeper_of_the_light_chakra_magic_custom"
"AbilityTextureName" "keeper_of_the_light_chakra_magic"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES"
"AbilityCastRange" "900"
"AbilityCastPoint" "0.3"
"AbilityManaCost" "0"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilityValues"
{
"mana_restore" "100 200 300 400"
"cooldown_reduction" "3 4 5 6"
"incoming_damage_reduction_pct" "12 16 20 24"
"damage_reduction_duration" "4 5 6 7"
"AbilityCooldown"
{
"value" "18 16 14 12"
"special_bonus_unique_keeper_of_the_light_7" "-2"
}
"strong_dispel"
{
"special_bonus_unique_keeper_of_the_light_14" "=1"
}
"refresh_charges"
{
"special_bonus_unique_keeper_of_the_light_3_1" "=1"
}
}
}
"keeper_of_the_light_will_o_wisp_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/keeper_of_the_light/keeper_of_the_light_will_o_wisp_custom"
"AbilityTextureName" "keeper_of_the_light_will_o_wisp"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilitySound" "Hero_KeeperOfTheLight.ManaLeak.Cast"
"AbilityCastPoint" "0.15"
"AbilityCharges" "3"
"AbilityCooldown" "0"
"AbilityChargeRestoreTime" "16 14 12"
"AbilityManaCost" "60 100 150"
"AbilityCastRange" "800"
"AbilityValues"
{
"radius"
{
"value" "350"
"special_bonus_unique_keeper_of_the_light_4_1" "+125"
"affected_by_aoe_increase" "1"
}
"active_duration" "1.2"
"active_tick" "0.2"
"delay" "1.2"
"damage"
{
"value" "200 400 600"
"CalculateSpellDamageTooltip" "1"
}
"slow_movespeed" "-60"
"hit_count"
{
"value" "4"
"special_bonus_unique_keeper_of_the_light_4_2" "+2"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"keeper_of_the_light_recall_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/keeper_of_the_light/keeper_of_the_light_recall_custom"
"AbilityTextureName" "keeper_of_the_light_recall"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_AUTOCAST"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_CUSTOM"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE"
"SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"MaxLevel" "1"
"IsGrantedByShard" "1"
"AbilitySound" "Hero_KeeperOfTheLight.Recall.Cast"
"AbilityCastPoint" "0.3 0.3 0.3"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"AbilityCastRange" "0"
"AbilityManaCost" "150"
"AbilityValues"
{
"teleport_delay"
{
"value" "4"
}
"movespeed_bonus_duration" "4"
"ally_movespeed_pct"
{
"value" "25"
}
"AbilityCooldown"
{
"value" "15"
}
}
}
"keeper_of_the_light_radiant_bind_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/keeper_of_the_light/keeper_of_the_light_radiant_bind_custom"
"AbilityTextureName" "keeper_of_the_light_radiant_bind"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_HIDDEN"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilitySound" "Hero_KeeperOfTheLight.ManaLeak.Cast"
"MaxLevel" "1"
"IsGrantedByScepter" "1"
"AbilityCastPoint" "0.2"
"AbilityManaCost" "120"
"AbilityCastRange" "850"
"AbilityValues"
{
"duration" "5"
"slow_pct_per_distance" "8"
"distance_for_slow" "100"
"movespeed_limit" "700"
"magres_pct" "30"
"AbilityCooldown" "14"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"special_bonus_unique_keeper_of_the_light_4_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_keeper_of_the_light_1_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_keeper_of_the_light_3_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_keeper_of_the_light_4_2"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
}
@@ -0,0 +1,209 @@
// Legion Commander — кастомный набор (логика в TS; стилистика ближе к dota1x6 / ваниле)
"DOTAAbilities"
{
"ability_legion_commander_overwhelming_odds_custom"
{
"BaseClass" "ability_lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityTextureName" "legion_commander_overwhelming_odds"
"ScriptFile" "abilities/heroes/legion_commander/ability_legion_commander_overwhelming_odds_custom.lua"
"MaxLevel" "4"
"AbilityCastRange" "625"
"AbilityCastPoint" "0.300000"
"AbilityManaCost" "30"
"AbilityCooldown" "13 12 11 10"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
"AbilityValues"
{
"radius"
{
"value" "330"
"special_bonus_unique_legion_commander_odds_radius" "+70"
"affected_by_aoe_increase" "1"
}
"damage_base"
{
"value" "125 145 165 185"
"special_bonus_unique_legion_commander_odds_damage" "+60"
}
"damage_per_enemy" "18 22 26 30"
"armor_buff_duration" "7"
"armor_per_enemy" "2 3 4 5"
"debuff_duration" "5"
"enemy_movespeed_slow" "40 45 50 55"
"self_buff_duration" "5"
"self_bonus_attack_speed" "30 40 50 60"
"self_bonus_movespeed" "15 20 25 30"
}
}
"ability_legion_commander_press_the_attack_custom"
{
"BaseClass" "ability_lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"AbilityTextureName" "legion_commander_press_the_attack"
"ScriptFile" "abilities/heroes/legion_commander/ability_legion_commander_press_the_attack_custom.lua"
"MaxLevel" "4"
"AbilityCastRange" "750"
"AbilityCastPoint" "0.225000"
"AbilityManaCost" "45"
"AbilityCooldown" "16 14 12 10"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
"AbilityValues"
{
"duration"
{
"value" "4 5 6 7"
"special_bonus_unique_legion_commander_pta_duration" "+2"
}
"attack_speed_bonus" "65 95 125 155"
"movespeed_bonus" "20 35 45 55"
"hp_regen"
{
"value" "12 16 20 24"
"special_bonus_unique_legion_commander_pta_regen" "+12"
}
}
}
"ability_legion_commander_moment_of_courage_custom"
{
"BaseClass" "ability_lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityTextureName" "legion_commander_moment_of_courage"
"ScriptFile" "abilities/heroes/legion_commander/ability_legion_commander_moment_of_courage_custom.lua"
"MaxLevel" "4"
"AbilityValues"
{
"trigger_chance_pct"
{
"value" "25 30 35 40"
"special_bonus_unique_legion_commander_moc_chance" "+10"
}
"proc_cooldown" "0.35"
"buff_duration" "1.2"
"buff_bonus_movespeed" "40 55 65 85"
"counter_lifesteal_pct"
{
"value" "40 50 60 70"
"special_bonus_unique_legion_commander_moc_lifesteal" "+25"
}
"attack_count" "1"
}
}
"ability_legion_commander_duel_custom"
{
"BaseClass" "ability_lua"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityTextureName" "legion_commander_duel"
"ScriptFile" "abilities/heroes/legion_commander/ability_legion_commander_duel_custom.lua"
"MaxLevel" "3"
"RequiredLevel" "6"
"LevelsBetweenUpgrades" "6"
"AbilityCastRange" "575"
"AbilityCastPoint" "0.300000"
"AbilityManaCost" "50"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"HasScepterUpgrade" "1"
"HasShardUpgrade" "1"
"AbilityValues"
{
"duration"
{
"value" "4 4.75 5.5"
"special_bonus_unique_legion_commander_duel_duration" "+2"
}
"victory_range" "1500"
"reward_damage"
{
"value" "10 18 26"
"special_bonus_unique_legion_commander_duel_reward" "+10"
}
"reward_damage_creep" "3 5 7"
"reward_random_stat"
{
"value" "1"
"special_bonus_scepter" "+4"
}
"max_stack_damage" "40000"
"bonus_attack_speed" "25 45 65"
"AbilityChargeRestoreTime"
{
"value" "75 70 65"
"special_bonus_scepter" "-10"
}
"AbilityCharges"
{
"value" "1"
"special_bonus_scepter" "2"
}
"scepter_cooldown_reduction" "10"
"scepter_magic_resist" "25"
"shard_overwhelming_interval" "2"
}
}
"special_bonus_unique_legion_commander_odds_radius"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_legion_commander_odds_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_legion_commander_pta_duration"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_legion_commander_pta_regen"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_legion_commander_moc_chance"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_legion_commander_moc_lifesteal"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_legion_commander_duel_duration"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_legion_commander_duel_reward"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+229
View File
@@ -0,0 +1,229 @@
"DOTAAbilities"
{
"ability_lina_dragon_slave_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/lina/ability_lina_dragon_slave_custom"
"AbilityTextureName" "lina_dragon_slave"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Lina.DragonSlave"
"AbilityCastRange" "1075"
"AbilityCastPoint" "0.35"
"AbilityDuration" "0.6875 0.6875 0.6875 0.6875"
"AbilityCooldown" "10 9 8 7"
"AbilityManaCost" "100 110 120 130"
"AbilityValues"
{
"dragon_slave_damage"
{
"value" "125 185 255 340"
"special_bonus_unique_lina_dragon_slave_damage_bonus" "+145"
}
"fire_stacks_per_level" "5 10 15 20"
"dragon_slave_speed" "1200"
"dragon_slave_width_initial" "275"
"dragon_slave_width_end" "200"
"dragon_slave_distance" "1075"
"proc_chance" "15 20 25 30"
"mana_damage_from_current_pct" "50"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"ability_lina_light_strike_array_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/lina/ability_lina_light_strike_array_custom"
"AbilityTextureName" "lina_light_strike_array"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG"
"FightRecapLevel" "1"
"AbilitySound" "Ability.LightStrikeArray"
"HasShardUpgrade" "1"
"AbilityCastRange" "700"
"AbilityCastPoint" "0.45"
"AbilityCooldown" "13 11 9 7"
"AbilityManaCost" "100 115 130 145"
"AbilityValues"
{
"light_strike_array_aoe"
{
"value" "250"
"affected_by_aoe_increase" "1"
}
"light_strike_array_delay_time" "0.5"
"light_strike_array_stun_duration"
{
"value" "0.25 0.50 0.75 1"
"special_bonus_shard" "+0.25"
}
"light_strike_array_damage"
{
"value" "160 200 240 280"
"special_bonus_shard" "+280"
}
"fire_stacks_per_level" "5 10 15 20"
"mana_damage_from_current_pct" "50"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_lina_flame_cloak_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/lina/ability_lina_flame_cloak_custom"
"AbilityTextureName" "lina_flame_cloak"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Lina.FlameCloak.Cast"
"AbilityCastPoint" "0.0"
"AbilityCooldown" "18 15 12 9"
"AbilityManaCost" "90 100 110 120"
"AbilityValues"
{
"duration"
{
"value" "6.0 7.0 8.0 9.0"
}
"array_five"
{
"special_bonus_unique_lina_light_strike_array_five" "4"
}
"fire_stacks_per_level" "1"
"damage_per_second"
{
"value" "10 20 30 40"
"special_bonus_unique_lina_flame_cloak_custom_damage_bonus" "+30"
}
"radius" "525"
"max_stacks" "7"
"visualzdelta" "100"
"attackspeed_bonus"
{
"value" "2 4 6 8"
"special_bonus_unique_lina_flame_cloak_custom_bonus_movespeed_attack_speed_pct" "+6"
}
"movespeed_bonus"
{
"value" "2 4 6 8"
"special_bonus_unique_lina_flame_cloak_custom_bonus_movespeed_attack_speed_pct" "+6"
}
"spell_amplify" "5 10 15 20"
"magical_resistance" "5 10 15 20"
"mana_damage_from_current_pct" "50"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"ability_lina_laguna_blade_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/lina/ability_lina_laguna_blade_custom"
"AbilityTextureName" "lina_laguna_blade"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"HasScepterUpgrade" "1"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"FightRecapLevel" "2"
"AbilitySound" "Ability.LagunaBladeImpact"
"AbilityCastRange" "600"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "70 60 50"
"AbilityValues"
{
"AbilityCooldown"
{
"value" "70 60 50"
"special_bonus_unique_lina_laguna_blade_custom_cd" "-25"
}
"damage" "1500 3000 4500"
"damage_delay" "0.25"
"mana_cost" "150 300 450"
"damage_mult" "300"
"duration" "20"
"spell_amplify" "10"
"mana_cost_facet"
{
"value" "0"
"special_bonus_scepter" "70"
}
"mana_cost_facet_tooltip"
{
"value" "0"
"special_bonus_scepter" "30"
}
"mana_damage_from_current_pct" "50"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
}
"special_bonus_unique_lina_light_strike_array_five"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_lina_laguna_blade_custom_cd"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_lina_flame_cloak_custom_damage_bonus"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_lina_flame_cloak_custom_bonus_movespeed_attack_speed_pct"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"ability_lina_scorch_affinity_innate"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/lina/ability_lina_scorch_affinity_innate"
"AbilityTextureName" "lina_flame_cloak"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"MaxLevel" "1"
"Innate" "1"
"IsBreakable" "1"
"AbilityValues"
{
"radius"
{
"value" "900"
"affected_by_aoe_increase" "1"
}
"bonus_pct_base" "5"
"bonus_pct_per_hero_level" "1"
}
}
}
+245
View File
@@ -0,0 +1,245 @@
"DOTAAbilities"
{
"ability_luna_lucent_beam_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/luna/ability_luna_lucent_beam_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityTextureName" "luna_lucent_beam"
"MaxLevel" "4"
"AbilitySound" "Hero_Luna.LucentBeam"
"AbilityCastRange" "800"
"AbilityCastPoint" "0.4"
"AbilityManaCost" "90 100 110 120"
"AbilityValues"
{
"AbilityCooldown"
{
"value" "9 7 5 3"
"special_bonus_unique_luna_lucent_beam_cooldown" "-2.5"
}
"lucent_beam_damage"
{
"value" "125 190 255 370"
"special_bonus_unique_luna_lucent_beam_damage" "+230"
}
"stun_duration" "0.4"
"lucent_beam_aoe_radius" "320"
"lucent_beam_aoe_damage_pct" "50"
"mana_damage_pct" "50 100 150 200"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"ability_luna_twin_glaives_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/luna/ability_luna_twin_glaives_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityTextureName" "luna_lunar_orbit"
"MaxLevel" "4"
"AbilityManaCost" "25"
"AbilityCooldown" "6"
"AbilityValues"
{
"cast_range"
{
"value" "1200"
"special_bonus_unique_luna_orbit_radius" "+200"
}
"glaive_damage"
{
"value" "140 180 220 280"
"special_bonus_unique_luna_orbit_damage" "+120"
}
"projectile_speed" "1200"
"AbilityCastRange"
{
"value" "1200"
"special_bonus_unique_luna_orbit_radius" "+200"
}
"projectile_range"
{
"value" "1300"
"special_bonus_unique_luna_orbit_radius" "+200"
}
"projectile_width" "75"
"axe_spread" "100"
"twin_facet_vuln_duration" "10"
"twin_facet_pct" "12 16 20 24"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"ability_luna_moon_glaive_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/luna/ability_luna_moon_glaive_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityTextureName" "luna_moon_glaive"
"MaxLevel" "4"
"AbilityValues"
{
"bounce_range" "500"
"moon_glaive_bounce_count"
{
"value" "4 5 6 7"
"special_bonus_unique_luna_glaive_extra_bounce" "+1"
}
"bounce_damage_pct" "50 60 70 80"
"bounce_falloff_pct"
{
"value" "60 70 80 90"
"special_bonus_unique_luna_glaives_no_falloff" "100"
}
"moon_facet_perform_attack"
{
"value" "0"
"special_bonus_unique_luna_moon_glaive_beam_attack" "1"
}
}
}
"ability_luna_lunar_blessing_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/luna/ability_luna_lunar_blessing_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
"Innate" "1"
"AbilityTextureName" "luna_lunar_blessing"
"MaxLevel" "1"
"HasShardUpgrade" "1"
"AbilityValues"
{
"blessing_radius"
{
"value" "800"
"affected_by_aoe_increase" "1"
"special_bonus_unique_luna_blessing_aura" "+350"
}
"blessing_bonus_damage"
{
"value" "2.5"
"hero_levelup" "+2.5"
"levelup_interval" "1"
}
"spell_amp_per_level"
{
"value" "0"
"special_bonus_shard" "+0.45"
}
"moon_sisters_radius"
{
"value" "1200"
"affected_by_aoe_increase" "1"
}
"moon_sisters_damage_reduction_pct" "25"
}
}
"ability_luna_eclipse_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/luna/ability_luna_eclipse_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityTextureName" "luna_eclipse"
"MaxLevel" "3"
"HasScepterUpgrade" "1"
"AbilityManaCost" "150 200 250"
"AbilityCooldown" "140 120 100"
"AbilityCastPoint" "0.4"
"AbilityValues"
{
"eclipse_duration" "3.6"
"beam_interval" "0.45"
"eclipse_beam_count"
{
"value" "8"
"special_bonus_unique_luna_eclipse_power" "+4"
}
"eclipse_radius" "1200"
"eclipse_damage" "100 200 300"
"eclipse_mini_stun" "0.25"
"eclipse_facet_wave_count"
{
"value" "0"
"special_bonus_scepter" "8"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
}
"special_bonus_unique_luna_lucent_beam_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_luna_orbit_radius"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_luna_glaive_extra_bounce"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_luna_blessing_aura"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_luna_lucent_beam_cooldown"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_luna_orbit_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_luna_eclipse_power"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_luna_glaives_no_falloff"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_luna_moon_glaive_beam_attack"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+261
View File
@@ -0,0 +1,261 @@
"DOTAAbilities"
{
"ability_mirana_starstorm_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/mirana/ability_mirana_starstorm_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityTextureName" "mirana_starfall"
"MaxLevel" "4"
"AbilitySound" "Hero_Mirana.Starstorm"
"AbilityCastPoint" "0.4"
"AbilityManaCost" "90 100 110 120"
"AbilityValues"
{
"AbilityCooldown"
{
"value" "12 11 10 9"
"special_bonus_unique_mirana_starstorm_cooldown" "-3"
}
"damage"
{
"value" "200 300 400 500"
"special_bonus_unique_mirana_starstorm_damage" "+180"
}
"radius"
{
"value" "650"
"affected_by_aoe_increase" "1"
}
"meteor_impact_delay" "0.57"
"secondary_delay" "0.8"
"secondary_damage_pct" "75"
"attack_proc_chance"
{
"value" "0"
"special_bonus_unique_mirana_starstorm_attack_proc" "20"
}
"mana_damage_pct"
{
"value" "10"
"hero_levelup" "+1"
"levelup_interval" "1"
"special_bonus_unique_mirana_innate_mana_damage" "+8"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"ability_mirana_sacred_arrow_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/mirana/ability_mirana_sacred_arrow_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_DIRECTIONAL"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityTextureName" "mirana_arrow"
"MaxLevel" "4"
"HasShardUpgrade" "1"
"AbilityCastPoint" "0.3"
"AbilityManaCost" "90 100 110 120"
"AbilityValues"
{
"AbilityCooldown" "17 15 13 11"
"arrow_damage"
{
"value" "50 150 250 350"
"special_bonus_unique_mirana_sacred_arrow_damage" "+150"
}
"arrow_range" "3000"
"arrow_speed" "900"
"arrow_width" "115"
"stun_per_100_distance" "0.17"
"max_stun_duration" "3.8"
"mana_damage_pct"
{
"value" "10"
"hero_levelup" "+1"
"levelup_interval" "1"
"special_bonus_unique_mirana_innate_mana_damage" "+8"
}
"shard_starfall_radius"
{
"value" "250"
"affected_by_aoe_increase" "1"
}
"shard_starfall_damage_pct_first" "50"
"shard_starfall_damage_pct_second" "25"
"shard_meteor_impact_delay" "0.57"
"shard_second_meteor_delay" "0.35"
"talent_side_arrow_angle" "25"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_mirana_leap_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/mirana/ability_mirana_leap_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityTextureName" "mirana_leap"
"MaxLevel" "4"
"AbilityCastPoint" "0.0"
"AbilityManaCost" "0"
"AbilityValues"
{
"mana_cost_pct" "5"
"leap_damage_reduction_pct" "75"
"leap_landing_radius"
{
"value" "175"
"affected_by_aoe_increase" "1"
"special_bonus_unique_mirana_leap_landing_radius" "+250"
}
"leap_landing_damage_pct" "25"
"mana_damage_pct"
{
"value" "10"
"hero_levelup" "+1"
"levelup_interval" "1"
"special_bonus_unique_mirana_innate_mana_damage" "+8"
}
"talent_air_strike_projectile_speed" "0"
"leap_distance" "575"
"leap_speed" "1300"
"leap_height" "150"
"leap_speedbonus" "8 16 24 32"
"leap_speedbonus_as" "60 80 100 120"
"leap_bonus_duration" "4"
"innate_damage_multiplier" "4"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"ability_mirana_innate_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/mirana/ability_mirana_innate_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
"AbilityType" "ABILITY_TYPE_BASIC"
"Innate" "1"
"IsBreakable" "1"
"AbilityTextureName" "mirana_celestial_quiver"
"MaxLevel" "1"
"AbilityValues"
{
"mana_damage_pct"
{
"value" "10"
"hero_levelup" "+1"
"levelup_interval" "1"
"special_bonus_unique_mirana_innate_mana_damage" "+8"
}
"moon_sisters_radius"
{
"value" "1200"
"affected_by_aoe_increase" "1"
}
"moon_sisters_damage_reduction_pct" "25"
}
}
"ability_mirana_moonlight_shadow_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/mirana/ability_mirana_moonlight_shadow_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityTextureName" "mirana_invis"
"MaxLevel" "3"
"HasScepterUpgrade" "1"
"AbilityCastPoint" "0.3"
"AbilityManaCost" "75 75 75"
"AbilityValues"
{
"AbilityCooldown" "140 120 100"
"duration"
{
"value" "18"
"special_bonus_unique_mirana_moonlight_duration" "+10"
}
"scepter_ally_damage_share_pct" "50"
"bonus_movement_speed" "9 12 15"
"damage_bonus_base" "15 20 25"
"damage_bonus_per_second" "2 3 4"
"radius" "25000"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
}
"special_bonus_unique_mirana_starstorm_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_mirana_starstorm_cooldown"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_mirana_starstorm_attack_proc"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityValues"
{
"attack_proc_chance" "20"
}
}
"special_bonus_unique_mirana_sacred_arrow_side_arrows"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_mirana_sacred_arrow_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_mirana_leap_charge_time"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_mirana_leap_air_strike"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_mirana_leap_landing_radius"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_mirana_moonlight_duration"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_mirana_innate_mana_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+164
View File
@@ -0,0 +1,164 @@
"DOTAAbilities"
{
"dark_friends"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nagash/dark_friends"
"AbilityTextureName" "old_heroes/nagash/dark_friend"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"MaxLevel" "4"
"AbilityValues"
{
"aura_radius" "350"
"aura_bonus_damage" "25 50 75 100"
"aura_bonus_attack_speed" "20 30 40 50"
"aura_bonus_movespeed_pct" "2 4 6 8"
"aura_bonus_armor" "3 5 6 9"
"outgoing_damage_pct"
{
"value" "0"
"special_bonus_unique_nagash_dark_friend_damage_pct" "25"
}
}
}
"world_destroyer"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nagash/world_destroyer"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"LinkedAbility" "leader_call"
"AbilityTextureName" "old_heroes/nagash/world_destroyer"
"AbilityCooldown" "30 28 26 24"
"AbilityManaCost" "125"
"AbilityCastRange" "600"
"AbilityCastPoint" "0.2"
"HasShardUpgrade" "1"
"AbilityValues"
{
"radius" "500"
"health_soul_eater" "200 300 400 500"
"dominate_duration" "10 15 20 25"
"bonus_damage" "150 200 250 300"
"bonus_attack_speed" "50 80 100 120"
"bonus_armor" "4 6 8 10"
"shard_invulnerable_duration" "3"
}
}
"leader_call"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nagash/leader_call"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"LinkedAbility" "world_destroyer"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"AbilityTextureName" "old_heroes/nagash/leader_call"
"AbilityCooldown" "2.5"
"AbilityHealthCost" "125 150 175 200"
"AbilityCastRange" "600"
"AbilityCastPoint" "0.2"
"AbilityValues"
{
"explosion_radius" "175"
"explosion_damage" "40 60 80 100"
"unit_health_for_damage"
{
"value" "0"
"special_bonus_unique_nagash_leader_call_damage" "50"
}
"bonus_stats_per_soul" "0.1 0.2 0.3 0.4"
}
}
"fighting_up"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nagash/fighting_up"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityTextureName" "old_heroes/nagash/soul_eater"
"AbilityCooldown" "40"
"AbilityHealthCost" "275"
"AbilityCastRange" "600"
"AbilityCastPoint" "0"
"AbilityValues"
{
"radius" "900"
"duration" "16"
"bonus_damage_pct" "20 30 40 50"
"bonus_movespeed_pct" "12 16 20 24"
"bonus_attackspeed_pct" "15 20 25 30"
}
}
"war_for_life"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nagash/war_for_life"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityTextureName" "old_heroes/nagash/war_for_life"
"AbilityCooldown" "60"
"AbilityManaCost" "150"
"IsGrantedByScepter" "1"
"AbilityCastPoint" "0"
"MaxLevel" "1"
"AbilityValues"
{
"lost_souls_pct"
{
"value" "30"
"special_bonus_shard" "-30"
}
"radius" "1500"
"health_res_pct" "20"
"inc_damage_res" "100"
"duration" "6"
}
}
"dark_golem"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nagash/dark_golem"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"MaxLevel" "3"
"AbilityTextureName" "old_heroes/nagash/dark_golem"
"AbilityCooldown" "300"
"AbilityManaCost" "500 1000 2000"
"AbilityHealthCost" "500 1000 2000"
"AbilityCastPoint" "0"
"AbilityValues"
{
"cleave_damage" "300 400 500"
"cleave_distance" "400"
"cleave_starting_width" "150"
"cleave_ending_width" "360"
"bonus_damage_pct_per_token" "0.1 0.2 0.3"
"bonus_attack_speed_pct_per_token" "0.1 0.2 0.3"
"bonus_movespeed_pct_per_token" "0.1 0.2 0.3"
"duration" "42"
}
}
"special_bonus_unique_nagash_dark_friend_damage_pct"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_nagash_leader_call_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+279
View File
@@ -0,0 +1,279 @@
"DOTAAbilities"
{
"nevermore_shadowraze1_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nevermore/nevermore_shadowraze_custom"
"AbilityTextureName" "nevermore_shadowraze1"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"LinkedAbility" "nevermore_shadowraze2_custom"
"AbilityCastAnimation" "ACT_DOTA_RAZE_1"
"AbilityCastGestureSlot" "DEFAULT"
"AbilityCastPoint" "0.55"
"AbilityManaCost" "80"
"AbilityValues"
{
"shadowraze_damage" "90 180 270 360"
"shadowraze_radius"
{
"value" "250"
"affected_by_aoe_increase" "1"
}
"slow_duration" "1 1 1 1"
"slow_duration_for_boss" "0.5 0.5 0.5 0.5"
"shadowraze_range" "200"
"stack_bonus_damage"
{
"value" "10 15 20 25"
"special_bonus_unique_nevermore_custom_8" "+20"
}
"duration" "7"
"movement_speed_debuff" "6 8 10 12"
"AbilityCooldown" "9"
}
}
"nevermore_shadowraze2_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nevermore/nevermore_shadowraze_custom"
"AbilityTextureName" "nevermore_shadowraze2"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"OnLearnbar" "0"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"FightRecapLevel" "1"
"LinkedAbility" "nevermore_shadowraze3_custom"
"AbilityCastAnimation" "ACT_DOTA_RAZE_2"
"AbilityCastGestureSlot" "DEFAULT"
"AbilityCastPoint" "0.55"
"AbilityManaCost" "80"
"AbilityValues"
{
"shadowraze_damage" "90 180 270 360"
"shadowraze_radius"
{
"value" "250"
"affected_by_aoe_increase" "1"
}
"slow_duration" "1 1 1 1"
"slow_duration_for_boss" "0.5 0.5 0.5 0.5"
"shadowraze_range" "450"
"stack_bonus_damage"
{
"value" "10 15 20 25"
"special_bonus_unique_nevermore_custom_8" "+20"
}
"duration" "7"
"movement_speed_debuff" "6 8 10 12"
"AbilityCooldown" "9"
}
}
"nevermore_shadowraze3_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nevermore/nevermore_shadowraze_custom"
"AbilityTextureName" "nevermore_shadowraze3"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"OnLearnbar" "0"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"LinkedAbility" "nevermore_shadowraze1_custom"
"AbilityCastAnimation" "ACT_DOTA_RAZE_3"
"AbilityCastGestureSlot" "DEFAULT"
"AbilityCastPoint" "0.55"
"AbilityManaCost" "80"
"AbilityValues"
{
"shadowraze_damage" "90 180 270 360"
"shadowraze_radius"
{
"value" "250"
"affected_by_aoe_increase" "1"
}
"slow_duration" "1 1 1 1"
"slow_duration_for_boss" "0.5 0.5 0.5 0.5"
"shadowraze_range" "700"
"stack_bonus_damage"
{
"value" "10 15 20 25"
"special_bonus_unique_nevermore_custom_8" "+20"
}
"duration" "7"
"movement_speed_debuff" "6 8 10 12"
"AbilityCooldown" "9"
}
}
"nevermore_necromastery_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nevermore/nevermore_necromastery_custom"
"AbilityTextureName" "nevermore_necromastery"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityManaCost" "0"
"AbilityCooldown" "40 35 30 25"
"AbilityValues"
{
"necromastery_damage_per_soul"
{
"value" "2 3 4 5"
"special_bonus_unique_nevermore_custom_4" "+2"
}
"necromastery_max_souls"
{
"value" "20"
"special_bonus_unique_nevermore_custom_3" "+20"
}
"souls_per_kill" "1"
"souls_per_boss_kill" "3"
"necromastery_soul_pct_release" "30"
"active_duration" "10"
"active_bonus_soul_cap" "20 40 60 80"
}
}
"nevermore_dark_lord_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nevermore/nevermore_dark_lord_custom"
"AbilityTextureName" "nevermore_dark_lord"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE"
"Innate" "1"
"HasShardUpgrade" "1"
"MaxLevel" "1"
"AbilityValues"
{
"armor_reduction_per_soul"
{
"value" "0.25"
"special_bonus_unique_nevermore_custom_5" "+0.25"
}
"presence_radius"
{
"value" "1200"
"special_bonus_unique_nevermore_custom_6" "+300"
}
"shard_ally_armor_bonus" "8"
}
}
"nevermore_deadly_strike_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nevermore/nevermore_deadly_strike_custom"
"AbilityTextureName" "nevermore_frenzy"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"MaxLevel" "4"
"AbilityValues"
{
"deadly_strike_chance"
{
"value" "20 25 30 35"
"special_bonus_unique_nevermore_custom_1" "+15"
}
"deadly_strike_base_crit" "100"
"deadly_strike_crit_per_soul"
{
"value" "1 1.5 2 2.5"
"special_bonus_unique_nevermore_custom_2" "+1"
}
}
}
"nevermore_requiem_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/nevermore/nevermore_requiem_custom"
"AbilityTextureName" "nevermore_requiem"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilityCastPoint" "1.67 1.67 1.67"
"HasScepterUpgrade" "1"
"AbilityManaCost" "150 300 600"
"AbilityValues"
{
"damage"
{
"value" "100 220 340"
"special_bonus_unique_nevermore_custom_7" "+150"
}
"AbilityCooldown" "20"
"requiem_radius" "1000"
"requiem_reduction_ms" "-20 -25 -30"
"requiem_reduction_mres" "-5 -10 -15"
"requiem_slow_duration" "0.6"
"requiem_slow_duration_max" "2.15"
"requiem_line_width_start" "125"
"requiem_line_width_end" "300"
"requiem_line_speed" "700 700 700"
"requiem_damage_pct_scepter" "60"
"count_split_attack" "0"
"split_attack_duration" "0"
"requiem_soul_pct_release" "70"
}
}
"special_bonus_unique_nevermore_custom_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_nevermore_custom_2"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_nevermore_custom_3"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_nevermore_custom_4"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_nevermore_custom_5"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_nevermore_custom_6"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_nevermore_custom_7"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_nevermore_custom_8"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
}
+251
View File
@@ -0,0 +1,251 @@
"DOTAAbilities"
{
"ability_ogre_magi_fireblast_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/ogre_magi/ability_ogre_magi_fireblast_custom"
"AbilityTextureName" "ogre_magi_fireblast"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG"
"FightRecapLevel" "1"
"AbilitySound" "Hero_OgreMagi.Fireblast"
"MaxLevel" "4"
"AbilityCastRange" "800"
"AbilityCastPoint" "0.45"
"AbilityManaCost" "70 85 100 115"
"AbilityValues"
{
"AbilityCooldown" "11 10 9 8"
"fireblast_damage"
{
"value" "70 130 190 250"
"special_bonus_unique_ogre_magi_fireblast_damage" "+220"
}
"stun_duration" "1.2"
"blast_radius" "200"
"max_health_damage_pct" "8 10 12 14"
"attack_proc_chance"
{
"value" "0"
"special_bonus_unique_ogre_magi_fireblast_attack_proc" "15"
}
"attack_proc_distance" "200"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"ability_ogre_magi_ignite_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/ogre_magi/ability_ogre_magi_ignite_custom"
"AbilityTextureName" "ogre_magi_ignite"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilitySound" "Hero_OgreMagi.Ignite"
"MaxLevel" "4"
"AbilityCastRange" "700 800 900 1000"
"AbilityCastPoint" "0.35"
"AbilityManaCost" "80 90 100 110"
"AbilityValues"
{
"AbilityCooldown" "17"
"duration" "5 6 7 8"
"burn_damage"
{
"value" "20 30 40 50"
"special_bonus_unique_ogre_magi_ignite_damage" "+12"
}
"slow_movement_speed_pct" "-25"
"projectile_speed" "1000"
"ignite_radius" "300"
"max_health_damage_pct" "2 3 4 5"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_ogre_magi_bloodlust_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/ogre_magi/ability_ogre_magi_bloodlust_custom"
"AbilityTextureName" "ogre_magi_bloodlust"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_BUILDING"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE"
"SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilitySound" "Hero_OgreMagi.Bloodlust.Target"
"MaxLevel" "4"
"AbilityCastRange" "650"
"AbilityCastPoint" "0.45"
"AbilityManaCost" "40 50 60 70"
"AbilityValues"
{
"AbilityCooldown" "20 18 16 14"
"bonus_movement_speed" "6 8 10 12"
"bonus_attack_speed"
{
"value" "35 50 65 80"
"special_bonus_unique_ogre_magi_bloodlust_as" "+35"
}
"self_bonus"
{
"value" "40 60 80 100"
"special_bonus_unique_ogre_magi_bloodlust_as" "+35"
}
"duration" "30"
"modelscale" "25"
"physical_vampirism"
{
"value" "0"
"special_bonus_unique_ogre_magi_bloodlust_as" "+30"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"ability_ogre_magi_multicast_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/ogre_magi/ability_ogre_magi_multicast_custom"
"AbilityTextureName" "ogre_magi_multicast"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"MaxLevel" "3"
"IsBreakable" "1"
"HasShardUpgrade" "1"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
"AbilityCastPoint" "0.5"
"AbilityValues"
{
"chance_2x" "75"
"chance_3x" "0 30 30"
"chance_4x" "0 0 15"
"multicast_delay" "0.6"
"shard_cooldown" "45 40 35"
"shard_mana_cost" "100 125 150"
"shard_radius" "800"
"shard_duration" "5"
}
}
"ability_ogre_magi_unrefined_fireblast_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/ogre_magi/ability_ogre_magi_unrefined_fireblast_custom"
"AbilityTextureName" "ogre_magi_unrefined_fireblast"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"MaxLevel" "1"
"IsGrantedByScepter" "1"
"AbilityCastRange" "800"
"AbilityCastPoint" "0.45"
"AbilityManaCost" "0"
"AbilitySound" "Hero_OgreMagi.Fireblast"
"AbilityValues"
{
"AbilityCooldown" "8"
"mana_cost_pct" "25"
"blast_damage" "300"
"stun_duration" "1.5"
"blast_radius" "200"
"max_health_damage_pct" "15"
}
}
"ability_ogre_magi_innate_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/ogre_magi/ability_ogre_magi_innate_custom"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
"AbilityType" "ABILITY_TYPE_BASIC"
"Innate" "1"
"IsBreakable" "1"
"AbilityTextureName" "ogre_magi_dumb_luck"
"MaxLevel" "1"
"AbilityValues"
{
"luck_per_level"
{
"value" "1"
"special_bonus_unique_ogre_magi_luck" "+1"
}
}
}
"special_bonus_unique_ogre_magi_fireblast_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_ogre_magi_ignite_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_ogre_magi_bloodlust_as"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_ogre_magi_ignite_stacks"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_ogre_magi_ignite_on_cast"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_ogre_magi_ignite_proc_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_ogre_magi_fireblast_attack_proc"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_cast_range_100"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_attack_damage_80"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_ogre_magi_luck"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
@@ -0,0 +1,196 @@
"DOTAAbilities"
{
"ability_phantom_assassin_stifling_dagger_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities\heroes\phantom_assassin\ability_phantom_assassin_stifling_dagger_custom.lua"
"AbilityTextureName" "phantom_assassin_stifling_dagger"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityCastRange" "600 700 800 900"
"AbilityCastPoint" "0.15"
"AbilityCooldown" "0"
"AbilityManaCost" "40 35 30 25"
"AbilityCharges" "1 2 3 4"
"AbilityChargeRestoreTime" "8 7 6 5"
"AbilityValues"
{
"attack_factor"
{
"value" "15 35 55 75"
"special_bonus_unique_assassin_stifling_dagger_damage_base" "+45"
}
"damage" "110 150 190 230"
"max_targets"
{
"value" "0"
"special_bonus_unique_assassin_stifling_dagger_max_targets" "2"
}
"chance"
{
"special_bonus_unique_assassin_stifling_dagger_chance_again" "10"
}
"movement_slow" "-50"
"slow_duration" "1.75 2.5 3.25 4.0"
"dagger_speed" "1200"
}
}
"ability_phantom_assassin_phantom_strike_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/phantom_assassin/ability_phantom_assassin_phantom_strike_custom.lua"
"AbilityTextureName" "phantom_assassin_phantom_strike"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityCastRange" "650 750 850 950"
"AbilityCastPoint" "0.25"
"AbilityManaCost" "25 40 45 50"
"AbilityValues"
{
"cooldown" "11 9 7 5"
"attack_speed_bonus" "110 145 180 215"
"bonus_duration" "3.5 4 4.5 5"
"lifesteal_percent"
{
"value" "0"
"special_bonus_unique_assassin_phantom_strike_lifesteal" "+25"
}
"crit_chance"
{
"value" "0"
"special_bonus_unique_assassin_phantom_strike_crit" "100"
}
"crit_mult"
{
"value" "0"
"special_bonus_unique_assassin_phantom_strike_crit" "175"
}
}
}
"ability_phantom_assassin_blur_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/phantom_assassin/ability_phantom_assassin_blur_custom.lua"
"AbilityTextureName" "phantom_assassin_blur"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityCooldown" "60"
"AbilityManaCost" "50"
"AbilityCastPoint" "0.25"
"HasShardUpgrade" "1"
"AbilityValues"
{
"bonus_agility_pct" "15 30 45 60"
"duration"
{
"value" "8 10 12 14"
"special_bonus_unique_assassin_blur_duration_base" "+6"
}
"bonus_agility"
{
"value" "14 26 38 50"
"special_bonus_unique_assassin_blur_agility_base" "+25"
}
"move_speed_pct" "20"
"illusion_outgoing_damage" "115"
"illusion_incoming_damage" "300"
}
}
"ability_phantom_assassin_coup_de_grace_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/phantom_assassin/ability_phantom_assassin_coup_de_grace_custom.lua"
"AbilityTextureName" "phantom_assassin_coup_de_grace"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"HasScepterUpgrade" "1"
"MaxLevel" "3"
"AbilityValues"
{
"crit_chance" "15 20 30"
"crit_mult" "250 400 550"
"damage_mult" "0"
"armor_reduction" "2 4 6"
"armor_reduction_agility_pct" "6 8 10"
"ability_cooldown" "20"
"health_mult_decrease" "0"
"duration" "7"
}
}
"ability_phantom_assassin_phantom_bash_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/phantom_assassin/ability_phantom_assassin_phantom_bash_custom.lua"
"AbilityTextureName" "phantom_assassin_phantom_bash"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"MaxLevel" "1"
"Innate" "1"
"IsBreakable" "1"
"AbilityValues"
{
"cooldown" "16.0"
"bash_duration" "0.15"
"bash_cd_level" "0.10"
}
}
"special_bonus_unique_assassin_blur_duration_base"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_assassin_blur_agility_base"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_assassin_stifling_dagger_chance_again"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_assassin_stifling_dagger_damage_base"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_assassin_phantom_strike_lifesteal"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_assassin_stifling_dagger_max_targets"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_assassin_phantom_strike_crit"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+205
View File
@@ -0,0 +1,205 @@
"DOTAAbilities"
{
"ability_pudge_meat_hook_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/pudge/ability_pudge_meat_hook_custom.lua"
"AbilityTextureName" "pudge_meat_hook"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_DIRECTIONAL"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"AbilityCastPoint" "0.3"
"AbilityCastRange" "900 1050 1200 1350"
"AbilityCooldown" "16 14 12 10"
"AbilityManaCost" "25"
"AbilityValues"
{
"hook_distance"
{
"value" "900 1050 1200 1350"
"special_bonus_unique_pudge_hook_range" "+250"
}
"hook_speed" "1450"
"hook_width" "110"
"hook_damage"
{
"value" "160 200 240 280"
"special_bonus_unique_pudge_hook_damage" "+120"
}
"max_health_damage_pct" "50 100 150 200"
}
}
"ability_pudge_rot_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/pudge/ability_pudge_rot_custom.lua"
"AbilityTextureName" "pudge_rot"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_TOGGLE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"AbilityManaCost" "0"
"AbilityCooldown" "0"
"HasScepterUpgrade" "1"
"AbilityValues"
{
"tick_interval" "0.2"
"rot_radius"
{
"value" "260 280 300 320"
"special_bonus_unique_pudge_rot_radius" "+80"
}
"rot_damage_per_sec"
{
"value" "45 70 95 120"
"special_bonus_unique_pudge_rot_damage" "+35"
}
"rot_damage_increase_per_sec" "6 8 10 12"
"max_health_damage_pct" "0.6 0.9 1.2 1.5"
"self_damage_pct_per_sec" "3.5"
"rot_slow_pct" "22"
"scepter_bonus_radius" "60"
"scepter_enemy_hp_regen_reduction_pct" "45"
"shard_slow_bonus_pct" "10"
}
}
"ability_pudge_flesh_heap_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/pudge/ability_pudge_flesh_heap_custom.lua"
"AbilityTextureName" "pudge_flesh_heap"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
"AbilityType" "ABILITY_TYPE_BASIC"
"IsBreakable" "1"
"Innate" "1"
"AbilityValues"
{
"stack_range"
{
"value" "900"
"special_bonus_unique_pudge_heap_range" "+250"
}
"strength_per_stack" "0.10"
"magic_resist_per_stack" "0.10"
}
}
"ability_pudge_meat_shield_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/pudge/ability_pudge_meat_shield_custom.lua"
"AbilityTextureName" "pudge_flesh_heap"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityType" "ABILITY_TYPE_BASIC"
"IsBreakable" "1"
"HasShardUpgrade" "1"
"AbilityValues"
{
"block_damage"
{
"value" "12 16 20 24"
"special_bonus_unique_pudge_heap_strength" "+16"
}
"block_damage_vs_creeps" "12 18 24 30"
"shard_block_per_strength" "0.1"
}
}
"ability_pudge_dismember_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/pudge/ability_pudge_dismember_custom.lua"
"AbilityTextureName" "pudge_dismember"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityCastRange" "175 175 175"
"AbilityChannelTime" "2.4 2.8 3.2"
"AbilityCooldown" "0"
"AbilityManaCost" "25"
"AbilityValues"
{
"cast_range"
{
"value" "175 175 175"
"special_bonus_unique_pudge_dismember_range" "+125"
}
"channel_time" "2.4 2.8 3.2"
"width" "220"
"pull_speed" "850"
"pulse_interval" "0.25"
"damage_per_second"
{
"value" "130 190 250"
"special_bonus_unique_pudge_dismember_damage" "+70"
}
"strength_damage_pct" "50 100 150"
"max_health_damage_pct" "0.8 1.2 1.6"
"flesh_heap_stack_damage" "1.2"
"hunger_bonus" "5"
"heal_from_damage_pct" "80"
}
"AbilityCastAnimation" "ACT_DOTA_CHANNEL_ABILITY_4"
}
"special_bonus_unique_pudge_hook_range"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_pudge_hook_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_pudge_rot_radius"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_pudge_rot_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_pudge_heap_range"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_pudge_heap_strength"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_pudge_dismember_range"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_pudge_dismember_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
@@ -0,0 +1,228 @@
"DOTAAbilities"
{
"queenofpain_shadow_strike_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/queenofpain/queenofpain_shadow_strike_custom"
"AbilityTextureName" "queenofpain_shadow_strike"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"HasScepterUpgrade" "1"
"AbilitySound" "Hero_QueenOfPain.ShadowStrike"
"AbilityCastRange" "450 500 550 600"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "13 10 7 4"
"AbilityValues"
{
"mana_damage_from_current_pct" "50 100 150 200"
"strike_damage"
{
"value" "45 90 135 180"
"special_bonus_scepter" "+50"
}
"duration_damage" "40 90 150 220"
"movement_slow" "-15"
"projectile_speed" "900"
"attack_speed"
{
"special_bonus_unique_queen_of_pain_1" "+45"
}
"damage_interval"
{
"value" "3.0"
"special_bonus_unique_queen_of_pain_4" "-1"
}
"AbilityManaCost"
{
"value" "50 60 70 80"
"special_bonus_scepter" "+80%"
}
"radius"
{
"value" "200"
"affected_by_aoe_increase" "1"
}
"duration" "12"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"queenofpain_blink_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/queenofpain/queenofpain_blink_custom"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilitySound" "Hero_QueenOfPain.Blink_in"
"AbilityTextureName" "queenofpain_blink"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
"AbilityCastPoint" "0.33 0.33 0.33 0.33"
"AbilityManaCost" "65"
"AbilityValues"
{
"mana_damage_from_current_pct" "50 100 150 200"
"cast_range" "800 900 1000 1100"
"damage"
{
"value" "40 80 120 160"
"special_bonus_unique_queen_of_pain_2_1" "+60"
}
"duration" "1 1.25 1.5 1.75"
"radius"
{
"value" "300"
"affected_by_aoe_increase" "1"
}
"AbilityCooldown"
{
"value" "12.0 10.0 8.0 6.0"
"special_bonus_unique_queen_of_pain_6" "-2"
}
}
}
"queenofpain_scream_of_pain_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/queenofpain/queenofpain_scream_of_pain_custom"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityTextureName" "queenofpain_scream_of_pain"
"AbilitySound" "Hero_QueenOfPain.ScreamOfPain"
"HasShardUpgrade" "1"
"AbilityCastRange" "0"
"AbilityCastPoint" "0.0 0.0 0.0 0.0"
"AbilityCooldown" "7.5 7 6.5 6"
"AbilityManaCost" "120"
"AbilityValues"
{
"mana_damage_from_current_pct" "50 100 150 200"
"shard_mark_duration" "4.0"
"shard_incoming_damage_pct" "6"
"radius"
{
"value" "600"
"affected_by_aoe_increase" "1"
}
"projectile_speed" "900"
"damage"
{
"value" "100 200 300 400"
"special_bonus_unique_queen_of_pain_2" "+150"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
"AbilityCastGestureSlot" "DEFAULT"
}
"queenofpain_sonic_wave"
{
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_POINT"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"FightRecapLevel" "2"
"AbilitySound" "Hero_QueenOfPain.SonicWave"
"AbilityCastRange" "700"
"AbilityCastPoint" "0.452 0.452 0.452"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"AbilityManaCost" "250 400 550"
"AbilityValues"
{
"starting_aoe"
{
"value" "100"
}
"distance"
{
"value" "900"
}
"final_aoe"
{
"value" "450"
"affected_by_aoe_increase" "1"
}
"speed" "900"
"damage"
{
"value" "1500 2000 3000"
"special_bonus_unique_queen_of_pain_7" "+500"
}
"tick_rate" "0.1"
"knockback_distance"
{
"value" "350"
"affected_by_aoe_increase" "1"
}
"knockback_duration" "1.4"
"AbilityCooldown"
{
"value" "70 65 60"
"special_bonus_unique_queen_of_pain_3" "-20"
}
}
}
"queenofpain_agony_innate"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/queenofpain/queenofpain_agony_innate"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
"AbilityType" "ABILITY_TYPE_BASIC"
"Innate" "1"
"MaxLevel" "1"
"IsBreakable" "1"
"AbilityTextureName" "queenofpain_scream_of_pain"
"AbilityValues"
{
"aura_radius" "2500"
"self_damage_pct_per_level" "1.5"
"spell_amp_bonus" "12"
"spell_amp_per_missing_hp_pct" "0.1"
"mitigation_pct_per_level"
{
"value" "0"
"special_bonus_unique_queen_of_pain_8" "1"
}
}
}
"special_bonus_unique_queen_of_pain_8"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_queen_of_pain_2_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
}
+177
View File
@@ -0,0 +1,177 @@
"DOTAAbilities"
{
"ability_rubick_telekinesis_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/rubick/ability_rubick_telekinesis_custom.lua"
"AbilityTextureName" "rubick_telekinesis"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"HasScepterUpgrade" "1"
"FightRecapLevel" "1"
"AbilityCastRange" "625"
"AbilityCastPoint" "0.1"
"AbilityManaCost" "110"
"AbilityValues"
{
"air_time" "2.5"
"lift_time" "0.25"
"drop_time" "0.07"
"lift_duration" "1.25 1.5 1.75 2.0"
"land_stun_duration"
{
"value" "1.0 1.25 1.5 1.75"
"special_bonus_unique_rubick_telekinesis_stun" "+1.25"
}
"land_stun_radius"
{
"value" "375"
"special_bonus_unique_rubick_telekinesis_land_radius" "+150"
}
"land_damage" "80 160 240 320"
"throw_distance" "375"
"lift_height" "200"
"ally_air_radius" "150"
"ally_air_max_radius" "250"
"ally_air_move_speed_mult" "1.5"
"ally_attack_speed_bonus" "110 170 230 290"
"ally_heal_per_second" "70 90 110 130"
"ally_attack_range_bonus" "100 150 200 250"
"ally_bonus_magic_damage" "180 240 300 360"
"ally_bonus_magic_damage_per_int" "0.5 0.75 1.0 1.25"
"caster_break_range_mult" "2"
"AbilityCharges"
{
"value" "1"
"special_bonus_unique_rubick_telekinesis_charges" "2"
}
"AbilityChargeRestoreTime" "12"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"ability_rubick_fade_bolt_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/rubick/ability_rubick_fade_bolt_custom.lua"
"AbilityTextureName" "rubick_fade_bolt"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"HasShardUpgrade" "1"
"AbilitySound" "Hero_Rubick.FadeBolt.Cast"
"AbilityCastRange" "800"
"AbilityCastPoint" "0.1"
"AbilityCooldown" "16 14 12 10"
"AbilityManaCost" "110 125 140 155"
"AbilityValues"
{
"damage"
{
"value" "150 250 350 450"
"special_bonus_unique_rubick_fade_bolt_damage" "+150"
}
"radius" "440"
"jump_damage_reduction_pct" "6"
"attack_damage_reduction" "5 15 25 35"
"duration" "10"
"jump_delay" "0.25"
"projectile_speed" "1200"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"ability_rubick_arcane_supremacy"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/rubick/ability_rubick_arcane_supremacy.lua"
"AbilityTextureName" "rubick_arcane_supremacy"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityValues"
{
"spell_amp" "15 25 35 45"
"spell_amp_pct_lvl" "0.5"
"aura_radius" "600"
"damage_pct"
{
"value" "15 20 25 30"
"special_bonus_unique_rubick_arcane_supremacy_damage_pct" "+15"
}
}
}
"ability_rubick_spellsteal_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/rubick/ability_rubick_spellsteal_custom.lua"
"AbilityTextureName" "rubick_spell_steal"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"FightRecapLevel" "1"
"MaxLevel" "1"
"Innate" "1"
"AbilityCastRange" "900"
"AbilityCastPoint" "0.1"
"AbilityManaCost" "200"
"AbilityValues"
{
"AbilityCooldown"
{
"value" "20"
"special_bonus_unique_rubick_spellsteal_cooldown" "-10"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
}
"special_bonus_unique_rubick_telekinesis_stun"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_rubick_fade_bolt_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_rubick_spellsteal_cooldown"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_rubick_arcane_supremacy_damage_pct"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_rubick_telekinesis_land_radius"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_rubick_fade_bolt_convert"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_rubick_telekinesis_charges"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+267
View File
@@ -0,0 +1,267 @@
"DOTAAbilities"
{
"sandking_burrowstrike_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sand_king/sandking_burrowstrike_custom.lua"
"AbilityTextureName" "sandking_burrowstrike"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG"
"FightRecapLevel" "1"
"AbilitySound" "Ability.SandKing_BurrowStrike"
"MaxLevel" "4"
"AbilityCastPoint" "0.0"
"AbilityCooldown" "15 14 13 12"
"AbilityManaCost" "15"
"AbilityDamage" "80 150 220 290"
"AbilityValues"
{
"burrow_anim_time" "0.52"
"burrow_width"
{
"value" "150"
"affected_by_aoe_increase" "1"
}
"burrow_speed" "2000"
"AbilityCastRange"
{
"value" "525 600 675 750"
"special_bonus_unique_sandking_burrow_range" "+75"
}
"stun_duration"
{
"value" "1.6 1.8 2.0 2.2"
"special_bonus_unique_sandking_burrow_stun" "+0.6"
}
"burrow_bonus_damage_max_hp_pct" "10 15 20 25"
}
}
"sandking_sand_storm_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sand_king/sandking_sand_storm_custom.lua"
"AbilityTextureName" "sandking_sand_storm"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"FightRecapLevel" "1"
"AbilitySound" "Ability.SandKing_SandStorm.start"
"MaxLevel" "4"
"AbilityCastRange" "0"
"AbilityCooldown" "15 13 11 9"
"AbilityCastPoint" "0.0"
"AbilityManaCost" "85"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
"AbilityValues"
{
"duration" "25"
"damage_tick_rate" "0.25"
"sand_storm_radius"
{
"value" "425 500 575 650"
"affected_by_aoe_increase" "1"
"special_bonus_unique_sandking_storm_radius" "+75"
}
"sand_storm_damage"
{
"value" "30 50 70 90"
"special_bonus_unique_sandking_storm_damage" "+40"
}
"sand_storm_regen_damage_pct" "4 5 6 7"
"sand_storm_move_speed" "60"
}
}
"sandking_scorpion_strike_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sand_king/sandking_scorpion_strike_custom.lua"
"AbilityTextureName" "sandking_scorpion_strike"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilitySound" "Hero_Sandking.Stinger"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
"AbilityCastGestureSlot" "DEFAULT"
"MaxLevel" "4"
"AbilityCastRange" "200"
"FightRecapLevel" "1"
"AbilityCastPoint" "0.4"
"AbilityManaCost" "35 40 45 50"
"HasScepterUpgrade" "1"
"AbilityCooldown" "11 9 7 5"
"AbilityValues"
{
"AbilityCooldown"
{
"value" "11 9 7 5"
"special_bonus_unique_sandking_scorpion_cd" "-2"
}
"radius"
{
"value" "225 255 285 315"
"affected_by_aoe_increase" "1"
}
"inner_radius"
{
"value" "125"
"affected_by_aoe_increase" "1"
}
"inner_radius_bonus_damage_pct" "40"
"attack_damage" "35 70 105 140"
"attack_damage_pct_from_attack" "75"
"debuff_duration" "4 5 6 7"
"strike_slow" "-10 -12 -14 -16"
"scepter_stack" "2"
"scepter_cd_pct" "80"
"scorpion_bonus_damage_max_hp_pct" "10 15 20 25"
}
}
"sandking_caustic_finale_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sand_king/sandking_caustic_finale_custom.lua"
"AbilityTextureName" "sandking_caustic_finale"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilitySound" "Ability.SandKing_CausticFinale"
"Innate" "1"
"MaxLevel" "1"
"IsBreakable" "1"
"AbilityValues"
{
"caustic_finale_radius"
{
"value" "500"
"affected_by_aoe_increase" "1"
"special_bonus_unique_sandking_finale_radius" "+100"
}
"explosion_damage_per_hero_level" "30"
"kill_explosion_max_hp_pct_base" "5"
"kill_explosion_max_hp_pct_per_level" "0.1"
"caustic_finale_duration" "6"
"max_attacks" "3"
"explosion_slow_pct" "-20"
}
}
"sandking_epicenter_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sand_king/sandking_epicenter_custom.lua"
"AbilityTextureName" "sandking_epicenter"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"FightRecapLevel" "2"
"AbilitySound" "Ability.SandKing_Epicenter"
"HasShardUpgrade" "1"
"HasScepterUpgrade" "1"
"MaxLevel" "3"
"AbilityCooldown" "40"
"AbilityCastPoint" "2.5"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"AbilityManaCost" "90"
"AbilityValues"
{
"pulse_phase_duration" "6.0"
"epicenter_pulses"
{
"value" "12 16 20"
"special_bonus_unique_sandking_epicenter_pulses" "+4"
}
"epicenter_damage"
{
"value" "60 70 80"
"special_bonus_unique_sandking_epicenter_damage" "+35"
}
"epicenter_radius_base"
{
"value" "500"
"affected_by_aoe_increase" "1"
}
"epicenter_radius_increment"
{
"value" "13"
"affected_by_aoe_increase" "1"
}
"epicenter_slow" "-30 -40 -50"
"epicenter_slow_as" "-50 -55 -60"
"slow_duration" "3"
"scepter_rolls_per_second" "6"
"scepter_proc_every_n_time_checks" "2"
"scepter_luck_per_extra_tail" "10"
"shard_cast_reduction" "0.4"
"shard_break_duration" "3"
"shard_break_count" "4"
"shard_break_radius" "325"
}
}
"special_bonus_unique_sandking_burrow_range"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sandking_burrow_stun"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sandking_storm_radius"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sandking_storm_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sandking_scorpion_cd"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sandking_finale_radius"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sandking_epicenter_pulses"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sandking_epicenter_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+268
View File
@@ -0,0 +1,268 @@
"DOTAAbilities"
{
"ability_star_devour"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sargatanas/ability_star_devour.lua"
"AbilityTextureName" "old_heroes/devour_sargatanas"
"FightRecapLevel" "1"
"MaxLevel" "4"
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_CUSTOM"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_CUSTOM"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"LinkedAbility" "ability_hell_summon"
"AbilityCharges" "3"
"AbilityCastRange" "300 300 300 300"
"AbilityCastPoint" "0.3 0.3 0.3 0.3"
"AbilityCooldown" "2"
"AbilityManaCost" "40 50 60 70"
"AbilityValues"
{
"bonus_gold" "0"
"devour_time" "0"
"regen" "1 5 9 13"
"creep_level" "1 5 10 15 20"
"max_stack"
{
"value" "3 4 5 6"
"special_bonus_unique_sargatanas_max_stack" "+6"
}
"AbilityChargeRestoreTime" "24 18 14 8"
}
}
"ability_hellstep"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sargatanas/ability_hellstep.lua"
"AbilityTextureName" "old_heroes/hellstep"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"MaxLevel" "4"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastPoint" "0.2"
"AbilityCastRange" "900"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "30 25 20 15"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "100 120 140 180"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"min_damage" "15 20 25 30"
"max_damage" "40 45 50 55"
"max_duration" "6"
"radius" "400"
"projectile_speed" "2000"
"stack_overhell" "1 2 3 4"
"duration"
{
"value" "6 8 10 12"
"special_bonus_unique_sargatanas_duration_1" "+4"
}
"bonus_damage" "80 140 180 220"
"bonus_attack_speed" "30 60 90 120"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_firecleave"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sargatanas/ability_firecleave.lua"
"AbilityTextureName" "old_heroes/firecleave"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"MaxLevel" "7"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"cleave_starting_width" "150"
"cleave_ending_width" "360"
"cleave_distance" "650"
"great_cleave_damage" "40 70 90 110"
"fire_damage" "2 4 8 16"
"duration" "8"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_sunflame"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sargatanas/ability_sunflame.lua"
"AbilityTextureName" "old_heroes/sunflame"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"RequiredLevel" "15"
"MaxLevel" "1"
"AbilityCooldown" "14"
"AbilityManaCost" "500"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"start_radius" "150 150 150 150"
"end_radius" "250 250 250 250"
"range" "800"
"speed" "800"
"stack_overhell" "110"
"damage" "20000"
"unduced" "34"
"damage_meta" "50000"
"unduced_meta" "67"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_hell_summon"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sargatanas/ability_hell_summon.lua"
"AbilityTextureName" "old_heroes/hell_summon"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"LinkedAbility" "ability_star_devour"
"AbilityCooldown" "30 28 26 24"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"str_dmg"
{
"value" "1 2 3 4 5"
"special_bonus_unique_sargatanas_str_dmg" "+0.75"
}
"str_hp" "10"
}
}
"ability_metamorphosis"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sargatanas/ability_metamorphosis.lua"
"AbilityTextureName" "old_heroes/revolve_metamorphosis"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"MaxLevel" "4"
"LevelsBetweenUpgrades" "5"
"RequiredLevel" "10"
"AbilityCooldown" "40 36 32 28"
"AbilityManaCost" "40 50 60 70"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"duration"
{
"value" "20 24 28 32"
"special_sargatanas_meta" "+10"
}
"bonus_resistance" "1"
"max_resistance"
{
"value" "24 31 39 44"
"special_sargatanas_meta" "+6"
}
"radius" "500"
"armor_ag" "0.2 0.4 0.6 0.8"
"attack_speed_ag" "0.35"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"special_bonus_unique_sargatanas_max_stack"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sargatanas_duration_1"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sargatanas_str_dmg"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+398
View File
@@ -0,0 +1,398 @@
"DOTAUnits"
{
"npc_spirit_sargatanas_hell_summon"
{
// General
//
"BaseClass" "npc_dota_creature" // Class of entity of link to.
"Model" "models/heroes/brewmaster/brewmaster_firespirit.vmdl" // Model.
"SoundSet" "Creep_Good_Range" // Name of sound set.
"ModelScale" "0.75"
"Level" "1"
"IsSummoned" "1"
"SelectionGroup" "Spirits"
"UnitLabel" "Spirits"
// Abilities
//----------------------------------------------------------------
"Ability1" "ability_firecleave_creep" // Ability 1.
"Ability2" "" // Ability 2.
"Ability3" "" // Ability 3.
"Ability4" "" // Ability 4.
"Ability5" "" // Ability 5.
"Ability6" "" // Ability 6 - Extra.
"Ability7" "" // Ability 7 - Extra.
"Ability8" "" // Ability 8 - Extra.
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "2" // Physical protection.
"MagicalResistance" "40" // Magical protection.
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK"
"AttackDamageMin" "2" // Damage range min.
"AttackDamageMax" "6" // Damage range max.
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackRate" "1.8" // Speed of attack.
"AttackAnimationPoint" "0.2" // Normalized time in animation cycle to attack.
"AttackAcquisitionRange" "800" // Range within a target can be acquired.
"AttackRange" "500" // Range within a target can be attacked.
"ProjectileModel" "particles/units/heroes/hero_lina/lina_base_attack.vpcf" // Particle system model for projectile.
"ProjectileSpeed" "900" // Speed of projectile.
// Bounty
//----------------------------------------------------------------
"BountyXP" "10" // Experience earn.
"BountyGoldMin" "18" // Gold earned min.
"BountyGoldMax" "24" // Gold earned max.
// Bounds
//----------------------------------------------------------------
"BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion.
"HealthBarOffset" "130"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air
"MovementSpeed" "280" // Speed
"MovementTurnRate" "0.9" // Turning rate.
// Status
//----------------------------------------------------------------
"StatusHealth" "170" // Base health.
"StatusHealthRegen" "4" // Health regeneration rate.
"StatusMana" "0" // Base mana.
"StatusManaRegen" "0" // Mana regeneration rate.
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_GOODGUYS" // Team name.
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_HERO"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "1200" // Range of vision during day light.
"VisionNighttimeRange" "800" // Range of vision at night time.
}
"npc_golem_sargatanas_hell_summon"
{
// General
//
"BaseClass" "npc_dota_creature" // Class of entity of link to.
"Model" "models/items/warlock/golem/ti_8_warlock_darkness_apostate_golem/ti_8_warlock_darkness_apostate_golem.vmdl" // Model.
"SoundSet" "Creep_Good_Range" // Name of sound set.
"ModelScale" "0.55"
"Level" "1"
"IsSummoned" "1"
"SelectionGroup" "Spirits"
"UnitLabel" "Spirits"
// Abilities
//----------------------------------------------------------------
"Ability1" "ability_firecleave_creep" // Ability 1.
"Ability2" "" // Ability 2.
"Ability3" "" // Ability 3.
"Ability4" "" // Ability 4.
"Ability5" "" // Ability 5.
"Ability6" "" // Ability 6 - Extra.
"Ability7" "" // Ability 7 - Extra.
"Ability8" "" // Ability 8 - Extra.
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "2" // Physical protection.
"MagicalResistance" "40" // Magical protection.
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK"
"AttackDamageMin" "54" // Damage range min.
"AttackDamageMax" "57" // Damage range max.
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackRate" "1.5" // Speed of attack.
"AttackAnimationPoint" "0.2" // Normalized time in animation cycle to attack.
"AttackAcquisitionRange" "800" // Range within a target can be acquired.
"AttackRange" "500" // Range within a target can be attacked.
"ProjectileModel" "particles/units/heroes/hero_lina/lina_base_attack.vpcf" // Particle system model for projectile.
"ProjectileSpeed" "900" // Speed of projectile.
// Bounty
//----------------------------------------------------------------
"BountyXP" "10" // Experience earn.
"BountyGoldMin" "18" // Gold earned min.
"BountyGoldMax" "24" // Gold earned max.
// Bounds
//----------------------------------------------------------------
"BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion.
"HealthBarOffset" "130"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air
"MovementSpeed" "280" // Speed
"MovementTurnRate" "0.9" // Turning rate.
// Status
//----------------------------------------------------------------
"StatusHealth" "260" // Base health.
"StatusHealthRegen" "4" // Health regeneration rate.
"StatusMana" "0" // Base mana.
"StatusManaRegen" "0" // Mana regeneration rate.
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_GOODGUYS" // Team name.
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_HERO"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "1200" // Range of vision during day light.
"VisionNighttimeRange" "800" // Range of vision at night time.
}
"npc_scorpion_sargatanas_hell_summon"
{
// General
//
"BaseClass" "npc_dota_creature" // Class of entity of link to.
"Model" "models/items/broodmother/spiderling/ti9_cache_brood_mother_of_thousands_spiderling/ti9_cache_brood_mother_of_thousands_spiderling.vmdl" // Model.
"SoundSet" "Creep_Good_Range" // Name of sound set.
"ModelScale" "0.75"
"Level" "1"
"IsSummoned" "1"
"SelectionGroup" "Spirits"
"UnitLabel" "Spirits"
// Abilities
//----------------------------------------------------------------
"Ability1" "ability_firecleave_creep" // Ability 1.
"Ability2" "" // Ability 2.
"Ability3" "" // Ability 3.
"Ability4" "" // Ability 4.
"Ability5" "" // Ability 5.
"Ability6" "" // Ability 6 - Extra.
"Ability7" "" // Ability 7 - Extra.
"Ability8" "" // Ability 8 - Extra.
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "2" // Physical protection.
"MagicalResistance" "40" // Magical protection.
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK"
"AttackDamageMin" "106" // Damage range min.
"AttackDamageMax" "117" // Damage range max.
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackRate" "1.5" // Speed of attack.
"AttackAnimationPoint" "0.2" // Normalized time in animation cycle to attack.
"AttackAcquisitionRange" "800" // Range within a target can be acquired.
"AttackRange" "500" // Range within a target can be attacked.
"ProjectileModel" "particles/units/heroes/hero_lina/lina_base_attack.vpcf" // Particle system model for projectile.
"ProjectileSpeed" "900" // Speed of projectile.
// Bounty
//----------------------------------------------------------------
"BountyXP" "10" // Experience earn.
"BountyGoldMin" "18" // Gold earned min.
"BountyGoldMax" "24" // Gold earned max.
// Bounds
//----------------------------------------------------------------
"BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion.
"HealthBarOffset" "130"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air
"MovementSpeed" "280" // Speed
"MovementTurnRate" "0.9" // Turning rate.
// Status
//----------------------------------------------------------------
"StatusHealth" "1450" // Base health.
"StatusHealthRegen" "4" // Health regeneration rate.
"StatusMana" "0" // Base mana.
"StatusManaRegen" "0" // Mana regeneration rate.
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_GOODGUYS" // Team name.
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_HERO"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "1200" // Range of vision during day light.
"VisionNighttimeRange" "800" // Range of vision at night time.
}
"npc_dragon_sargatanas_hell_summon"
{
// General
//
"BaseClass" "npc_dota_creature" // Class of entity of link to.
"Model" "models/creeps/neutral_creeps/n_creep_black_dragon/n_creep_black_dragon.vmdl" // Model.
"SoundSet" "Creep_Good_Range" // Name of sound set.
"ModelScale" "0.75"
"Level" "1"
"IsSummoned" "1"
"SelectionGroup" "Spirits"
"UnitLabel" "Spirits"
// Abilities
//----------------------------------------------------------------
"Ability1" "ability_firecleave_creep" // Ability 1.
"Ability2" "" // Ability 2.
"Ability3" "" // Ability 3.
"Ability4" "" // Ability 4.
"Ability5" "" // Ability 5.
"Ability6" "" // Ability 6 - Extra.
"Ability7" "" // Ability 7 - Extra.
"Ability8" "" // Ability 8 - Extra.
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "8" // Physical protection.
"MagicalResistance" "40" // Magical protection.
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK"
"AttackDamageMin" "140" // Damage range min.
"AttackDamageMax" "160" // Damage range max.
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackRate" "1.5" // Speed of attack.
"AttackAnimationPoint" "0.2" // Normalized time in animation cycle to attack.
"AttackAcquisitionRange" "800" // Range within a target can be acquired.
"AttackRange" "500" // Range within a target can be attacked.
"ProjectileModel" "particles/units/heroes/hero_lina/lina_base_attack.vpcf" // Particle system model for projectile.
"ProjectileSpeed" "900" // Speed of projectile.
// Bounty
//----------------------------------------------------------------
"BountyXP" "10" // Experience earn.
"BountyGoldMin" "18" // Gold earned min.
"BountyGoldMax" "24" // Gold earned max.
// Bounds
//----------------------------------------------------------------
"BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion.
"HealthBarOffset" "130"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air
"MovementSpeed" "280" // Speed
"MovementTurnRate" "0.9" // Turning rate.
// Status
//----------------------------------------------------------------
"StatusHealth" "670" // Base health.
"StatusHealthRegen" "4" // Health regeneration rate.
"StatusMana" "0" // Base mana.
"StatusManaRegen" "0" // Mana regeneration rate.
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_GOODGUYS" // Team name.
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_HERO"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "1200" // Range of vision during day light.
"VisionNighttimeRange" "800" // Range of vision at night time.
}
"npc_kaban_sargatanas_hell_summon"
{
// General
//
"BaseClass" "npc_dota_creature" // Class of entity of link to.
"Model" "models/heroes/beastmaster/beastmaster_beast.vmdl" // Model.
"SoundSet" "Creep_Good_Range" // Name of sound set.
"ModelScale" "0.75"
"Level" "1"
"IsSummoned" "1"
"SelectionGroup" "Spirits"
"UnitLabel" "Spirits"
// Abilities
//----------------------------------------------------------------
"Ability1" "ability_firecleave_creep" // Ability 1.
"Ability2" "ghoul_crazy_look" // Ability 2.
"Ability3" "" // Ability 3.
"Ability4" "" // Ability 4.
"Ability5" "" // Ability 5.
"Ability6" "" // Ability 6 - Extra.
"Ability7" "" // Ability 7 - Extra.
"Ability8" "" // Ability 8 - Extra.
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "22" // Physical protection.
"MagicalResistance" "80" // Magical protection.
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK"
"AttackDamageMin" "280" // Damage range min.
"AttackDamageMax" "292" // Damage range max.
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackRate" "1.2" // Speed of attack.
"AttackAnimationPoint" "0.2" // Normalized time in animation cycle to attack.
"AttackAcquisitionRange" "800" // Range within a target can be acquired.
"AttackRange" "700" // Range within a target can be attacked.
"ProjectileModel" "particles/units/heroes/hero_lina/lina_base_attack.vpcf" // Particle system model for projectile.
"ProjectileSpeed" "900" // Speed of projectile.
// Bounty
//----------------------------------------------------------------
"BountyXP" "10" // Experience earn.
"BountyGoldMin" "18" // Gold earned min.
"BountyGoldMax" "24" // Gold earned max.
// Bounds
//----------------------------------------------------------------
"BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion.
"HealthBarOffset" "130"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air
"MovementSpeed" "550" // Speed
"MovementTurnRate" "0.25" // Turning rate.
// Status
//----------------------------------------------------------------
"StatusHealth" "1270" // Base health.
"StatusHealthRegen" "14" // Health regeneration rate.
"StatusMana" "0" // Base mana.
"StatusManaRegen" "0" // Mana regeneration rate.
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_GOODGUYS" // Team name.
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_HERO"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "1200" // Range of vision during day light.
"VisionNighttimeRange" "800" // Range of vision at night time.
}
}
+212
View File
@@ -0,0 +1,212 @@
"DOTAAbilities"
{
"silencer_curse_of_the_silent"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/silencer/silencer_curse_of_the_silent"
"AbilityTextureName" "silencer_curse_of_the_silent"
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilitySound" "Hero_Silencer.Curse.Cast"
"AbilityCastRange" "1000"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "22 20 18 16"
"AbilityManaCost" "130 135 140 145"
"AbilityValues"
{
"damage"
{
"value" "20 40 60 80"
"special_bonus_unique_silencer" "+120"
}
"radius" "350"
"duration" "6"
"penalty_duration" "2"
"movespeed" "-10"
}
}
"glaives_of_wisdom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/silencer/glaives_of_wisdom"
"AbilityTextureName" "silencer_glaives_of_wisdom"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"AbilitySound" "Hero_Silencer.GlaivesOfWisdom"
"AbilityManaCost" "0"
"AbilityCooldown" "0"
"AbilityCastRange" "0"
"AbilityValues"
{
"intellect_damage_pct"
{
"value" "100 150 200 250"
"special_bonus_unique_silencer_intellect_damage_pct" "+150"
}
}
}
"razor_eye_of_the_storm_lua"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/silencer/razor_eye_of_the_storm_lua"
"AbilityTextureName" "new_heroes/mind_storm"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastPoint" "0"
"AbilityCooldown" "30 28 26 24"
"AbilityManaCost" "60 100 140 180"
"HasScepterUpgrade" "1"
"AbilityValues"
{
"radius" "500"
"scepter_bonus_targets" "3"
"duration"
{
"value" "20"
"special_bonus_unique_silencer_storm_duration" "+6"
}
"strike_interval"
{
"value" "0.75"
"special_bonus_unique_silencer_storm_interval" "-0.5"
}
"armor_reduction" "1"
"damage" "75 100 125 150"
}
}
"int"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/silencer/int"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityTextureName" "new_heroes/sil_glaive"
"MaxLevel" "1"
"innate" "1"
"AbilityValues"
{
"grow_int"
{
"value" "1.4"
"special_bonus_unique_silencer_grow_int" "+0.6"
}
"stack_interval"
{
"value" "10"
"special_bonus_unique_silencer_stack_interval" "-5"
}
}
}
"ability_last_word"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/silencer/ability_last_word"
"AbilityTextureName" "silencer_last_word"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"MaxLevel" "3"
"RequiredLevel" "7"
"LevelsBetweenUpgrades" "7"
"AbilityCastPoint" "0.3"
"AbilityCastRange" "900"
"AbilityCooldown" "0"
"AbilityManaCost" "115"
"AbilityCharges" "3"
"AbilityChargeRestoreTime" "20"
"HasShardUpgrade" "1"
"AbilityValues"
{
"damage" "225 450 675"
"debuff_duration" "4"
"duration" "4"
"shard_bonus_int" "50"
"int"
{
"value" "150"
"special_bonus_shard" "+50"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"ability_global_silence"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/silencer/ability_global_silence"
"AbilityTextureName" "silencer_global_silence"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastPoint" "0.3"
"MaxLevel" "3"
"AbilityCooldown" "90"
"AbilityManaCost" "1200"
"AbilityValues"
{
"tooltip_duration" "6 7 8"
"icnoming_enemy" "20 40 60"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
}
"special_bonus_unique_silencer_intellect_damage_pct"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_silencer_grow_int"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_silencer_stack_interval"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_silencer_storm_interval"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_silencer_storm_duration"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_silencer_glaives_bounces"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
"AbilityValues"
{
"bonus_bounce_count" "2"
}
}
"special_bonus_unique_silencer"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
}
@@ -0,0 +1,259 @@
"DOTAAbilities"
{
"skywrath_mage_arcane_bolt_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/skywrath_mage/skywrath_mage_arcane_bolt_custom"
"AbilityTextureName" "skywrath_mage_arcane_bolt"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilitySound" "Hero_SkywrathMage.ArcaneBolt.Cast"
"AbilityCastRange" "875"
"AbilityCastPoint" "0.1 0.1 0.1 0.1"
"AbilityCooldown" "0"
"HasShardUpgrade" "1"
"AbilityManaCost" "70"
"AbilityValues"
{
"AbilityCharges"
{
"value" "1"
"special_bonus_shard" "+1"
}
"AbilityChargeRestoreTime" "2.0 1.5 1.0 0.5"
"AbilityCastRange"
{
"value" "875"
"special_bonus_unique_skywrath_6" "+125"
}
"bolt_damage" "125 175 225 275"
"int_multiplier"
{
"value" "1.5 2 2.5 3"
"special_bonus_unique_skywrath_2" "+1.5"
}
"bolt_speed" "500"
"bolt_vision" "325"
"vision_duration" "3.34"
}
}
"skywrath_mage_concussive_shot_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/skywrath_mage/skywrath_mage_concussive_shot_custom"
"AbilityTextureName" "skywrath_mage_concussive_shot"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityCastPoint" "0.0 0.0 0.0 0.0"
"AbilityCastRange" "1600"
"AbilityCooldown" "0"
"HasShardUpgrade" "1"
"AbilityManaCost" "80 85 90 95"
"AbilityValues"
{
"AbilityCharges"
{
"value" "1"
"special_bonus_shard" "+1"
}
"AbilityChargeRestoreTime" "15 14 13 12"
"launch_radius"
{
"value" "1600"
"special_bonus_unique_skywrath_4" "+1000"
"affected_by_aoe_increase" "1"
}
"speed" "800 800 800 800"
"slow_radius"
{
"value" "250"
"affected_by_aoe_increase" "1"
}
"damage" "120 180 240 300"
"int_multiplier" "2 4 6 8"
"slow_duration" "4"
"slow"
{
"value" "40"
"special_bonus_unique_skywrath_concussive_shot_slow" "+20"
}
"creep_damage_pct" "60"
"shot_vision" "300"
"vision_duration" "3.34"
}
}
"skywrath_mage_ancient_seal_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/skywrath_mage/skywrath_mage_ancient_seal_custom"
"AbilityTextureName" "skywrath_mage_ancient_seal"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilityCastRange" "700 750 800 850"
"AbilityCastPoint" "0.1 0.1 0.1 0.1"
"AbilityCooldown" "0"
"HasShardUpgrade" "1"
"AbilityManaCost" "80 90 100 110"
"AbilityValues"
{
"AbilityCharges"
{
"value" "1"
"special_bonus_shard" "+1"
}
"AbilityChargeRestoreTime"
{
"value" "14"
"special_bonus_unique_skywrath" "-6"
}
"seal_duration" "3.0 4.0 5.0 6.0"
"radius"
{
"value" "300"
"affected_by_aoe_increase" "1"
}
"resist_debuff"
{
"value" "-20 -25 -30 -35"
"special_bonus_unique_skywrath_3" "-10"
}
"int_multiplier" "0.5"
"AbilityCooldown" "0"
}
}
"skywrath_mage_mystic_flare_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/skywrath_mage/skywrath_mage_mystic_flare_custom"
"AbilityTextureName" "skywrath_mage_mystic_flare"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilitySound" "Hero_SkywrathMage.MysticFlare.Cast"
"AbilityCastRange" "1200"
"AbilityCastPoint" "0.1"
"AbilityCooldown" "0"
"HasShardUpgrade" "1"
"AbilityManaCost" "150 300 450"
"AbilityValues"
{
"AbilityCharges"
{
"value" "1"
"special_bonus_shard" "+1"
}
"AbilityChargeRestoreTime" "60.0 40.0 20.0"
"radius"
{
"value" "170"
"affected_by_aoe_increase" "1"
}
"duration" "2.0"
"damage"
{
"value" "800 1200 1600"
"special_bonus_unique_skywrath_5" "+400"
}
"int_multiplier" "4.0 8 16 32"
"damage_interval" "0.1"
}
}
"skywrath_mage_innate_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/skywrath_mage/skywrath_mage_innate_custom"
"AbilityTextureName" "skywrath_mage_arcane_bolt"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
"AbilityType" "ABILITY_TYPE_BASIC"
"Innate" "1"
"MaxLevel" "1"
"IsBreakable" "1"
"AbilityValues"
{
"search_radius" "700"
"max_targets" "3"
"damage_pct" "50"
"bolt_vision" "325"
"vision_duration" "0.34"
}
}
"skywrath_mage_staff_of_the_scion_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/skywrath_mage/skywrath_mage_staff_of_the_scion_custom"
"AbilityTextureName" "skywrath_mage_staff_of_the_scion"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"MaxLevel" "1"
"IsGrantedByScepter" "1"
"AbilityValues"
{
"reset_duration" "30"
"max_successes" "4"
}
}
"special_bonus_unique_skywrath_2"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_skywrath_6"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_skywrath_concussive_shot_slow"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_skywrath"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_skywrath_4"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_skywrath_3"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_skywrath_5"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
}
+228
View File
@@ -0,0 +1,228 @@
"DOTAAbilities"
{
"ability_fire_punishment"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/smaug/ability_fire_punishment"
"AbilityTextureName" "old_heroes/fire_punishment"
"FightRecapLevel" "1"
"MaxLevel" "4"
"AbilityType" "DOTA_ABILITY_TYPE_PASSIVE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_BUILDING"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES | DOTA_UNIT_TARGET_FLAG_DEAD"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityCastRange" "600"
"AbilityCastPoint" "0.0 0.0 0.0 0.0"
"AbilityDuration" "1.5"
"AbilityCooldown" "0"
"AbilityValues"
{
"debuff_magic"
{
"value" " -1 -2 -3 -4"
"special_bonus_unique_smaug_fire_punishment" "-2"
}
"radius"
{
"value" "80 100 120 140"
"special_bonus_unique_smaug_fire_punishment" "+30"
}
"pct_dmg"
{
"value" "22"
"special_bonus_unique_smaug_fire_punishment" "+66"
}
"damage"
{
"value" "12 20 32 48"
"special_bonus_unique_smaug_fire_punishment" "+32"
}
}
}
"ability_incandescent_fury"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/smaug/ability_incandescent_fury"
"AbilityTextureName" "old_heroes/incandescent_fury"
"FightRecapLevel" "2"
"RequiredLevel" "6"
"LevelsBetweenUpgrades" "6"
"MaxLevel" "3"
"HasScepterUpgrade" "1"
"AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"AbilityCastRange" "1400"
"AbilityCastPoint" "0.55"
"AbilityManaCost" "220 330 440"
"AbilityValues"
{
"AbilityCooldown"
{
"value" "180"
"special_bonus_scepter" "-90"
}
"pct_dmg" "100 200 300"
"damage"
{
"value" "322 644 988"
"special_bonus_unique_smaug_incandescent_fury" "+1012"
}
"cast_range" "1400"
"path_radius" "260"
"duration" "10"
"burn_interval" "0.25"
"linger_duration" "2"
}
}
"ability_dragon_fear_aura"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/smaug/ability_dragon_fear_aura"
"AbilityTextureName" "old_heroes/dragon_fear_aura"
"FightRecapLevel" "1"
"MaxLevel" "4"
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityValues"
{
"outgoing" "-14 -16 -20 -26"
"duration" "1"
"spell_amp" "16 20 24 28"
"incoming" "15 20 25 30"
}
}
"ability_dragon_gold_deal"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/smaug/ability_dragon_gold_deal"
"AbilityTextureName" "old_heroes/dragon_gold_deal"
"FightRecapLevel" "1"
"RequiredLevel" "5"
"LevelsBetweenUpgrades" "5"
"MaxLevel" "3"
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityValues"
{
"health_bonus" "0.1 0.2 0.3"
"spell_amp" "0.025 0.05 0.75"
"physical_armor" "0.01 0.02 0.03"
"gold"
{
"value" "100"
"special_bonus_unique_smaug_dragon_gold_deal" "-50"
}
}
}
"ability_dragon_reward"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/smaug/ability_dragon_reward"
"AbilityTextureName" "old_heroes/dragon_reward"
"FightRecapLevel" "1"
"IsGrantedByShard" "1"
"HasShardUpgrade" "1"
"MaxLevel" "1"
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityValues"
{
"max" "99"
"bonus_attributes" "1"
}
}
"ability_dragon_scales"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/smaug/ability_dragon_scales"
"AbilityTextureName" "old_heroes/dragon_scales"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"MaxLevel" "4"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"AbilityCooldown"
{
"value" "30"
"special_bonus_unique_smaug_dragon_scales_cd" "-10"
}
"reflect"
{
"value" "20 40 60 80"
"special_bonus_unique_smaug_dragon_scales_reflect" "+20"
}
"invul" "-1000"
"duration" "4 4.5 5 5.5"
"min_radius" "300"
"max_radius" "700"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"special_bonus_unique_smaug_dragon_scales_cd"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_smaug_dragon_scales_reflect"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_smaug_dragon_gold_deal"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_smaug_incandescent_fury"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_smaug_fire_punishment"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+188
View File
@@ -0,0 +1,188 @@
"DOTAAbilities"
{
"ability_sniper_shrapnel_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sniper/ability_sniper_shrapnel_custom"
"AbilityTextureName" "sniper_shrapnel"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityManaCost" "50"
"AbilityCastRange" "1800"
"AbilityCastPoint" "0.3"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
"AbilityValues"
{
"AbilityCooldown"
{
"value" "12 10 8 6"
"special_bonus_unique_sniper_shrapnel_cooldown" "-3"
}
"radius"
{
"value" "400"
"affected_by_aoe_increase" "1"
"special_bonus_unique_sniper_shrapnel_radius" "+150"
}
"damage_delay" "1.2"
"duration" "10"
"tick_interval" "1.0"
"attack_damage_pct" "25"
"slow_movement_speed" "-18"
"incoming_damage_pct" "25"
}
}
"ability_sniper_critical_focus_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sniper/ability_sniper_critical_focus_custom"
"AbilityTextureName" "sniper_headshot"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityCooldown" "30 26 22 18"
"AbilityManaCost" "50"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
"AbilityValues"
{
"duration"
{
"value" "1.5 2 2.5 3"
"special_bonus_unique_sniper_critical_focus_duration" "+1.5"
}
"crit_chance" "75"
"crit_mult"
{
"value" "125 145 165 185"
"special_bonus_unique_sniper_critical_focus_crit_mult" "+25"
}
}
}
"ability_sniper_keen_eye_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sniper/ability_sniper_keen_eye_custom"
"AbilityTextureName" "sniper_take_aim"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityValues"
{
"bonus_attack_range"
{
"value" "100 150 200 250"
"special_bonus_unique_sniper_keen_range" "+75"
}
"proc_chance"
{
"value" "15"
"special_bonus_unique_sniper_keen_proc" "+12"
}
"headshot_bonus_damage" "40 50 60 70"
"slow_duration" "1.5"
"knockback_distance" "120"
"slow_movement_pct" "-40"
"slow_attack_speed" "-40"
}
}
"ability_sniper_assassinate_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/sniper/ability_sniper_assassinate_custom"
"AbilityTextureName" "sniper_assassinate"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"HasScepterUpgrade" "1"
"AbilityManaCost" "50 100 150"
"AbilityCastRange" "3000"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"AbilityValues"
{
"AbilityCastPoint"
{
"value" "2"
"special_bonus_scepter" "-1.4"
}
"AbilityCooldown"
{
"value" "20 18 16"
"special_bonus_scepter" "-10"
}
"aoe_radius"
{
"value" "400"
"special_bonus_unique_sniper_assassinate_aoe" "+250"
}
"debuff_duration" "2.5"
"projectile_speed" "2500"
"ministun_duration"
{
"value" "0.1"
"special_bonus_scepter" "+1.9"
}
"attack_damage_bonus"
{
"value" "20 40 60"
"special_bonus_unique_sniper_assassinate_damage" "+50"
}
"armor_mark_duration" "4"
}
}
"special_bonus_unique_sniper_shrapnel_radius"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sniper_keen_range"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sniper_shrapnel_cooldown"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sniper_critical_focus_duration"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sniper_critical_focus_crit_mult"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sniper_keen_proc"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sniper_assassinate_aoe"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_sniper_assassinate_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+306
View File
@@ -0,0 +1,306 @@
"DOTAAbilities"
{
"ability_spectre_spectral_dagger_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/spectre/ability_spectre_spectral_dagger_custom"
"AbilityTextureName" "spectre_spectral_dagger"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"FightRecapLevel" "1"
"AbilitySound" "Hero_Spectre.DaggerCast"
"MaxLevel" "4"
"AbilityCastRange" "1100"
"AbilityCastPoint" "0.3"
"AbilityManaCost" "35"
"AbilityValues"
{
"AbilityCooldown"
{
"value" "22 20 18 16"
"special_bonus_unique_spectre_dagger_cooldown" "-4"
}
"damage"
{
"value" "50 100 150 200"
"special_bonus_unique_spectre_dagger_damage" "+80"
}
"bonus_movespeed" "10 17 21 25"
"slow_pct" "14 18 22 26"
"buff_persistence" "5.0"
"dagger_radius"
{
"value" "125"
"affected_by_aoe_increase" "1"
}
"vision_radius"
{
"value" "200"
"affected_by_aoe_increase" "1"
}
"speed" "800"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"ability_spectre_spectral_echo_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/spectre/ability_spectre_spectral_echo_custom"
"AbilityTextureName" "spectre_desolate"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"MaxLevel" "4"
"IsBreakable" "1"
"AbilityValues"
{
"proc_chance"
{
"value" "15 20 25 30"
"special_bonus_unique_spectre_echo_proc_chance" "+12"
}
"shadows_per_proc"
{
"value" "1"
"special_bonus_unique_spectre_spectral_echo_twin" "+1"
}
"spawn_radius_near_target" "120"
"follow_distance" "140"
"search_radius"
{
"value" "350"
"affected_by_aoe_increase" "1"
}
"illusion_outgoing_damage"
{
"value" "50 55 60 65"
"special_bonus_unique_spectre_echo_shadow_damage" "+25"
}
"shadow_attacks"
{
"value" "1"
"special_bonus_unique_spectre_echo_double_strike" "+1"
}
"attack_damage_pct" "100"
"illusion_attack_speed" "50 75 100 125"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_spectre_desolate_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/spectre/ability_spectre_desolate_custom"
"AbilityTextureName" "spectre_desolate"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_INNATE_UI | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_SKIP_FOR_KEYBINDS"
"AbilityType" "ABILITY_TYPE_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilitySound" "Hero_Spectre.Desolate"
"MaxLevel" "1"
"Innate" "1"
"IsBreakable" "1"
"AbilityValues"
{
"health_damage_pct"
{
"value" "1"
"hero_levelup" "+0.1"
"special_bonus_unique_spectre_desolate_hp_pct" "+0.4"
}
}
}
"ability_spectre_dispersion_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/spectre/ability_spectre_dispersion_custom"
"AbilityTextureName" "spectre_dispersion"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"HasShardUpgrade" "1"
"MaxLevel" "4"
"IsBreakable" "1"
"AbilityValues"
{
"damage_reflection_pct"
{
"value" "8 12 16 20"
"special_bonus_unique_spectre_dispersion_pct" "+8"
}
"damage_reflection_pct_boosted" "150"
"min_radius"
{
"value" "300"
"affected_by_aoe_increase" "1"
}
"max_radius"
{
"value" "800"
"affected_by_aoe_increase" "1"
}
"activation_cooldown"
{
"value" "0"
"special_bonus_shard" "+16"
}
"activation_manacost"
{
"value" "0"
"special_bonus_shard" "+50"
}
"activation_bonus_pct"
{
"value" "0"
"special_bonus_shard" "+50"
}
"activation_duration"
{
"value" "0"
"special_bonus_shard" "+5"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
}
"ability_spectre_haunt_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/spectre/ability_spectre_haunt_custom"
"AbilityTextureName" "spectre_haunt"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilitySound" "Hero_Spectre.Haunt"
"MaxLevel" "3"
"AbilityCastPoint" "0.4"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"AbilityCooldown" "80 70 60"
"AbilityManaCost" "25"
"LinkedAbility" "ability_spectre_reality_custom"
"AbilityValues"
{
"illusion_count" "1 2 3"
"duration"
{
"value" "40"
"special_bonus_unique_spectre_haunt_duration" "+20"
}
"illusion_damage_outgoing" "0 10 20"
"illusion_damage_incoming" "0"
"spawn_radius" "140"
}
}
"ability_spectre_reality_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/spectre/ability_spectre_haunt_custom"
"AbilityTextureName" "spectre_reality"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityType" "ABILITY_TYPE_BASIC"
"MaxLevel" "1"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5"
"AbilityCastPoint" "0"
"AbilityManaCost" "0"
"LinkedAbility" "ability_spectre_haunt_custom"
"AbilityValues"
{
"AbilityCooldown"
{
"value" "10"
"special_bonus_unique_spectre_reality_cooldown" "-6"
}
}
}
"ability_spectre_shadow_step_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/spectre/ability_spectre_shadow_step_custom"
"AbilityTextureName" "spectre_shadow_step"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"MaxLevel" "1"
"IsGrantedByScepter" "1"
"IsBreakable" "1"
"AbilityValues"
{
"duration_steal" "5"
"health_steal" "50"
"illusion_decrease" "50"
"health_bonus_self" "30"
}
}
"special_bonus_unique_spectre_dagger_cooldown"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_spectre_echo_proc_chance"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_spectre_spectral_echo_twin"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_spectre_dagger_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_spectre_dispersion_pct"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_spectre_haunt_duration"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_spectre_desolate_hp_pct"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_spectre_echo_shadow_damage"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_spectre_echo_double_strike"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_spectre_reality_all_haunts"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+135
View File
@@ -0,0 +1,135 @@
"DOTAAbilities"
{
"ability_sven_storm_hammer_custom"
{
"BaseClass" "ability_lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityTextureName" "sven_storm_bolt"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"ScriptFile" "abilities/heroes/sven/ability_sven_storm_hammer_custom.lua"
"MaxLevel" "4"
"AbilityCastRange" "600"
"AbilityCastPoint" "0.25"
"AbilityManaCost" "40"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
"AbilityCooldown" "18 16 14 12"
"AbilityValues"
{
"projectile_speed" "1000"
"radius" "275"
"stun_duration"
{
"value" "1.25 1.5 1.75 2.0"
"special_bonus_unique_sven_storm_hammer_stun_duration" "+1"
}
"damage" "225 275 325 375"
"sven_storm_hammer_purger" "1"
"stun_duration_for_boss_mult" "2"
}
}
"ability_sven_great_cleave_custom"
{
"BaseClass" "ability_lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityTextureName" "sven_great_cleave"
"ScriptFile" "abilities/heroes/sven/ability_sven_great_cleave_custom.lua"
"MaxLevel" "4"
"AbilityCastPoint" "0"
"AbilityCooldown" "12 11 10 9"
"AbilityValues"
{
"cleave_damage_pct"
{
"value" "45 60 75 95"
"special_bonus_unique_sven_great_cleave_damage_pct" "+105"
}
"cleave_radius" "400"
"cleave_starting_width" "150"
"cleave_ending_width" "360"
"health_cost_pct" "5"
"cleave_damage_multiple_facet" "200 300 400 500"
}
}
"ability_sven_warcry_custom"
{
"BaseClass" "ability_lua"
"AbilityTextureName" "sven_warcry"
"ScriptFile" "abilities/heroes/sven/ability_sven_warcry_custom.lua"
"MaxLevel" "4"
"AbilityCastPoint" "0"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityCooldown" "16"
"AbilityManaCost" "24"
"AbilityCastAnimation" "ACT_DOTA_OVERRIDE_ABILITY_3"
"AbilityValues"
{
"duration"
{
"value" "10 12 14 16"
"special_bonus_unique_sven_warcry_duration_base" "+5"
}
"radius" "700"
"armor_bonus" "8 12 16 20"
"movespeed_bonus" "20 30 40 50"
"attackspeed_bonus" "5 10 15 20"
"damage_bonus_per_armor"
{
"value" "2 4 6 8"
"special_bonus_unique_sven_warcry_damage_bonus_per_armor" "+4"
}
}
}
"ability_sven_gods_strength_custom"
{
"BaseClass" "ability_lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityTextureName" "sven_gods_strength"
"ScriptFile" "abilities/heroes/sven/ability_sven_gods_strength_custom.lua"
"MaxLevel" "3"
"AbilityCastPoint" "0.3"
"HasShardUpgrade" "1"
"HasScepterUpgrade" "1"
"AbilityCooldown" "110 100 90"
"AbilityManaCost" "75"
"AbilityCastAnimation" "ACT_DOTA_OVERRIDE_ABILITY_4"
"AbilityValues"
{
"gods_strength_damage_bonus"
{
"value" "100 150 200"
"special_bonus_unique_sven_gods_strength_damage_bonus_base" "+300"
}
"gods_strength_damage_bonus_per_health"
{
"value" "0"
"special_bonus_unique_sven_gods_strength_damage_per_health" "0.2 0.4 0.6 0.8"
}
"duration"
{
"value" "25"
"special_bonus_unique_sven_gods_strength_duration_base" "+15"
}
"gods_strength_bonus_strength_pct"
{
"special_bonus_scepter" "0.6 0.8 1.0"
}
"gods_strength_shard_magic_resist"
{
"value" "80"
}
}
}
"special_bonus_unique_sven_gods_strength_damage_per_health"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
@@ -0,0 +1,229 @@
"DOTAAbilities"
{
"ability_templar_assassin_refraction_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/templar_assassin/ability_templar_assassin_refraction_custom.lua"
"AbilityTextureName" "templar_assassin_refraction"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"AbilityCastPoint" "0.0"
"AbilityCooldown" "20 18 16 14"
"AbilityManaCost" "90"
"MaxLevel" "4"
"HasShardUpgrade" "1"
"AbilityValues"
{
"instances"
{
"value" "8 12 16 20"
"special_bonus_unique_templar_assassin_8" "+10"
}
"bonus_damage"
{
"value" "70 110 150 190"
"special_bonus_unique_templar_assassin_4" "+20"
}
"damage_threshold" "5"
"duration" "17"
"shard_instances_bonus" "2"
}
"AbilityCastAnimation" "ACT_DOTA_OVERRIDE_ABILITY_1"
}
"ability_templar_assassin_psi_blades_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/templar_assassin/ability_templar_assassin_psi_blades_custom.lua"
"AbilityTextureName" "templar_assassin_psi_blades"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PURE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"MaxLevel" "1"
"Innate" "1"
"IsBreakable" "1"
"AbilityValues"
{
"bonus_attack_range" "50"
"bonus_attack_range_per_hero_level" "5"
"attack_spill_range" "650"
"attack_spill_width" "90"
"attack_spill_pct"
{
"value" "40"
"special_bonus_unique_templar_assassin_7" "+40"
}
}
}
"ability_templar_assassin_meld_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/templar_assassin/ability_templar_assassin_meld_custom.lua"
"AbilityTextureName" "templar_assassin_meld"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_ALT_CASTABLE | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"MaxLevel" "4"
"AbilityManaCost" "80 60 40 05"
"HasShardUpgrade" "1"
"AbilityValues"
{
"AbilityCharges" "1 2 3 4"
"AbilityChargeRestoreTime" "7"
"blink_range" "400"
"min_blink_range" "100"
"blink_attack_targets" "1 2 3 4"
"meld_damage_deal" "150 300 450 600"
"radius"
{
"value" "720"
"special_bonus_unique_templar_assassin_3" "+120"
}
"duration" "12 14 16 18"
"armor_reduction" "-12 -16 -20 -24"
"shard_bonus_targets" "1"
}
}
"ability_templar_assassin_templar_secret_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/templar_assassin/ability_templar_assassin_templar_secret_custom.lua"
"AbilityTextureName" "new_heroes/templar_secret"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"MaxLevel" "4"
"AbilityValues"
{
"temp_crit_chance" "100"
"temp_crit_mult" "140 160 180 200"
}
}
"ability_templar_assassin_bedlam_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/templar_assassin/ability_templar_assassin_bedlam_custom.lua"
"AbilityTextureName" "dark_willow_bedlam"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"MaxLevel" "3"
"HasScepterUpgrade" "1"
"AbilityValues"
{
"attack_interval" "0.5 0.4 0.3"
"attack_radius" "600"
"attack_targets"
{
"value" "1"
"special_bonus_unique_templar_assassin_2" "+1"
}
"roaming_radius" "200"
"roaming_seconds_per_rotation" "1.8"
"scepter_bonus_targets" "2"
"scepter_interval_mult_pct" "80"
}
}
"ability_templar_assassin_refusion_trap_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/templar_assassin/ability_templar_assassin_refusion_trap_custom.lua"
"AbilityTextureName" "new_heroes/refusion_trap"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCooldown" "90"
"IsGrantedByScepter" "1"
"MaxLevel" "1"
"AbilityValues"
{
"radius" "600"
"duration" "9"
"count" "2"
}
}
"special_bonus_unique_templar_assassin_4"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_INTEGER"
"value" "20"
}
}
}
"special_bonus_unique_templar_assassin_8"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_INTEGER"
"value" "2"
}
}
}
"special_bonus_unique_templar_assassin_3"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_INTEGER"
"value" "120"
}
}
}
"special_bonus_unique_templar_assassin_2"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_INTEGER"
"value" "1"
}
}
}
"special_bonus_unique_templar_assassin_7"
{
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_INTEGER"
"value" "20"
}
}
}
}
@@ -0,0 +1,310 @@
"DOTAAbilities"
{
"troll_warlord_switch_stance_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/troll_warlord/troll_warlord_switch_stance_custom"
"AbilityTextureName" "troll_warlord_switch_stance"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_TOGGLE | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilitySound" "Hero_TrollWarlord.BerserkersRage.Toggle"
"HasShardUpgrade" "1"
"Innate" "1"
"AbilityCastPoint" "0.2"
"AbilityValues"
{
"bonus_armor"
{
"value" "15"
"special_bonus_unique_troll_warlord_1_3" "8"
}
"bonus_move_speed"
{
"value" "45"
"special_bonus_unique_troll_warlord_1_1" "25"
}
"base_attack_time"
{
"value" "1.4"
"special_bonus_unique_troll_warlord_1_2" "-0.4"
}
"chance_ensnare"
{
"value" "20"
"special_bonus_unique_troll_warlord_1_4" "+15"
}
"cooldown_ensnare" "1.7"
"duration_ensnare" "1.5"
"ensnare_speed" "700"
"split_radius"
{
"special_bonus_shard" "+200"
}
"max_split_attack"
{
"special_bonus_shard" "+2"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"troll_warlord_active_axes_ranged"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/troll_warlord/troll_warlord_active_axes_ranged"
"AbilityTextureName" "troll_warlord_whirling_axes_ranged"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilitySound" "Hero_TrollWarlord.WhirlingAxes.Ranged"
"LinkedAbility" "troll_warlord_active_axes_melee"
"AbilityCastAnimation" "ACT_DOTA_WHIRLING_AXES_RANGED"
"AbilityCastGestureSlot" "DEFAULT"
"AbilityCastPoint" "0.2 0.2 0.2 0.2"
"AbilityManacost" "25"
"AbilityCooldown" "12"
"AbilityValues"
{
"AbilityCastRange"
{
"value" "800"
}
"axe_width"
{
"value" "100"
"affected_by_aoe_increase" "1"
}
"axe_speed"
{
"value" "1500.0"
}
"axe_range"
{
"value" "950.0"
}
"axe_damage"
{
"value" "60 120 180 240"
"special_bonus_unique_troll_warlord_3" "+150"
}
"attack_damage_pct" "100 125 150 175"
"axe_slow_duration"
{
"value" "2.0 2.5 3.0 3.5"
"special_bonus_unique_troll_warlord_2_1" "+20%"
}
"movement_speed" "30 35 40 45"
"axe_spread" "25"
"axe_count" "5"
}
}
"troll_warlord_active_axes_melee"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/troll_warlord/troll_warlord_active_axes_melee"
"AbilityTextureName" "troll_warlord_whirling_axes_melee"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"FightRecapLevel" "1"
"AbilitySound" "Hero_TrollWarlord.WhirlingAxes.Melee"
"LinkedAbility" "troll_warlord_active_axes_ranged"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
"AbilityCastGestureSlot" "DEFAULT"
"AbilityCastPoint" "0.0"
"AbilityManacost" "25"
"AbilityCooldown" "12"
"AbilityValues"
{
"damage"
{
"value" "75 150 225 300"
"special_bonus_unique_troll_warlord_3" "+100"
}
"attack_damage_pct" "100 150 200 250"
"hit_radius"
{
"value" "100"
"affected_by_aoe_increase" "1"
}
"max_range"
{
"value" "450.0"
"affected_by_aoe_increase" "1"
}
"axe_movement_speed" "1250"
"debuff_duration"
{
"value" "0.5"
"special_bonus_unique_troll_warlord_2_1" "+50%"
}
"whirl_duration" "3.0"
}
}
"troll_warlord_fervor_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/troll_warlord/troll_warlord_fervor_custom"
"AbilityTextureName" "troll_warlord_fervor"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"HasScepterUpgrade" "1"
"IsBreakable" "1"
"AbilityValues"
{
"attack_speed"
{
"value" "15 20 25 30"
"special_bonus_unique_troll_warlord_5" "+8"
}
"max_stacks" "14"
"stack_linger_duration" "4.0"
"stack_linger_bar_extra" "0.75"
"locked_attack_speed" "700"
"pct_damage_per_attack_speed"
{
"special_bonus_scepter" "+1"
}
}
}
"troll_warlord_battle_trance_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/troll_warlord/troll_warlord_battle_trance_custom"
"AbilityTextureName" "troll_warlord_battle_trance"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"SpellDispellableType" "SPELL_DISPELLABLE_NO"
"FightRecapLevel" "2"
"AbilitySound" "Hero_TrollWarlord.BattleTrance.Cast"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"MaxLevel" "3"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"AbilityCastGestureSlot" "DEFAULT"
"AbilityCastPoint" "0.0 0.0 0.0"
"AbilityValues"
{
"AbilityCastRange"
{
"value" "525"
}
"AbilityManaCost"
{
"value" "100"
}
"trance_duration"
{
"value" "6.5"
}
"AbilityCooldown"
{
"value" "90 80 70"
"special_bonus_unique_troll_warlord_4_1" "-20"
}
"lifesteal" "40 60 80"
"attack_speed" "140 170 200"
"movement_speed"
{
"value" "25 30 35"
"special_bonus_unique_troll_warlord_battle_trance_movespeed" "+10"
}
"range"
{
"value" "900"
"affected_by_aoe_increase" "1"
}
}
}
"special_bonus_unique_troll_warlord_1_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_troll_warlord_1_2"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_troll_warlord_2_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_troll_warlord_4_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_troll_warlord_1_3"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_troll_warlord_3"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_troll_warlord_5"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_troll_warlord_1_4"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_troll_warlord_battle_trance_movespeed"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
}
@@ -0,0 +1,213 @@
"DOTAAbilities"
{
"vengefulspirit_magic_missile_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/vengefulspirit/vengefulspirit_magic_missile_custom.lua"
"AbilityTextureName" "vengefulspirit_magic_missile"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG"
"AbilitySound" "Hero_VengefulSpirit.MagicMissile"
"AbilityCastPoint" "0.3 0.3 0.3 0.3"
"AbilityCooldown" "12 11 10 9"
"AbilityManaCost" "90 95 100 105"
"AbilityValues"
{
"speed" "1350"
"stun_duration"
{
"value" "1.5 1.9 2.3 2.7"
"special_bonus_unique_vengeful_spirit_1" "+0.3"
}
"mana_burn" "60 120 180 240"
"damage" "150 300 450 600"
"AbilityCastRange"
{
"value" "650"
"special_bonus_unique_vengeful_spirit_missile_castrange" "+100"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"vengefulspirit_wave_of_terror_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/vengefulspirit/vengefulspirit_wave_of_terror_custom.lua"
"AbilityTextureName" "vengefulspirit_wave_of_terror"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilitySound" "Hero_VengefulSpirit.WaveOfTerror"
"AbilityCastRange" "1400"
"AbilityCastPoint" "0.3 0.3 0.3 0.3"
"AbilityCooldown" "16 14 12 10"
"AbilityDuration" "8"
"AbilityManaCost" "40"
"AbilityValues"
{
"damage" "100 150 200 250"
"wave_speed" "2000.0"
"wave_width"
{
"value" "325"
"affected_by_aoe_increase" "1"
}
"armor_reduction"
{
"value" "-4 -6 -8 -10"
"special_bonus_unique_vengeful_spirit_4" "+-4"
}
"armor_reduction_pct" "12 16 20 24"
"attack_reduction" "10 15 20 25"
"vision_aoe"
{
"value" "350"
"affected_by_aoe_increase" "1"
}
"vision_duration" "4"
"steal_pct"
{
"value" "0"
"special_bonus_unique_vengeful_spirit_wave_of_terror_steal" "+10"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_vengefulspirit_command_aura_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/vengefulspirit/ability_vengefulspirit_command_aura_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA"
"AbilityTextureName" "vengefulspirit_command_aura"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES"
"IsBreakable" "1"
"AbilityCastRange" "1200"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
"AbilityValues"
{
"bonus_base_damage"
{
"value" "10 18 26 34"
"special_bonus_unique_vengeful_spirit_2" "+22"
}
"physical_vampirism" "8 12 16 20"
"magical_vampirism" "4 6 8 10"
"aura_radius"
{
"value" "1200"
"affected_by_aoe_increase" "1"
}
}
}
"ability_vengefulspirit_spirit_debt_innate"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/vengefulspirit/ability_vengefulspirit_spirit_debt_innate.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
"AbilityType" "ABILITY_TYPE_BASIC"
"Innate" "1"
"IsBreakable" "1"
"AbilityTextureName" "vengefulspirit_command_aura_alt1"
"MaxLevel" "1"
"AbilityValues"
{
"mark_duration" "8"
"heal_on_kill_pct" "4"
"mana_restore" "35"
"ally_heal_share_pct" "50"
"fallback_aura_radius" "1200"
}
}
"vengefulspirit_revenge"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/vengefulspirit/vengefulspirit_revenge.lua"
"AbilityTextureName" "vengefulspirit_command_aura_alt2"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG"
"IsGrantedByShard" "1"
"AbilitySound" "Hero_VengefulSpirit.MagicMissile"
"MaxLevel" "1"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "14"
"AbilityManaCost" "90"
"AbilityValues"
{
"duration" "4.5"
"crit_bonus" "150"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1"
}
"vengefulspirit_nether_swap_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/vengefulspirit/vengefulspirit_nether_swap_custom.lua"
"AbilityTextureName" "vengefulspirit_nether_swap"
"AbilityType" "ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilitySound" "Hero_VengefulSpirit.NetherSwap"
"AbilityCastRange" "850 975 1100"
"AbilityCastPoint" "0.4"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"AbilityCooldown" "46 38 30"
"AbilityManaCost" "100 150 200"
"AbilityValues"
{
"hit_point_minimum_pct"
{
"value" "50 40 30"
"DamageTypeTooltip" "DAMAGE_TYPE_NONE"
}
"heal_or_damage"
{
"value" "0"
"special_bonus_unique_vengefulspirit_4_1" "+12"
}
"has_dispell"
{
"value" "0"
"special_bonus_unique_vengefulspirit_4_2" "+1"
}
"AbilityCooldown"
{
"value" "60 50 40"
"special_bonus_unique_vengeful_spirit_9" "-18"
}
}
}
"special_bonus_unique_vengefulspirit_4_1"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
"special_bonus_unique_vengefulspirit_4_2"
{
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"BaseClass" "special_bonus_base"
}
}
+364
View File
@@ -0,0 +1,364 @@
"DOTAAbilities"
{
"ability_yuki_pohela"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/yuki-onna/ability_yuki_pohela.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"AbilityTextureName" "ancient_apparition_cold_feet"
"MaxLevel" "4"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "600"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "40"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "70 90 125 160"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"AbilityChannelTime"
{
"value" "6"
}
"channel_duration"
{
"value" "6"
}
"bonus_resistance"
{
"value" "20 25 30 35"
"special_bonus_unique_yuki_pohela_resistance" "+15"
}
"reduce_atack_speed" "10 15 20 25"
"debuff_duration" "1 1.25 1.5 1.75"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"ability_yuki_frostshtorm"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/yuki-onna/ability_yuki_frostshtorm"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"SpellDispellableType" "SPELL_DISPELLABLE_YES"
"AbilityTextureName" "old_heroes/yuki/froststorm"
"AbilityCastRange" "675"
"AbilityCastPoint" "0.6"
"MaxLevel" "4"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "35"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "60 100 140 200"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"radius"
{
"value" "300 325 350 375"
}
"duration"
{
"value" "8"
"special_bonus_unique_yuki_frostshtorm_duration" "+5"
}
"dmg_increese" "20 40 60 80"
"dmg_reduced" "-20 -40 -60 -80"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_yuki_revenge"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/yuki-onna/ability_yuki_revenge.lua"
"AbilityTextureName" "old_heroes/yuki/revenge"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO"
"MaxLevel" "4"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"mana_damage_pct"
{
"value" "10 20 30 40"
"CalculateSpellDamageTooltip" "0"
}
"radius"
{
"value" "375"
}
"int_think" "1"
"heal"
{
"value" "15 30 45 60"
"special_bonus_unique_yuki_revenge_heal" "+145"
}
"base_damage"
{
"value" "45 65 85 105"
"special_bonus_unique_yuki_revenge_damage" "+105"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"ability_yuki_ritual"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/yuki-onna/ability_yuki_ritual.lua"
"AbilityTextureName" "old_heroes/yuki/ritual"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH"
"AbilityCastRange" "800"
"AbilityCastPoint" "2.5"
"AbilityCooldown" "60"
"AbilityManaCost" "550"
"RequiredLevel" "25"
"MaxLevel" "1"
"AbilityValues"
{
"duration" "14"
"bonus_armor" "200"
"bonus_hp_regen"
{
"value" "100"
}
"bonus_hp_regen_pct" "2"
"reduce_ms" "100"
"reduce_as" "50"
}
}
"ability_yuki_challenge"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/yuki-onna/ability_yuki_challenge.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityTextureName" "old_heroes/yuki/challenge"
"HasScepterUpgrade" "1"
"HasShardUpgrade" "1"
"RequiredLevel" "10"
"MaxLevel" "3"
"LevelsBetweenUpgrades" "5"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "400"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "90"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "600 1200 1800"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"duration" "6"
"dmg_per_atr"
{
"value" "6"
"special_bonus_shard" "-2.5"
"CalculateSpellDamageTooltip" "0"
}
"interval" "0.2"
"bonus_main" "4 8 12"
"dmg_incr" "50"
"dmg_reduce" "30"
"main_pct" "8"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"ability_yuki_snowman"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/yuki-onna/ability_yuki_snowman.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT"
"AbilityTextureName" "old_heroes/yuki/snowman"
"AbilityCastRange" "400 600 800"
"AbilityCastPoint" "0.8"
"MaxLevel" "3"
"LevelsBetweenUpgrades" "10"
"RequiredLevel" "6"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "30"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "200 400 600"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"bonus_health" "1200 2400 3600"
"max_snowman"
{
"value" "3 4 5"
"special_bonus_unique_yuki_snowman_max" "+2"
}
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2"
}
"ability_yuki_snowball"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "ability_lua"
"ScriptFile" "abilities/heroes/yuki-onna/ability_yuki_snowball.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityTextureName" "tusk_snowball"
// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "500 800 1100"
// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "0"
// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "0"
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"radius" "250"
"heal" "10 25 40"
"slow_as" "-10 -20 -30"
"duration" "2"
}
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3"
}
"special_bonus_unique_yuki_revenge_heal"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_yuki_revenge_damage"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_yuki_pohela_resistance"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_yuki_frostshtorm_duration"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
"special_bonus_unique_yuki_snowman_max"
{
// General
//-------------------------------------------------------------------------------------------------------------
"BaseClass" "special_bonus_undefined"
"AbilityType" "ABILITY_TYPE_ATTRIBUTES"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
}
}
+147
View File
@@ -0,0 +1,147 @@
//
// <key> <value>
// Hero currently on/off, will be # of instances (-1 = infinite)
//
"CustomHeroList"
{
// usefull
"npc_dota_hero_drow_ranger" "1"
"npc_dota_hero_phantom_assassin" "1"
"npc_dota_hero_lina" "1"
"npc_dota_hero_crystal_maiden" "1"
"npc_dota_hero_axe" "1"
"npc_dota_hero_sven" "1"
"npc_dota_hero_bloodhunter" "1"
"npc_dota_hero_yuki_onna" "1"
"npc_dota_hero_nagash" "1"
"npc_dota_hero_sargatanas" "1"
"npc_dota_hero_elder_dragon_smaug" "1"
"npc_dota_hero_pudge" "1"
"npc_dota_hero_medusa" "0"
"npc_dota_hero_rubick" "1"
"npc_dota_hero_luna" "1"
"npc_dota_hero_mirana" "1"
"npc_dota_hero_queenofpain" "1"
"npc_dota_hero_troll_warlord" "1"
"npc_dota_hero_skywrath_mage" "1"
"npc_dota_hero_silencer" "1"
"npc_dota_hero_terrorblade" "0"
"npc_dota_hero_jakiro" "0"
"npc_dota_hero_winter_wyvern" "0"
"npc_dota_hero_bloodseeker" "0"
"npc_dota_hero_abyssal_underlord" "0"
"npc_dota_hero_juggernaut" "1"
"npc_dota_hero_hoodwink" "1"
"npc_dota_hero_templar_assassin" "1"
"npc_dota_hero_nevermore" "1"
"npc_dota_hero_sniper" "1"
"npc_dota_hero_bristleback" "1"
"npc_dota_hero_ogre_magi" "1"
"npc_dota_hero_legion_commander" "1"
"npc_dota_hero_sand_king" "1"
"npc_dota_hero_alchemist" "0"
"npc_dota_hero_tidehunter" "0"
"npc_dota_hero_wisp" "0"
"npc_dota_hero_dazzle" "0"
"npc_dota_hero_clinkz" "0"
"npc_dota_hero_ursa" "0"
"npc_dota_hero_skeleton_king" "0"
"npc_dota_hero_dark_seer" "0"
"npc_dota_hero_enigma" "0"
"npc_dota_hero_muerta" "0"
"npc_dota_hero_treant" "0"
"npc_dota_hero_phantom_lancer" "0"
"npc_dota_hero_slark" "0"
"npc_dota_hero_huskar" "0"
"npc_dota_hero_tusk" "0"
"npc_dota_hero_lion" "0"
"npc_dota_hero_shredder" "0"
"npc_dota_hero_antimage" "0"
"npc_dota_hero_oracle" "0"
"npc_dota_hero_marci" "0"
"npc_dota_hero_techies" "0"
"npc_dota_hero_gyrocopter" "0"
"npc_dota_hero_ember_spirit" "0"
"npc_dota_hero_lycan" "0"
"npc_dota_hero_dragon_knight" "0"
"npc_dota_hero_spectre" "1"
"npc_dota_hero_tiny" "0"
"npc_dota_hero_obsidian_destroyer" "0"
"npc_dota_hero_vengefulspirit" "1"
"npc_dota_hero_windrunner" "0"
"npc_dota_hero_viper" "0"
"npc_dota_hero_invoker" "0"
"npc_dota_hero_tinker" "0"
"npc_dota_hero_earthshaker" "0"
"npc_dota_hero_omniknight" "0"
"npc_dota_hero_keeper_of_the_light" "1"
"npc_dota_hero_snapfire" "0"
"npc_dota_hero_bounty_hunter" "0"
"npc_dota_hero_kunkka" "0"
"npc_dota_hero_centaur" "0"
"npc_dota_hero_necrolyte" "0"
"npc_dota_hero_enchantress" "0"
"npc_dota_hero_witch_doctor" "0"
"npc_dota_hero_techies" "0"
"npc_dota_hero_abaddon" "0"
"npc_dota_hero_ancient_apparition" "0"
"npc_dota_hero_bane" "0"
"npc_dota_hero_batrider" "0"
"npc_dota_hero_beastmaster" "0"
"npc_dota_hero_brewmaster" "0"
"npc_dota_hero_broodmother" "0"
"npc_dota_hero_chaos_knight" "0"
"npc_dota_hero_chen" "0"
"npc_dota_hero_rattletrap" "0"
"npc_dota_hero_death_prophet" "0"
"npc_dota_hero_disruptor" "0"
"npc_dota_hero_doom_bringer" "0"
"npc_dota_hero_earth_spirit" "0"
"npc_dota_hero_elder_titan" "0"
"npc_dota_hero_faceless_void" "0"
"npc_dota_hero_monkey_king" "0"
"npc_dota_hero_pangolier" "0"
"npc_dota_hero_leshrac" "0"
"npc_dota_hero_lich" "0"
"npc_dota_hero_life_stealer" "0"
"npc_dota_hero_lone_druid" "0"
"npc_dota_hero_magnataur" "0"
"npc_dota_hero_meepo" "0"
"npc_dota_hero_mirana" "1"
"npc_dota_hero_morphling" "0"
"npc_dota_hero_naga_siren" "0"
"npc_dota_hero_furion" "0"
"npc_dota_hero_night_stalker" "0"
"npc_dota_hero_nyx_assassin" "0"
"npc_dota_hero_phoenix" "0"
"npc_dota_hero_puck" "0"
"npc_dota_hero_pugna" "0"
"npc_dota_hero_razor" "0"
"npc_dota_hero_riki" "0"
"npc_dota_hero_slardar" "0"
"npc_dota_hero_spirit_breaker" "0"
"npc_dota_hero_storm_spirit" "0"
"npc_dota_hero_shadow_demon" "0"
"npc_dota_hero_shadow_shaman" "0"
"npc_dota_hero_undying" "0"
"npc_dota_hero_venomancer" "0"
"npc_dota_hero_visage" "0"
"npc_dota_hero_warlock" "0"
"npc_dota_hero_weaver" "0"
"npc_dota_hero_zeus" "0"
"npc_dota_hero_zuus" "0"
}
+249
View File
@@ -0,0 +1,249 @@
"DOTAAbilities"
{
"item_blackshop_common_injector"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_injector"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/soldier"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"attack_speed" "15"
"movement_speed" "15"
}
}
"item_blackshop_common_bonus_stats_agi"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_bonus_stats_agi"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/book_agi"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"Model" "models/gameplay/attrib_tome_agi.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_agility" "12"
}
}
"item_blackshop_common_bonus_stats_str"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_bonus_stats_str"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/book_str"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"Model" "models/gameplay/attrib_tome_str.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_strength" "12"
}
}
"item_blackshop_common_bonus_stats_int"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_bonus_stats_int"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/book_int"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"Model" "models/gameplay/attrib_tome_int.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_intelligence" "12"
}
}
"item_blackshop_common_king_crown"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_king_crown"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/crown"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_health" "150"
"bonus_armor" "15"
}
}
"item_blackshop_common_manaflare"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_manaflare"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/manaflare"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_mana" "150"
"bonus_mana_regen" "1.5"
}
}
"item_blackshop_common_spell_mask"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_spell_mask"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/spell_mask"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_spell_amp" "3"
"bonus_mana_regen" "3"
}
}
"item_blackshop_common_boo_stuff"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_boo_stuff"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/boo_stuff"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_stats" "30"
"bonus_attack_range" "50"
}
}
"item_blackshop_common_stone_armor"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_stone_armor"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/stone_armor"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_armor" "6"
}
}
"item_blackshop_common_vigor_tincture"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_vigor_tincture"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/vigor_salve"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_hp_regen" "2"
}
}
"item_blackshop_common_wind_dust"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_wind_dust"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/granite_boots"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_movement_speed" "25"
}
}
"item_blackshop_common_blue_tallow"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/common/item_blackshop_common_blue_tallow"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/blue_tallow"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_omniknight/omniknight_heavenly_grace_buff.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_mana_regen" "2"
}
}
}
+91
View File
@@ -0,0 +1,91 @@
"DOTAAbilities"
{
"item_blackshop_cursed_the_hand_of_gluttony"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/cursed/item_blackshop_cursed_the_hand_of_gluttony"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/the_hand_of_gluttony"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/shadow_fiend/sf_desolation/sf_base_attack_desolation.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_stats" "66.6"
}
}
"item_blackshop_cursed_martyrs_brand"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/cursed/item_blackshop_cursed_martyrs_brand"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/martyrs_brand"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/shadow_fiend/sf_desolation/sf_base_attack_desolation.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_damage_per" "30"
"incoming_damage_per_stack" "6.66"
}
}
"item_blackshop_cursed_widow_chain"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/cursed/item_blackshop_cursed_widow_chain"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/widow_chain"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/shadow_fiend/sf_desolation/sf_base_attack_desolation.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_outgoing_damage_pct" "50"
"attack_speed_loss_pct" "50"
"root_duration" "1.5"
}
}
"item_blackshop_cursed_glass_pact"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/cursed/item_blackshop_cursed_glass_pact"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/glass_pact"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/shadow_fiend/sf_desolation/sf_base_attack_desolation.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"outgoing_damage_pct" "15"
"incoming_damage_pct" "15"
}
}
}
+90
View File
@@ -0,0 +1,90 @@
"DOTAAbilities"
{
"item_blackshop_epic_power_of_grow"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/epic/item_blackshop_epic_power_of_grow"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/magic_mushroom"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/lanaya/lanaya_epit_trap/templar_assassin_epit_trap.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_stats" "30"
}
}
"item_blackshop_epic_critical_paladin_sword"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/epic/item_blackshop_epic_critical_paladin_sword"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "item_paladin_sword"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/lanaya/lanaya_epit_trap/templar_assassin_epit_trap.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"crit_multiplier" "175"
}
}
"item_blackshop_epic_trinity_seal"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/epic/item_blackshop_epic_trinity_seal"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/trinity_seal"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/lanaya/lanaya_epit_trap/templar_assassin_epit_trap.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_all" "14"
}
}
"item_blackshop_epic_bulwark_plate"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/epic/item_blackshop_epic_bulwark_plate"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/iron_plate"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/lanaya/lanaya_epit_trap/templar_assassin_epit_trap.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_armor_per" "9"
"bonus_mr_per" "4"
}
}
}
+94
View File
@@ -0,0 +1,94 @@
"DOTAAbilities"
{
"item_blackshop_heavenly_reset_to_zero"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/heavenly/item_blackshop_heavenly_reset_to_zero"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/reset_to_zero"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/templar_assassin/ta_2022_immortal/ta_2022_immortal_trap_crimson.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
}
}
"item_blackshop_heavenly_font_of_mercy"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/heavenly/item_blackshop_heavenly_font_of_mercy"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_AOE"
"ItemCost" "0"
"AbilityTextureName" "blackshop/holy_mercy"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/templar_assassin/ta_2022_immortal/ta_2022_immortal_trap_crimson.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"heal_flat" "450"
"heal_max_hp_pct" "18"
"radius" "900"
"hero_cooldown" "75"
"crisis_hp_pct" "30"
}
}
"item_blackshop_heavenly_sanctuary_veil"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/heavenly/item_blackshop_heavenly_sanctuary_veil"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/sanctuary_veil"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/templar_assassin/ta_2022_immortal/ta_2022_immortal_trap_crimson.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"status_resist" "28"
"magic_resist" "22"
}
}
"item_blackshop_heavenly_dawn_chorus"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/heavenly/item_blackshop_heavenly_dawn_chorus"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_AOE"
"ItemCost" "0"
"AbilityTextureName" "blackshop/dawn_chorus"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/templar_assassin/ta_2022_immortal/ta_2022_immortal_trap_crimson.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"radius" "650"
"status_resist" "14"
"magic_resist" "12"
}
}
}
+131
View File
@@ -0,0 +1,131 @@
"DOTAAbilities"
{
"item_blackshop_legendary_restock"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/legendary/item_blackshop_legendary_restock"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/restock"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/templar_assassin/ta_2022_immortal/ta_2022_immortal_trap_gold.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
}
}
"item_blackshop_legendary_fire_summoner"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/legendary/item_blackshop_legendary_fire_summoner"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/fire_summoner"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPermanent" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/templar_assassin/ta_2022_immortal/ta_2022_immortal_trap_gold.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilitySpecial"
{
}
}
"item_blackshop_legendary_primordial_shard"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/legendary/item_blackshop_legendary_primordial_shard"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/primordial_shard"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/templar_assassin/ta_2022_immortal/ta_2022_immortal_trap_gold.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_all" "22"
}
}
"item_blackshop_legendary_twilight_mirror"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/legendary/item_blackshop_legendary_twilight_mirror"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/twilight_mirror"
"ItemKillable" "0"
"ItemSellable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/templar_assassin/ta_2022_immortal/ta_2022_immortal_trap_gold.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"spell_amp_pct" "32"
"incoming_damage_pct" "14"
}
}
"item_blackshop_legendary_astral_anchor"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/legendary/item_blackshop_legendary_astral_anchor"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/astral_anchor"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/templar_assassin/ta_2022_immortal/ta_2022_immortal_trap_gold.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"cast_range_bonus" "150"
"move_speed_loss_pct" "10"
}
}
"item_blackshop_legendary_fated_die"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/legendary/item_blackshop_legendary_fated_die"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/fated_die"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemPurchasable" "0"
"ItemSellable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/econ/items/templar_assassin/ta_2022_immortal/ta_2022_immortal_trap_gold.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"luck_bonus" "38"
}
}
}
+151
View File
@@ -0,0 +1,151 @@
"DOTAAbilities"
{
"item_blackshop_rare_egg_of_death"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/rare/item_blackshop_rare_egg_of_death"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/egg_of_death"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_ancient_apparition/ancient_apparition_base_attack.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_all" "10"
}
}
"item_blackshop_rare_agility_cape"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/rare/item_blackshop_rare_agility_cape"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/agility_cape"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_ancient_apparition/ancient_apparition_base_attack.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_agility" "30"
}
}
"item_blackshop_rare_damage_dagger"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/rare/item_blackshop_rare_damage_dagger"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/damage_dagger"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_ancient_apparition/ancient_apparition_base_attack.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_damage" "75"
}
}
"item_blackshop_rare_silver_eye"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/rare/item_blackshop_rare_silver_eye"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/silver_eye"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_ancient_apparition/ancient_apparition_base_attack.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_vision" "100"
}
}
"item_blackshop_rare_critical_havoc"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/rare/item_blackshop_rare_critical_havoc"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/critical_havoc"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_ancient_apparition/ancient_apparition_base_attack.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"crit_chance" "15"
"crit_mult" "130"
}
}
"item_blackshop_rare_granite_badge"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/rare/item_blackshop_rare_granite_badge"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/granite_stone"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_ancient_apparition/ancient_apparition_base_attack.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_health" "100"
}
}
"item_blackshop_rare_iron_resolve"
{
"BaseClass" "item_lua"
"ScriptFile" "items/blackshop/rare/item_blackshop_rare_iron_resolve"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
"ItemCost" "0"
"AbilityTextureName" "blackshop/ironwood_tree"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemStackable" "0"
"ItemSellable" "0"
"ItemPurchasable" "0"
"Model" "models/props_gameplay/treasure_chest_gold.vmdl"
"Effect" "particles/units/heroes/hero_ancient_apparition/ancient_apparition_base_attack.vpcf"
"AbilityCooldown" "0"
"ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
"AbilityValues"
{
"bonus_status_resist" "10"
}
}
}
File diff suppressed because it is too large Load Diff
+449
View File
@@ -0,0 +1,449 @@
"DOTAAbilities"
{
"item_rom"
{
"BaseClass" "item_datadriven"
"AbilityTextureName" "quest_items/rom"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityCastAnimation" "ACT_DOTA_GENERIC_CHANNEL_1"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "0"
"ItemInitialCharges" "0"
"ItemStackable" "0"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_ent_heart"
{
"BaseClass" "item_datadriven"
"AbilityTextureName" "quest_items/ent_heart"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "40"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_wolf_claw"
{
"BaseClass" "item_datadriven"
"AbilityTextureName" "quest_items/wolf_claw"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "50"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_testo"
{
"BaseClass" "item_datadriven"
"AbilityTextureName" "utils/testo"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "120"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_egg"
{
"BaseClass" "item_datadriven"
"AbilityTextureName" "utils/egg"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/moon_shard/moon_shard_003.vmdl"
"ModelScale" "10"
"ItemIsNeutralDrop" "0"
"ItemCost" "120"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_testo_pizza"
{
"BaseClass" "item_datadriven"
"AbilityTextureName" "utils/testo_pizza"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "120"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_spider_legs_custom"
{
"BaseClass" "item_datadriven"
"AbilityTextureName" "quest_items/spider_legs"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "120"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_poison"
{
"BaseClass" "item_datadriven"
"AbilityTextureName" "quest_items/poison"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "120"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_frog_paw"
{
"BaseClass" "item_datadriven"
"AbilityTextureName" "quest_items/frog_paw"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "120"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_pollen_keeper"
{
"BaseClass" "item_lua"
"AbilityTextureName" "quest_items/pollen_keeper_1"
"ScriptFile" "items/quest_items/item_pollen_keeper"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "120"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
"chance" "15"
}
}
"item_mayonnaise"
{
"BaseClass" "item_datadriven"
"AbilityTextureName" "utils/mayonnaise"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "1200"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_lycan_horn"
{
"BaseClass" "item_datadriven"
"AbilityTextureName" "quest_items/lycan_horn"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "1"
"ItemInitialCharges" "0"
"ItemStackable" "0"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_clean_harbor"
{
"BaseClass" "item_lua"
"ScriptFile" "items/default_items/item_clean_harbor"
"AbilityTextureName" "item_roshans_banner"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "0"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
}
}
"item_shameful_pipe"
{
"BaseClass" "item_lua"
"ScriptFile" "items/quest_items/item_shameful_pipe"
"AbilityTextureName" "blackshop/astral_anchor"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemCost" "0"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "0"
"ItemDroppable" "1"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPermanent" "1"
"AbilityValues"
{
"bonus_attack_range" "450"
}
}
"item_shovel"
{
"BaseClass" "item_lua"
"ScriptFile" "items/quest_items/item_shovel"
"AbilityTextureName" "item_trusty_shovel"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED"
"AbilityChannelTime" "1"
"AbilityCastAnimation" "ACT_DOTA_GENERIC_CHANNEL_1"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityCooldown" "12"
"ItemCost" "0"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemPermanent" "0"
"ItemIsNeutralDrop" "1"
"ItemInitialCharges" "0"
"ItemDisplayCharges" "1"
"AbilityValues"
{
"gold_min" "145"
"gold_max" "325"
"bonus_health" "675"
"max_digs" "5"
}
}
"item_fishing_rod"
{
"BaseClass" "item_lua"
"ScriptFile" "items/default_items/item_fishing_rod"
"AbilityTextureName" "quest_items/fishing_rod"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES | DOTA_ABILITY_BEHAVIOR_OVERSHOOT"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"Model" "models/props_gameplay/neutral_box.vmdl"
"ItemIsNeutralDrop" "0"
"AbilityCastRange" "600"
"AbilityCastPoint" "0.3"
"AbilityCooldown" "2.5"
"AbilityManaCost" "25"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "0"
"ItemInitialCharges" "0"
"ItemStackable" "0"
"ItemPermanent" "0"
"SideShop" "0"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"AbilityValues"
{
"hook_distance" "952"
"hook_speed" "1600"
"hook_width" "100"
"Damage" "75"
"duration" "3"
"slow_movespeed" "-20"
"damage_per_tick" "15"
"tick" "0.5"
"vision_radius" "500"
"vision_duration" "4"
"fish_catch_item" "item_fish"
"fish_loot_launch_height" "100"
"fish_loot_launch_distance" "150"
"fish_loot_launch_duration" "0.5"
}
}
}
+101
View File
@@ -0,0 +1,101 @@
"DOTAAbilities"
{
"item_radiance" "REMOVE"
"item_lifesteal" "REMOVE"
"item_satanic" "REMOVE"
"item_recipe_satanic" "REMOVE"
"item_mask_of_madness" "REMOVE"
"item_voodoo_mask" "REMOVE"
"item_cyclone" "REMOVE"
"item_basher" "REMOVE"
"item_glimmer_cape" "REMOVE"
"item_travel_boots_2" "REMOVE"
"item_dagon" "REMOVE"
"item_dagon_2" "REMOVE"
"item_dagon_3" "REMOVE"
"item_dagon_4" "REMOVE"
"item_dagon_5" "REMOVE"
"item_revenants_brooch" "REMOVE"
"item_helm_of_the_overlord" "REMOVE"
"item_silver_edge" "REMOVE"
"item_invis_sword" "REMOVE"
"item_shadow_amulet" "REMOVE"
"item_greater_crit" "REMOVE"
"item_lesser_crit" "REMOVE"
"item_dragon_scale" "REMOVE"
"item_pupils_gift" "REMOVE"
"item_grove_bow" "REMOVE"
"item_bullwhip" "REMOVE"
"item_skadi" "REMOVE"
"item_eye_of_the_vizier" "REMOVE"
"item_vampire_fangs" "REMOVE"
"item_light_collector" "REMOVE"
"item_vambrace" "REMOVE"
"item_paladin_sword" "REMOVE"
"item_vindicators_axe" "REMOVE"
"item_craggy_coat" "REMOVE"
"item_enchanted_quiver" "REMOVE"
"item_elven_tunic" "REMOVE"
"item_doubloon" "REMOVE"
"item_timeless_relic" "REMOVE"
"item_ascetic_cap" "REMOVE"
"item_avianas_feather" "REMOVE"
"item_spy_gadget" "REMOVE"
"item_trickster_cloak" "REMOVE"
"item_ancient_guardian" "REMOVE"
"item_havoc_hammer" "REMOVE"
"item_force_boots" "REMOVE"
"item_seer_stone" "REMOVE"
"item_mirror_shield" "REMOVE"
"item_apex" "REMOVE"
"item_force_field" "REMOVE"
"item_giants_ring" "REMOVE"
"item_unwavering_condition" "REMOVE"
"item_book_of_shadows" "REMOVE"
//"item_keen_optic" "REMOVE"
"item_arcane_ring" "REMOVE"
//"item_possessed_mask" "REMOVE"
//"item_mysterious_hat" "REMOVE"
"item_safety_bubble" "REMOVE"
"item_lance_of_pursuit" "REMOVE"
//"item_ocean_heart" "REMOVE"
"item_broom_handle" "REMOVE"
//"item_chipped_vest" "REMOVE"
"item_royal_jelly" "REMOVE"
"item_faded_broach" "REMOVE"
"item_ironwood_tree" "REMOVE"
//"item_smoke_of_deceit" "REMOVE"
"item_faerie_fire" "REMOVE"
"item_enchanted_mango" "REMOVE"
"item_helm_of_the_dominator" "REMOVE"
"item_helm_of_the_dominator_2" "REMOVE"
"item_dust" "REMOVE"
"item_travel_boots" "REMOVE"
"item_vladmir" "REMOVE"
"item_solar_crest" "REMOVE"
"item_bfury" "REMOVE"
"item_guardian_greaves" "REMOVE"
"item_recipe_abyssal_blade" "REMOVE"
"item_abyssal_blade" "REMOVE"
"item_recipe_mjollnir" "REMOVE"
"item_mjollnir" "REMOVE"
"item_wind_waker" "REMOVE"
"item_hand_of_midas" "REMOVE"
"item_rapier" "REMOVE"
"item_urn_of_shadows" "REMOVE"
"item_arcane_blink" "REMOVE"
"item_swift_blink" "REMOVE"
"item_overwhelming_blink" "REMOVE"
"item_voodoo_mask" "REMOVE"
"item_bloodstone" "REMOVE"
"item_ethereal_blade" "REMOVE"
"item_recipe_ethereal_blade" "REMOVE"
"item_desolator" "REMOVE"
"item_orb_of_corruption" "REMOVE"
"item_recipe_orb_of_corruption" "REMOVE"
"item_orb_of_corruption_2" "REMOVE"
"item_recipe_orb_of_corruption_2" "REMOVE"
"item_blood_grenade" "REMOVE"
}
+514
View File
@@ -0,0 +1,514 @@
"DOTAAbilities"
{
"item_meat"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_meat.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/gameplay/meat/meat.vmdl"
"AbilityTextureName" "utils/meat"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"heal" "150"
"hunger_bonus" "5"
}
}
"item_fish"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_fish.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityTextureName" "utils/fish"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"heal" "150"
"hunger_bonus" "5"
}
}
"item_pizza"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_pizza.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityTextureName" "utils/pizza"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"stack_count" "15"
"hunger_bonus" "100"
}
}
"item_firecore"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_firecore.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityTextureName" "item_philosophers_stone"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "0"
"ItemKillable" "0"
"ItemInitialCharges" "0"
"ItemStackable" "0"
"ItemPermanent" "0"
"SideShop" "0"
}
"item_grilled_meat"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_grilled_meat.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityTextureName" "utils/grilled_meat"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"heal" "350"
"hunger_bonus" "15"
}
}
"item_bread"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_bread.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityTextureName" "utils/bread"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"heal" "100"
"hunger_bonus" "40"
}
}
"item_sandwich"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_sandwich.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityTextureName" "utils/sandwich"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"hunger_bonus" "70"
"buff_duration" "180"
"bonus_damage" "150"
"bonus_armor" "16"
"move_speed_slow_pct" "30"
"model_scale" "40"
}
}
"item_cheese"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_milk.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityTextureName" "utils/cheese"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"mana" "75"
"hunger_bonus" "5"
}
}
"item_milk"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_milk.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/bottle_mango001.vmdl"
"AbilityTextureName" "utils/milk"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"mana" "75"
"hunger_bonus" "5"
}
}
"item_banana"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_banana.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/banana_prop_closed.vmdl"
"AbilityTextureName" "utils/banana"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"mana" "125"
"hunger_bonus" "9"
}
}
"item_rofl_for_kaban_pumba"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_rofl_for_kaban_pumba.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"Effect" "particles/heavenly_item_effect.vpcf"
"AbilityTextureName" "utils/rofl_for_kaban_pumba"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityCastRange" "200"
"ItemQuality" "artifact"
"ItemCost" "0"
"AbilityCooldown" "60.0"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"AbilityValues"
{
}
}
"item_easter_egg"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_easter_egg.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/moon_shard/moon_shard_meteor.vmdl"
"AbilityTextureName" "utils/eggs"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"SideShop" "0"
"AbilityValues"
{
"hunger_bonus" "100"
}
}
"item_candy"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_candys.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/moon_shard/moon_shard_001.vmdl"
"AbilityTextureName" "utils/candy"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"SideShop" "0"
"AbilityValues"
{
"hunger_bonus" "15"
}
}
"item_energy_drink"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_energy_drink.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityTextureName" "utils/energetic"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"heal" "100"
"mana" "150"
"hunger_bonus" "35"
"buff_duration" "45"
"buff_move_speed_pct" "12"
"buff_attack_speed" "30"
}
}
"item_cocktail"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_cocktail.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityTextureName" "utils/cocktail"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "0"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"hunger_bonus" "40"
"buff_duration" "120"
"spell_lifesteal" "15"
"spell_amp" "15"
"manacost_increase" "20"
}
}
"item_coffee"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_coffee.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityTextureName" "utils/coffee"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "100"
"ItemDroppable" "1"
"ItemPurchasable" "0"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"hunger_bonus" "15"
"buff_duration" "60"
"cooldown_reduction" "15"
"casttime_reduction" "20"
}
}
"item_coffe_bean"
{
"BaseClass" "item_lua"
"ScriptFile" "items/util_items/item_coffe_bean.lua"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"Model" "models/props_gameplay/neutral_box.vmdl"
"AbilityTextureName" "utils/coffee_bean"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityCastRange" "200"
"ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING"
"ItemQuality" "artifact"
"ItemCost" "50"
"ItemDroppable" "1"
"ItemPurchasable" "1"
"ItemSellable" "1"
"ItemKillable" "1"
"ItemInitialCharges" "1"
"ItemStackable" "1"
"ItemPermanent" "0"
"SideShop" "0"
"AbilityValues"
{
"mana_pct" "5"
"mana" "150"
}
}
}
+295
View File
@@ -0,0 +1,295 @@
"neutral_items"
{
"madstone_limits"
{
"madstone_no_limit_time" "00:00"
}
"neutral_tiers"
{
"1"
{
"start_time" "0:00"
"trinket_options" "4"
"enhancement_options" "4"
"craft_cost" "5"
"xp_bonus" "0"
"items"
{
"item_occult_bracelet" "1"
"item_kobold_cup" "1"
"item_chipped_vest" "1"
"item_polliwog_charm" "1"
"item_dormant_curio" "1"
"item_duelist_gloves" "1"
"item_weighted_dice" "1"
"item_ash_legion_shield" "1"
"item_dagger_of_ristul" "1"
"item_stonefeather_satchel" "1"
"item_possessed_mask" "1"
"item_foragers_kit" "1"
}
"enhancements"
{
"global"
{
"item_enhancement_quickened" "1"
"item_enhancement_vital" "1"
}
"strength"
{
"item_enhancement_brawny" "1"
"item_enhancement_tough" "1"
}
"agility"
{
"item_enhancement_alert" "1"
"item_enhancement_brawny" "1"
}
"intelligence"
{
"item_enhancement_mystical" "1"
"item_enhancement_tough" "1"
}
"universal"
{
"item_enhancement_alert" "1"
"item_enhancement_mystical" "1"
}
}
}
"2"
{
"start_time" "00:00"
"trinket_options" "5"
"enhancement_options" "5"
"craft_cost" "6"
"xp_bonus" "0"
"items"
{
"item_essence_ring" "1"
"item_mana_draught" "1"
"item_poor_mans_shield" "1"
"item_searing_signet" "1"
"item_pogo_stick" "1"
"item_defiant_shell" "1"
"item_crippling_crossbow" "1"
"item_medallion_of_courage" "1"
"item_seeds_of_serenity" "1"
}
"enhancements"
{
"global"
{
"item_enhancement_quickened" "2"
}
"strength"
{
"item_enhancement_brawny" "2"
"item_enhancement_tough" "2"
"item_enhancement_crude" "1"
}
"agility"
{
"item_enhancement_alert" "2"
"item_enhancement_brawny" "2"
"item_enhancement_nimble" "1"
}
"intelligence"
{
"item_enhancement_mystical" "2"
"item_enhancement_tough" "2"
"item_enhancement_keen_eyed" "1"
}
"universal"
{
"item_enhancement_alert" "2"
"item_enhancement_mystical" "2"
"item_enhancement_titanic" "1"
}
}
}
"3"
{
"start_time" "00:00"
"trinket_options" "5"
"enhancement_options" "5"
"craft_cost" "7"
"xp_bonus" "0"
"items"
{
"item_serrated_shiv" "1"
"item_gunpowder_gauntlets" "1"
"item_jidi_pollen_bag" "1"
"item_psychic_headband" "1"
"item_unrelenting_eye" "1"
"item_cloak_of_flames" "1"
"item_spellslinger" "1"
"item_stormcrafter" "1"
"item_partisans_brand" "1"
}
"enhancements"
{
"global"
{
"item_enhancement_quickened" "3"
}
"strength"
{
"item_enhancement_brawny" "3"
"item_enhancement_tough" "3"
"item_enhancement_crude" "2"
}
"agility"
{
"item_enhancement_alert" "3"
"item_enhancement_brawny" "3"
"item_enhancement_nimble" "2"
}
"intelligence"
{
"item_enhancement_mystical" "3"
"item_enhancement_tough" "3"
"item_enhancement_keen_eyed" "2"
}
"universal"
{
"item_enhancement_alert" "3"
"item_enhancement_mystical" "3"
"item_enhancement_titanic" "2"
}
}
}
"4"
{
"start_time" "00:00"
"trinket_options" "5"
"enhancement_options" "5"
"craft_cost" "8"
"xp_bonus" "0"
"items"
{
"item_giant_maul" "1"
"item_rattlecage" "1"
"item_idol_of_screeauk" "1"
"item_flayers_bota" "1"
"item_metamorphic_mandible" "1"
"item_dandelion_amulet" "1"
"item_enchanters_bauble" "1"
"item_prophets_pendulum" "1"
"item_conjurers_catalyst" "1"
}
"enhancements"
{
"global"
{
"item_enhancement_quickened" "4"
"item_enhancement_timeless" "1"
}
"strength"
{
"item_enhancement_brawny" "4"
"item_enhancement_tough" "4"
"item_enhancement_crude" "3"
}
"agility"
{
"item_enhancement_alert" "4"
"item_enhancement_brawny" "4"
"item_enhancement_nimble" "3"
}
"intelligence"
{
"item_enhancement_mystical" "4"
"item_enhancement_tough" "4"
"item_enhancement_keen_eyed" "3"
}
"universal"
{
"item_enhancement_alert" "4"
"item_enhancement_mystical" "4"
"item_enhancement_titanic" "3"
}
}
}
"5"
{
"start_time" "00:00"
"trinket_options" "5"
"enhancement_options" "5"
"craft_cost" "9"
"recraft_cost" "3"
"xp_bonus" "0"
"items"
{
"item_desolator_2" "1"
"item_fallen_sky" "1"
"item_demonicon" "1"
"item_minotaur_horn" "1"
"item_spider_legs" "1"
"item_riftshadow_prism" "1"
"item_dezun_bloodrite" "1"
"item_divine_regalia" "1"
"item_harmonizer" "1"
"item_heavy_blade" "1"
}
"enhancements"
{
"global"
{
"item_enhancement_timeless" "2"
"item_enhancement_evolved" "1"
"item_enhancement_fleetfooted" "1"
"item_enhancement_vampiric" "1"
}
"strength"
{
"item_enhancement_hulking" "1"
}
"agility"
{
"item_enhancement_audacious" "1"
}
"intelligence"
{
"item_enhancement_feverish" "1"
}
"universal"
{
"item_enhancement_manic" "1"
}
}
}
}
}
+134
View File
@@ -0,0 +1,134 @@
#base "creep_abilities/creep_abilities.kv"
#base "creep_abilities/wave_creep_abilities.kv"
#base "heroes/phantom_assassin/phantom_assassin.kv"
#base "heroes/drow_ranger/drow_ranger.kv"
#base "heroes/lina/lina.kv"
#base "heroes/sven/sven.kv"
#base "heroes/crystal_maiden/crystal_maiden.kv"
#base "heroes/juggernaut/juggernaut.kv"
#base "heroes/keeper_of_the_light/keeper_of_the_light.kv"
#base "heroes/rubick/rubick.kv"
#base "heroes/sargatanas/sargatanas.kv"
#base "heroes/sargatanas/summons.kv"
#base "heroes/nagash/nagash.kv"
#base "heroes/smaug/smaug.kv"
#base "heroes/bloodhunter/bloodhunter.kv"
#base "heroes/yuki-onna/yuki-onna.kv"
#base "heroes/luna/luna.kv"
#base "heroes/mirana/mirana.kv"
#base "heroes/pudge/pudge.kv"
#base "heroes/axe/axe.kv"
#base "heroes/templar_assassin/templar_assassin.kv"
#base "heroes/hoodwink/hoodwink.kv"
#base "heroes/sniper/sniper.kv"
#base "heroes/nevermore/nevermore.kv"
#base "heroes/silencer/silencer.kv"
#base "heroes/bristleback/bristleback.kv"
#base "heroes/queenofpain/queenofpain.kv"
#base "heroes/troll_warlord/troll_warlord.kv"
#base "heroes/skywrath_mage/skywrath_mage.kv"
#base "heroes/legion_commander/legion_commander.kv"
#base "heroes/sand_king/sand_king.kv"
#base "heroes/ogre_magi/ogre_magi.kv"
#base "heroes/spectre/spectre.kv"
#base "heroes/vengefulspirit/vengefulspirit.kv"
"DOTAAbilities"
{
"invul_npc"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/invul_npc.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
}
"no_healthbar"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/no_healthbar.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
}
"fish_basic"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/fish_basic.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
}
"spider_snake_passive"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/spider_snake_passive.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
}
dps_tracker
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/modifiers/dps_tracker.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
}
"invul_box"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/invul_box.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
}
"ability_capture_point"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/ability_capture_point.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
"AbilityValues"
{
"activation_radius" "400"
"spawn_distance" "120"
}
}
"ability_stacking_crit"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/modifiers/ability_stacking_crit.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
}
"ability_stacking_spell_crit"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/modifiers/ability_stacking_spell_crit.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
}
"ability_stats_multiplier"
{
"BaseClass" "ability_lua"
"ScriptFile" "modifiers/modifier_stats_multiplier.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
}
"ability_glyph_custom"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/modifiers/ability_glyph_custom.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
}
"ability_unit_less_laggy"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/modifiers/ability_unit_less_laggy.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE"
"Innate" "1"
}
"ability_effects"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/modifiers/ability_effects.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN "
}
"ability_modifier_source"
{
"BaseClass" "ability_lua"
"ScriptFile" "abilities/modifiers/ability_modifier_source.lua"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE"
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+297
View File
@@ -0,0 +1,297 @@
#base "wave/npc_wave_zombies.kv"
#base "wave/npc_wave_boss_zombies.kv"
#base "event_units/event_units.kv"
#base "spawn_manager/spawn_units.kv"
#base "spawn_manager/spawn_boss_units.kv"
#base "quest_npc/quest_npc.kv"
#base "summons/summons.kv"
"DOTAUnits"
{
"scene_panel_npc_dota_hero_nagash"
{
"BaseClass" "npc_dota_base_additive"
"Model" "models/heroes/phantom_assassin_persona/phantom_assassin_persona.vmdl"
}
"scene_panel_npc_dota_hero_bloodhunter"
{
"BaseClass" "npc_dota_base_additive"
"Model" "models/heroes/blood_seeker/blood_seeker.vmdl"
}
"scene_panel_npc_dota_hero_yuki_onna"
{
"BaseClass" "npc_dota_base_additive"
"Model" "models/heroes/crystal_maiden/crystal_maiden_arcana.vmdl"
}
"scene_panel_npc_dota_hero_sargatanas"
{
"BaseClass" "npc_dota_base_additive"
"Model" "models/items/terrorblade/dreadhunt_demon/dreadhunt_demon.vmdl"
}
"npc_dota_hero_elder_dragon_smaug"
{
"BaseClass" "npc_dota_base_additive"
"Model" "models/heroes/dragon_knight_persona/dk_persona_dragon.vmdl"
}
"npc_campfire"
{
"BaseClass" "npc_dota_creature"
"Model" "models/campfire.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ArmorPhysical" "0"
"MagicalResistance" "0"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "1"
"StatusHealthRegen" "0"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_dummy_test"
{
"BaseClass" "npc_dota_creature"
"Model" "models/props_gameplay/dummy/dummy_large.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ArmorPhysical" "0"
"MagicalResistance" "0"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "550"
"StatusHealth" "5000"
"StatusHealthRegen" "0"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" "dps_tracker"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_attack_box"
{
"BaseClass" "npc_dota_creature"
"Model" "models/attack_box.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ArmorPhysical" "0"
"MagicalResistance" "0"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "1"
"StatusHealthRegen" "0"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" "invul_box"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_capture_point"
{
"BaseClass" "npc_dota_creature"
"Model" "models/props_gameplay/lantern/lantern_of_sight.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ArmorPhysical" "0"
"MagicalResistance" "0"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "1"
"StatusHealthRegen" "0"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" "invul_npc"
"Ability2" "ability_capture_point"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_teleport"
{
"BaseClass" "npc_dota_building"
"Model" "models/development/invisiblebox.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_dota_camera"
{
"BaseClass" "npc_dota_creature"
"Model" "models/development/invisiblebox.vmdl"
"Level" "0"
"ArmorPhysical" "0"
"MagicalResistance" "0"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE"
"StatusHealth" "1"
"TeamName" "DOTA_TEAM_GOODGUYS"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" "invul_cam"
}
"npc_grave"
{
"BaseClass" "npc_dota_creature"
"Model" "models/items/wraith_king/arcana/wk_arcana_tombstone.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" "1.2"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_kotl_wisp"
{
"Model" "models/heroes/keeper_of_the_light/kotl_wisp.vmdl"
"BaseClass" "npc_dota_ignis_fatuus"
"SoundSet" "Phoenix_Sun"
"Level" "1"
"ModelScale" "1"
"MinimapIconSize" "300"
"Ability1" ""
"Ability2" ""
"Ability3" ""
"Ability4" ""
"ArmorPhysical" "0"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"AttackDamageMin" "0"
"AttackDamageMax" "0"
"AttackRate" "1.0"
"AttackAnimationPoint" "0.0"
"AttackAcquisitionRange" "0"
"AttackRange" "0"
"ProjectileModel" ""
"ProjectileSpeed" "0"
"HealthBarOffset" "150"
"RingRadius" "85"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"BountyXP" "0"
"BountyGoldMin" "0"
"BountyGoldMax" "0"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE"
"MovementSpeed" "0"
"StatusHealth" "100"
"StatusHealthRegen" "0.0"
"VisionDaytimeRange" "1800"
"VisionNighttimeRange" "800"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD"
"AttackDesire" "1.5"
}
"npc_dota_donate_item"
{
"BaseClass" "npc_dota_base_additive"
"Model" "models/heroes/kunkka/kunkka.vmdl"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"ModelScale" "1"
"MovementSpeed" "325"
"MovementTurnRate" "1.0"
"TeamName" "DOTA_TEAM_NEUTRALS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
}
}
+600
View File
@@ -0,0 +1,600 @@
"DOTAUnits"
{
"npc_homer"
{
"BaseClass" "npc_dota_creature"
"Model" "models/heroes/shopkeeper_dire/shopkeeper_dire.vmdl"
"HealthBarOffset" "250"
"HasInventory" "0"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"RingRadius" "75"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" "ability_glyph_custom"
"Ability2" "ability_unit_less_laggy"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_quest_giver_kunkka"
{
"BaseClass" "npc_dota_creature"
"Model" "models/heroes/kunkka/kunkka.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" "1.2"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
"Creature"
{
"AttachWearables"
{
"Wearable1" { "ItemDef" "6487" }
"Wearable2" { "ItemDef" "4016" }
"Wearable3" { "ItemDef" "6179" }
"Wearable4" { "ItemDef" "5470" }
"Wearable6" { "ItemDef" "357" }
"Wearable7" { "ItemDef" "5321" }
}
}
}
"npc_quest_giver_denny"
{
"BaseClass" "npc_dota_creature"
"Model" "models/heroes/dragon_knight_persona/dk_persona_base.vmdl"
"HealthBarOffset" "140"
"HasInventory" "1"
"ModelScale" "1.45"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"ConsideredHero" "1"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"RingRadius" "125"
"AttackRange" "130"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "1330"
"AttackDamageMin" "22"
"AttackDamageMax" "34"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
"Creature"
{
"AttachWearables"
{
"Wearable1" { "ItemDef" "762" }
"Wearable2" { "ItemDef" "763" }
}
}
}
"npc_quest_giver_oldmen"
{
"BaseClass" "npc_dota_creature"
"Model" "models/heroes/omniknight/omniknight.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" ".9"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
"Creature"
{
"AttachWearables"
{
"Wearable1" { "ItemDef" "7093" }
"Wearable2" { "ItemDef" "45" }
"Wearable3" { "ItemDef" "8172" }
}
}
}
"npc_quest_giver_firestar"
{
"BaseClass" "npc_dota_creature"
"Model" "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl7/courier_ti10_radiant_lvl7.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" ".8"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_quest_giver_lina"
{
"BaseClass" "npc_dota_creature"
"Model" "models/heroes/lina/lina.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" "1"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
"Creature"
{
"AttachWearables"
{
"Wearable1" { "ItemDef" "6707" }
"Wearable2" { "ItemDef" "6339" }
"Wearable3" { "ItemDef" "6598" }
"Wearable4" { "ItemDef" "5940" }
}
}
}
"npc_quest_giver_maiden"
{
"BaseClass" "npc_dota_creature"
"Model" "models/heroes/crystal_maiden/crystal_maiden.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" "1"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
"Creature"
{
"AttachWearables"
{
"Wearable1" { "ItemDef" "8225" }
"Wearable2" { "ItemDef" "8226" }
"Wearable3" { "ItemDef" "8227" }
"Wearable4" { "ItemDef" "8229" }
}
}
}
"npc_quest_giver_friend"
{
"BaseClass" "npc_dota_creature"
"Model" "models/pets/icewrack_wolf_alt/icewrack_wolf_alt.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" "1.45"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"HasInventory" "1"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" "invul_npc"
"Ability2" ""
"TeamName" "DOTA_TEAM_NEUTRALS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_mound"
{
"BaseClass" "npc_dota_creature"
"Model" "models/heroes/nerubian_assassin/mound.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" "1.45"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"HasInventory" "0"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" "invul_npc"
"Ability2" ""
"TeamName" "DOTA_TEAM_NEUTRALS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_sakura_tree"
{
"BaseClass" "npc_dota_creature"
"Model" "models/sakura_tree.vmdl"
"HealthBarOffset" "640"
"HasInventory" "0"
"ModelScale" "1.45"
"ArmorPhysical" "30"
"MagicalResistance" "90"
"HasInventory" "0"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "10000"
"StatusHealthRegen" "0"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" "ability_unit_less_laggy"
"Ability2" ""
"TeamName" "DOTA_TEAM_NEUTRALS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_quest_giver_largo"
{
"BaseClass" "npc_dota_creature"
"Model" "models/heroes/bard/bard_frog_base.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" "1.5"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
"Creature"
{
"AttachWearables"
{
"Wearable1" { "ItemDef" "856" }
"Wearable2" { "ItemDef" "857" }
"Wearable3" { "ItemDef" "858" }
"Wearable4" { "ItemDef" "859" }
}
}
}
"npc_quest_giver_doctor"
{
"BaseClass" "npc_dota_creature"
"Model" "models/heroes/witchdoctor/witchdoctor.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" "1.38"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
"Creature"
{
"AttachWearables"
{
"Wearable1" { "ItemDef" "8267" }
"Wearable1" { "ItemDef" "9172" }
"Wearable1" { "ItemDef" "9173" }
"Wearable1" { "ItemDef" "9174" }
"Wearable1" { "ItemDef" "9176" }
}
}
}
"npc_kot_roflik_1"
{
"BaseClass" "npc_dota_creature"
"Model" "models/items/courier/courier_ti10_radiant/courier_ti10_radiant.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" ".8"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_kot_roflik_2"
{
"BaseClass" "npc_dota_creature"
"Model" "models/items/courier/courier_ti10_dire/courier_ti10_dire_lvl1/courier_ti10_dire_lvl1.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" ".8"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_kot_roflik_0"
{
"BaseClass" "npc_dota_creature"
"Model" "models/items/courier/courier_ti10_dire/courier_ti10_dire_lvl4/courier_ti10_dire_lvl4.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ModelScale" ".8"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "125"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "6969"
"StatusHealthRegen" "1337"
"VisionDaytimeRange" "3900"
"VisionNighttimeRange" "3900"
"Ability1" ""
"Ability2" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
}
"npc_market_blackshop"
{
"BaseClass" "npc_dota_creature"
"Model" "models/heroes/grimstroke/grimstroke.vmdl"
"HealthBarOffset" "140"
"HasInventory" "0"
"ArmorPhysical" "10"
"MagicalResistance" "25"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"RingRadius" "70"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "0"
"StatusHealth" "3000"
"StatusHealthRegen" "3"
"VisionDaytimeRange" "900"
"VisionNighttimeRange" "900"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE"
"Ability1" ""
"Ability2" "invul_npc"
"Creature"
{
"AttachWearables"
{
"Wearable1" { "ItemDef" "27489" }
"Wearable1" { "ItemDef" "13896" }
"Wearable1" { "ItemDef" "13898" }
"Wearable1" { "ItemDef" "13897" }
"Wearable1" { "ItemDef" "27490" }
}
}
}
"npc_kunkka_quest_anchor_marker"
{
"BaseClass" "npc_dota_creature"
"Model" "models/heroes/wisp/wisp.vmdl"
"ModelScale" "1.0"
"HealthBarOffset" "0"
"HasInventory" "0"
"ArmorPhysical" "0"
"MagicalResistance" "100"
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL"
"RingRadius" "8"
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE"
"MovementSpeed" "0"
"StatusHealth" "1"
"StatusHealthRegen" "0"
"VisionDaytimeRange" "0"
"VisionNighttimeRange" "0"
"Ability1" "invul_npc"
"TeamName" "DOTA_TEAM_GOODGUYS"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD"
}
}
@@ -0,0 +1,245 @@
"DOTAUnits"
{
"npc_boss_lycan"
{
"Model" "models/items/lycan/ultimate/_ascension_of_the_hallowed_beast_form/_ascension_of_the_hallowed_beast_form.vmdl"
"BaseClass" "npc_dota_creature"
"SoundSet" "Hero_Lycan"
"GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts"
"ModelScale" "1.35"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"UseNeutralCreepBehavior" "1"
"ConsideredHero" "1"
"MinimapIcon" "minimap_death"
"MinimapIconSize" "650"
"Ability1" "necronomicon_warrior_mana_burn"
"Ability2" "lycan_summon_wolves_critical_strike"
"Ability3" "lycan_summon_wolves_hamstring"
"Ability4" "lycan_summon_wolves_hightail"
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "40"
"MagicalResistance" "22"
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK"
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackDamageMin" "270"
"AttackDamageMax" "342"
"AttackRate" "1.25"
"AttackAnimationPoint" "0.4"
"AttackAcquisitionRange" "1100"
"BaseAttackSpeed" "140"
"AttackAcquisitionRange" "200"
"AttackRange" "200"
"Level" "10"
// Bounds
//----------------------------------------------------------------
"RingRadius" "40"
"HealthBarOffset" "170"
// Bounty
//----------------------------------------------------------------
"BountyXP" "800"
"BountyGoldMin" "0"
"BountyGoldMax" "0"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "666"
// Status
//----------------------------------------------------------------
"StatusHealth" "6150"
"StatusHealthRegen" "5"
"StatusMana" "440"
"StatusManaRegen" "5.0"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "400"
"VisionNighttimeRange" "400"
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_BADGUYS"
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
"Creature"
{
}
}
"npc_demon_dragon_satyr"
{
"vscripts" "ai/ai_demon_dragon_satyr"
"BaseClass" "npc_dota_creature" // Class of entity of link to.
"Model" "models/creeps/nian/nian_creep.vmdl" // Model.
"SoundSet" "Creep_Good_Melee" // Name of sound set.
"ModelScale" "1.2"
"ConsideredHero" "1"
"UseNeutralCreepBehavior" "0"
// Abilities
//----------------------------------------------------------------
"Ability1" "ability_grab" // Ability 1
"Ability2" "fear" // Ability 2
"Ability3" "back_stun" // Ability 3
"Ability4" "face_stun" // Ability 4
"Ability5" "ability_animation" // Ability 4
"Ability6" "boss_ability"
// Stats
//----------------------------------------------------------------
"ArmorPhysical" "100" // Physical protection.
"AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK"
"AttackDamageMin" "1660" // Damage range min.
"AttackDamageMax" "1710" // Damage range max.
"AttackRate" "2.2" // Speed of attack.
"BaseAttackSpeed" "140"
"AttackAnimationPoint" "0.38" // Normalized time in animation cycle to attack.
"AttackAcquisitionRange" "500" // Range within a target can be acquired.
"AttackRange" "110" // Range within a target can be attacked.
"ProjectileModel" "" // Particle system model for projectile.
"ProjectileSpeed" "0" // Speed of projectile.
"MagicalResistance" "62"
// Bounds
//----------------------------------------------------------------
"RingRadius" "50"
"HealthBarOffset" "350"
// Xp
//----------------------------------------------------------------
"BountyXP" "0" // Experience earn.
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "330" // Speed.
"MovementTurnRate" "0.9" // Turning rate.
// Status
//----------------------------------------------------------------
"StatusHealth" "15200" // Base health.
"StatusHealthRegen" "50.0" // Health regeneration rate.
"StatusMana" "0" // Base mana.
"StatusManaRegen" "0.0" // Mana regeneration rate.
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "800" // Range of vision during day light.
"VisionNighttimeRange" "800" // Range of vision at night time.
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_NEUTRALS" // Team name.
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
}
"npc_boss_nevermore"
{
"Model" "models/heroes/shadow_fiend/shadow_fiend_arcana.vmdl"
"BaseClass" "npc_dota_creature"
"SoundSet" "Hero_Lycan"
"GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts"
"ModelScale" "1.9"
"BoundsHullName" "DOTA_HULL_SIZE_HERO"
"UseNeutralCreepBehavior" "0"
"ConsideredHero" "0"
"IsAncient" "1"
"vscripts" "ai/nevermore_ai"
"MinimapIcon" "minimap_death"
"MinimapIconSize" "650"
"Ability1" "boss_nevermore_coil_wave"
"Ability2" "boss_nevermore_triple_coil_aoe"
"Ability3" "boss_nevermore_requiem_barrage"
"Ability4" "boss_nevermore_time_walk"
"Ability5" "boss_nevermore_coil_beam"
"Ability6" "no_healthbar"
"Ability7" "terrorblade_terror_wave"
"Ability8" "boss_nevermore_hub_crossburst"
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "218"
"MagicalResistance" "52"
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK"
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackDamageMin" "500"
"AttackDamageMax" "570"
"AttackRate" "1.25"
"AttackAnimationPoint" "0.4"
"AttackAcquisitionRange" "1100"
"BaseAttackSpeed" "140"
"AttackAcquisitionRange" "200"
"AttackRange" "200"
"Level" "10"
// Bounds
//----------------------------------------------------------------
"RingRadius" "40"
"HealthBarOffset" "170"
// Bounty
//----------------------------------------------------------------
"BountyXP" "800"
"BountyGoldMin" "0"
"BountyGoldMax" "0"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "666"
// Status
//----------------------------------------------------------------
"StatusHealth" "287500"
"StatusHealthRegen" "0"
"StatusMana" "4400"
"StatusManaRegen" "5.0"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "10000"
"VisionNighttimeRange" "10000"
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_BADGUYS"
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
"Creature"
{
"AttachWearables"
{
"Wearable1" { "ItemDef" "7279" }
"Wearable1" { "ItemDef" "8259" }
"Wearable1" { "ItemDef" "13505" }
}
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+519
View File
@@ -0,0 +1,519 @@
"DOTAUnits"
{
"npc_wave_boss_zombie"
{
"Model" "models/items/undying/flesh_golem/incurable_pestilence_golem/incurable_pestilence_golem.vmdl"
"BaseClass" "npc_dota_creature"
"SoundSet" "n_creep_Melee"
"GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts"
"ModelScale" "1.4"
"BoundsHullName" "DOTA_HULL_SIZE_REGULAR"
"UseNeutralCreepBehavior" "0"
"Ability1" "zombie_rage"
"Ability2" "zombie_open_wounds"
"Ability3" "zombie_feast"
"Ability4" "ability_unit_less_laggy"
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "12"
"MagicalResistance" "25"
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK"
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackDamageMin" "140"
"AttackDamageMax" "210"
"AttackRate" "1.7"
"AttackAnimationPoint" "0.4"
"AttackAcquisitionRange" "1100"
"AttackRange" "130"
"BaseAttackSpeed" "140"
// Bounds
//----------------------------------------------------------------
"RingRadius" "40"
"HealthBarOffset" "170"
// Bounty
//----------------------------------------------------------------
"BountyXP" "400"
"BountyGoldMin" "0"
"BountyGoldMax" "0"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "550"
// Status
//----------------------------------------------------------------
"StatusHealth" "9000"
"StatusHealthRegen" "0"
"StatusMana" "400"
"StatusManaRegen" "0.0"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "900"
"VisionNighttimeRange" "900"
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_NEUTRALS"
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
"Creature"
{
"OffensiveAbilities"
{
"Ability1"
{
"Name" "zombie_rage"
}
"Ability2"
{
"Name" "zombie_open_wounds"
}
}
}
}
"npc_wave_boss_skeleton"
{
"Model" "models/items/wraith_king/arcana/wraith_king_arcana.vmdl"
"BaseClass" "npc_dota_creature"
"SoundSet" "n_creep_Melee"
"GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts"
"ModelScale" "1.4"
"BoundsHullName" "DOTA_HULL_SIZE_REGULAR"
"UseNeutralCreepBehavior" "0"
"Ability1" "skeleton_blast"
"Ability2" "skeleton_king_mortal_strike"
"Ability3" "zombie_feast"
"Ability4" "bone_armor"
"Ability5" "sven_great_cleave"
"Ability6" "ability_unit_less_laggy"
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "12"
"MagicalResistance" "25"
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK"
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackDamageMin" "140"
"AttackDamageMax" "210"
"AttackRate" "1.7"
"AttackAnimationPoint" "0.4"
"AttackAcquisitionRange" "1100"
"AttackRange" "130"
"BaseAttackSpeed" "140"
// Bounds
//----------------------------------------------------------------
"RingRadius" "40"
"HealthBarOffset" "170"
// Bounty
//----------------------------------------------------------------
"BountyXP" "400"
"BountyGoldMin" "0"
"BountyGoldMax" "0"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "550"
// Status
//----------------------------------------------------------------
"StatusHealth" "15000"
"StatusHealthRegen" "5"
"StatusMana" "400"
"StatusManaRegen" "0.0"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "900"
"VisionNighttimeRange" "900"
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_NEUTRALS"
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
"Creature"
{
"OffensiveAbilities"
{
"Ability1"
{
"Name" "skeleton_blast"
}
}
}
}
"npc_wave_boss_lifestealer"
{
"Model" "models/heroes/life_stealer/life_stealer.vmdl"
"BaseClass" "npc_dota_creature"
"SoundSet" "n_creep_Melee"
"GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts"
"ModelScale" "1.4"
"BoundsHullName" "DOTA_HULL_SIZE_REGULAR"
"UseNeutralCreepBehavior" "0"
"Ability1" "zombie_rage"
"Ability2" "zombie_open_wounds"
"Ability3" "zombie_feast"
"Ability4" "bone_armor"
"Ability5" "skeleton_king_mortal_strike"
"Ability6" "ability_unit_less_laggy"
"Ability7" "zombie_armor_decress"
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "-12"
"MagicalResistance" "25"
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK"
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackDamageMin" "140"
"AttackDamageMax" "210"
"AttackRate" "1.7"
"AttackAnimationPoint" "0.4"
"AttackAcquisitionRange" "1100"
"AttackRange" "130"
"BaseAttackSpeed" "140"
// Bounds
//----------------------------------------------------------------
"RingRadius" "40"
"HealthBarOffset" "170"
// Bounty
//----------------------------------------------------------------
"BountyXP" "400"
"BountyGoldMin" "0"
"BountyGoldMax" "0"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "550"
// Status
//----------------------------------------------------------------
"StatusHealth" "9000"
"StatusHealthRegen" "5"
"StatusMana" "400"
"StatusManaRegen" "0.0"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "900"
"VisionNighttimeRange" "900"
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_NEUTRALS"
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
"Creature"
{
"OffensiveAbilities"
{
"Ability1"
{
"Name" "zombie_rage"
}
"Ability2"
{
"Name" "zombie_open_wounds"
}
}
}
}
"npc_wave_boss_death_prophet"
{
"Model" "models/heroes/death_prophet/death_prophet.vmdl"
"BaseClass" "npc_dota_creature"
"SoundSet" "n_creep_Ranged"
"GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts"
"ModelScale" "1.4"
"BoundsHullName" "DOTA_HULL_SIZE_REGULAR"
"UseNeutralCreepBehavior" "0"
"Ability1" "death_prophet_carrion_swarm"
"Ability2" "death_prophet_silence"
"Ability3" "death_prophet_spirit_siphon"
"Ability4" "ghost_evasive"
"Ability5" "ability_unit_less_laggy"
"Ability6" "death_prophet_exorcism"
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "12"
"MagicalResistance" "0"
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK"
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackDamageMin" "140"
"AttackDamageMax" "210"
"AttackRate" "1.7"
"AttackAnimationPoint" "0.4"
"AttackAcquisitionRange" "1100"
"AttackRange" "630"
"BaseAttackSpeed" "140"
"ProjectileModel" "particles/units/heroes/hero_death_prophet/death_prophet_base_attack.vpcf"
"ProjectileSpeed" "1000"
// Bounds
//----------------------------------------------------------------
"RingRadius" "40"
"HealthBarOffset" "170"
// Bounty
//----------------------------------------------------------------
"BountyXP" "400"
"BountyGoldMin" "0"
"BountyGoldMax" "0"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "550"
// Status
//----------------------------------------------------------------
"StatusHealth" "6500"
"StatusHealthRegen" "0"
"StatusMana" "4000"
"StatusManaRegen" "0.0"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "900"
"VisionNighttimeRange" "900"
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_NEUTRALS"
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
"Creature"
{
"OffensiveAbilities"
{
"Ability1"
{
"Name" "death_prophet_carrion_swarm"
}
"Ability2"
{
"Name" "death_prophet_silence"
}
"Ability3"
{
"Name" "death_prophet_spirit_siphon"
}
"Ability6"
{
"Name" "death_prophet_exorcism"
}
}
"AttachWearables"
{
"Wearable1" { "ItemDef" "5597" }
"Wearable1" { "ItemDef" "5598" }
"Wearable1" { "ItemDef" "5599" }
"Wearable1" { "ItemDef" "5600" }
"Wearable1" { "ItemDef" "5603" }
}
}
}
"npc_wave_boss_suicide_zombie"
{
"Model" "models/items/courier/pw_zombie/pw_zombie_flying.vmdl"
"BaseClass" "npc_dota_creature"
"SoundSet" "n_creep_Ranged"
"GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts"
"ModelScale" "1.4"
"BoundsHullName" "DOTA_HULL_SIZE_REGULAR"
"UseNeutralCreepBehavior" "0"
"Ability1" "ghost_evasive"
"Ability2" "suicide_boys"
"Ability3" ""
"Ability4" ""
"Ability5" ""
"Ability6" ""
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "20"
"MagicalResistance" "20"
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackDamageMin" "0"
"AttackDamageMax" "0"
"AttackRate" "1.7"
"AttackAnimationPoint" "0.4"
"AttackAcquisitionRange" "1100"
"AttackRange" "630"
"BaseAttackSpeed" "140"
"ProjectileModel" "particles/units/heroes/hero_death_prophet/death_prophet_base_attack.vpcf"
"ProjectileSpeed" "1000"
// Bounds
//----------------------------------------------------------------
"RingRadius" "40"
"HealthBarOffset" "170"
// Bounty
//----------------------------------------------------------------
"BountyXP" "400"
"BountyGoldMin" "0"
"BountyGoldMax" "0"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "100"
// Status
//----------------------------------------------------------------
"StatusHealth" "200000"
"StatusHealthRegen" "0"
"StatusMana" "10000"
"StatusManaRegen" "0.0"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "900"
"VisionNighttimeRange" "900"
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_NEUTRALS"
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
"Creature"
{
}
}
"npc_wave_boss_zombie_king"
{
"Model" "models/items/undying/flesh_golem/direstones_corruption_flesh_golem/direstones_corruption_flesh_golem.vmdl"
"BaseClass" "npc_dota_creature"
"SoundSet" "n_creep_Melee"
"GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts"
"ModelScale" "1.4"
"BoundsHullName" "DOTA_HULL_SIZE_REGULAR"
"UseNeutralCreepBehavior" "0"
"Ability1" "zombie_rage"
"Ability2" "undying_tombstone"
"Ability3" "undying_tombstone_zombie_aura"
"Ability4" "bone_armor"
"Ability5" "skeleton_king_mortal_strike"
"Ability6" "ability_unit_less_laggy"
"Ability7" "zombie_armor_decress"
// Armor
//----------------------------------------------------------------
"ArmorPhysical" "-12"
"MagicalResistance" "25"
// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK"
"AttackDamageType" "DAMAGE_TYPE_ArmorPhysical"
"AttackDamageMin" "140"
"AttackDamageMax" "210"
"AttackRate" "1.7"
"AttackAnimationPoint" "0.4"
"AttackAcquisitionRange" "1100"
"AttackRange" "130"
"BaseAttackSpeed" "140"
// Bounds
//----------------------------------------------------------------
"RingRadius" "40"
"HealthBarOffset" "170"
// Bounty
//----------------------------------------------------------------
"BountyXP" "400"
"BountyGoldMin" "0"
"BountyGoldMax" "0"
// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND"
"MovementSpeed" "550"
// Status
//----------------------------------------------------------------
"StatusHealth" "9000"
"StatusHealthRegen" "5"
"StatusMana" "400"
"StatusManaRegen" "0.0"
// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "900"
"VisionNighttimeRange" "900"
// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_NEUTRALS"
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
"Creature"
{
"OffensiveAbilities"
{
"Ability1"
{
"Name" "zombie_rage"
}
"Ability2"
{
"Name" "undying_tombstone"
}
}
}
}
}
File diff suppressed because it is too large Load Diff
+771
View File
@@ -0,0 +1,771 @@
// Патчноуты для сайта /patch-notes (game/scripts/patch_notes.kv).
// В блоке «Герои»: [hero:…] портрет героя; [abil:id_способности] иконка+имя из addon (dota_tooltip_ability_<id>).
// В блоке «Предметы»: [item:item_<id>] иконка+имя из addon (dota_tooltip_ability_item_<id>).
// В любом тексте патча: [card:N] — иконка карты из Panorama `content/panorama/images/custom_game/cards/card_<N>.png` (сайт: /api/game-cardicon?id=N).
// [hero:…]: для ванильных — суффикс имени как в npc_dota_hero_* (axe, drow_ranger). Для кастомных — полное имя юнита
// (npc_dota_hero_bloodhunter, npc_dota_hero_elder_dragon_smaug, …), чтобы портрет совпадал с файлами Panorama:
// content/panorama/images/heroes/<npc_dota_hero_…>.png. Сервер лобби отдаёт их по HTTP (тот же репозиторий):
// GET {ORIGIN_СЕРВЕРА}/zi-icons/heroes/npc_dota_hero_bloodhunter.png
// (см. server/index.js — express.static на content/panorama/images/heroes). Во фронте патчноутов подставляйте этот URL
// для кастомных npc_dota_hero_*; Steam CDN для них пустой.
// Рендереру сайта: если тег уже начинается с npc_dota_hero_, не добавлять префикс повторно.
// После [abil:…] текст режется на строки: явный перенос \n; «; » между крупными пунктами; запятая+пробел, если дальше есть «→» (отдельная правка на строку).
"ZI3PatchNotes"
{
"ru"
{
"1"
{
"date" "2026-05-14"
"version" "0.12.0"
"title" "0.12.0"
"general"
{
"1" "Теперь способности крипов также усиляются на множитель сложности."
"2" "Удача: итоговый шанс не может превышать шанс способности более чем в два раза. Точные числа — в подсказках в игре."
}
"heroes"
{
"1" "[hero:axe][abil:axe_battle_hunger_custom]Урон/сек по цели 25/50/75/100 → 16/32/56/72, талант к урон/с +8 → +28. [abil:axe_counter_helix_custom]Урон 110/140/170/200 → 55/90/125/160, талант +200 → +160, шанс 20/25/30/35% → 14/18/22/26%."
"2" "[hero:npc_dota_hero_bloodhunter][abil:ability_bloodrage]Бонусный урон за стак 40/60/80/100 → 20/40/60/80."
"3" "[hero:bristleback][abil:bristleback_quill_spray_custom]Базовый урон ёжиков 25/50/75/100 → 12/16/20/24, талант +150 → +16; урон со стака 30/35/40/45 → 30/35/40, талант +40. [abil:bristleback_bristleback_custom]Со спины 16/24/32/40% → 14/18/22/26%. [abil:bristleback_warpath]Урон за стак 20/27/34 → 20/30/40, талант +26 → +25."
"4" "[hero:drow_ranger][abil:ability_drow_ranger_frost_arrows_custom]Урон в % от метки 25/45/65/85 → 12/24/36/48, талант +30% → +12%. [abil:ability_drow_ranger_gust_custom]Урон 280/320/460/540 → 180/240/300/360. [abil:ability_drow_ranger_multishot_custom]% урона от стрел 90/120/140/160 → 45/75/105/135, талант +160% → +45%. [abil:ability_drow_ranger_marksmanship_custom]% ловкости 55/85/115 → 25/45/65, бонусный урон 320/480/640 → 120/200/280, радиус отключения выстрела у союзников 400 → 250. [abil:drow_ranger_trueshot]Базовый бонус ловкости 15/20/25/30 → 8/12/16/20."
"5" "[hero:juggernaut][abil:ability_juggernaut_omnislash_custom]Длительность 3/3.5/4 с → 1.5/2/2.5 с."
"6" "[hero:legion_commander][abil:ability_legion_commander_duel_custom]Заряды в AbilityCharges внутри AbilityValues (1 +2 от Aghanim's Scepter), восстановление заряда 75/70/65. [abil:ability_legion_commander_overwhelming_odds_custom]Aghanim's Shard: авто-каст во время дуэли каждые 2 с (shard_overwhelming_interval)."
"7" "[hero:phantom_assassin][abil:ability_phantom_assassin_coup_de_grace_custom]Шанс крита 15/25/35/45% → 15/20/30%, множитель крита 250/500/750% → 250/400/550%. [abil:ability_phantom_assassin_phantom_bash_custom]Оглушение 0.75 → 0.15 с, шаг перезарядки между проками за уровень 0.25 → 0.10 с."
"8" "[hero:silencer][abil:glaives_of_wisdom]Урон в % от интеллекта 20/32/44/68 → 12/16/20/24, талант +32% → +16%."
"9" "[hero:skywrath_mage][abil:skywrath_mage_arcane_bolt_custom]Время восстановления заряда 5.0/4.0/3.0/2.0 → 2.0/1.5/1.0/0.5 с."
"10" "[hero:npc_dota_hero_elder_dragon_smaug][abil:ability_fire_punishment]Снижение сопр. магии цели −1/−2/−3/−4% → −5/7/9/11%, талант −2% → −4%; больше не накладывает новый модификатор, а продлевает текущий."
}
"cards"
{
"1" "[card:5]Карта 5 «Карточное безумие»: бонус к атрибутам считается только по картам, взятым до неё; % за карту по уровням: 0.5/1/1.5 → 5/7/9."
}
}
"2"
{
"date" "2026-05-15"
"version" "0.13.0"
"title" "0.13.0"
"general"
{
"1" "Свиньи в зоне: с 5 до 3."
"2" "Интервал респавна свиней: с 12 до 7 секунд."
"3" "Овцы в зоне: с 5 до 3."
"4" "Интервал респавна овец: с 14 до 7 секунд."
"5" "Курицы в зоне: с 12 до 8."
"6" "Волки (энты в зоне): с 3 до 2; интервал зоны волков: с 10 до 9 секунд."
"7" "Скелеты (обе зоны): интервал респавна с 3 до 5 секунд."
"8" "Рыбы/бомбы: бомбы в зоне с 8 до 6."
"9" "Лягушки: маг/головастик с 4 до 3, лягушонок/мини с 4 до 2; интервал зоны с 8 до 6 секунд."
"10" "Змеи и пауки: каждый тип в зоне с 4 до 3."
"11" "«Смертельный приговор»: усложнения с контракта на врага при спавне больше не вешаются всегда — шанс 25% на каждую строку усложнения отдельно. Может выпасть сразу несколько разных эффектов (взрыв, токсин, вирус, фазинг и др.)."
"12" "Токсин (лужа при смерти): доля урона от макс. HP крипа снижена со 100% до 15%."
"13" "Взрыв при смерти (zombie_death_explosion): доля урона от макс. HP крипа снижена со 100% до 15%."
"14" "Арсенал: максимум экземпляров в инвентаре снижен с 507 до 207 (игра, API и сетка UI)."
"15" "За победу после матча больше нет доп. осколков за NPC-квесты."
}
}
"3"
{
"date" "2024-05-16"
"version" "0.14.0"
"title" "0.14.0"
"general"
{
"1" "За победу после матча больше нет доп. осколков за NPC-квесты."
"2" "«Смертельный приговор»: у контрактов прочность с 1 до 5; на нуле ломается."
"3" "Новый Battle Pass."
"4" "Арсенал: подсказки и выдача."
"5" "Чат-колесо: новые звуки и эффекты."
"6" "Конец матча: у контракта DS верно показывается макс. прочности."
"7" "Скины: починены частицы эффектов (BP, самоцветы и т.п.)."
"8" "За поражение в матче у контракта DS −1 прочности."
"9" "Магазин: обновлён интерфейс."
"10" "Профиль: список покупок — новые сверху."
"11" "Лобби: загрузка и отображение контрактов «Смертельный приговор»."
"12" "Свиньи и овцы в зонах спавна: с 3 до 5 в каждой зоне."
}
"heroes"
{
"1" "[hero:sand_king]Новый герой Sand King."
"2" "[hero:sniper][abil:ability_sniper_critical_focus_custom]КД 20/18/16/14 с → 30/26/22/18 с; длительность баффа 6 с → 2.5/3/3.5/4 с по уровням; талант к длительности +3 с → +1.5 с."
}
}
"4"
{
"date" "2026-05-16"
"version" "0.15.0"
"title" "0.15.0"
"general"
{
"1" "Поражение при выходе из матча засчитывается быстрее: ~90 с игрового времени после отключения, серверная проверка без heartbeat — 3 мин."
"2" "В лобби (gamesetup): при входе закрываются зависшие матчи как поражение; у контракта «Смертельный приговор» −1 прочность."
"3" "Heartbeat матча: повтор через 5 с, если API не принял сигнал."
"4" "Новые и переработанные предметы в магазине (см. раздел «Предметы»)."
}
"items"
{
"1" "Blazing Radiance — рецепт: Fire Cape + Radiance + Ultimate Crown."
"2" "Radiance (кастом) — жжение с поджиганием атакующих."
"3" "Graded Shiva's — рецепт: Crimson Guard + Shiva's Guard + Ultimate Crown."
"4" "Ultimate Crown — три Ultimate Orb."
"5" "Satanic (кастом) — вампиризм с усилением от силы."
"6" "Шляпа волка — квестовый предмет."
}
"heroes"
{
"1" "[hero:bristleback][abil:bristleback_viscous_nasal_goo_custom]Слизь: AOE 200, без КД (10 маны), броня и замедление в % от стаков. [abil:bristleback_quill_spray_custom]Ёжики: КД 0.1 с, 10 маны, автокаст. [abil:bristleback_warpath]Warpath — врождёнка: урон за стак растёт с уровнем героя."
"2" "[hero:lina][abil:ability_lina_flame_cloak_custom]Пламенная мантия: КД 18/16/14/12 → 18/15/12/9 с; усиление заклинаний и сопр. магии 5 → 5/10/15/20% по уровням."
"3" "[hero:pudge][abil:pudge_dismember]Разорвание: мана 60 → 25; урон от силы 28/34/40% → 50/100/150%."
"4" "[hero:luna][abil:ability_luna_lucent_beam_custom]Луч: КД 9/8/7/6 → 9/7/5/3 с; талант к КД −3 → −2.5 с; урон по мане 50/100/150/200%; Moon Glaives facet 4% → 12/16/20/24%."
"5" "[hero:sven][abil:sven_great_cleave]Рассекающий удар: cleave 30/45/60/75% → 45/60/75/95%; талант +115% → +105%. [abil:sven_gods_strength]Бог силы: талант к бонусу урона +100% → +300%."
}
}
"5"
{
"date" "2026-05-17"
"version" "0.16.0"
"title" "0.16.0"
"general"
{
"1" "Карты: новые 75–83; баланс и правки 38, 71, 73; проклятие — +25% входящего за стак (было 5%)."
"2" "Магазин: в продаже [hero:lina]Lina — 25000 зомби-осколков."
"3" "Арсенал: боевые % (исходящий/входящий, скорость атаки и передвижения, урон атаки) снова считаются напрямую на герое; % атрибутов — через множитель статов. Снижение входящего урона суммируется по правилам линейной формулы."
}
"cards"
{
"1" "Проклятие (все карты с проклятием): входящий урон за стак 5% → 25%. После сборки [card:80]Фростморна проклятие даёт исходящий урон, а не входящий."
"2" "[card:38]«Кристальный рассвет»: множитель кристаллов 1.5/2/2.5 → 1.25/1.5/1.75."
"3" "[card:71]«Тяжесть долга»: +1% макс. HP за стак проклятия; самоурон 2.5/2/1.5% макс. HP/с — теперь снимает HP напрямую (не убивает, мин. 1 HP)."
"4" "[card:73]«Адмиральский ром»: откладывает 30/40/50% урона после брони и маг. сопр.; отложенное — чистый DoT за 3/3.5/4 с (раньше считалось от «сырого» урона до смягчения)."
"5" "[card:75]«Мановой разряд» (новая): каждые 5/4/3 с −15% макс. маны; через 1.2/1/0.8 с взрыв 90/120/150 + 5/7/11% макс. маны чистым уроном (радиус 175, поиск 1000)."
"6" "[card:76]«Резонанс заклинаний» (новая): после каста бьёт 1/2/3 врагов в 250/300/350 на 20/40/60% текущей маны; лечение = урон."
"7" "[card:77]«Мана-щит» (новая): поглощает до 60/70/80% входящего за 1/0.8/0.67 маны за 1 ед. урона."
"8" "[card:78]«Пульс маны» (новая): каст → стак 10/12/14 с, +0.5/1/1.5% к макс. мане (стаки суммируются)."
"9" "[card:79]«Эхо выбора» (новая, золотая): дублирует следующий выбор из окна (404 не дублируется; макс. 2 копии)."
"10" "[card:80]«Фростморн» (новая, врождённая): в колоду осколки 81–83; после сборки +5/7/9% исходящего за стак проклятия, проклятия больше не увеличивают урон по вам."
"11" "[card:81]Осколок «лезвие» (новый): +15% исходящего, +15% усиления заклинаний; 1 проклятие."
"12" "[card:82]Осколок «рукоять» (новый): +20% макс. HP и маны; 1 проклятие."
"13" "[card:83]Осколок «душа» (новый): +20% размера, +10% физ. и маг. вампиризма; 1 проклятие. Линия 80–83 не дублируется картами 57 и 79."
}
"heroes"
{
"1" "[hero:npc_dota_hero_bloodhunter][abil:ability_bloodrage]КД 16 → 40 с; стаки урона/скорости атаки 4/8/12/16 и 8/12/16/20 → 4/6/8/10. [abil:ability_bloodstained_memory]Бонус HP% 6/8/10/12 → 2/3/4/5, талант +6% → +2%. [abil:ability_sacrifice_revenge]Базовое время атаки 1.2/1.1/1 → 1.35/1.3/1.25; чистый урон за стак без 4-го уровня."
"2" "[hero:keeper_of_the_light][abil:keeper_of_the_light_chakra_magic_custom]На союзника: снижение входящего урона 12/16/20/24% на 4/5/6/7 с; урон способностей +50% от текущей маны цели."
"3" "[hero:lina][abil:ability_lina_scorch_affinity_innate]Новая врождёнка: бонус к урону, сопр. магии и усилению заклинаний за каждого горящего врага в радиусе 900. [abil:ability_lina_dragon_slave_custom][abil:ability_lina_light_strike_array_custom][abil:ability_lina_flame_cloak_custom][abil:ability_lina_laguna_blade_custom]Доп. урон от % текущей маны (50%)."
"4" "[hero:nevermore][abil:nevermore_requiem_custom]КД 90 → 20 с; доля душ при касте 25% → 70%."
"5" "[hero:queenofpain][abil:queenofpain_scream_of_pain_custom][abil:queenofpain_shadow_strike_custom][abil:queenofpain_sonic_wave]Урон от % маны: 50 → 50/100/150/200 по уровням способности."
"6" "[hero:silencer][abil:glaives_of_wisdom]Урон от интеллекта 12/16/20/24% → 100/150/200/250%, талант +16% → +150%. [abil:ability_global_silence]Длительность глобальной тишины 15 → 20 с, талант +5 → +6 с."
"7" "[hero:templar_assassin][abil:templar_assassin_refraction_custom]Заряды 4/6/8/10 → 8/12/16/20, талант +2 → +10. [abil:templar_assassin_psi_blades_custom]Дальность +80 → +50, +4 за уровень → +5; пробивание 80% → 40%, талант +20% → +40%."
}
}
"6"
{
"date" "2026-05-19"
"version" "0.17.0"
"title" "0.17.0"
"general"
{
"1" "Редактор колод: переработан интерфейс; импорт/экспорт строки колоды (копировать код, загрузить, применить, новая колода из кода)."
"2" "У некоторых карт также появилась стоимость слотов в колоде: теперь часть карт занимает больше одного слота из лимита 20; число слотов показывается бейджем снизу на карте в декбилдере и магазине."
"3" "Нейтралы — опыт ↑, золото ↓: свинья/рыба 6→7 XP, золото 16–21→1015; овца 6→7, 2025→1419; курица 11→13, 3035→2429; волк 24→29, 4247→3641; энт 25→30, 2838→22–32; скелеты (4 типа) XP 14→17, золота нет."
"4" "Лягушки: мини 40→48 XP, 7590→6984 з; magi 72→86, 8893→8287; головастик 55→66, 72–77→66–71; лягушонок 72→86, 75–80→69–74. Драконы: чёрный/синий/красный 160→192 XP, 100105→9499 з; малый синий 124→149, 127135→121129; малый красный 41→49, 120125→114119."
"5" "Квесты Denny: цепочка перестроена — старт «Убить 20 овец» → «Найти питомца» → «Тренировка» (20 овец, награда 600 з / 100 опыта / 5 крист.) и параллельно у Kunkka «Найти Ром» (раньше доступен сразу, теперь LOCKED до питомца) → «Убить воров». Oldmen: «Молоко» открывает «Сыровар» (оба раньше были AVAILABLE)."
"6" "Battle Pass: исправлено начисление XP при одновременном автозаборе нескольких квестов (раньше засчитывался только один левел-ап)."
"7" "Крипы: взрыв при смерти — доля урона от макс. HP 15% → 35%; костяная броня — штраф изолированному дальнику ×2 → ×1.5."
}
"cards"
{
"1" "[card:43]«Быстрые руки»: вместо плоской скорости атаки — снижение BAT на 0.1/0.15/0.2 (мин. BAT 0.35)."
"2" "3 слота в колоде: [card:38]«Кристальный рассвет», [card:45]«Энергетик», [card:57]«Зеркало судьбы», [card:67]«Сердце титана», [card:80]«Фростморн»."
"3" "2 слота в колоде: [card:1]«Кровавый путь», [card:2]«Лёгкость пера», [card:21]«Солнечный клинок», [card:47]«Хороший старт», [card:58]«Буйный рост», [card:74]«Снайперский прицел», [card:79]«Эхо выбора»."
}
"items"
{
"1" "[item:item_soul_devourer_staff]Восстановление макс. маны за убийство 10% → 25%; рост стаков благословения за интервал 20% → 10%."
"2" "[item:item_blazing_radiance_custom]Доп. бонус ко всем базовым атрибутам 5% → 3%."
"3" "[item:item_ultimate_crown]Доп. бонус ко всем базовым атрибутам 5% → 3%."
"4" "[item:item_crimson_shivas_custom]Доп. бонус ко всем базовым атрибутам 5% → 3%."
}
"heroes"
{
"1" "[hero:sniper][abil:ability_sniper_critical_focus_custom]Длительность 2.5/3/3.5/4 с → 1.5/2/2.5/3 с; шанс крита 100% → 75%; крит 150% (+40) → 125/145/165/185% (+25)."
"2" "[hero:hoodwink][abil:hoodwink_hunters_boomerang]Ульт: КД 45 → 25 с."
"3" "[hero:silencer][abil:razor_eye_of_the_storm_lua]Глаз бури: эффекты старта на клиенте; снятие брони с целей стабильнее."
}
}
"7"
{
"date" "2026-05-21"
"version" "0.18.0"
"title" "0.18.0"
"general"
{
"1" "Лимит колоды увеличен с 20 до 30 слотов."
"2" "Валюта «пыль»: улучшение и разбор карт, арсенала и приговоров «Смертельного приговора»."
"3" "Снижение входящего урона от нескольких источников суммируется корректно — больше не конфликтуют.\nКарты [card:51][card:77][card:70], способности [abil:ability_crystal_maiden_frostbite_custom][abil:hoodwink_scurry_custom][abil:keeper_of_the_light_chakra_magic_custom][abil:ability_lina_scorch_affinity_innate][abil:war_for_life][abil:ability_metamorphosis][abil:ability_yuki_pohela], ауры [item:item_crimson_shivas_custom][item:item_mjolnir_custom][item:item_demon_slayer]."
"4" "Квесты NPC: командные награды делятся между игроками в матче (до 4); в подсказках показана доля на игрока."
"5" "Зомби не держат цель и не переключаются на героев в неуязвимости или с иммунитетом к атакам."
"6" "[hero:rubick]Telekinesis: нельзя поднимать боссов."
"7" "Магазин: вкладка «Акции» (бандлы за ₽, ежедневные и еженедельные предложения); донат через Robokassa из игры; промокод DUST20K — 20 000 пыли."
"8" "Карты в магазине покупаются и улучшаются за пыль."
}
"cards"
{
"1" "[card:1]«Кровавый путь»: макс. здоровье −25% / −20% / −15% по уровням."
"2" "[card:6]«Счастливая рука»: мин. карт в выборе всегда 4; ур. 2 — +2 бесплатных реролла; ур. 3 — доп. выбор только из легендарных."
"3" "[card:21]«Солнечный клинок»: больше не врождённая."
"4" "[card:22]«Монеты рассвета»: утро 700 золота, −100 за каждую ночь; ур. 2 — +50% при взятии; ур. 3 — +50% перед ночью."
"5" "[card:45]«Энергетик»: 4 слота в колоде (было 3)."
"6" "[card:47]«Хороший старт»: вместо +1 уровня — +100/150/200% к опыту на 3 мин.; можно качать."
"7" "[card:57]«Зеркало судьбы»: больше не врождённое."
"8" "[card:59][card:60][card:61]Дары опыта, золота и кристаллов — только через [card:62]«Карту желания», не в колоду; награды и уровни 59–61 масштабируются."
"9" "[card:62]«Карта желания»: при получении выбор одного из трёх даров."
"10" "[card:67]«Сердце титана»: бонус силы к HP и исходящему урону снижен (0.05/0.1/0.15 HP и +0.1% урона за ед. силы)."
}
"items"
{
"1" "[item:item_crimson_shivas_custom]Снижение входящего урона от ауры — общая формула суммирования."
"2" "[item:item_mjolnir_custom]Снижение входящего урона от ауры — общая формула суммирования."
"3" "[item:item_demon_slayer]Снижение входящего урона от ауры — общая формула суммирования."
}
"heroes"
{
"1" "[hero:bristleback][abil:bristleback_quill_spray_custom]КД 0.1 → 2.5 с."
"2" "[hero:npc_dota_hero_elder_dragon_smaug][abil:ability_fire_punishment]Длительность дебаффа 2.5 → 1.5 с."
}
}
"8"
{
"date" "2026-05-22"
"version" "0.18.1"
"title" "0.18.1"
"general"
{
"1" "Механика «Алчность»: общий бафф для карт — число на иконке = сколько таких карт активно; +1 ко всем атрибутам за каждые 100 нетворса (золото + стоимость предметов в инвентаре)."
"2" "Редактор колод; сетка 30 слотов — 6 рядов по 5"
"3" "Бонусы от атрибутов заданы явно (раньше — как в ванильной Dota 2). За 1 ед.: сила — +4 к урону атаки; ловкость — +0,05 брони, +0,5 к скорости атаки, +2 к урону атаки; интеллект — +4 маны, +3 к урону атаки; ко всем атрибутам — +1,25 к урону атаки за каждую единицу."
}
"cards"
{
"1" "Пул алчности: [card:9][card:20][card:22][card:23][card:24][card:39][card:40][card:51][card:60] — скрытые одноразовые (39, 40, 60) дают +1 стак при получении."
"2" "[card:9]«Проклятие алчного мидаса»: переработка — +1 стак алчности; при смерти теряется всё золото и один случайный предмет из основного инвентаря (раньше: только выкуп без золота и бонус золота за убийства)."
"3" "[card:2]«Лёгкость пера»: ур. 1 — только скорость передвижения; ур. 2 — лимит скорости; ур. 3 — проход сквозь юнитов и снижение BAT. Убраны игнор лимитов скорости передвижения и атаки на всех уровнях."
"4" "[card:43]«Быстрые руки»: ур. 2 — дальнобойным +300 к скорости снарядов; ур. 3 — время анимации атаки −33%."
}
}
"9"
{
"date" "2026-05-22"
"version" "0.18.2"
"title" "0.18.2"
"general"
{
"1" "Волновые зомби больше не дают опыта."
"2" "Ночь 1: Зонбу-Ходун 15→2; Зонбу-падальщик 18→4 (1-я волна) / 18→2 (2–3); Зонбу-токсик — / 18→4 (2–3); в конце 1-й волны 3× Зонбу-Зверь 25→2."
"3" "Ночь 2: Зонбу-токсик 15→4 / 18→4; Зонбу-Зверь 18→4 / 20→4; Скелет 15→3 / 25→3; Скелет-падальщик 18→3 / 20→2; Скелет-лучник 25→3 / 25→2; Скелет-мечник — / 18→3."
"4" "Ночь 3: Гаргулья 18→4; Зонбу-токсик II 18→6 / 20→4; Призрачный стрелок 15→3 / 15→5; Зонбу-Зверь 18→4; Призрак 15 (без изменений, макс. 6 за волну вместо 25)."
"5" "Ночь 4: Упырь 15→7; Зонбу-токсик II 18→7 / 18→6; Скелет-ассасин — / 15→5; Скелет-воин — / 18→4."
"6" "Ночь 5: Упырь 18→5 / 18→6; Призрак 18→6 / 18→7; Гаргулья 22→5 / 22→8; Скелет-ассасин 20→5 / 20→7; Зонбу-токсик II 20→5; Скелет-воин — / 20→5; Призрачный стрелок — / 18→6; Скелет-лучник — / 25→5 / 25→6."
"7" "Ночь 6: Зонбу-токсик II 22→6 / 22→5; Призрак 20→7 / 20→6; Упырь 20→7 / 20→5; Скелет-воин 22→8 / 22→7; Гаргулья 24→8 / 24→6; Скелет-ассасин — / 22→7 / 22→8; Скелет-лучник — / 26→6 / 26→5; Призрачный стрелок — / 20→8."
"8" "Ночь 7 (финал): Зонбу-Ходун 15→6; Зонбу-падальщик 18→7; Зонбу-токсик 18→8 / 18→9; Зонбу-Зверь — / 20→9; Скелет 25→9; Скелет-падальщик — / 20→9; Скелет-мечник — / 18→9; Скелет-лучник — / 25→9; Гаргулья 18→9; Зонбу-токсик II 20→9 / 18→9; Призрак 15→9; Призрачный стрелок 15→9; Упырь 15→9; Скелет-ассасин 15→9; Скелет-воин 18→9."
}
"cards"
{
"1" "[card:84]«Маленькое буйство маны» (новая): разово фиксирует усиление заклинаний = 15/20/25% от макс. маны на момент взятия (×0.1 в формуле); не в колоду — только через [card:33]."
"2" "[card:33]«Буйство маны»: ур. 3 — выбор «Маленького буйства маны» (как лезвия у [card:41])."
"3" "[card:25]«Ядро маны»: ур. 3 — +25% к максимальной мане."
"4" "[card:41]«Резерв лезвий»: теперь можно качать; ур. 2 — сразу выбор «Лезвие маны» или «Лезвие крови»; ур. 3 — ещё по одному лезвию каждого типа в пул (всего 4 карты)."
"5" "[card:30]«Проклятие роста», [card:31]«Проклятие ловкости», [card:54]«Проклятие интеллекта»: бонус атрибута за уровень 1/2/3 → 0.5/1/1.5; штраф к другим атрибутам смягчён."
"6" "[card:60]Дар золота (желание): 500/800/1200 → 250/500/750. [card:61]Дар кристаллов: 25/40/60 → 12/18/24."
"7" "[card:79]«Эхо выбора»: 3 слота в колоде (было 2)."
}
}
"10"
{
"date" "2026-05-24"
"version" "0.19.0"
"title" "0.19.0"
"general"
{
"1" "У всех сняты контракты «Смертельный приговор» и арсенал (включая лоты на торговой площадке). Взамен начислена пыль по правилам разбора. Всего выдано ~18 млн пыли, 990 игрокам."
"2" "Магазин — вкладка «Аркада»: обычный пак (3 карты за 25 000 зомби-осколков) и премиум-пак (3 карты за 80 донат-осколков). Дубликаты → пыль."
"3" "Акции для новичков: бандл «Зайка» 500₽ (7 дней после регистрации) — BP Premium, звук «Зайка», 20 000 пыли, 300 донат-осколков, 250 000 зомби-осколков. Набор 8 обычных + 2 премиум паков — 199₽ (21 день, можно покупать повторно)."
"4" "Месячная подписка 299₽: +30 дней за покупку (срок суммируется). Ежедневно при первом входе: 30 донат-осколков и 5 000 зомби-осколков. Админка подписок на сервере."
"5" "Рейтинг после матча умножается на множитель сложности. Пол рейтинга по пику MMR (шаг 1000, колонка rating_peak) — ниже пола рейтинг не падает."
"6" "Скины Battle Pass: эмблемы Diretide (3 варианта). Карта invasion обновлена."
"7" "Квест Кункки «Клад под крестом»: лопата, кресты на карте, копание за золото; награда — Позорная труба (+450 дальности, иммунитет к костяной броне крипов)."
"8" "Крипы: токсин и взрыв при смерти считают урон от атаки крипа (не от макс. HP); «полная жестокость» без лишнего скейла сложности. Костяная броня: штраф изолированному дальнику ×1.5 (было ×5); отражение только если рядом герой; волновой дебафф −0.5 брони/маг. сопр. за стак (было −3)."
"9" "Босс Nevermore: ниже 50% HP — −80% входящего, пока не скастует реквием 3 раза. [hero:axe] Berserker's Call не таунтит босса."
"10" "Выбор карт: веса пула и даунгрейд редкости переработаны (копии «тратятся» между слотами). Арсенал: в сводке — эффективный % снижения входящего (макс. ~92%), подпись «сумма по предметам» для линейной суммы."
"11" "Добавлены новые герои: [hero:mirana], [hero:vengefulspirit], [hero:spectre] (донат), [hero:ogre_magi] (бесплатно)."
}
"items"
{
"1" "[item:item_shovel]Волшебная лопата (квест): канал 1 с, до 5 копаний на крестах, 145–325 золота, +675 HP."
"2" "[item:item_shameful_pipe]Позорная труба (награда квеста): +450 дальности атаки дальникам; иммунитет к штрафу и отражению костяной брони."
}
"cards"
{
"1" "[card:6]«Счастливая рука»: ур. 3 — доп. выбор из легендарных и мифических карт пула (раньше только легендарные)."
"2" "[card:43]«Быстрые руки»: BAT через SetBaseAttackTime, копии стакаются; синергия с [card:2] на ур. 3."
"3" "[card:2]«Лёгкость пера»: снижение BAT на ур. 3 через общую формулу BAT (если нет [card:43])."
}
"heroes"
{
"1" "[hero:mirana]Новый герой в магазине (донат). Лунная охотница: урон заклинаний растёт от максимальной маны и с уровнем героя. [abil:ability_mirana_starstorm_custom]Звёздный дождь — урон по области, второй удар с задержкой. [abil:ability_mirana_sacred_arrow_custom]Священная стрела — чем дальше полетела, тем дольше оглушение; шард вызывает звёздный дождь в точке попадания. [abil:ability_mirana_leap_custom]Прыжок за долю маны, при приземлении бьёт врагов вокруг (урон от маны). [abil:ability_mirana_moonlight_shadow_custom]Ульта — невидимость и усиление урона союзникам на всей карте; сценарий делит с союзниками получаемый урон. Рядом с [hero:luna] в радиусе 1200 обе получают −25% входящего урона."
"2" "[hero:vengefulspirit]Новый герой в магазине (донат). Поддержка и инициация: усиливает союзников, ломает врагов. [abil:ability_vengefulspirit_command_aura_custom]Аура — бонус к урону атаки и вампиризму (физ. и маг.). [abil:vengefulspirit_magic_missile_custom]Magic Missile — урон, оглушение, сжигание маны; после попадания отскакивает к ближайшему врагу. [abil:vengefulspirit_wave_of_terror_custom]Волна ужаса — урон, снятие брони (плоско и в % от базовой), ослабление урона атак, обзор на пути. [abil:vengefulspirit_nether_swap_custom]Обмен позициями с героем или крипом; у цели не опускается ниже порога HP. Шард [abil:vengefulspirit_revenge] — краткий режим с усиленным критом. Врождёнка: метка на врагов, лечение и восстановление маны при убийствах."
"3" "[hero:spectre]Новый герой в магазине (донат). Керри-тень для длительных боёв и глобального давления. [abil:ability_spectre_spectral_dagger_custom]Спектральный кинжал — след на земле, замедление, мобильность по тропе. [abil:ability_spectre_spectral_echo_custom]Эхо — шанс призвать тень, копирующую атаки. [abil:ability_spectre_dispersion_custom]Dispersion — отражает часть входящего урона; шард включает усиленный режим за ману. [abil:ability_spectre_desolate_custom]Врождёнка Desolate — чистый урон по целям без союзников рядом (% от их макс. HP). [abil:ability_spectre_haunt_custom]Haunt — иллюзии на всех вражеских героев; [abil:ability_spectre_reality_custom]Reality телепортирует к выбранной иллюзии и наносит удар."
"4" "[hero:ogre_magi]Новый герой — доступен всем в пике. Толстый саппорт с мультикастом: одно заклинание может сработать несколько раз подряд. [abil:ability_ogre_magi_fireblast_custom]Fireblast — стан и урон по области, плюс доля от макс. HP цели. [abil:ability_ogre_magi_ignite_custom]Ignite — поджог с расползанием, замедление и уроном от макс. HP в секунду. [abil:ability_ogre_magi_bloodlust_custom]Bloodlust — ускорение атаки и передвижения союзнику (и себе). [abil:ability_ogre_magi_multicast_custom]Ульта Multicast — шансы на двойное, тройное и четверное применение способностей. Сценарий — [abil:ability_ogre_magi_unrefined_fireblast_custom]мощный Fireblast за долю маны."
"5" "[hero:pudge][abil:ability_pudge_meat_hook_custom]+50/100/150/200% урона от макс. HP цели. [abil:ability_pudge_rot_custom]+0.6/0.9/1.2/1.5% макс. HP/с к DoT. [abil:ability_pudge_dismember_custom]+0.8/1.2/1.6% макс. HP/с к урону от силы."
"6" "[hero:sniper][abil:ability_sniper_shrapnel_custom]урон зоны — 25% от урона атаки каждую 1 с (10 с), вместо фикс. 12–30 маг. урона; +25% входящего по врагам в зоне."
"7" "[hero:rubick][abil:ability_rubick_telekinesis_custom]×2 дистанция сдвига цели до разрыва канала."
"8" "[hero:luna][abil:ability_luna_lunar_blessing_custom]1 ур. врождёнки; +2.5 урона за уровень героя; шард +0.45% усиления заклинаний/ур.; синергия с Mirana."
"9" "[hero:legion_commander][abil:ability_legion_commander_duel_custom]случайный стат за убийство +1 (+4 со сценарием); кап стаков урона 40 000 (было 400)."
"10" "[hero:nagash]Aghanim's Shard: 3 с неуязвимости."
"11" "[hero:yuki_onna][abil:ability_yuki_challenge]бонус атрибута за испытание до +12 (было +16); бафф фиксирует плоский бонус при прохождении."
"12" "[hero:templar_assassin]исправлено зависание ловушки Refraction Trap после срабатывания."
}
}
"11"
{
"date" "2026-05-26"
"version" "0.19.1"
"title" "0.19.1"
"general"
{
"1" "Алчность: +1 ко всем атрибутам за каждые 250 нетворса (было 100)."
"2" "Арсенал: снижены верхние границы и рост при улучшении для статов «ко всем атрибутам», одиночных атрибутов и их %%."
}
"cards"
{
"1" "[card:85]«Рыбаловство» (новая): при взятии — доп. выбор карт (1/2/3 по уровню) и шлак в пул; [card:86]«Шлак» — пустая карта без эффекта, только из пула."
"2" "[card:51]«Midas Chestplate»: переработка — золото за полученный урон (% от урона), входящий урон +база и +0.1% за каждые 100 полученного урона (вместо поглощения за золото)."
"3" "[card:58]«Буйный рост»: врождённая; 3/4/5 доп. выборов в начале игры по 3/4/5 карт; на рассвете стандартный выбор карт не показывается."
"4" "[card:57]«Зеркало судьбы»: 5 слотов в колоде (было 3)."
"5" "[card:74]: 3 слота в колоде (было 2)."
"6" "[card:69]«Проклятая сделка»: сила других карт 75/50/25% → 50/35/20%."
"7" "[card:68]«Три долга»: с [card:69] в колоде бонусный выбор — любые 3 карты из пула, не только проклятые; шлак не попадает в варианты."
"8" "[card:23]«Золотой дождь»: доход %/мин 2/2.5/3.5 → 2/3.5/5; тик раз в 60 с на всех уровнях."
"9" "[card:36]«Кристальный рост»: бонус урона за шаг и потолок усилены (макс. бонус 40/55/70% → 80/160/320%)."
}
"items"
{
"1" "[new][item:item_skadi_custom]Eye of Skadi (кастом) — рецепт: Ultimate Crown + Orb of Corrosion; холодная атака, +45 ко всем атрибутам и +5% к базовым атрибутам."
"2" "[new][item:item_shovel]Волшебная лопата — квестовая: копать на крестах (до 5 раз), золото и +675 HP."
"3" "[new][item:item_shameful_pipe]Позорная труба — награда квеста: +450 дальности дальникам, иммунитет к костяной броне."
"4" "[item:item_desolator_custom] / [item:item_desolator_2_custom]: макс. бонус урона 30→90 и 45→125."
}
"heroes"
{
"1" "[hero:rubick][abil:ability_rubick_telekinesis_custom]Нельзя поднимать npc_homer и боссов; союзникам без Scepter — конечное время в воздухе (раньше у союзников кроме Гомера было бесконечно)."
"2" "[hero:vengefulspirit][abil:vengefulspirit_nether_swap_custom]С союзником не копируются баффы телекинеза Рубика; Гомера нельзя лечить свапом до полного HP."
"3" "[hero:npc_dota_hero_nagash]Потеря душ при смерти: Aghanim's Shard снижает lost_souls_pct на 30."
}
}
"12"
{
"date" "2026-05-28"
"version" "0.19.2"
"title" "0.19.2"
"general"
{
"1" "Карточная система: крупная переработка ядра выбора/обработки карт для стабильности и производительности."
"2" "Оптимизации и техправки игровых систем: трекинг урона, источники модификаторов, HUD босса, служебные менеджеры и инициализация."
"3" "Локализация и каталоги: обновлены тексты/справочники карт (RU/EN/CN) и манифесты UI-ресурсов."
"4" "Арсенал: процентные статы к атрибутам (% к силе/ловкости/интеллекту и % ко всем атрибутам) применяются только к базовым характеристикам."
}
"cards"
{
"1" "[card:87] «Король шлака»: за каждую карту шлака [card:86], оставшуюся в пуле, даёт +2.5% к базовой силе, ловкости и интеллекту (бонус пересчитывается динамически)."
"2" "[card:88] «Прикормка»: бесплатные рероллы теперь начисляются за каждый полученный шлак (умножаются на количество шлака за событие)."
"3" "[card:23] добавлен анти-абуз дивидендов: выплата срабатывает только если за тик набрано минимум 25% от суммы дивиденда."
"4" "[card:51] ослаблен потолок утреннего золота: 400/600/800 → 250/400/550 (и масштабируется от числа активных копий карты)."
"5" "[card:67] ребаланс: HP от силы 0.05/0.1/0.15 → 0.1; % исходящего за силу 0.1 → 0.05; шанс прока 60/75/90 → 40/45/50; КД прока 3/2.5/2 → 3; урон от макс. HP 100/200/300 → 60/80/100."
"6" "[card:69] порог активации по HP 60% → 30%; цена здоровья унифицирована в 5%; бонус урона за стак проклятия 10/14/18 → 10/20/30."
"7" "[card:47] ослабление XP-бонуса: 100/150/200% → 35/50/65%."
"8" "Карты [card:12], [card:13], [card:14], [card:19], [card:26], [card:35], [card:48], [card:55], [card:56], [card:78], [card:80], а также модификаторы проклятия/алчности переведены на единый source ability при выдаче модификаторов (стабильнее стаки, события и источники урона)."
}
}
}
"en"
{
"1"
{
"date" "2026-05-14"
"version" "0.12.0"
"title" "0.12.0"
"general"
{
"1" "Creep abilities now also scale with the difficulty multiplier."
"2" "Luck: the final proc chance cannot exceed twice the ability's base chance. Exact numbers are in in-game tooltips."
}
"heroes"
{
"1" "[hero:axe][abil:axe_battle_hunger_custom]Damage/sec on target 25/50/75/100 → 16/32/56/72, talent +8 → +28. [abil:axe_counter_helix_custom]Damage 110/140/170/200 → 55/90/125/160, talent +200 → +160, proc chance 20/25/30/35% → 14/18/22/26%."
"2" "[hero:npc_dota_hero_bloodhunter][abil:ability_bloodrage]Bonus damage per stack 40/60/80/100 → 20/40/60/80."
"3" "[hero:bristleback][abil:bristleback_quill_spray_custom]Base quill damage 25/50/75/100 → 12/16/20/24, talent +150 → +16; stack damage 30/35/40/45 → 30/35/40, talent +40. [abil:bristleback_bristleback_custom]Back damage reduction 16/24/32/40% → 14/18/22/26%. [abil:bristleback_warpath]Damage per stack 20/27/34 → 20/30/40, talent +26 → +25."
"4" "[hero:drow_ranger][abil:ability_drow_ranger_frost_arrows_custom]Mark damage % 25/45/65/85 → 12/24/36/48, talent +30% → +12%. [abil:ability_drow_ranger_gust_custom]Damage 280/320/460/540 → 180/240/300/360. [abil:ability_drow_ranger_multishot_custom]Arrow damage % 90/120/140/160 → 45/75/105/135, talent +160% → +45%. [abil:ability_drow_ranger_marksmanship_custom]Agility % 55/85/115 → 25/45/65, bonus damage 320/480/640 → 120/200/280, ally disable radius 400 → 250. [abil:drow_ranger_trueshot]Base agility bonus 15/20/25/30 → 8/12/16/20."
"5" "[hero:juggernaut][abil:ability_juggernaut_omnislash_custom]Duration 3/3.5/4s → 1.5/2/2.5s."
"6" "[hero:legion_commander][abil:ability_legion_commander_duel_custom]Charges in AbilityCharges inside AbilityValues (1 +2 from Aghanim's Scepter), charge restore 75/70/65. [abil:ability_legion_commander_overwhelming_odds_custom]Aghanim's Shard: auto-cast during Duel every 2s (shard_overwhelming_interval)."
"7" "[hero:phantom_assassin][abil:ability_phantom_assassin_coup_de_grace_custom]Crit chance 15/25/35/45% → 15/20/30%, crit mult 250/500/750% → 250/400/550%. [abil:ability_phantom_assassin_phantom_bash_custom]Stun 0.75 → 0.15s, per-level internal CD step 0.25 → 0.10s."
"8" "[hero:silencer][abil:glaives_of_wisdom]INT damage % 20/32/44/68 → 12/16/20/24, talent +32% → +16%."
"9" "[hero:skywrath_mage][abil:skywrath_mage_arcane_bolt_custom]Charge restore time 5.0/4.0/3.0/2.0 → 2.0/1.5/1.0/0.5s."
"10" "[hero:npc_dota_hero_elder_dragon_smaug][abil:ability_fire_punishment]Magic resist reduction on targets 1/2/3/4% → 5/7/9/11%, talent 2% → 4%; no longer applies a new modifier, extends the current one."
}
"cards"
{
"1" "[card:5]Card 5 (Card madness): the stat bonus counts only cards picked before it; % per card per level: 0.5/1/1.5 → 5/7/9."
}
}
"2"
{
"date" "2026-05-15"
"version" "0.13.0"
"title" "0.13.0"
"general"
{
"1" "Pigs per zone: reduced from 5 to 3."
"2" "Pig respawn interval: reduced from 12 to 7 seconds."
"3" "Sheep per zone: reduced from 5 to 3."
"4" "Sheep respawn interval: reduced from 14 to 7 seconds."
"5" "Chickens per zone: reduced from 12 to 8."
"6" "Wolves (ents in zone): reduced from 3 to 2; wolf zone interval: from 10 to 9 seconds."
"7" "Skeleton zones (both): respawn interval increased from 3 to 5 seconds."
"8" "Fish/bomb zone: bombs reduced from 8 to 6."
"9" "Frogs: magi/tadpole from 4 to 3, froglet/mini from 4 to 2; zone interval from 8 to 6 seconds."
"10" "Snakes and spiders: each type per zone reduced from 4 to 3."
"11" "Death Sentence: contract complications on enemy spawn are no longer guaranteed — 25% chance per complication line, rolled independently. Multiple different effects can apply at once (explosion, toxin, virus, phasing, etc.)."
"12" "Toxin (death pool): HP-based damage fraction reduced from 100% max HP to 15%."
"13" "Zombie death explosion: HP-based damage fraction reduced from 100% max HP to 15%."
"14" "Arsenal: max item instances in inventory reduced from 507 to 207 (game, API, and UI grid)."
"15" "No extra win shards from NPC quests after a match."
}
}
"3"
{
"date" "2024-05-16"
"version" "0.14.0"
"title" "0.14.0"
"general"
{
"1" "No extra win shards from NPC quests after a match."
"2" "Death Sentence: contract durability 15; breaks at zero."
"3" "New Battle Pass."
"4" "Arsenal: tooltips and grants."
"5" "Chat wheel: new sounds and effects."
"6" "Match end: DS contract max durability shows correctly."
"7" "Skins: particle effects fixed (BP, gems, etc.)."
"8" "DS contracts: 1 durability on a match loss."
"9" "Store: updated UI."
"10" "Profile: purchases — newest first."
"11" "Lobby: Death Sentence contracts load and display."
"12" "Pigs and sheep per spawn zone: 3 → 5."
}
"heroes"
{
"1" "[hero:sand_king]New hero Sand King."
"2" "[hero:sniper][abil:ability_sniper_critical_focus_custom]Cooldown 20/18/16/14s → 30/26/22/18s; buff duration 6s → 2.5/3/3.5/4s per level; duration talent +3s → +1.5s."
}
}
"4"
{
"date" "2026-05-16"
"version" "0.15.0"
"title" "0.15.0"
"general"
{
"1" "Match loss on disconnect is applied faster: ~90s game time after drop, server timeout without heartbeat — 3 min."
"2" "Lobby (game setup): stale in-progress matches are closed as losses; Death Sentence contracts 1 durability."
"3" "Match heartbeat: retry after 5s if the API did not accept the ping."
"4" "New and reworked shop items (see Items section)."
}
"items"
{
"1" "Blazing Radiance — recipe: Fire Cape + Radiance + Ultimate Crown."
"2" "Radiance (custom) — burn aura with attacker ignite."
"3" "Graded Shiva's — recipe: Crimson Guard + Shiva's Guard + Ultimate Crown."
"4" "Ultimate Crown — three Ultimate Orbs."
"5" "Satanic (custom) — lifesteal scaling with Strength."
"6" "Wolf Hat — quest item."
}
"heroes"
{
"1" "[hero:bristleback][abil:bristleback_viscous_nasal_goo_custom]Goo: 200 AoE, no cooldown (10 mana), armor and slow as % per stack. [abil:bristleback_quill_spray_custom]Quill Spray: 0.1s CD, 10 mana, autocast. [abil:bristleback_warpath]Warpath innate: damage per stack scales with hero level."
"2" "[hero:lina][abil:ability_lina_flame_cloak_custom]Flame Cloak: CD 18/16/14/12 → 18/15/12/9s; spell amp and magic resist 5 → 5/10/15/20% per level."
"3" "[hero:pudge][abil:pudge_dismember]Dismember: mana 60 → 25; STR damage 28/34/40% → 50/100/150%."
"4" "[hero:luna][abil:ability_luna_lucent_beam_custom]Lucent Beam: CD 9/8/7/6 → 9/7/5/3s; CD talent 3 → 2.5s; mana damage 50/100/150/200%; Moon Glaives facet 4% → 12/16/20/24%."
"5" "[hero:sven][abil:sven_great_cleave]Great Cleave: 30/45/60/75% → 45/60/75/95%; talent +115% → +105%. [abil:sven_gods_strength]God's Strength: damage talent +100% → +300%."
}
}
"5"
{
"date" "2026-05-17"
"version" "0.16.0"
"title" "0.16.0"
"general"
{
"1" "Cards: new 7583; balance and fixes for 38, 71, 73; curse stacks now +25% incoming damage each (was 5%)."
"2" "Store: [hero:lina]Lina available for 25,000 zombie shards."
"3" "Arsenal: combat % (outgoing/incoming, attack speed, move speed, base damage) apply directly on the hero again; attribute % still use the stats multiplier. Incoming damage reduction stacks with the linear combine formula."
"4" "Mana-based damage: several heroes and Keeper of the Light now use KV values for % of current/max mana (see Heroes)."
}
"cards"
{
"1" "Curse (all curse cards): incoming damage per stack 5% → 25%. After completing [card:80]Frostmourne, curse stacks grant outgoing damage instead of incoming."
"2" "[card:38]Crystal Dawn: crystal multiplier 1.5/2/2.5 → 1.25/1.5/1.75."
"3" "[card:71]Burden of Debt: +1% max HP per curse stack; self-damage 2.5/2/1.5% max HP/s — now drains HP directly (non-lethal, min 1 HP)."
"4" "[card:73]Admiral's Rum: defers 30/40/50% of post-mitigation damage; deferred part is pure DoT over 3/3.5/4s (was calculated from pre-mitigation damage)."
"5" "[card:75]Mana Blast (new): every 5/4/3s spends 15% max mana; after 1.2/1/0.8s deals 90/120/150 + 5/7/11% max mana pure (radius 175, search 1000)."
"6" "[card:76]Spell Resonance (new): after a cast, hits 1/2/3 enemies in 250/300/350 for 20/40/60% current mana; heal = damage."
"7" "[card:77]Mana Shield (new): absorbs up to 60/70/80% incoming for 1/0.8/0.67 mana per damage point."
"8" "[card:78]Mana Pulse (new): cast → stack 10/12/14s, +0.5/1/1.5% max mana (stacks stack)."
"9" "[card:79]Echo of Choice (new, gold): duplicates next draft pick (not 404; max 2 copies)."
"10" "[card:80]Frostmourne (new, innate): shuffles shards 8183; when complete +5/7/9% outgoing per curse stack."
"11" "[card:81]Shard — Blade (new): +15% outgoing, +15% spell amp; 1 curse."
"12" "[card:82]Shard — Hilt (new): +20% max HP and mana; 1 curse."
"13" "[card:83]Shard — Soul (new): +20% size, +10% physical and magical lifesteal; 1 curse. Line 8083 not duplicated by cards 57 or 79."
}
"heroes"
{
"1" "[hero:npc_dota_hero_bloodhunter][abil:ability_bloodrage]CD 16 → 40s; stack damage/attack speed 4/8/12/16 and 8/12/16/20 → 4/6/8/10. [abil:ability_bloodstained_memory]HP% bonus 6/8/10/12 → 2/3/4/5, talent +6% → +2%. [abil:ability_sacrifice_revenge]Base attack time 1.2/1.1/1 → 1.35/1.3/1.25; pure damage per stack no longer has a 4th level."
"2" "[hero:keeper_of_the_light][abil:keeper_of_the_light_chakra_magic_custom]On ally: 12/16/20/24% incoming damage reduction for 4/5/6/7s; ability damage +50% of target's current mana."
"3" "[hero:lina][abil:ability_lina_scorch_affinity_innate]New innate: damage, magic resist, and spell amp per burning enemy in 900 radius. [abil:ability_lina_dragon_slave_custom][abil:ability_lina_light_strike_array_custom][abil:ability_lina_flame_cloak_custom][abil:ability_lina_laguna_blade_custom]Bonus damage from 50% of current mana."
"4" "[hero:nevermore][abil:nevermore_requiem_custom]CD 90 → 20s; souls released on cast 25% → 70%."
"5" "[hero:queenofpain][abil:queenofpain_scream_of_pain_custom][abil:queenofpain_shadow_strike_custom][abil:queenofpain_sonic_wave]Mana damage %: flat 50 → 50/100/150/200 per ability level."
"6" "[hero:silencer][abil:glaives_of_wisdom]INT damage % 12/16/20/24 → 100/150/200/250, talent +16% → +150%. [abil:ability_global_silence]Global Silence duration 15 → 20s, talent +5 → +6s."
"7" "[hero:templar_assassin][abil:templar_assassin_refraction_custom]Instances 4/6/8/10 → 8/12/16/20, talent +2 → +10. [abil:templar_assassin_psi_blades_custom]Range bonus +80 → +50, +4 per level → +5; spill 80% → 40%, talent +20% → +40%."
}
}
"6"
{
"date" "2026-05-19"
"version" "0.17.0"
"title" "0.17.0"
"general"
{
"1" "Deck builder: UI overhaul; deck string import/export (copy code, load, apply, new deck from code)."
"2" "Some cards now have a deck slot cost: one copy can take more than one slot from the 20-slot limit; the count is shown on a badge at the bottom of the card in the deck builder and store."
"3" "Neutrals — more XP, less gold: pig/fish 6→7 XP, gold 1621→1015; sheep 6→7, 2025→1419; chicken 11→13, 3035→2429; wolf 24→29, 4247→3641; ent 25→30, 2838→2232; skeletons (4 types) XP 14→17, no gold."
"4" "Frogs: mini 40→48 XP, 7590→6984 g; magi 72→86, 8893→8287; tadpole 55→66, 7277→6671; froglet 72→86, 7580→6974. Dragons: black/blue/red 160→192 XP, 100105→9499 g; small blue 124→149, 127135→121129; small red 41→49, 120125→114119."
"5" "Denny quests rebuilt: start Kill 20 sheep → Find a pet → Training (20 sheep, 600 g / 100 XP / 5 crystals) and in parallel Kunkka Find Rom (was AVAILABLE at start, now LOCKED until pet) → Kill thieves. Oldmen: Milk unlocks Cheesemaker (both used to be AVAILABLE)."
"6" "Battle Pass: fixed XP grant when multiple quests are claimed at once (only one level-up was applied before)."
"7" "Creeps: death explosion HP fraction 15% → 35%; bone armor isolated ranged penalty ×2 → ×1.5."
}
"cards"
{
"1" "[card:43]Quick Hands: flat attack speed → BAT reduction by 0.1/0.15/0.2 (min BAT 0.35)."
"2" "3 deck slots: [card:38]«Crystal Dawn», [card:45]«Energy Drink», [card:57]«Mirror of Fate», [card:67]«Titan's Heart», [card:80]«Frostmourne»."
"3" "2 deck slots: [card:1]«Bloodway», [card:2]«Light pen», [card:21]«Solar Blade», [card:47]«Good Start», [card:58]«Rampant Growth», [card:74]«Sniper Scope», [card:79]«Echo Pick»."
}
"items"
{
"1" "[item:item_soul_devourer_staff]Max mana restored on kill 10% → 25%; blessing stack growth per interval 20% → 10%."
"2" "[item:item_blazing_radiance_custom]Additional all base attributes bonus 5% → 3%."
"3" "[item:item_ultimate_crown]Additional all base attributes bonus 5% → 3%."
"4" "[item:item_crimson_shivas_custom]Additional all base attributes bonus 5% → 3%."
}
"heroes"
{
"1" "[hero:sniper][abil:ability_sniper_critical_focus_custom]Duration 2.5/3/3.5/4s → 1.5/2/2.5/3s; crit chance 100% → 75%; crit 150% (+40) → 125/145/165/185% (+25)."
"2" "[hero:hoodwink][abil:hoodwink_hunters_boomerang]Ultimate CD 45 → 25s."
"3" "[hero:silencer][abil:razor_eye_of_the_storm_lua]Eye of the Storm: start FX on client; armor reduction on targets more reliable."
}
}
"7"
{
"date" "2026-05-21"
"version" "0.18.0"
"title" "0.18.0"
"general"
{
"1" "Deck slot limit increased from 20 to 30."
"2" "Dust currency: card upgrades and disassembly, arsenal upgrades/disassembly, and Death Sentence contract dismantling."
"3" "Incoming damage reduction from multiple sources stacks correctly — no longer conflicts.\nCards [card:51][card:77][card:70], abilities [abil:ability_crystal_maiden_frostbite_custom][abil:hoodwink_scurry_custom][abil:keeper_of_the_light_chakra_magic_custom][abil:ability_lina_scorch_affinity_innate][abil:war_for_life][abil:ability_metamorphosis][abil:ability_yuki_pohela], auras [item:item_crimson_shivas_custom][item:item_mjolnir_custom][item:item_demon_slayer]."
"4" "NPC quests: team rewards are split among players in the match (up to 4); tooltips show each player's share."
"5" "Zombies no longer keep or switch to heroes that are invulnerable or attack-immune."
"6" "[hero:rubick]Telekinesis: cannot lift bosses."
"7" "Store: Promotions tab (rub bundles, daily and weekly deals); Robokassa donation from in-game; promo code DUST20K — 20,000 dust."
"8" "Store cards are purchased and upgraded with dust."
}
"cards"
{
"1" "[card:1]Bloodway: max HP 25% / 20% / 15% per level."
"2" "[card:6]Lucky Hand: minimum draft size always 4; level 2 — +2 free rerolls; level 3 — bonus pick is legendary-only."
"3" "[card:21]Solar Blade: no longer innate."
"4" "[card:22]Dawn Coins: 700 gold at dawn, 100 per survived night; level 2 — +50% on pickup; level 3 — +50% before night."
"5" "[card:45]Energy Drink: 4 deck slots (was 3)."
"6" "[card:47]Good Start: instead of +1 level — +100/150/200% XP for 3 min.; upgradeable."
"7" "[card:57]Mirror of Fate: no longer innate."
"8" "[card:59][card:60][card:61]XP, gold, and crystal gifts — only via [card:62]Wish Card, not deckable; rewards and levels 5961 scale."
"9" "[card:62]Wish Card: on pickup, choose one of three gifts."
"10" "[card:67]Titan's Heart: Strength bonuses to HP and outgoing damage reduced (0.05/0.1/0.15 HP and +0.1% damage per STR)."
}
"items"
{
"1" "[item:item_crimson_shivas_custom]Aura incoming damage reduction uses the shared stacking formula."
"2" "[item:item_mjolnir_custom]Aura incoming damage reduction uses the shared stacking formula."
"3" "[item:item_demon_slayer]Aura incoming damage reduction uses the shared stacking formula."
}
"heroes"
{
"1" "[hero:bristleback][abil:bristleback_quill_spray_custom]Cooldown 0.1 → 2.5s."
"2" "[hero:npc_dota_hero_elder_dragon_smaug][abil:ability_fire_punishment]Debuff duration 2.5 → 1.5s."
}
}
"8"
{
"date" "2026-05-22"
"version" "0.18.1"
"title" "0.18.1"
"general"
{
"1" "Greed mechanic: shared buff for gold cards — icon stack count = active gold cards; +1 to all attributes per 100 net worth (gold + item costs in inventory)."
"2" "Deck builder: fixed Panorama script caching (deck_builder.js no longer included twice); 30-slot grid — 6 rows of 5, fixed cell width; window open/close fixed."
"3" "Attribute bonuses are set explicitly (was vanilla Dota 2 defaults). Per point: Strength — +4 attack damage; Agility — +0.05 armor, +0.5 attack speed, +2 attack damage; Intelligence — +4 mana, +3 attack damage; All Stats — +1.25 attack damage per point."
}
"cards"
{
"1" "Greed pool: [card:9][card:20][card:22][card:23][card:24][card:39][card:40][card:51][card:60] — one-time hidden cards (39, 40, 60) grant +1 stack on pickup."
"2" "[card:9]Curse of Greedy Midas: rework — +1 Greed stack; on death lose all gold and one random main-inventory item (was: buyback-only respawn with no gold cost and bonus kill gold)."
"3" "[card:2]Light pen: level 1 — move speed only; level 2 — move speed limit; level 3 — unit phasing and BAT reduction. Removed move speed and attack speed limit ignore at all levels."
"4" "[card:43]Quick Hands: level 2 — ranged heroes +300 projectile speed; level 3 — attack animation time 33%."
}
}
"9"
{
"date" "2026-05-22"
"version" "0.18.2"
"title" "0.18.2"
"general"
{
"1" "Wave zombies no longer grant XP."
"2" "Night 1: Shambler 15→2; Scavenger 18→4 (wave 1) / 18→2 (waves 23); Toxin — / 18→4 (waves 23); end of wave 1: 3× Beast 25→2."
"3" "Night 2: Toxin 15→4 / 18→4; Beast 18→4 / 20→4; Skeleton 15→3 / 25→3; Skeleton scavenger 18→3 / 20→2; Skeleton archer 25→3 / 25→2; Skeleton swordsman — / 18→3."
"4" "Night 3: Gargoyle 18→4; Toxin II 18→6 / 20→4; Ghost shooter 15→3 / 15→5; Beast 18→4; Ghost 15 (unchanged, max 6 per wave instead of 25)."
"5" "Night 4: Ghoul 15→7; Toxin II 18→7 / 18→6; Skeleton assassin — / 15→5; Skeleton warrior — / 18→4."
"6" "Night 5: Ghoul 18→5 / 18→6; Ghost 18→6 / 18→7; Gargoyle 22→5 / 22→8; Skeleton assassin 20→5 / 20→7; Toxin II 20→5; Skeleton warrior — / 20→5; Ghost shooter — / 18→6; Skeleton archer — / 25→5 / 25→6."
"7" "Night 6: Toxin II 22→6 / 22→5; Ghost 20→7 / 20→6; Ghoul 20→7 / 20→5; Skeleton warrior 22→8 / 22→7; Gargoyle 24→8 / 24→6; Skeleton assassin — / 22→7 / 22→8; Skeleton archer — / 26→6 / 26→5; Ghost shooter — / 20→8."
"8" "Night 7 (finale): Shambler 15→6; Scavenger 18→7; Toxin 18→8 / 18→9; Beast — / 20→9; Skeleton 25→9; Skeleton scavenger — / 20→9; Skeleton swordsman — / 18→9; Skeleton archer — / 25→9; Gargoyle 18→9; Toxin II 20→9 / 18→9; Ghost 15→9; Ghost shooter 15→9; Ghoul 15→9; Skeleton assassin 15→9; Skeleton warrior 18→9."
}
"cards"
{
"1" "[card:84]Small Mana Surge (new): one-time fixed spell amp = 15/20/25% of max mana at pickup (×0.1 in formula); not deckable — only via [card:33]."
"2" "[card:33]Mana Surge: level 3 — pick Small Mana Surge (like blades from [card:41])."
"3" "[card:25]Mana Core: level 3 — +25% max mana."
"4" "[card:41]Blade Reserve: now upgradeable; level 2 — instant Mana Blade or Blood Blade pick; level 3 — +1 of each blade in pool (4 cards total)."
"5" "[card:30]Curse of Growth, [card:31]Curse of Agility, [card:54]Curse of Intellect: attribute per level 1/2/3 → 0.5/1/1.5; penalties to other stats softened."
"6" "[card:60]Gold gift (wish): 500/800/1200 → 250/500/750. [card:61]Crystal gift: 25/40/60 → 12/18/24."
"7" "[card:79]Echo of Choice: 3 deck slots (was 2)."
}
}
"10"
{
"date" "2026-05-24"
"version" "0.19.0"
"title" "0.19.0"
"general"
{
"1" "All players: Death Sentence contracts and arsenal inventory removed (including active marketplace listings). Dust compensation granted using disassemble values. Total ~18M dust to 990 players."
"2" "Store — Arcade tab: standard pack (3 cards for 25,000 zombie shards) and premium pack (3 cards for 80 donate shards). Duplicates → dust."
"3" "Newbie promos: Starter «Zaika» bundle 500₽ (7 days after signup) — BP Premium, Zaika chat wheel sound, 20,000 dust, 300 donate shards, 250,000 zombie shards. Card pack bundle 8 standard + 2 premium — 199₽ (21 days, repeatable)."
"4" "Monthly subscription 299₽: +30 days per purchase (stacks). Daily on first login: 30 donate shards and 5,000 zombie shards."
"5" "Post-match rating change multiplied by difficulty multiplier. Rating floor from peak MMR (1000 step) — rating cannot drop below floor."
"6" "BP skins: Diretide emblem effects (3 variants). invasion map updated."
"7" "Kunkka quest «Treasure under the cross»: shovel, crosses on the map, dig for gold; reward — Shameful Pipe (+450 attack range, immune to creep bone armor)."
"8" "Creeps: toxin and death explosion use creep attack damage (not max HP); Full Brutality no extra difficulty scale. Bone armor: isolated ranged penalty ×1.5 (was ×5); reflect only if a hero is nearby; wave armor/magic debuff 0.5 per stack (was 3)."
"9" "Nevermore boss: below 50% HP — 80% incoming until Requiem cast 3 times. [hero:axe] Berserker's Call does not taunt the boss."
"10" "Card draft: pool weights and rarity downgrades reworked (copies consumed across slots). Arsenal summary: effective incoming reduction % (cap ~92%), «sum from items» label for linear sum."
"11" "New heroes: [hero:mirana], [hero:vengefulspirit], [hero:spectre] (donate), [hero:ogre_magi] (free)."
}
"items"
{
"1" "[item:item_shovel]Magic Shovel (quest): 1s channel, up to 5 digs on crosses, 145325 gold, +675 HP."
"2" "[item:item_shameful_pipe]Shameful Pipe (quest reward): +450 attack range for ranged; immune to bone armor penalty and reflect."
}
"cards"
{
"1" "[card:6]Lucky Hand: level 3 — bonus pick from legendary and mythic pool cards (was legendary only)."
"2" "[card:43]Quick Hands: BAT via SetBaseAttackTime, copies stack; synergy with [card:2] at level 3."
"3" "[card:2]Light pen: level 3 BAT reduction via shared BAT formula (when [card:43] absent)."
}
"heroes"
{
"1" "[hero:mirana]New store hero (donate). Moon huntress: spell damage scales with max mana and hero level. [abil:ability_mirana_starstorm_custom]Starstorm — AoE damage, delayed second strike. [abil:ability_mirana_sacred_arrow_custom]Sacred Arrow — longer flight means longer stun; Shard triggers Starstorm on impact. [abil:ability_mirana_leap_custom]Leap costs a mana share and deals landing damage around you (mana-based). [abil:ability_mirana_moonlight_shadow_custom]Ultimate — global invisibility and damage amp for allies; Scepter shares damage taken. Within 1200 of [hero:luna], both Moon Sisters take 25% incoming damage."
"2" "[hero:vengefulspirit]New store hero (donate). Support and initiation: buffs allies, breaks enemies. [abil:ability_vengefulspirit_command_aura_custom]Command Aura — bonus attack damage and lifesteal (physical and spell). [abil:vengefulspirit_magic_missile_custom]Magic Missile — damage, stun, mana burn; bounces to a nearby enemy after hit. [abil:vengefulspirit_wave_of_terror_custom]Wave of Terror — damage, armor reduction (flat and % of base), reduced attack damage, vision along the path. [abil:vengefulspirit_nether_swap_custom]Nether Swap — swap positions with a unit; target HP cannot drop below a threshold. Shard [abil:vengefulspirit_revenge] — short empowered crit window. Innate: marks enemies; heals and restores mana on kills."
"3" "[hero:spectre]New store hero (donate). Spectral carry for long fights and map-wide pressure. [abil:ability_spectre_spectral_dagger_custom]Spectral Dagger — ground path, slow, mobility along the trail. [abil:ability_spectre_spectral_echo_custom]Spectral Echo — chance to spawn attack-copying shadows. [abil:ability_spectre_dispersion_custom]Dispersion — reflects incoming damage; Shard adds a boosted active for mana. [abil:ability_spectre_desolate_custom]Innate Desolate — pure damage vs targets with no allies nearby (% of their max HP). [abil:ability_spectre_haunt_custom]Haunt — illusions on every enemy hero; [abil:ability_spectre_reality_custom]Reality teleports to one illusion and strikes."
"4" "[hero:ogre_magi]New hero — free in the hero pool. Beefy support with Multicast: one cast can fire multiple times. [abil:ability_ogre_magi_fireblast_custom]Fireblast — AoE stun and damage plus a slice of target max HP. [abil:ability_ogre_magi_ignite_custom]Ignite — spreading burn, slow, and max-HP damage over time. [abil:ability_ogre_magi_bloodlust_custom]Bloodlust — attack and move speed for an ally (and yourself). [abil:ability_ogre_magi_multicast_custom]Ultimate Multicast — chances to cast abilities 2×, 3×, or 4×. Scepter — [abil:ability_ogre_magi_unrefined_fireblast_custom]heavy Fireblast for a mana cost."
"5" "[hero:pudge][abil:ability_pudge_meat_hook_custom]+50/100/150/200% max HP damage. [abil:ability_pudge_rot_custom]+0.6/0.9/1.2/1.5% max HP/s to DoT. [abil:ability_pudge_dismember_custom]+0.8/1.2/1.6% max HP/s to STR damage."
"6" "[hero:sniper][abil:ability_sniper_shrapnel_custom]zone damage — 25% attack damage per 1s (10s), instead of flat 1230 spell damage; +25% incoming to enemies in zone."
"7" "[hero:rubick][abil:ability_rubick_telekinesis_custom]×2 lift distance before channel break."
"8" "[hero:luna][abil:ability_luna_lunar_blessing_custom]1 innate level; +2.5 damage per hero level; Shard +0.45% spell amp/level; synergy with Mirana."
"9" "[hero:legion_commander][abil:ability_legion_commander_duel_custom]random stat on kill +1 (+4 with Scepter); damage stack cap 40,000 (was 400)."
"10" "[hero:nagash]Aghanim's Shard: 3s invulnerability."
"11" "[hero:yuki_onna][abil:ability_yuki_challenge]attribute bonus per trial up to +12 (was +16); buff locks flat bonus on completion."
"12" "[hero:templar_assassin]fixed Refraction Trap stuck after trigger."
}
}
"11"
{
"date" "2026-05-26"
"version" "0.19.1"
"title" "0.19.1"
"general"
{
"1" "Greed: +1 to all attributes per 250 net worth (was 100)"
"2" "Arsenal: lower caps and upgrade growth for all-stats, single attributes, and their % lines."
}
"cards"
{
"1" "[card:85]Fishing (new): on pickup — extra card picks (1/2/3 by level) and Slag in pool; [card:86]Slag — empty no-effect card, pool only."
"2" "[card:51]Midas Chestplate: rework — gold from damage taken (% of damage), incoming damage +base and +0.1% per 100 damage taken (was damage mitigation for gold)."
"3" "[card:58]Rampant Growth: innate; 3/4/5 extra picks at game start with 3/4/5 cards each; no standard dawn card selection."
"4" "[card:57]Mirror of Fate: 5 deck slots (was 3)."
"5" "[card:74]: 3 deck slots (was 2)."
"6" "[card:69]Cursed Bargain: other cards effectiveness 75/50/25% → 50/35/20%."
"7" "[card:68]Three Debts: with [card:69] in deck, bonus pick is any 3 cards from pool, not only cursed; Slag excluded from options."
"8" "[card:23]Golden Rain: income %/min 2/2.5/3.5 → 2/3.5/5; tick every 60s at all levels."
"9" "[card:36]Crystal Growth: damage per step and cap increased (max bonus 40/55/70% → 80/160/320%)."
}
"items"
{
"1" "[new][item:item_skadi_custom]Eye of Skadi (custom) — recipe: Ultimate Crown + Orb of Corrosion; cold attack, +45 all stats and +5% base attributes."
"2" "[new][item:item_shovel]Magic Shovel — quest item: dig at crosses (up to 5 times), gold and +675 HP."
"3" "[new][item:item_shameful_pipe]Shameful Pipe — quest reward: +450 attack range for ranged, immune to bone armor."
"4" "[item:item_desolator_custom] / [item:item_desolator_2_custom]: max damage bonus 30→90 and 45→125."
}
"heroes"
{
"1" "[hero:rubick][abil:ability_rubick_telekinesis_custom]Cannot lift npc_homer or bosses; allies without Scepter have finite air time (was infinite for allies except Homer)."
"2" "[hero:vengefulspirit][abil:vengefulspirit_nether_swap_custom]Does not copy Rubick telekinesis buffs to allies; cannot full-heal Homer on swap."
"3" "[hero:npc_dota_hero_nagash]Soul loss on death: Aghanim's Shard reduces lost_souls_pct by 30."
}
}
"12"
{
"date" "2026-05-28"
"version" "0.19.2"
"title" "0.19.2"
"general"
{
"1" "Card system: major rework of core draft/processing logic for stability and performance."
"2" "Optimization and technical gameplay fixes: damage tracking, modifier source handling, boss HUD, service managers, and initialization flow."
"3" "Localization and catalogs: card texts/references updated (RU/EN/CN) with related UI manifests."
"4" "Arsenal: percentage attribute stats (% Strength/% Agility/% Intelligence/% All Stats) apply only to base attributes."
}
"cards"
{
"1" "[card:87]\"King of Slag\": grants +2.5% to base Strength, Agility, and Intelligence for each [card:86] slag card left in the pool (updates dynamically)."
"2" "[card:88] free rerolls now grant per each slag card received (scaled by slag amount in one event)."
"3" "[card:23] anti-abuse payout gate added: dividend triggers only if earned gold per tick is at least 25% of that dividend."
"4" "[card:51] morning gold cap nerf: 400/600/800 → 250/400/550 (and now scales with active card copies)."
"5" "[card:67] rebalance: HP per Strength 0.05/0.1/0.15 → 0.1; outgoing % per Strength 0.1 → 0.05; proc chance 60/75/90 → 40/45/50; proc CD 3/2.5/2 → 3; max-HP damage 100/200/300 → 60/80/100."
"6" "[card:69] HP activation threshold 60% → 30%; health cost unified to 5%; curse stack damage bonus 10/14/18 → 10/20/30."
"7" "[card:47] XP bonus nerf: 100/150/200% → 35/50/65%."
"8" "[card:12], [card:13], [card:14], [card:19], [card:26], [card:35], [card:48], [card:55], [card:56], [card:78], [card:80], plus curse/greed modifiers now use unified source ability when applying modifiers (more stable stacks/events/damage source attribution)."
}
}
}
}
+428
View File
@@ -0,0 +1,428 @@
"dota_shops"
{
"consumables"
{
"item" "item_tpscroll"
"item" "item_clarity"
"item" "item_coffe_bean"
"item" "item_faerie_fire"
"item" "item_smoke_of_deceit"
"item" "item_ward_observer"
"item" "item_ward_sentry"
"item" "item_enchanted_mango"
"item" "item_flask"
"item" "item_tango"
"item" "item_blood_grenade"
"item" "item_dust"
"item" "item_bottle"
"item" "item_aghanims_shard"
}
"attributes"
{
"item" "item_branches"
"item" "item_gauntlets"
"item" "item_slippers"
"item" "item_mantle"
"item" "item_circlet"
"item" "item_belt_of_strength"
"item" "item_boots_of_elves"
"item" "item_robe"
"item" "item_crown"
"item" "item_ogre_axe"
"item" "item_blade_of_alacrity"
"item" "item_staff_of_wizardry"
"item" "item_diadem"
}
"weapons_armor"
{
"item" "item_quelling_blade"
"item" "item_ring_of_protection"
"item" "item_magic_wand"
"item" "item_null_talisman"
"item" "item_wraith_band"
"item" "item_bracer"
"item" "item_orb_of_venom"
"item" "item_blight_stone"
"item" "item_orb_of_frost"
"item" "item_orb_of_fire"
"item" "item_ice_spine"
"item" "item_blades_of_attack"
"item" "item_gloves"
"item" "item_chainmail"
"item" "item_quarterstaff"
"item" "item_helm_of_iron_will"
"item" "item_broadsword"
"item" "item_blitz_knuckles"
"item" "item_javelin"
"item" "item_magical_quiver"
"item" "item_claymore"
"item" "item_mithril_hammer"
"item" "item_poor_shield"
}
"misc"
{
"item" "item_ring_of_regen"
"item" "item_sobi_mask"
"item" "item_magic_stick"
"item" "item_fluffy_hat"
"item" "item_wind_lace"
"item" "item_cloak"
"item" "item_boots"
//"item" "item_ring_of_tarrasque"
"item" "item_gem"
"item" "item_lifesteal_custom"
"item" "item_voodoo_mask_custom"
"item" "item_shadow_amulet"
"item" "item_ghost"
"item" "item_blink"
"item" "item_ring_of_health"
"item" "item_void_stone"
}
// Level 1 - Green Recipes
"basics"
{
//"item" "item_magic_wand"
//"item" "item_null_talisman"
//"item" "item_wraith_band"
//"item" "item_bracer"
"item" "item_vampire_claw"
"item" "item_magic_stone"
"item" "item_orb_of_corrosion"
"item" "item_vambrace"
//"item" "item_soul_ring"
"item" "item_falcon_blade"
"item" "item_phase_boots"
"item" "item_power_treads"
//"item" "item_oblivion_staff"
"item" "item_pers"
"item" "item_mask_of_madness_custom"
"item" "item_mega_treads"
"item" "item_moon_shard"
"item" "item_soul_booster"
//"item" "item_hand_of_midas"
//"item" "item_travel_boots"
}
// Level 2 - Blue Recipes
"support"
{
"item" "item_buckler"
"item" "item_ring_of_basilius"
"item" "item_headdress"
"item" "item_holy_locket"
"item" "item_urn_of_shadows"
"item" "item_pavise"
"item" "item_arcane_boots"
"item" "item_tranquil_boots"
"item" "item_spirit_vessel"
"item" "item_solar_crest"
"item" "item_mekansm"
"item" "item_ancient_janggo"
"item" "item_vladmir"
"item" "item_pipe"
"item" "item_guardian_greaves"
"item" "item_boots_of_bearing"
}
"magics"
{
"item" "item_glimmer_cape"
"item" "item_force_staff"
"item" "item_dagon"
"item" "item_meteor_hammer"
"item" "item_rod_of_atos"
"item" "item_aether_lens"
"item" "item_cyclone"
"item" "item_orchid"
"item" "item_gungir"
"item" "item_ethereal_blade_custom"
"item" "item_wind_waker"
"item" "item_refresher"
"item" "item_octarine_core"
"item" "item_sheepstick"
"item" "item_bloodstone_magical"
"item" "item_ultimate_scepter"
"item" "item_soul_devourer_staff"
"item" "item_magic_rapier"
"item" "item_magical_divine_rapier"
}
// Level 3 - Purple Recipes
"defense"
{
"item" "item_vanguard"
"item" "item_blade_mail"
"item" "item_blademail_2"
"item" "item_helm_of_the_dominator"
"item" "item_armlet"
"item" "item_armlet_of_eternal_hunger"
"item" "item_crimson_guard"
"item" "item_crimson_shivas_custom"
"item" "item_aeon_disk"
"item" "item_helm_of_the_overlord"
"item" "item_heart"
"item" "item_veil_of_discord"
"item" "item_eternal_shroud"
"item" "item_lotus_orb"
"item" "item_black_king_bar"
"item" "item_warrior_shield"
"item" "item_shivas_guard"
"item" "item_skadi_custom"
"item" "item_sphere"
"item" "item_fire_cape"
"item" "item_assault"
// Not purchasable anymore
"item" "item_hood_of_defiance"
}
"weapons"
{
"item" "item_mini_bfury"
"item" "item_battle_fury_custom"
"item" "item_mega_fury"
"item" "item_mage_slayer"
"item" "item_zombie_slayer"
"item" "item_desolator_custom"
"item" "item_desolator_custom_2"
"item" "item_nullifier"
"item" "item_crystalys"
"item" "item_magical_crit"
"item" "item_witch_blade"
"item" "item_basher"
"item" "item_invis_sword"
"item" "item_revenants_brooch"
"item" "item_devastator"
"item" "item_abyssal_blade"
"item" "item_silver_edge"
"item" "item_dark_crystalys"
"item" "item_balist_custom"
"item" "item_diffusal_blade"
"item" "item_radiance_custom"
"item" "item_blazing_radiance_custom"
"item" "item_monkey_king_bar"
"item" "item_rapier_custom"
"item" "item_divine_rapier_custom"
"item" "item_disperser"
"item" "item_butterfly"
"item" "item_king_fly"
"item" "item_bloodthorn"
// Not purchasable items
"item" "item_aetherial_halo"
"item" "item_caster_rapier"
}
// Level 4 - Orange / Orb / Artifacts
"artifacts"
{
"item" "item_dragon_lance"
"item" "item_storm"
"item" "item_echo_sabre"
"item" "item_maelstrom"
"item" "item_phylactery"
"item" "item_hurricane_pike"
"item" "item_harpoon"
"item" "item_mjolnir_custom"
"item" "item_angels_demise"
"item" "item_bearstbow"
"item" "item_demonic_bow"
"item" "item_sange"
"item" "item_yasha"
"item" "item_kaya"
"item" "item_heavens_halberd"
"item" "item_kaya_and_sange"
"item" "item_sange_and_yasha"
"item" "item_yasha_and_kaya"
"item" "item_trident"
"item" "item_manta"
"item" "item_overwhelming_blink"
"item" "item_swift_blink"
"item" "item_arcane_blink"
"item" "item_satanic_custom"
}
"sideshop1"
{
"item" "item_tpscroll"
"item" "item_magic_stick"
"item" "item_quelling_blade"
"item" "item_boots"
"item" "item_boots_of_elves"
"item" "item_belt_of_strength"
"item" "item_robe"
"item" "item_crown"
}
"sideshop2"
{
"item" "item_gloves"
"item" "item_chainmail"
"item" "item_cloak"
"item" "item_void_stone"
"item" "item_helm_of_iron_will"
"item" "item_energy_booster"
"item" "item_vitality_booster"
"item" "item_lifesteal_custom"
"item" "item_broadsword"
"item" "item_blink"
}
"secretshop"
{
"item" "item_ring_of_tarrasque"
"item" "item_tiara_of_selemene"
"item" "item_cornucopia"
"item" "item_energy_booster"
"item" "item_vitality_booster"
"item" "item_point_booster"
"item" "item_talisman_of_evasion"
"item" "item_platemail"
"item" "item_hyperstone"
"item" "item_ultimate_orb"
"item" "item_ultimate_crown"
"item" "item_demon_edge"
"item" "item_mystic_staff"
"item" "item_reaver"
"item" "item_eagle"
"item" "item_relic"
}
"pregame"
{
"item" "item_clarity"
"item" "item_faerie_fire"
"item" "item_enchanted_mango"
"item" "item_tango"
"item" "item_flask"
"item" "item_smoke_of_deceit"
"item" "item_dust"
"item" "item_ward_observer"
"item" "item_ward_sentry"
"item" "item_blood_grenade"
"item" "item_branches"
"item" "item_gauntlets"
"item" "item_slippers"
"item" "item_mantle"
"item" "item_circlet"
"item" "item_magic_wand"
"item" "item_ring_of_protection"
"item" "item_quelling_blade"
"item" "item_fluffy_hat"
"item" "item_blight_stone"
"item" "item_orb_of_venom"
"item" "item_orb_of_frost"
"item" "item_orb_of_fire"
"item" "item_wind_lace"
"item" "item_magic_stick"
"item" "item_sobi_mask"
"item" "item_ring_of_regen"
"item" "item_boots"
"item" "item_gloves"
"item" "item_crown"
"item" "item_wraith_band"
"item" "item_null_talisman"
"item" "item_bracer"
"item" "item_blades_of_attack"
"item" "item_ring_of_basilius"
"item" "item_buckler"
"item" "item_headdress"
}
"pregame_consumables"
{
"item" "item_tango"
"item" "item_faerie_fire"
"item" "item_flask"
"item" "item_smoke_of_deceit"
"item" "item_clarity"
"item" "item_enchanted_mango"
"item" "item_magic_stick"
"item" "item_magic_wand"
"item" "item_ward_observer"
"item" "item_ward_sentry"
"item" "item_dust"
"item" "item_blood_grenade"
}
"pregame_attributes"
{
"item" "item_branches"
"item" "item_gauntlets"
"item" "item_slippers"
"item" "item_mantle"
"item" "item_circlet"
"item" "item_bracer"
"item" "item_wraith_band"
"item" "item_null_talisman"
"item" "item_crown"
"item" "item_fluffy_hat"
"item" "item_wind_lace"
"item" "item_boots"
}
"pregame_accessories"
{
"item" "item_quelling_blade"
"item" "item_ring_of_protection"
"item" "item_sobi_mask"
"item" "item_ring_of_basilius"
"item" "item_blight_stone"
"item" "item_orb_of_venom"
"item" "item_orb_of_frost"
"item" "item_orb_of_fire"
"item" "item_ring_of_regen"
"item" "item_gloves"
"item" "item_blades_of_attack"
"item" "item_buckler"
"item" "item_headdress"
}
}
@@ -0,0 +1,125 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
--- Пассивка для npc_capture_point: при приближении героя спавнит npc_teleport один раз.
____exports.ability_capture_point = __TS__Class()
local ability_capture_point = ____exports.ability_capture_point
ability_capture_point.name = "ability_capture_point"
ability_capture_point.____file_path = "scripts/vscripts/abilities/ability_capture_point.lua"
__TS__ClassExtends(ability_capture_point, BaseAbility)
function ability_capture_point.prototype.GetIntrinsicModifierName(self)
return ____exports.modifier_ability_capture_point.name
end
ability_capture_point = __TS__Decorate(
ability_capture_point,
ability_capture_point,
{registerAbility(nil)},
{kind = "class", name = "ability_capture_point"}
)
____exports.ability_capture_point = ability_capture_point
____exports.modifier_ability_capture_point = __TS__Class()
local modifier_ability_capture_point = ____exports.modifier_ability_capture_point
modifier_ability_capture_point.name = "modifier_ability_capture_point"
modifier_ability_capture_point.____file_path = "scripts/vscripts/abilities/ability_capture_point.lua"
__TS__ClassExtends(modifier_ability_capture_point, BaseModifier)
function modifier_ability_capture_point.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.activated = false
self.intervalThinkCount = 0
end
function modifier_ability_capture_point.prototype.IsHidden(self)
return true
end
function modifier_ability_capture_point.prototype.IsPurgable(self)
return false
end
function modifier_ability_capture_point.prototype.OnCreated(self)
if IsServer() then
local p = self:GetParent()
local o = p and p:GetAbsOrigin()
local ____opt_2 = p and p.GetEntityIndex
local idx = ____opt_2 and ____opt_2(p) or -1
self:StartIntervalThink(0.25)
end
end
function modifier_ability_capture_point.prototype.OnIntervalThink(self)
if not IsServer() or self.activated then
return
end
self:GetParent():StartGesture(ACT_DOTA_RUN)
local parent = self:GetParent()
if not parent or not IsValidEntity(parent) or not parent:IsAlive() then
return
end
local ability = self:GetAbility()
local radius = ability:GetSpecialValueFor("activation_radius")
local spawnDistance = ability:GetSpecialValueFor("spawn_distance")
local heroes = FindUnitsInRadius(
parent:GetTeamNumber(),
parent:GetAbsOrigin(),
nil,
radius,
DOTA_UNIT_TARGET_TEAM_FRIENDLY,
DOTA_UNIT_TARGET_HERO,
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
self.intervalThinkCount = self.intervalThinkCount + 1
local realHeroCount = 0
for ____, u in ipairs(heroes) do
if u and u:IsAlive() and u:IsRealHero() then
realHeroCount = realHeroCount + 1
end
end
for ____, h in ipairs(heroes) do
if h and h:IsAlive() and h:IsRealHero() then
parent:RemoveGesture(ACT_DOTA_RUN)
self:spawnTeleport(parent, spawnDistance)
self.activated = true
self:StartIntervalThink(-1)
return
end
end
end
function modifier_ability_capture_point.prototype.spawnTeleport(self, capture, distance)
local origin = capture:GetAbsOrigin()
local forward = capture:GetForwardVector()
local rawPos = Vector(origin.x + forward.x * distance, origin.y + forward.y * distance, -origin.z)
local pos = GetGroundPosition(rawPos, nil)
capture:StartGesture(ACT_DOTA_CAPTURE)
local tp = CreateUnitByName(
"npc_teleport",
pos,
false,
nil,
nil,
capture:GetTeamNumber()
)
if tp and IsValidEntity(tp) then
local pfx = ParticleManager:CreateParticle(
"particles/econ/events/fall_2021/fountain_regen_fall_2021_lvl3.vpcf",
PATTACH_ABSORIGIN_FOLLOW,
self:GetParent()
)
ParticleManager:ReleaseParticleIndex(pfx)
tp:SetEntityName("npc_teleport")
tp:SetAbsOrigin(pos)
tp:SetForwardVector(forward)
end
end
modifier_ability_capture_point = __TS__Decorate(
modifier_ability_capture_point,
modifier_ability_capture_point,
{registerModifier(nil)},
{kind = "class", name = "modifier_ability_capture_point"}
)
____exports.modifier_ability_capture_point = modifier_ability_capture_point
return ____exports
@@ -0,0 +1,136 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__ArrayForEach = ____lualib.__TS__ArrayForEach
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.agro_leader = __TS__Class()
local agro_leader = ____exports.agro_leader
agro_leader.name = "agro_leader"
agro_leader.____file_path = "scripts/vscripts/abilities/creep/agro_leader.lua"
__TS__ClassExtends(agro_leader, BaseAbility)
function agro_leader.prototype.Precache(self, context)
PrecacheResource("particle", "particles/units/heroes/hero_axe/axe_beserkers_call_owner.vpcf", context)
PrecacheResource("particle", "particles/status_fx/status_effect_beserkers_call.vpcf", context)
PrecacheResource("soundfile", "soundevents/game_sounds_heroes/game_sounds_axe.vsndevts", context)
end
function agro_leader.prototype.OnAbilityPhaseStart(self)
if IsServer() then
self:GetCaster():StartGestureWithPlaybackRate(ACT_DOTA_CAST_ABILITY_4, 0.7)
self.preParticle = ParticleManager:CreateParticle(
"particles/darkmoon_creep_warning.vpcf",
PATTACH_ABSORIGIN_FOLLOW,
self:GetCaster()
)
ParticleManager:SetParticleControlEnt(
self.preParticle,
0,
self:GetCaster(),
PATTACH_ABSORIGIN_FOLLOW,
"",
self:GetCaster():GetOrigin(),
true
)
ParticleManager:SetParticleControl(
self.preParticle,
1,
Vector(100, 100, 100)
)
end
return true
end
function agro_leader.prototype.OnAbilityPhaseInterrupted(self)
if IsClient() or not self.preParticle then
return
end
self:GetCaster():FadeGesture(ACT_DOTA_CAST_ABILITY_4)
ParticleManager:DestroyParticle(self.preParticle, false)
end
function agro_leader.prototype.OnSpellStart(self)
local caster = self:GetCaster()
if self.preParticle then
ParticleManager:DestroyParticle(self.preParticle, false)
end
caster:FadeGesture(ACT_DOTA_CAST_ABILITY_4)
local radius = self:GetSpecialValueFor("radius")
local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_axe/axe_beserkers_call_owner.vpcf", PATTACH_ABSORIGIN_FOLLOW, caster)
ParticleManager:SetParticleControl(
particle,
2,
Vector(radius, radius, radius)
)
caster:EmitSound("Hero_Axe.Berserkers_Call")
local enemies = FindUnitsInRadius(
caster:GetTeamNumber(),
caster:GetAbsOrigin(),
nil,
radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES,
FIND_ANY_ORDER,
false
)
__TS__ArrayForEach(
enemies,
function(____, enemy)
enemy:MoveToTargetToAttack(caster)
____exports.modifier_agro_leader_debuff:apply(
enemy,
caster,
self,
{duration = self:GetSpecialValueFor("duration")}
)
end
)
end
agro_leader = __TS__Decorate(
agro_leader,
agro_leader,
{registerAbility(nil)},
{kind = "class", name = "agro_leader"}
)
____exports.agro_leader = agro_leader
____exports.modifier_agro_leader_debuff = __TS__Class()
local modifier_agro_leader_debuff = ____exports.modifier_agro_leader_debuff
modifier_agro_leader_debuff.name = "modifier_agro_leader_debuff"
modifier_agro_leader_debuff.____file_path = "scripts/vscripts/abilities/creep/agro_leader.lua"
__TS__ClassExtends(modifier_agro_leader_debuff, BaseModifier)
function modifier_agro_leader_debuff.prototype.IsHidden(self)
return false
end
function modifier_agro_leader_debuff.prototype.IsPurgable(self)
return false
end
function modifier_agro_leader_debuff.prototype.IsDebuff(self)
return true
end
function modifier_agro_leader_debuff.prototype.CheckState(self)
return {[MODIFIER_STATE_COMMAND_RESTRICTED] = true}
end
function modifier_agro_leader_debuff.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_DEATH}
end
function modifier_agro_leader_debuff.prototype.OnDeath(self, event)
if event.unit == self:GetCaster() then
self:Destroy()
end
end
function modifier_agro_leader_debuff.prototype.OnDestroy(self)
end
function modifier_agro_leader_debuff.prototype.GetStatusEffectName(self)
return "particles/status_fx/status_effect_beserkers_call.vpcf"
end
modifier_agro_leader_debuff = __TS__Decorate(
modifier_agro_leader_debuff,
modifier_agro_leader_debuff,
{registerModifier(nil)},
{kind = "class", name = "modifier_agro_leader_debuff"}
)
____exports.modifier_agro_leader_debuff = modifier_agro_leader_debuff
return ____exports
@@ -0,0 +1,150 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local ____item_shameful_pipe = require("items.quest_items.item_shameful_pipe")
local modifier_item_shameful_pipe = ____item_shameful_pipe.modifier_item_shameful_pipe
local ____luck = require("utils.luck")
local rollLuckChance = ____luck.rollLuckChance
____exports.bone_armor = __TS__Class()
local bone_armor = ____exports.bone_armor
bone_armor.name = "bone_armor"
bone_armor.____file_path = "scripts/vscripts/abilities/creep/bone_armor.lua"
__TS__ClassExtends(bone_armor, BaseAbility)
function bone_armor.prototype.Precache(self, context)
PrecacheResource("particle", "particles/econ/items/centaur/centaur_crownfall_belt/centaur_crownfall_belt_retaliate.vpcf", context)
end
function bone_armor.prototype.GetIntrinsicModifierName(self)
return "modifier_bone_armor_passive"
end
bone_armor = __TS__Decorate(
bone_armor,
bone_armor,
{registerAbility(nil)},
{kind = "class", name = "bone_armor"}
)
____exports.bone_armor = bone_armor
____exports.modifier_bone_armor_passive = __TS__Class()
local modifier_bone_armor_passive = ____exports.modifier_bone_armor_passive
modifier_bone_armor_passive.name = "modifier_bone_armor_passive"
modifier_bone_armor_passive.____file_path = "scripts/vscripts/abilities/creep/bone_armor.lua"
__TS__ClassExtends(modifier_bone_armor_passive, BaseModifier)
function modifier_bone_armor_passive.prototype.IsHidden(self)
return true
end
function modifier_bone_armor_passive.prototype.IsDebuff(self)
return false
end
function modifier_bone_armor_passive.prototype.IsPurgable(self)
return false
end
function modifier_bone_armor_passive.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_EVENT_ON_ATTACK_LANDED}
end
function modifier_bone_armor_passive.prototype.GetModifierPhysicalArmorBonus(self)
local ____opt_0 = self:GetAbility()
return ____opt_0 and ____opt_0:GetSpecialValueFor("armor_bonus") or 0
end
function modifier_bone_armor_passive.prototype.playRetaliateParticle(self)
ParticleManager:CreateParticle(
"particles/econ/items/centaur/centaur_crownfall_belt/centaur_crownfall_belt_retaliate.vpcf",
PATTACH_ABSORIGIN_FOLLOW,
self:GetParent()
)
end
function modifier_bone_armor_passive.prototype.hasHeroNearCreep(self, creep, radius)
local heroes = FindUnitsInRadius(
creep:GetTeamNumber(),
creep:GetAbsOrigin(),
nil,
radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO,
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
for ____, hero in ipairs(heroes) do
if hero and IsValidEntity(hero) and hero:IsAlive() and hero:IsRealHero() then
return true
end
end
return false
end
function modifier_bone_armor_passive.prototype.applyReflectedDamage(self, attacker, parent, ability, eventDamage)
local reflectChance = ability:GetSpecialValueFor("damage_reflect_chance")
if not rollLuckChance(nil, attacker, reflectChance / 100) then
return
end
local reflectPct = ability:GetSpecialValueFor("damage_reflect_pct")
local reflectDamage = eventDamage * (reflectPct / 100)
if reflectDamage <= 0 then
return
end
ApplyDamage({
victim = attacker,
attacker = parent,
damage = reflectDamage,
damage_type = DAMAGE_TYPE_PHYSICAL,
ability = ability
})
self:playRetaliateParticle()
end
function modifier_bone_armor_passive.prototype.OnAttackLanded(self, event)
if not IsServer() then
return
end
if event.target ~= self:GetParent() then
return
end
local attacker = event.attacker
if not attacker or not IsValidEntity(attacker) or not attacker:IsAlive() then
return
end
if not attacker:IsHero() or not attacker:IsRealHero() then
return
end
if not attacker:IsRangedAttacker() then
return
end
if attacker:HasModifier(modifier_item_shameful_pipe.name) then
return
end
local ability = self:GetAbility()
if not ability then
return
end
local parent = self:GetParent()
local heroProximityRadius = ability:GetSpecialValueFor("hero_proximity_radius")
local heroNearCreep = self:hasHeroNearCreep(parent, heroProximityRadius)
if not heroNearCreep then
local isolatedMultiplier = ability:GetSpecialValueFor("isolated_damage_multiplier")
local damage = event.damage * isolatedMultiplier
if damage > 0 then
ApplyDamage({
victim = attacker,
attacker = parent,
damage = damage,
damage_type = DAMAGE_TYPE_PHYSICAL,
ability = ability
})
self:playRetaliateParticle()
end
return
end
self:applyReflectedDamage(attacker, parent, ability, event.damage)
end
modifier_bone_armor_passive = __TS__Decorate(
modifier_bone_armor_passive,
modifier_bone_armor_passive,
{registerModifier(nil)},
{kind = "class", name = "modifier_bone_armor_passive"}
)
____exports.modifier_bone_armor_passive = modifier_bone_armor_passive
return ____exports
@@ -0,0 +1,362 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local modifier_boss_nevermore_coil_beam_lock
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local ____modifier_boss_nevermore_coil_debuff = require("abilities.creep.modifier_boss_nevermore_coil_debuff")
local modifier_boss_nevermore_coil_debuff = ____modifier_boss_nevermore_coil_debuff.modifier_boss_nevermore_coil_debuff
--- Как 1-я способность (две волны по «шахматке»), но слоты в линию от босса к точке каста — «к врагу».
____exports.boss_nevermore_coil_beam = __TS__Class()
local boss_nevermore_coil_beam = ____exports.boss_nevermore_coil_beam
boss_nevermore_coil_beam.name = "boss_nevermore_coil_beam"
boss_nevermore_coil_beam.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_coil_beam.lua"
__TS__ClassExtends(boss_nevermore_coil_beam, BaseAbility)
function boss_nevermore_coil_beam.prototype.Precache(self, context)
PrecacheResource("particle", "particles/units/heroes/hero_nevermore/nevermore_shadowraze.vpcf", context)
PrecacheResource("particle", "particles/darkmoon_creep_warning.vpcf", context)
PrecacheResource("particle", "particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", context)
PrecacheResource("soundfile", "sounds/units/heroes/nevermore/shadowraze.vsnd", context)
end
function boss_nevermore_coil_beam.prototype.GetAOERadius(self)
local r = self:GetSpecialValueFor("radius")
local start = self:getSpecialOrDefault("beam_start_dist", ____exports.boss_nevermore_coil_beam.DEFAULT_BEAM_START)
local step = self:getBeamStepDistance()
local slots = self:getSlotCountForPhase(self:getBossPhase())
return start + step * math.max(0, slots - 1) + r * 2
end
function boss_nevermore_coil_beam.prototype.getSpecialOrDefault(self, name, fallback)
local value = self:GetSpecialValueFor(name)
if not value or value <= 0 then
return fallback
end
return value
end
function boss_nevermore_coil_beam.prototype.getBossPhase(self)
local caster = self:GetCaster()
if not caster or caster:IsNull() then
return 1
end
local hp = caster:GetHealthPercent()
if hp <= 25 then
return 4
end
if hp <= 50 then
return 3
end
if hp <= 75 then
return 2
end
return 1
end
function boss_nevermore_coil_beam.prototype.getSlotCountForPhase(self, phase)
local baseSlots = math.floor(self:getSpecialOrDefault("lane_slot_count", ____exports.boss_nevermore_coil_beam.DEFAULT_SLOT_COUNT))
local perPhase = math.floor(self:getSpecialOrDefault("lane_slot_phase_bonus", ____exports.boss_nevermore_coil_beam.DEFAULT_SLOT_PHASE_BONUS))
return baseSlots + (phase - 1) * perPhase
end
function boss_nevermore_coil_beam.prototype.getBeamStepDistance(self)
local radius = self:GetSpecialValueFor("radius")
local stepKv = self:GetSpecialValueFor("beam_step")
if stepKv > 0 then
return stepKv
end
return math.max(radius * 1.22, ____exports.boss_nevermore_coil_beam.DEFAULT_BEAM_STEP)
end
function boss_nevermore_coil_beam.prototype.buildBeamSlots(self, origin, direction, phase)
local dir2d = direction:Normalized()
dir2d.z = 0
local slotCount = self:getSlotCountForPhase(phase)
local startDist = self:getSpecialOrDefault("beam_start_dist", ____exports.boss_nevermore_coil_beam.DEFAULT_BEAM_START)
local step = self:getBeamStepDistance()
local firstWaveHitsEvenIndex = RandomInt(0, 1) == 0
local slots = {}
do
local i = 0
while i < slotCount do
local along = startDist + i * step
local pos = GetGroundPosition(origin + dir2d * along, nil)
local isEven = i % 2 == 0
local ____firstWaveHitsEvenIndex_0
if firstWaveHitsEvenIndex then
____firstWaveHitsEvenIndex_0 = isEven
else
____firstWaveHitsEvenIndex_0 = not isEven
end
local hitsOnFirstWave = ____firstWaveHitsEvenIndex_0
slots[#slots + 1] = {position = pos, hitsOnFirstWave = hitsOnFirstWave}
i = i + 1
end
end
return slots
end
function boss_nevermore_coil_beam.prototype.OnSpellStart(self)
if not IsServer() then
return
end
local caster = self:GetCaster()
local origin = caster:GetAbsOrigin()
local point = self:GetCursorPosition()
local toPoint = point - origin
local direction = toPoint:Length2D() < 1 and caster:GetForwardVector() or toPoint:Normalized()
local phase = self:getBossPhase()
self:spawnBeamPattern(origin, direction, phase)
end
function boss_nevermore_coil_beam.prototype.spawnBeamPattern(self, origin, direction, phase)
local caster = self:GetCaster()
local slots = self:buildBeamSlots(origin, direction, phase)
if #slots == 0 then
return
end
local radius = self:GetSpecialValueFor("radius")
local startDelay = self:getSpecialOrDefault("start_delay", ____exports.boss_nevermore_coil_beam.DEFAULT_START_DELAY)
local warningTime = self:getSpecialOrDefault("precast_warning_time", ____exports.boss_nevermore_coil_beam.DEFAULT_WARNING_TIME)
local secondDelayRaw = self:GetSpecialValueFor("second_wave_delay")
local secondWaveDelay = secondDelayRaw > 0 and secondDelayRaw or ____exports.boss_nevermore_coil_beam.DEFAULT_SECOND_WAVE_DELAY
local firstHitTime = startDelay
local secondHitTime = firstHitTime + secondWaveDelay
local firstWarningStart = math.max(0, firstHitTime - warningTime)
local secondWarningStart = math.max(firstHitTime + 0.1, secondHitTime - warningTime)
caster:AddNewModifier(caster, self, modifier_boss_nevermore_coil_beam_lock.name, {duration = secondHitTime + 0.35})
local warnings = {}
local function destroyWarningPair(____, pair)
ParticleManager:DestroyParticle(pair[1], true)
ParticleManager:ReleaseParticleIndex(pair[1])
ParticleManager:DestroyParticle(pair[2], true)
ParticleManager:ReleaseParticleIndex(pair[2])
end
local function clearWarning(____, idx)
local pair = warnings[idx + 1]
if not pair then
return
end
destroyWarningPair(nil, pair)
warnings[idx + 1] = nil
end
Timers:CreateTimer(
firstWarningStart,
function()
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
do
local i = 0
while i < #slots do
do
if not slots[i + 1].hitsOnFirstWave then
goto __continue25
end
warnings[i + 1] = self:createPulseWarningColored(slots[i + 1].position, radius, true)
end
::__continue25::
i = i + 1
end
end
return nil
end
)
Timers:CreateTimer(
firstHitTime,
function()
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
local impactPhase = self:getBossPhase()
local baseDamage = caster:GetAttackDamage()
local bonusDamagePerStack = self:GetSpecialValueFor("coil_stack_bonus_damage")
local damageMultiplier = 1 + (impactPhase - 1) * 0.3
do
local i = 0
while i < #slots do
do
if not slots[i + 1].hitsOnFirstWave then
goto __continue29
end
clearWarning(nil, i)
self:applyPulseDamage(
slots[i + 1].position,
radius,
baseDamage,
bonusDamagePerStack,
damageMultiplier
)
end
::__continue29::
i = i + 1
end
end
return nil
end
)
Timers:CreateTimer(
secondWarningStart,
function()
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
do
local i = 0
while i < #slots do
do
if slots[i + 1].hitsOnFirstWave then
goto __continue33
end
if warnings[i + 1] then
goto __continue33
end
warnings[i + 1] = self:createPulseWarningColored(slots[i + 1].position, radius, false)
end
::__continue33::
i = i + 1
end
end
return nil
end
)
Timers:CreateTimer(
secondHitTime,
function()
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
local impactPhase = self:getBossPhase()
local baseDamage = caster:GetAttackDamage()
local bonusDamagePerStack = self:GetSpecialValueFor("coil_stack_bonus_damage")
local damageMultiplier = 1 + (impactPhase - 1) * 0.3
do
local i = 0
while i < #slots do
do
if slots[i + 1].hitsOnFirstWave then
goto __continue38
end
clearWarning(nil, i)
self:applyPulseDamage(
slots[i + 1].position,
radius,
baseDamage,
bonusDamagePerStack,
damageMultiplier
)
end
::__continue38::
i = i + 1
end
end
return nil
end
)
end
function boss_nevermore_coil_beam.prototype.createPulseWarningColored(self, pulsePoint, radius, firstWaveStrike)
local caster = self:GetCaster()
local warningParticle = ParticleManager:CreateParticle("particles/darkmoon_creep_warning.vpcf", PATTACH_CUSTOMORIGIN, caster)
local aoeParticle = ParticleManager:CreateParticle("particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(warningParticle, 0, pulsePoint)
ParticleManager:SetParticleControl(
warningParticle,
1,
Vector(radius, 100, 100)
)
ParticleManager:SetParticleControl(aoeParticle, 0, pulsePoint)
ParticleManager:SetParticleControl(
aoeParticle,
1,
Vector(radius, 0, 0)
)
ParticleManager:SetParticleControl(
aoeParticle,
2,
Vector(6, 0, 1)
)
local rgb = firstWaveStrike and Vector(240, 40, 40) or Vector(70, 170, 255)
ParticleManager:SetParticleControl(aoeParticle, 3, rgb)
ParticleManager:SetParticleControl(aoeParticle, 4, pulsePoint)
return {warningParticle, aoeParticle}
end
function boss_nevermore_coil_beam.prototype.applyPulseDamage(self, pulsePoint, radius, baseDamage, bonusDamagePerStack, damageMultiplier)
if not IsServer() then
return
end
local caster = self:GetCaster()
if not caster or caster:IsNull() or not caster:IsAlive() then
return
end
local enemies = FindUnitsInRadius(
caster:GetTeamNumber(),
pulsePoint,
nil,
radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
for ____, enemy in ipairs(enemies) do
local coilDebuff = enemy:FindModifierByName(modifier_boss_nevermore_coil_debuff.name)
local stacks = coilDebuff and coilDebuff:GetStackCount() or 0
local damage = (baseDamage + stacks * bonusDamagePerStack) * damageMultiplier
ApplyDamage({
victim = enemy,
attacker = caster,
damage = damage,
damage_type = DAMAGE_TYPE_MAGICAL,
ability = self
})
local updatedDebuff = enemy:AddNewModifier(caster, self, modifier_boss_nevermore_coil_debuff.name, {})
if updatedDebuff ~= nil then
if stacks > 0 then
updatedDebuff:SetStackCount(stacks + 1)
else
updatedDebuff:SetStackCount(1)
end
end
end
EmitSoundOnLocationWithCaster(pulsePoint, "Hero_Nevermore.Shadowraze", caster)
local hitParticle = ParticleManager:CreateParticle("particles/units/heroes/hero_nevermore/nevermore_shadowraze.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(hitParticle, 0, pulsePoint)
ParticleManager:SetParticleControl(
hitParticle,
1,
Vector(radius, 1, 1)
)
ParticleManager:ReleaseParticleIndex(hitParticle)
end
boss_nevermore_coil_beam.DEFAULT_START_DELAY = 0.9
boss_nevermore_coil_beam.DEFAULT_SECOND_WAVE_DELAY = 1
boss_nevermore_coil_beam.DEFAULT_WARNING_TIME = 0.85
boss_nevermore_coil_beam.DEFAULT_SLOT_COUNT = 12
boss_nevermore_coil_beam.DEFAULT_SLOT_PHASE_BONUS = 2
boss_nevermore_coil_beam.DEFAULT_BEAM_START = 140
boss_nevermore_coil_beam.DEFAULT_BEAM_STEP = 195
boss_nevermore_coil_beam = __TS__Decorate(
boss_nevermore_coil_beam,
boss_nevermore_coil_beam,
{registerAbility(nil)},
{kind = "class", name = "boss_nevermore_coil_beam"}
)
____exports.boss_nevermore_coil_beam = boss_nevermore_coil_beam
modifier_boss_nevermore_coil_beam_lock = __TS__Class()
modifier_boss_nevermore_coil_beam_lock.name = "modifier_boss_nevermore_coil_beam_lock"
modifier_boss_nevermore_coil_beam_lock.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_coil_beam.lua"
__TS__ClassExtends(modifier_boss_nevermore_coil_beam_lock, BaseModifier)
function modifier_boss_nevermore_coil_beam_lock.prototype.IsHidden(self)
return true
end
function modifier_boss_nevermore_coil_beam_lock.prototype.IsPurgable(self)
return false
end
function modifier_boss_nevermore_coil_beam_lock.prototype.CheckState(self)
return {[MODIFIER_STATE_DISARMED] = true}
end
modifier_boss_nevermore_coil_beam_lock = __TS__Decorate(
modifier_boss_nevermore_coil_beam_lock,
modifier_boss_nevermore_coil_beam_lock,
{registerModifier(nil)},
{kind = "class", name = "modifier_boss_nevermore_coil_beam_lock"}
)
return ____exports
@@ -0,0 +1,353 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local modifier_boss_nevermore_coil_wave_lock
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local ____modifier_boss_nevermore_coil_debuff = require("abilities.creep.modifier_boss_nevermore_coil_debuff")
local modifier_boss_nevermore_coil_debuff = ____modifier_boss_nevermore_coil_debuff.modifier_boss_nevermore_coil_debuff
____exports.boss_nevermore_coil_wave = __TS__Class()
local boss_nevermore_coil_wave = ____exports.boss_nevermore_coil_wave
boss_nevermore_coil_wave.name = "boss_nevermore_coil_wave"
boss_nevermore_coil_wave.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_coil_wave.lua"
__TS__ClassExtends(boss_nevermore_coil_wave, BaseAbility)
function boss_nevermore_coil_wave.prototype.Precache(self, context)
PrecacheResource("particle", "particles/units/heroes/hero_nevermore/nevermore_shadowraze.vpcf", context)
PrecacheResource("particle", "particles/darkmoon_creep_warning.vpcf", context)
PrecacheResource("particle", "particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", context)
PrecacheResource("soundfile", "sounds/units/heroes/nevermore/shadowraze.vsnd", context)
end
function boss_nevermore_coil_wave.prototype.GetAOERadius(self)
local r = self:GetSpecialValueFor("radius")
local forward = self:getSpecialOrDefault("lane_forward_dist", ____exports.boss_nevermore_coil_wave.DEFAULT_FORWARD_DIST)
return forward + r * 2
end
function boss_nevermore_coil_wave.prototype.getSpecialOrDefault(self, name, fallback)
local value = self:GetSpecialValueFor(name)
if not value or value <= 0 then
return fallback
end
return value
end
function boss_nevermore_coil_wave.prototype.getBossPhase(self)
local caster = self:GetCaster()
if not caster or caster:IsNull() then
return 1
end
local hp = caster:GetHealthPercent()
if hp <= 25 then
return 4
end
if hp <= 50 then
return 3
end
if hp <= 75 then
return 2
end
return 1
end
function boss_nevermore_coil_wave.prototype.buildGapLaneSlots(self, origin, direction, phase)
local radius = self:GetSpecialValueFor("radius")
local baseSlots = math.floor(self:getSpecialOrDefault("lane_slot_count", ____exports.boss_nevermore_coil_wave.DEFAULT_SLOT_COUNT))
local slotCount = baseSlots + (phase - 1)
local forwardDist = self:getSpecialOrDefault("lane_forward_dist", ____exports.boss_nevermore_coil_wave.DEFAULT_FORWARD_DIST) + (phase - 1) * 35
local spacing = math.max(
radius * self:getSpecialOrDefault("lane_slot_spacing", ____exports.boss_nevermore_coil_wave.DEFAULT_SLOT_SPACING_FACTOR),
185
)
local dir2d = direction:Normalized()
dir2d.z = 0
local right = Vector(-dir2d.y, dir2d.x, 0):Normalized()
local centerRow = GetGroundPosition(origin + dir2d * forwardDist, nil)
local firstWaveHitsEvenIndex = RandomInt(0, 1) == 0
local slots = {}
local mid = (slotCount - 1) / 2
do
local i = 0
while i < slotCount do
local lateral = (i - mid) * spacing
local pos = GetGroundPosition(centerRow + right * lateral, nil)
local isEven = i % 2 == 0
local ____firstWaveHitsEvenIndex_0
if firstWaveHitsEvenIndex then
____firstWaveHitsEvenIndex_0 = isEven
else
____firstWaveHitsEvenIndex_0 = not isEven
end
local hitsOnFirstWave = ____firstWaveHitsEvenIndex_0
slots[#slots + 1] = {position = pos, hitsOnFirstWave = hitsOnFirstWave}
i = i + 1
end
end
return slots
end
function boss_nevermore_coil_wave.prototype.OnSpellStart(self)
if not IsServer() then
return
end
local caster = self:GetCaster()
local origin = caster:GetAbsOrigin()
local point = self:GetCursorPosition()
local toPoint = point - origin
local direction = toPoint:Length2D() < 1 and caster:GetForwardVector() or toPoint:Normalized()
local phase = self:getBossPhase()
self:spawnGapLanePattern(origin, direction, phase)
end
function boss_nevermore_coil_wave.prototype.spawnGapLanePattern(self, origin, direction, phase)
local caster = self:GetCaster()
local slots = self:buildGapLaneSlots(origin, direction, phase)
if #slots == 0 then
return
end
local radius = self:GetSpecialValueFor("radius")
local startDelay = self:getSpecialOrDefault("start_delay", ____exports.boss_nevermore_coil_wave.DEFAULT_START_DELAY)
local warningTime = self:getSpecialOrDefault("precast_warning_time", ____exports.boss_nevermore_coil_wave.DEFAULT_WARNING_TIME)
local secondDelayRaw = self:GetSpecialValueFor("second_wave_delay")
local secondWaveDelay = secondDelayRaw > 0 and secondDelayRaw or ____exports.boss_nevermore_coil_wave.DEFAULT_SECOND_WAVE_DELAY
local firstHitTime = startDelay
local secondHitTime = firstHitTime + secondWaveDelay
local firstWarningStart = math.max(0, firstHitTime - warningTime)
local secondWarningStart = math.max(firstHitTime + 0.1, secondHitTime - warningTime)
caster:AddNewModifier(caster, self, modifier_boss_nevermore_coil_wave_lock.name, {duration = secondHitTime + 0.35})
local warnings = {}
local function destroyWarningPair(____, pair)
ParticleManager:DestroyParticle(pair[1], true)
ParticleManager:ReleaseParticleIndex(pair[1])
ParticleManager:DestroyParticle(pair[2], true)
ParticleManager:ReleaseParticleIndex(pair[2])
end
local function clearWarning(____, idx)
local pair = warnings[idx + 1]
if not pair then
return
end
destroyWarningPair(nil, pair)
warnings[idx + 1] = nil
end
Timers:CreateTimer(
firstWarningStart,
function()
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
do
local i = 0
while i < #slots do
do
if not slots[i + 1].hitsOnFirstWave then
goto __continue22
end
warnings[i + 1] = self:createPulseWarningColored(slots[i + 1].position, radius, true)
end
::__continue22::
i = i + 1
end
end
return nil
end
)
Timers:CreateTimer(
firstHitTime,
function()
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
local impactPhase = self:getBossPhase()
local baseDamage = caster:GetAttackDamage()
local bonusDamagePerStack = self:GetSpecialValueFor("coil_stack_bonus_damage")
local damageMultiplier = 1 + (impactPhase - 1) * 0.3
do
local i = 0
while i < #slots do
do
if not slots[i + 1].hitsOnFirstWave then
goto __continue26
end
clearWarning(nil, i)
self:applyPulseDamage(
slots[i + 1].position,
radius,
baseDamage,
bonusDamagePerStack,
damageMultiplier
)
end
::__continue26::
i = i + 1
end
end
return nil
end
)
Timers:CreateTimer(
secondWarningStart,
function()
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
do
local i = 0
while i < #slots do
do
if slots[i + 1].hitsOnFirstWave then
goto __continue30
end
if warnings[i + 1] then
goto __continue30
end
warnings[i + 1] = self:createPulseWarningColored(slots[i + 1].position, radius, false)
end
::__continue30::
i = i + 1
end
end
return nil
end
)
Timers:CreateTimer(
secondHitTime,
function()
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
local impactPhase = self:getBossPhase()
local baseDamage = caster:GetAttackDamage()
local bonusDamagePerStack = self:GetSpecialValueFor("coil_stack_bonus_damage")
local damageMultiplier = 1 + (impactPhase - 1) * 0.3
do
local i = 0
while i < #slots do
do
if slots[i + 1].hitsOnFirstWave then
goto __continue35
end
clearWarning(nil, i)
self:applyPulseDamage(
slots[i + 1].position,
radius,
baseDamage,
bonusDamagePerStack,
damageMultiplier
)
end
::__continue35::
i = i + 1
end
end
return nil
end
)
end
function boss_nevermore_coil_wave.prototype.createPulseWarningColored(self, pulsePoint, radius, firstWaveStrike)
local caster = self:GetCaster()
local warningParticle = ParticleManager:CreateParticle("particles/darkmoon_creep_warning.vpcf", PATTACH_CUSTOMORIGIN, caster)
local aoeParticle = ParticleManager:CreateParticle("particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(warningParticle, 0, pulsePoint)
ParticleManager:SetParticleControl(
warningParticle,
1,
Vector(radius, 100, 100)
)
ParticleManager:SetParticleControl(aoeParticle, 0, pulsePoint)
ParticleManager:SetParticleControl(
aoeParticle,
1,
Vector(radius, 0, 0)
)
ParticleManager:SetParticleControl(
aoeParticle,
2,
Vector(6, 0, 1)
)
local rgb = firstWaveStrike and Vector(240, 40, 40) or Vector(70, 170, 255)
ParticleManager:SetParticleControl(aoeParticle, 3, rgb)
ParticleManager:SetParticleControl(aoeParticle, 4, pulsePoint)
return {warningParticle, aoeParticle}
end
function boss_nevermore_coil_wave.prototype.applyPulseDamage(self, pulsePoint, radius, baseDamage, bonusDamagePerStack, damageMultiplier)
if not IsServer() then
return
end
local caster = self:GetCaster()
if not caster or caster:IsNull() or not caster:IsAlive() then
return
end
local enemies = FindUnitsInRadius(
caster:GetTeamNumber(),
pulsePoint,
nil,
radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
for ____, enemy in ipairs(enemies) do
local coilDebuff = enemy:FindModifierByName(modifier_boss_nevermore_coil_debuff.name)
local stacks = coilDebuff and coilDebuff:GetStackCount() or 0
local damage = (baseDamage + stacks * bonusDamagePerStack) * damageMultiplier
ApplyDamage({
victim = enemy,
attacker = caster,
damage = damage,
damage_type = DAMAGE_TYPE_MAGICAL,
ability = self
})
local updatedDebuff = enemy:AddNewModifier(caster, self, modifier_boss_nevermore_coil_debuff.name, {})
if updatedDebuff ~= nil then
if stacks > 0 then
updatedDebuff:SetStackCount(stacks + 1)
else
updatedDebuff:SetStackCount(1)
end
end
end
EmitSoundOnLocationWithCaster(pulsePoint, "Hero_Nevermore.Shadowraze", caster)
local hitParticle = ParticleManager:CreateParticle("particles/units/heroes/hero_nevermore/nevermore_shadowraze.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(hitParticle, 0, pulsePoint)
ParticleManager:SetParticleControl(
hitParticle,
1,
Vector(radius, 1, 1)
)
ParticleManager:ReleaseParticleIndex(hitParticle)
end
boss_nevermore_coil_wave.DEFAULT_START_DELAY = 0.9
boss_nevermore_coil_wave.DEFAULT_SECOND_WAVE_DELAY = 1
boss_nevermore_coil_wave.DEFAULT_WARNING_TIME = 0.85
boss_nevermore_coil_wave.DEFAULT_SLOT_COUNT = 5
boss_nevermore_coil_wave.DEFAULT_FORWARD_DIST = 360
boss_nevermore_coil_wave.DEFAULT_SLOT_SPACING_FACTOR = 1.32
boss_nevermore_coil_wave = __TS__Decorate(
boss_nevermore_coil_wave,
boss_nevermore_coil_wave,
{registerAbility(nil)},
{kind = "class", name = "boss_nevermore_coil_wave"}
)
____exports.boss_nevermore_coil_wave = boss_nevermore_coil_wave
modifier_boss_nevermore_coil_wave_lock = __TS__Class()
modifier_boss_nevermore_coil_wave_lock.name = "modifier_boss_nevermore_coil_wave_lock"
modifier_boss_nevermore_coil_wave_lock.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_coil_wave.lua"
__TS__ClassExtends(modifier_boss_nevermore_coil_wave_lock, BaseModifier)
function modifier_boss_nevermore_coil_wave_lock.prototype.IsHidden(self)
return true
end
function modifier_boss_nevermore_coil_wave_lock.prototype.IsPurgable(self)
return false
end
function modifier_boss_nevermore_coil_wave_lock.prototype.CheckState(self)
return {[MODIFIER_STATE_DISARMED] = true}
end
modifier_boss_nevermore_coil_wave_lock = __TS__Decorate(
modifier_boss_nevermore_coil_wave_lock,
modifier_boss_nevermore_coil_wave_lock,
{registerModifier(nil)},
{kind = "class", name = "modifier_boss_nevermore_coil_wave_lock"}
)
return ____exports
@@ -0,0 +1,284 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local modifier_boss_nevermore_hub_crossburst_lock
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local ____modifier_boss_nevermore_coil_debuff = require("abilities.creep.modifier_boss_nevermore_coil_debuff")
local modifier_boss_nevermore_coil_debuff = ____modifier_boss_nevermore_coil_debuff.modifier_boss_nevermore_coil_debuff
--- Случайная точка-хаб: от неё волны взрывов по 4 лучам (плюс или крест).
____exports.boss_nevermore_hub_crossburst = __TS__Class()
local boss_nevermore_hub_crossburst = ____exports.boss_nevermore_hub_crossburst
boss_nevermore_hub_crossburst.name = "boss_nevermore_hub_crossburst"
boss_nevermore_hub_crossburst.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_hub_crossburst.lua"
__TS__ClassExtends(boss_nevermore_hub_crossburst, BaseAbility)
function boss_nevermore_hub_crossburst.prototype.Precache(self, context)
PrecacheResource("particle", "particles/units/heroes/hero_nevermore/nevermore_shadowraze.vpcf", context)
PrecacheResource("particle", "particles/darkmoon_creep_warning.vpcf", context)
PrecacheResource("particle", "particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", context)
PrecacheResource("soundfile", "sounds/units/heroes/nevermore/shadowraze.vsnd", context)
end
function boss_nevermore_hub_crossburst.prototype.GetAOERadius(self)
local pick = self:getSpecialOrDefault("spawn_pick_radius", ____exports.boss_nevermore_hub_crossburst.DEFAULT_PICK_RADIUS)
local start = self:getSpecialOrDefault("ring_start_dist", ____exports.boss_nevermore_hub_crossburst.DEFAULT_RING_START)
local step = self:getSpecialOrDefault("ring_step", ____exports.boss_nevermore_hub_crossburst.DEFAULT_RING_STEP)
local n = self:getRingCountForPhase(self:getBossPhase())
local reach = start + (n - 1) * step + self:GetSpecialValueFor("radius")
return pick + reach
end
function boss_nevermore_hub_crossburst.prototype.getSpecialOrDefault(self, name, fallback)
local v = self:GetSpecialValueFor(name)
if not v or v <= 0 then
return fallback
end
return v
end
function boss_nevermore_hub_crossburst.prototype.getBossPhase(self)
local c = self:GetCaster()
if not c or c:IsNull() then
return 1
end
local hp = c:GetHealthPercent()
if hp <= 25 then
return 4
end
if hp <= 50 then
return 3
end
if hp <= 75 then
return 2
end
return 1
end
function boss_nevermore_hub_crossburst.prototype.getRingCountForPhase(self, phase)
local base = math.floor(self:getSpecialOrDefault("ring_count", ____exports.boss_nevermore_hub_crossburst.DEFAULT_RING_COUNT))
local perPhase = math.floor(self:getSpecialOrDefault("ring_count_phase_bonus", ____exports.boss_nevermore_hub_crossburst.DEFAULT_RING_COUNT_PHASE_BONUS))
return math.max(1, base + (phase - 1) * perPhase)
end
function boss_nevermore_hub_crossburst.prototype.pickRandomHub(self, groundOrigin)
local maxR = self:getSpecialOrDefault("spawn_pick_radius", ____exports.boss_nevermore_hub_crossburst.DEFAULT_PICK_RADIUS)
local ang = RandomFloat(0, 360)
local dist = maxR * math.sqrt(RandomFloat(0.001, 1))
local rad = ang * math.pi / 180
local dx = math.cos(rad) * dist
local dy = math.sin(rad) * dist
return GetGroundPosition(
groundOrigin + Vector(dx, dy, 0),
nil
)
end
function boss_nevermore_hub_crossburst.prototype.getDirections(self, pattern)
if pattern == "plus" then
return {
Vector(1, 0, 0),
Vector(-1, 0, 0),
Vector(0, 1, 0),
Vector(0, -1, 0)
}
end
local s = 1 / math.sqrt(2)
return {
Vector(s, s, 0),
Vector(s, -s, 0),
Vector(-s, s, 0),
Vector(-s, -s, 0)
}
end
function boss_nevermore_hub_crossburst.prototype.OnSpellStart(self)
if not IsServer() then
return
end
local caster = self:GetCaster()
if not caster or caster:IsNull() or not caster:IsAlive() then
return
end
local bossGround = GetGroundPosition(
caster:GetAbsOrigin(),
nil
)
local hub = self:pickRandomHub(bossGround)
local pattern = RandomInt(0, 1) == 0 and "plus" or "cross"
local radius = self:GetSpecialValueFor("radius")
local rEff = radius > 0 and radius or ____exports.boss_nevermore_hub_crossburst.DEFAULT_RADIUS
local phaseNow = self:getBossPhase()
local ringCount = self:getRingCountForPhase(phaseNow)
local ringStep = self:getSpecialOrDefault("ring_step", ____exports.boss_nevermore_hub_crossburst.DEFAULT_RING_STEP)
local ringStart = self:getSpecialOrDefault("ring_start_dist", ____exports.boss_nevermore_hub_crossburst.DEFAULT_RING_START)
local baseInterval = self:getSpecialOrDefault("ring_interval", ____exports.boss_nevermore_hub_crossburst.DEFAULT_RING_INTERVAL)
--- Ниже фаза — чуть быстрее волны (до ~−12% на фазе 4).
local ringInterval = baseInterval * math.max(0.72, 1 - (phaseNow - 1) * 0.06)
local firstDelay = self:getSpecialOrDefault("first_ring_delay", ____exports.boss_nevermore_hub_crossburst.DEFAULT_FIRST_DELAY)
local warningTime = self:getSpecialOrDefault("precast_warning_time", ____exports.boss_nevermore_hub_crossburst.DEFAULT_WARNING_TIME)
local dirs = self:getDirections(pattern)
local function ringPositionsForIndex(____, ringIdx)
local along = ringStart + ringIdx * ringStep
local out = {}
for ____, d in ipairs(dirs) do
local scaled = Vector(d.x * along, d.y * along, 0)
out[#out + 1] = GetGroundPosition(hub + scaled, nil)
end
return out
end
local lastHitTime = firstDelay + (ringCount - 1) * ringInterval
caster:AddNewModifier(caster, self, modifier_boss_nevermore_hub_crossburst_lock.name, {duration = lastHitTime + 0.5})
do
local r = 0
while r < ringCount do
local hitTime = firstDelay + r * ringInterval
local warnT = math.max(0, hitTime - warningTime)
local positions = ringPositionsForIndex(nil, r)
local isRedWave = r % 2 == 0
Timers:CreateTimer(
warnT,
function()
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
local ____pairs = {}
for ____, p in ipairs(positions) do
____pairs[#____pairs + 1] = self:createWarningPair(p, rEff, isRedWave)
end
Timers:CreateTimer(
hitTime - warnT,
function()
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
for ____, pair in ipairs(____pairs) do
do
if not pair then
goto __continue28
end
ParticleManager:DestroyParticle(pair[1], true)
ParticleManager:ReleaseParticleIndex(pair[1])
ParticleManager:DestroyParticle(pair[2], true)
ParticleManager:ReleaseParticleIndex(pair[2])
end
::__continue28::
end
for ____, p in ipairs(positions) do
self:applyRingDamage(p, rEff)
end
return nil
end
)
return nil
end
)
r = r + 1
end
end
end
function boss_nevermore_hub_crossburst.prototype.createWarningPair(self, pos, rad, firstStyle)
local caster = self:GetCaster()
local warningParticle = ParticleManager:CreateParticle("particles/darkmoon_creep_warning.vpcf", PATTACH_CUSTOMORIGIN, caster)
local aoeParticle = ParticleManager:CreateParticle("particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(warningParticle, 0, pos)
ParticleManager:SetParticleControl(
warningParticle,
1,
Vector(rad, 100, 100)
)
ParticleManager:SetParticleControl(aoeParticle, 0, pos)
ParticleManager:SetParticleControl(
aoeParticle,
1,
Vector(rad, 0, 0)
)
ParticleManager:SetParticleControl(
aoeParticle,
2,
Vector(6, 0, 1)
)
local rgb = firstStyle and Vector(230, 80, 40) or Vector(180, 80, 230)
ParticleManager:SetParticleControl(aoeParticle, 3, rgb)
ParticleManager:SetParticleControl(aoeParticle, 4, pos)
return {warningParticle, aoeParticle}
end
function boss_nevermore_hub_crossburst.prototype.applyRingDamage(self, pulsePoint, rad)
local caster = self:GetCaster()
if not caster or caster:IsNull() or not caster:IsAlive() then
return
end
local phase = self:getBossPhase()
local baseDamage = caster:GetAttackDamage()
local bonusDamagePerStack = self:GetSpecialValueFor("coil_stack_bonus_damage")
local damageMultiplier = 1 + (phase - 1) * 0.3
local enemies = FindUnitsInRadius(
caster:GetTeamNumber(),
pulsePoint,
nil,
rad,
DOTA_UNIT_TARGET_TEAM_ENEMY,
bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
for ____, enemy in ipairs(enemies) do
local coilDebuff = enemy:FindModifierByName(modifier_boss_nevermore_coil_debuff.name)
local stacks = coilDebuff and coilDebuff:GetStackCount() or 0
local damage = (baseDamage + stacks * bonusDamagePerStack) * damageMultiplier * 0.85
ApplyDamage({
victim = enemy,
attacker = caster,
damage = damage,
damage_type = DAMAGE_TYPE_MAGICAL,
ability = self
})
local updatedDebuff = enemy:AddNewModifier(caster, self, modifier_boss_nevermore_coil_debuff.name, {})
if updatedDebuff ~= nil then
updatedDebuff:SetStackCount(stacks > 0 and stacks + 1 or 1)
end
end
EmitSoundOnLocationWithCaster(pulsePoint, "Hero_Nevermore.Shadowraze", caster)
local hitParticle = ParticleManager:CreateParticle("particles/units/heroes/hero_nevermore/nevermore_shadowraze.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(hitParticle, 0, pulsePoint)
ParticleManager:SetParticleControl(
hitParticle,
1,
Vector(rad, 1, 1)
)
ParticleManager:ReleaseParticleIndex(hitParticle)
end
boss_nevermore_hub_crossburst.DEFAULT_PICK_RADIUS = 1500
boss_nevermore_hub_crossburst.DEFAULT_RADIUS = 165
boss_nevermore_hub_crossburst.DEFAULT_RING_COUNT = 7
boss_nevermore_hub_crossburst.DEFAULT_RING_COUNT_PHASE_BONUS = 1
boss_nevermore_hub_crossburst.DEFAULT_RING_STEP = 190
boss_nevermore_hub_crossburst.DEFAULT_RING_START = 90
boss_nevermore_hub_crossburst.DEFAULT_RING_INTERVAL = 0.52
boss_nevermore_hub_crossburst.DEFAULT_FIRST_DELAY = 0.55
boss_nevermore_hub_crossburst.DEFAULT_WARNING_TIME = 0.82
boss_nevermore_hub_crossburst = __TS__Decorate(
boss_nevermore_hub_crossburst,
boss_nevermore_hub_crossburst,
{registerAbility(nil)},
{kind = "class", name = "boss_nevermore_hub_crossburst"}
)
____exports.boss_nevermore_hub_crossburst = boss_nevermore_hub_crossburst
modifier_boss_nevermore_hub_crossburst_lock = __TS__Class()
modifier_boss_nevermore_hub_crossburst_lock.name = "modifier_boss_nevermore_hub_crossburst_lock"
modifier_boss_nevermore_hub_crossburst_lock.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_hub_crossburst.lua"
__TS__ClassExtends(modifier_boss_nevermore_hub_crossburst_lock, BaseModifier)
function modifier_boss_nevermore_hub_crossburst_lock.prototype.IsHidden(self)
return true
end
function modifier_boss_nevermore_hub_crossburst_lock.prototype.IsPurgable(self)
return false
end
function modifier_boss_nevermore_hub_crossburst_lock.prototype.CheckState(self)
return {[MODIFIER_STATE_DISARMED] = true}
end
modifier_boss_nevermore_hub_crossburst_lock = __TS__Decorate(
modifier_boss_nevermore_hub_crossburst_lock,
modifier_boss_nevermore_hub_crossburst_lock,
{registerModifier(nil)},
{kind = "class", name = "modifier_boss_nevermore_hub_crossburst_lock"}
)
return ____exports
@@ -0,0 +1,494 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__ArrayMap = ____lualib.__TS__ArrayMap
local __TS__ArrayPush = ____lualib.__TS__ArrayPush
local __TS__SparseArrayNew = ____lualib.__TS__SparseArrayNew
local __TS__SparseArrayPush = ____lualib.__TS__SparseArrayPush
local __TS__SparseArraySpread = ____lualib.__TS__SparseArraySpread
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local modifier_boss_nevermore_requiem_barrage_casting
local ____nevermore_boss_requiem_bridge = require("ai.nevermore_boss_requiem_bridge")
local nevermoreIncrementRequiemCastCount = ____nevermore_boss_requiem_bridge.nevermoreIncrementRequiemCastCount
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local ____modifier_boss_nevermore_requiem_magic_resist_debuff = require("abilities.creep.modifier_boss_nevermore_requiem_magic_resist_debuff")
local modifier_boss_nevermore_requiem_magic_resist_debuff = ____modifier_boss_nevermore_requiem_magic_resist_debuff.modifier_boss_nevermore_requiem_magic_resist_debuff
--- Глобальный множитель урона залпа (подогнан под KV-бафф ~+60%).
local REQUIEM_BARRAGE_DAMAGE_MULT = 1.6
--- Доп. дальность волны за стадию HP босса (согласовано с KV wave_distance ×1.6).
local REQUIEM_PHASE_DISTANCE_BONUS = 192
____exports.boss_nevermore_requiem_barrage = __TS__Class()
local boss_nevermore_requiem_barrage = ____exports.boss_nevermore_requiem_barrage
boss_nevermore_requiem_barrage.name = "boss_nevermore_requiem_barrage"
boss_nevermore_requiem_barrage.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_requiem_barrage.lua"
__TS__ClassExtends(boss_nevermore_requiem_barrage, BaseAbility)
function boss_nevermore_requiem_barrage.prototype.____constructor(self, ...)
BaseAbility.prototype.____constructor(self, ...)
self.castSerial = 0
self.phasePreviewParticles = {}
self.phasePreviewRotationOffset = 0
self.activePreviewParticles = {}
self.gestureLoopSerial = 0
end
function boss_nevermore_requiem_barrage.prototype.Precache(self, context)
PrecacheResource("particle", "particles/units/heroes/hero_nevermore/nevermore_requiemofsouls_line.vpcf", context)
PrecacheResource("particle", "particles/boss_tinker_laser_preview_vector.vpcf", context)
PrecacheResource("soundfile", "soundevents/game_sounds_heroes/game_sounds_nevermore.vsndevts", context)
end
function boss_nevermore_requiem_barrage.prototype.GetChannelTime(self)
local channel = self:GetSpecialValueFor("channel_time")
return channel > 0 and channel or 3
end
function boss_nevermore_requiem_barrage.prototype.getBossPhase(self)
local caster = self:GetCaster()
if not caster or caster:IsNull() then
return 1
end
local hp = caster:GetHealthPercent()
if hp <= 25 then
return 4
end
if hp <= 50 then
return 3
end
if hp <= 75 then
return 2
end
return 1
end
function boss_nevermore_requiem_barrage.prototype.OnAbilityPhaseStart(self)
if not IsServer() then
return true
end
local caster = self:GetCaster()
local point = self:GetCursorPosition()
local toPoint = point - caster:GetAbsOrigin()
local baseDirection = toPoint:Length2D() < 1 and caster:GetForwardVector() or toPoint:Normalized()
self:clearPhasePreview()
self.phasePreviewRotationOffset = self:getWaveRotationOffset(1)
local previewDirections = self:buildBurstDirections(
baseDirection,
self.phasePreviewRotationOffset,
self:getBossPhase()
)
local previewDuration = self:GetCastPoint() > 0 and self:GetCastPoint() or 0.3
self.phasePreviewParticles = self:createWavePreview(previewDirections, previewDuration)
return true
end
function boss_nevermore_requiem_barrage.prototype.OnAbilityPhaseInterrupted(self)
if not IsServer() then
return
end
self:clearPhasePreview()
end
function boss_nevermore_requiem_barrage.prototype.OnSpellStart(self)
if not IsServer() then
return
end
local caster = self:GetCaster()
nevermoreIncrementRequiemCastCount(nil, caster)
local point = self:GetCursorPosition()
local toPoint = point - caster:GetAbsOrigin()
local baseDirection = toPoint:Length2D() < 1 and caster:GetForwardVector() or toPoint:Normalized()
self.castSerial = self.castSerial + 1
local currentCast = self.castSerial
local channelTime = self:GetChannelTime()
local phase = self:getBossPhase()
local baseWaveInterval = self:GetSpecialValueFor("wave_interval") > 0 and self:GetSpecialValueFor("wave_interval") or 1
local waveInterval = math.max(0.35, baseWaveInterval - (phase - 1) * 0.12)
local wavesCount = math.max(
1,
math.floor(channelTime / waveInterval)
)
local previewTime = self:GetSpecialValueFor("wave_preview_time") > 0 and self:GetSpecialValueFor("wave_preview_time") or 0.35
local waveDistanceKv = self:GetSpecialValueFor("wave_distance") > 0 and self:GetSpecialValueFor("wave_distance") or 850
local travelDist = waveDistanceKv + (phase - 1) * REQUIEM_PHASE_DISTANCE_BONUS
local waveTravelTimeMax = self:getMaxWaveTravelTime(travelDist)
self:clearPhasePreview()
caster:AddNewModifier(caster, self, modifier_boss_nevermore_requiem_barrage_casting.name, {duration = channelTime + 0.1})
EmitSoundOn("Hero_Nevermore.RequiemOfSoulsCast", caster)
self:startGestureLoop(caster)
local firstRotationOffset = self.phasePreviewRotationOffset
self:fireSoulWaveBurst(baseDirection, firstRotationOffset)
Timers:CreateTimer(
waveTravelTimeMax,
function()
self:destroyPreviewParticles(self.phasePreviewParticles)
self.phasePreviewParticles = {}
return nil
end
)
do
local i = 1
while i <= wavesCount do
local fireTime = i * waveInterval
local waveRotationOffset = self:getWaveRotationOffset(i + 1)
local wavePreviewParticles = {}
local wasPreviewShown = false
local speedsForWave
Timers:CreateTimer(
math.max(0, fireTime - previewTime),
function()
if self.castSerial ~= currentCast then
return nil
end
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
local previewDirections = self:buildBurstDirections(
baseDirection,
waveRotationOffset,
self:getBossPhase()
)
speedsForWave = __TS__ArrayMap(
previewDirections,
function() return self:sampleWaveSpeed() end
)
wavePreviewParticles = self:createWavePreview(previewDirections, previewTime, speedsForWave)
wasPreviewShown = true
return nil
end
)
Timers:CreateTimer(
fireTime,
function()
if not wasPreviewShown then
return nil
end
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
self:fireSoulWaveBurst(baseDirection, waveRotationOffset, speedsForWave)
Timers:CreateTimer(
waveTravelTimeMax,
function()
self:destroyPreviewParticles(wavePreviewParticles)
return nil
end
)
return nil
end
)
i = i + 1
end
end
end
function boss_nevermore_requiem_barrage.prototype.OnChannelFinish(self, _bInterrupted)
if not IsServer() then
return
end
self.castSerial = self.castSerial + 1
local caster = self:GetCaster()
self:clearPhasePreview()
self:clearAllActivePreviews()
self:stopGestureLoop(caster)
caster:RemoveModifierByName(modifier_boss_nevermore_requiem_barrage_casting.name)
StopSoundOn("Hero_Nevermore.RequiemOfSoulsCast", caster)
end
function boss_nevermore_requiem_barrage.prototype.startGestureLoop(self, caster)
self.gestureLoopSerial = self.gestureLoopSerial + 1
local serial = self.gestureLoopSerial
local interval = 0.45
local tick
tick = function()
if self.gestureLoopSerial ~= serial then
return
end
if not caster or caster:IsNull() or not caster:IsAlive() then
return
end
if not caster:HasModifier(modifier_boss_nevermore_requiem_barrage_casting.name) then
return
end
caster:StartGestureWithPlaybackRate(ACT_DOTA_RAZE_1, 1)
Timers:CreateTimer(
interval,
function()
tick(nil)
return nil
end
)
end
tick(nil)
end
function boss_nevermore_requiem_barrage.prototype.stopGestureLoop(self, caster)
self.gestureLoopSerial = self.gestureLoopSerial + 1
if not caster or caster:IsNull() then
return
end
caster:FadeGesture(ACT_DOTA_RAZE_1)
end
function boss_nevermore_requiem_barrage.prototype.getWaveSpeedBounds(self)
local base = self:GetSpecialValueFor("wave_speed") > 0 and self:GetSpecialValueFor("wave_speed") or 800
local minKv = self:GetSpecialValueFor("wave_speed_min")
local maxKv = self:GetSpecialValueFor("wave_speed_max")
if minKv > 0 and maxKv > 0 and maxKv >= minKv then
return {minKv, maxKv}
end
local lo = math.max(120, base * 0.72)
local hi = base * 1.32
return {lo, hi}
end
function boss_nevermore_requiem_barrage.prototype.sampleWaveSpeed(self)
local mn, mx = unpack(self:getWaveSpeedBounds())
return RandomFloat(mn, mx)
end
function boss_nevermore_requiem_barrage.prototype.getMaxWaveTravelTime(self, distance)
local mn, _ = unpack(self:getWaveSpeedBounds())
return distance / mn
end
function boss_nevermore_requiem_barrage.prototype.fireSoulWaveBurst(self, baseDirection, rotationOffset, precomputedSpeeds)
local phase = self:getBossPhase()
local directions = self:buildBurstDirections(baseDirection, rotationOffset, phase)
local waveDistanceBase = self:GetSpecialValueFor("wave_distance") > 0 and self:GetSpecialValueFor("wave_distance") or 850
local startRadius = self:GetSpecialValueFor("wave_width_start") > 0 and self:GetSpecialValueFor("wave_width_start") or 45
local endRadius = self:GetSpecialValueFor("wave_width_end") > 0 and self:GetSpecialValueFor("wave_width_end") or 45
local distance = waveDistanceBase + (phase - 1) * REQUIEM_PHASE_DISTANCE_BONUS
do
local i = 0
while i < #directions do
local direction = directions[i + 1]
local spd = precomputedSpeeds ~= nil and precomputedSpeeds[i + 1] ~= nil and precomputedSpeeds[i + 1] or self:sampleWaveSpeed()
self:fireSoulWave(
direction,
distance,
spd,
startRadius,
endRadius
)
i = i + 1
end
end
EmitSoundOn(
"Hero_Nevermore.RequiemOfSouls",
self:GetCaster()
)
end
function boss_nevermore_requiem_barrage.prototype.getWaveRotationOffset(self, waveIndex)
local randomOffset = RandomInt(0, 359)
local waveOffset = waveIndex * 17
return (randomOffset + waveOffset) % 360
end
function boss_nevermore_requiem_barrage.prototype.buildBurstDirections(self, baseDirection, rotationOffset, phase)
local dirs = {}
local baseAngles = {
0,
90,
180,
270,
45,
135,
225,
315
}
local phaseAngles = {}
if phase >= 1 then
__TS__ArrayPush(
phaseAngles,
22.5,
112.5,
202.5,
292.5
)
end
if phase >= 2 then
__TS__ArrayPush(
phaseAngles,
30,
120,
210,
300
)
end
if phase >= 3 then
__TS__ArrayPush(
phaseAngles,
67.5,
157.5,
247.5,
337.5
)
end
if phase >= 4 then
__TS__ArrayPush(
phaseAngles,
15,
105,
195,
285
)
end
local ____array_0 = __TS__SparseArrayNew(unpack(baseAngles))
__TS__SparseArrayPush(
____array_0,
unpack(phaseAngles)
)
local angles = {__TS__SparseArraySpread(____array_0)}
for ____, angle in ipairs(angles) do
local q = QAngle(0, angle + rotationOffset, 0)
dirs[#dirs + 1] = RotatePosition(
Vector(0, 0, 0),
q,
baseDirection
)
end
return dirs
end
function boss_nevermore_requiem_barrage.prototype.createWavePreview(self, directions, previewDuration, speeds)
local caster = self:GetCaster()
local phase = self:getBossPhase()
local distance = (self:GetSpecialValueFor("wave_distance") > 0 and self:GetSpecialValueFor("wave_distance") or 850) + (phase - 1) * REQUIEM_PHASE_DISTANCE_BONUS
local defaultSpeed = self:GetSpecialValueFor("wave_speed") > 0 and self:GetSpecialValueFor("wave_speed") or 800
local casterPos = caster:GetAbsOrigin()
local casterZ = casterPos.z
local particles = {}
do
local i = 0
while i < #directions do
local direction = directions[i + 1]
local spd = speeds ~= nil and speeds[i + 1] ~= nil and speeds[i + 1] or defaultSpeed
local travelTime = distance / spd
local startPos = casterPos + direction * 110
startPos.z = casterZ
local endPos = startPos + direction * distance
endPos.z = casterZ
local previewFx = ParticleManager:CreateParticle("particles/boss_tinker_laser_preview_vector.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(previewFx, 0, startPos)
ParticleManager:SetParticleControl(previewFx, 1, endPos)
ParticleManager:SetParticleControl(
previewFx,
2,
Vector(
math.max(previewDuration, travelTime),
0,
0
)
)
particles[#particles + 1] = previewFx
local ____self_activePreviewParticles_1 = self.activePreviewParticles
____self_activePreviewParticles_1[#____self_activePreviewParticles_1 + 1] = previewFx
i = i + 1
end
end
return particles
end
function boss_nevermore_requiem_barrage.prototype.destroyPreviewParticles(self, particles)
if #particles == 0 then
return
end
local toRemove = {}
for ____, p in ipairs(particles) do
toRemove[p] = true
end
for ____, particle in ipairs(particles) do
ParticleManager:DestroyParticle(particle, false)
ParticleManager:ReleaseParticleIndex(particle)
end
local nextActive = {}
for ____, p in ipairs(self.activePreviewParticles) do
if not (toRemove[p] ~= nil) then
nextActive[#nextActive + 1] = p
end
end
self.activePreviewParticles = nextActive
end
function boss_nevermore_requiem_barrage.prototype.clearPhasePreview(self)
self:destroyPreviewParticles(self.phasePreviewParticles)
self.phasePreviewParticles = {}
end
function boss_nevermore_requiem_barrage.prototype.clearAllActivePreviews(self)
self:destroyPreviewParticles(self.activePreviewParticles)
self.activePreviewParticles = {}
end
function boss_nevermore_requiem_barrage.prototype.fireSoulWave(self, direction, distance, speed, startRadius, endRadius)
local caster = self:GetCaster()
local casterPos = caster:GetAbsOrigin()
local startPos = casterPos + direction * 110
startPos.z = casterPos.z
local velocity = direction * speed
velocity.z = 0
ProjectileManager:CreateLinearProjectile({
Ability = self,
EffectName = "",
vSpawnOrigin = startPos,
fDistance = distance,
fStartRadius = startRadius,
fEndRadius = endRadius,
Source = caster,
bHasFrontalCone = false,
iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY,
iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE,
iUnitTargetType = bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
vVelocity = velocity,
bProvidesVision = false
})
local travelTime = distance / speed
local lineParticle = ParticleManager:CreateParticle("particles/units/heroes/hero_nevermore/nevermore_requiemofsouls_line.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(lineParticle, 0, startPos)
ParticleManager:SetParticleControl(lineParticle, 1, velocity)
ParticleManager:SetParticleControl(
lineParticle,
2,
Vector(0, travelTime, 0)
)
ParticleManager:ReleaseParticleIndex(lineParticle)
end
function boss_nevermore_requiem_barrage.prototype.OnProjectileHit(self, target, _location)
if not target then
return false
end
local caster = self:GetCaster()
local phase = self:getBossPhase()
local baseDamage = caster:GetAverageTrueAttackDamage(target)
local damage = baseDamage * (1 + (phase - 1) * 0.28) * REQUIEM_BARRAGE_DAMAGE_MULT
ApplyDamage({
victim = target,
attacker = caster,
damage = damage,
damage_type = DAMAGE_TYPE_MAGICAL,
ability = self
})
local debuff = target:AddNewModifier(caster, self, modifier_boss_nevermore_requiem_magic_resist_debuff.name, {duration = -1})
if debuff ~= nil then
debuff:SetStackCount(debuff:GetStackCount() + 1)
end
return false
end
boss_nevermore_requiem_barrage = __TS__Decorate(
boss_nevermore_requiem_barrage,
boss_nevermore_requiem_barrage,
{registerAbility(nil)},
{kind = "class", name = "boss_nevermore_requiem_barrage"}
)
____exports.boss_nevermore_requiem_barrage = boss_nevermore_requiem_barrage
modifier_boss_nevermore_requiem_barrage_casting = __TS__Class()
modifier_boss_nevermore_requiem_barrage_casting.name = "modifier_boss_nevermore_requiem_barrage_casting"
modifier_boss_nevermore_requiem_barrage_casting.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_requiem_barrage.lua"
__TS__ClassExtends(modifier_boss_nevermore_requiem_barrage_casting, BaseModifier)
function modifier_boss_nevermore_requiem_barrage_casting.prototype.IsHidden(self)
return true
end
function modifier_boss_nevermore_requiem_barrage_casting.prototype.IsPurgable(self)
return false
end
function modifier_boss_nevermore_requiem_barrage_casting.prototype.CheckState(self)
return {
[MODIFIER_STATE_STUNNED] = false,
[MODIFIER_STATE_DISARMED] = true,
[MODIFIER_STATE_SILENCED] = false,
[MODIFIER_STATE_ROOTED] = true,
[MODIFIER_STATE_COMMAND_RESTRICTED] = true
}
end
modifier_boss_nevermore_requiem_barrage_casting = __TS__Decorate(
modifier_boss_nevermore_requiem_barrage_casting,
modifier_boss_nevermore_requiem_barrage_casting,
{registerModifier(nil)},
{kind = "class", name = "modifier_boss_nevermore_requiem_barrage_casting"}
)
return ____exports
@@ -0,0 +1,431 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__NumberToFixed = ____lualib.__TS__NumberToFixed
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local modifier_boss_nevermore_time_walk
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifierMotionHorizontal = ____dota_ts_adapter.BaseModifierMotionHorizontal
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local DEBUG_TIME_WALK = false
local twDebugNextAt = {}
local function timeWalkDebug(self, tag, message, throttle)
if throttle == nil then
throttle = 0.35
end
if not DEBUG_TIME_WALK then
return
end
local now = GameRules:GetGameTime()
local nextAt = twDebugNextAt[tag] or 0
if now < nextAt then
return
end
twDebugNextAt[tag] = now + throttle
print((("[NevermoreTimeWalk][" .. tag) .. "] ") .. message)
end
____exports.boss_nevermore_time_walk = __TS__Class()
local boss_nevermore_time_walk = ____exports.boss_nevermore_time_walk
boss_nevermore_time_walk.name = "boss_nevermore_time_walk"
boss_nevermore_time_walk.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_time_walk.lua"
__TS__ClassExtends(boss_nevermore_time_walk, BaseAbility)
function boss_nevermore_time_walk.prototype.Precache(self, context)
PrecacheResource("particle", "particles/units/heroes/hero_nevermore/nevermore_shadowraze.vpcf", context)
PrecacheResource("particle", "particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", context)
PrecacheResource("soundfile", "sounds/units/heroes/nevermore/shadowraze.vsnd", context)
PrecacheResource("particle", "particles/units/heroes/hero_faceless_void/faceless_void_time_walk_slow.vpcf", context)
PrecacheResource("particle", "particles/units/heroes/hero_faceless_void/faceless_void_time_walk_preimage.vpcf", context)
PrecacheResource("particle", "particles/units/heroes/hero_faceless_void/faceless_void_time_walk.vpcf", context)
end
function boss_nevermore_time_walk.prototype.GetCastRange(self, _location, _target)
return self:GetSpecialValueFor("range")
end
function boss_nevermore_time_walk.prototype.OnSpellStart(self)
if not IsServer() then
return
end
local caster = self:GetCaster()
if caster:HasModifier(modifier_boss_nevermore_time_walk.name) then
timeWalkDebug(nil, "cast_skip", "already moving, skip recast", 0.2)
return
end
local range = self:GetSpecialValueFor("range")
local speed = math.max(
1,
self:GetSpecialValueFor("speed")
)
local radius = self:GetSpecialValueFor("radius")
local point = self:GetCursorPosition()
local origin = caster:GetAbsOrigin()
local direction = point - origin
local distance = direction:Length2D()
if distance < 1 then
direction = caster:GetForwardVector()
distance = range
else
direction = direction:Normalized()
end
local clampedDistance = math.min(distance, range)
local targetPosition = GetGroundPosition(origin + direction * clampedDistance, nil)
local duration = clampedDistance / speed
timeWalkDebug(
nil,
"cast",
(((("distance=" .. __TS__NumberToFixed(clampedDistance, 0)) .. " duration=") .. __TS__NumberToFixed(duration, 2)) .. " speed=") .. tostring(speed),
0.1
)
EmitSoundOn("Hero_FacelessVoid.TimeWalk", caster)
local startFx = ParticleManager:CreateParticle("particles/units/heroes/hero_faceless_void/faceless_void_time_walk_slow.vpcf", PATTACH_WORLDORIGIN, caster)
ParticleManager:SetParticleControl(startFx, 0, origin)
ParticleManager:SetParticleControl(
startFx,
1,
Vector(radius, 0, 0)
)
ParticleManager:ReleaseParticleIndex(startFx)
local preimageFx = ParticleManager:CreateParticle("particles/units/heroes/hero_faceless_void/faceless_void_time_walk_preimage.vpcf", PATTACH_WORLDORIGIN, caster)
ParticleManager:SetParticleControl(preimageFx, 0, origin)
ParticleManager:SetParticleControl(preimageFx, 1, targetPosition)
ParticleManager:SetParticleControl(preimageFx, 2, targetPosition)
ParticleManager:ReleaseParticleIndex(preimageFx)
caster:AddNewModifier(
caster,
self,
modifier_boss_nevermore_time_walk.name,
{
duration = duration,
target_x = targetPosition.x,
target_y = targetPosition.y,
target_z = targetPosition.z,
speed = speed,
radius = radius,
damage = self:GetSpecialValueFor("damage")
}
)
ProjectileManager:ProjectileDodge(caster)
end
function boss_nevermore_time_walk.prototype.OnProjectileHit(self, target, _location)
if not IsServer() or not target then
return false
end
local caster = self:GetCaster()
if not caster or caster:IsNull() or not caster:IsAlive() then
return false
end
local base = self:GetSpecialValueFor("damage")
local damage = math.max(1, base * 0.35)
ApplyDamage({
victim = target,
attacker = caster,
damage = damage,
damage_type = DAMAGE_TYPE_MAGICAL,
ability = self
})
return false
end
boss_nevermore_time_walk = __TS__Decorate(
boss_nevermore_time_walk,
boss_nevermore_time_walk,
{registerAbility(nil)},
{kind = "class", name = "boss_nevermore_time_walk"}
)
____exports.boss_nevermore_time_walk = boss_nevermore_time_walk
modifier_boss_nevermore_time_walk = __TS__Class()
modifier_boss_nevermore_time_walk.name = "modifier_boss_nevermore_time_walk"
modifier_boss_nevermore_time_walk.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_time_walk.lua"
__TS__ClassExtends(modifier_boss_nevermore_time_walk, BaseModifierMotionHorizontal)
function modifier_boss_nevermore_time_walk.prototype.____constructor(self, ...)
BaseModifierMotionHorizontal.prototype.____constructor(self, ...)
self.direction = Vector(0, 0, 0)
self.remainingDistance = 0
self.speed = 0
self.damage = 0
self.radius = 0
self.coilInterval = 0.25
self.sideWaveInterval = 0.7
self.nextSideWaveAt = 0
self.sideWaveToggle = false
self.maxTargetsPerTick = 8
self.nextCoilSoundAllowedAt = 0
self.coilPulseIndex = 0
end
function modifier_boss_nevermore_time_walk.prototype.IsHidden(self)
return true
end
function modifier_boss_nevermore_time_walk.prototype.IsPurgable(self)
return false
end
function modifier_boss_nevermore_time_walk.prototype.OnCreated(self, params)
if not IsServer() then
return
end
local parent = self:GetParent()
local target = Vector(
params.target_x or parent:GetAbsOrigin().x,
params.target_y or parent:GetAbsOrigin().y,
params.target_z or parent:GetAbsOrigin().z
)
local toTarget = target - parent:GetAbsOrigin()
self.remainingDistance = toTarget:Length2D()
self.direction = self.remainingDistance < 1 and parent:GetForwardVector() or toTarget:Normalized()
local ____math_max_3 = math.max
local ____params_speed_2 = params.speed
if ____params_speed_2 == nil then
local ____opt_0 = self:GetAbility()
____params_speed_2 = ____opt_0 and ____opt_0:GetSpecialValueFor("speed")
end
self.speed = ____math_max_3(1, ____params_speed_2 or 1)
local ____math_max_7 = math.max
local ____params_radius_6 = params.radius
if ____params_radius_6 == nil then
local ____opt_4 = self:GetAbility()
____params_radius_6 = ____opt_4 and ____opt_4:GetSpecialValueFor("radius")
end
self.radius = ____math_max_7(1, ____params_radius_6 or 180)
local ____params_damage_10 = params.damage
if ____params_damage_10 == nil then
local ____opt_8 = self:GetAbility()
____params_damage_10 = ____opt_8 and ____opt_8:GetSpecialValueFor("damage")
end
self.damage = ____params_damage_10 or 0
local ____math_max_13 = math.max
local ____opt_11 = self:GetAbility()
self.coilInterval = ____math_max_13(
0.22,
____opt_11 and ____opt_11:GetSpecialValueFor("coil_interval") or 0.25
)
local ____math_max_16 = math.max
local ____opt_14 = self:GetAbility()
self.sideWaveInterval = ____math_max_16(
0.45,
____opt_14 and ____opt_14:GetSpecialValueFor("side_wave_interval") or 0.7
)
local ____math_max_19 = math.max
local ____opt_17 = self:GetAbility()
self.maxTargetsPerTick = ____math_max_19(
1,
____opt_17 and ____opt_17:GetSpecialValueFor("max_targets_per_tick") or 8
)
local now = GameRules:GetGameTime()
self.nextSideWaveAt = now + self.sideWaveInterval
self.nextCoilSoundAllowedAt = now
timeWalkDebug(
nil,
"start",
(((((("dist=" .. __TS__NumberToFixed(self.remainingDistance, 0)) .. " speed=") .. tostring(self.speed)) .. " coilInt=") .. __TS__NumberToFixed(self.coilInterval, 2)) .. " sideInt=") .. __TS__NumberToFixed(self.sideWaveInterval, 2),
0.1
)
if not self:ApplyHorizontalMotionController() then
self:Destroy()
return
end
self.cachedRequiemAbility = parent:FindAbilityByName("boss_nevermore_requiem_barrage") or nil
self:StartIntervalThink(self.coilInterval)
self:runCoilPulse(now)
end
function modifier_boss_nevermore_time_walk.prototype.OnIntervalThink(self)
if not IsServer() then
return
end
local parent = self:GetParent()
local ability = self:GetAbility()
if not parent or parent:IsNull() or not ability then
return
end
local now = GameRules:GetGameTime()
if now >= self.nextSideWaveAt then
self.nextSideWaveAt = now + self.sideWaveInterval
self.sideWaveToggle = not self.sideWaveToggle
self:fireSideWaves(
parent,
ability,
GetGroundPosition(
parent:GetAbsOrigin(),
nil
),
self.sideWaveToggle
)
timeWalkDebug(nil, "side_waves", "spawn side=" .. (self.sideWaveToggle and "L" or "R"), 0.25)
end
self:runCoilPulse(now)
end
function modifier_boss_nevermore_time_walk.prototype.runCoilPulse(self, now)
local parent = self:GetParent()
local ability = self:GetAbility()
if not parent or parent:IsNull() or not ability then
return
end
local pulsePoint = GetGroundPosition(
parent:GetAbsOrigin(),
nil
)
local enemies = FindUnitsInRadius(
parent:GetTeamNumber(),
pulsePoint,
nil,
self.radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
local targetCount = math.min(#enemies, self.maxTargetsPerTick)
do
local i = 0
while i < targetCount do
local enemy = enemies[i + 1]
ApplyDamage({
victim = enemy,
attacker = parent,
damage = self.damage,
damage_type = DAMAGE_TYPE_MAGICAL,
ability = ability
})
i = i + 1
end
end
self.coilPulseIndex = self.coilPulseIndex + 1
timeWalkDebug(
nil,
"coil_tick",
(("enemies=" .. tostring(#enemies)) .. " applied=") .. tostring(targetCount),
0.25
)
if now >= self.nextCoilSoundAllowedAt then
self.nextCoilSoundAllowedAt = now + 0.45
EmitSoundOnLocationWithCaster(pulsePoint, "Hero_Nevermore.Shadowraze", parent)
end
if self.coilPulseIndex % 2 == 0 then
local hitParticle = ParticleManager:CreateParticle("particles/units/heroes/hero_nevermore/nevermore_shadowraze.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(hitParticle, 0, pulsePoint)
ParticleManager:SetParticleControl(
hitParticle,
1,
Vector(self.radius, 1, 1)
)
ParticleManager:ReleaseParticleIndex(hitParticle)
else
local aoeFx = ParticleManager:CreateParticle("particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", PATTACH_CUSTOMORIGIN, parent)
ParticleManager:SetParticleControl(aoeFx, 0, pulsePoint)
ParticleManager:SetParticleControl(
aoeFx,
1,
Vector(self.radius, 0, 0)
)
ParticleManager:SetParticleControl(
aoeFx,
2,
Vector(5, 0, 1)
)
ParticleManager:SetParticleControl(
aoeFx,
3,
Vector(200, 50, 0)
)
ParticleManager:SetParticleControl(aoeFx, 4, pulsePoint)
ParticleManager:ReleaseParticleIndex(aoeFx)
end
end
function modifier_boss_nevermore_time_walk.prototype.fireSideWaves(self, caster, sourceAbility, origin, fireLeft)
local requiem = self.cachedRequiemAbility
if not requiem or requiem:IsNull() then
requiem = caster:FindAbilityByName("boss_nevermore_requiem_barrage") or nil
self.cachedRequiemAbility = requiem
end
local distance = requiem and not requiem:IsNull() and math.max(
200,
requiem:GetSpecialValueFor("wave_distance") or 900
) or 900
local waveSpeed = requiem and not requiem:IsNull() and math.max(
200,
requiem:GetSpecialValueFor("wave_speed") or 700
) or 700
local startRadius = requiem and not requiem:IsNull() and math.max(
10,
requiem:GetSpecialValueFor("wave_width_start") or 45
) or 45
local endRadius = requiem and not requiem:IsNull() and math.max(
10,
requiem:GetSpecialValueFor("wave_width_end") or 45
) or 45
local dir = fireLeft and Vector(-self.direction.y, self.direction.x, 0):Normalized() or Vector(self.direction.y, -self.direction.x, 0):Normalized()
local startPos = origin + dir * 80
startPos.z = origin.z
local velocity = dir * waveSpeed
velocity.z = 0
ProjectileManager:CreateLinearProjectile({
Ability = sourceAbility,
EffectName = "",
vSpawnOrigin = startPos,
fDistance = distance,
fStartRadius = startRadius,
fEndRadius = endRadius,
Source = caster,
bHasFrontalCone = false,
iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY,
iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE,
iUnitTargetType = bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
vVelocity = velocity,
bProvidesVision = false
})
end
function modifier_boss_nevermore_time_walk.prototype.OnDestroy(self)
if not IsServer() then
return
end
local parent = self:GetParent()
parent:RemoveHorizontalMotionController(self)
FindClearSpaceForUnit(
parent,
parent:GetAbsOrigin(),
true
)
parent:StartGesture(ACT_DOTA_CAST_ABILITY_1_END)
timeWalkDebug(nil, "end", "modifier destroyed", 0.1)
end
function modifier_boss_nevermore_time_walk.prototype.UpdateHorizontalMotion(self, me, dt)
if not IsServer() then
return
end
local step = self.speed * dt
if self.remainingDistance > 0 then
local oldPos = me:GetAbsOrigin()
local nextPos = GetGroundPosition(
oldPos + self.direction * math.min(step, self.remainingDistance),
nil
)
me:SetAbsOrigin(nextPos)
self.remainingDistance = self.remainingDistance - step
return
end
self:Destroy()
end
function modifier_boss_nevermore_time_walk.prototype.OnHorizontalMotionInterrupted(self)
if not IsServer() then
return
end
self:Destroy()
end
function modifier_boss_nevermore_time_walk.prototype.CheckState(self)
return {[MODIFIER_STATE_COMMAND_RESTRICTED] = true, [MODIFIER_STATE_NO_UNIT_COLLISION] = true, [MODIFIER_STATE_FLYING_FOR_PATHING_PURPOSES_ONLY] = true}
end
function modifier_boss_nevermore_time_walk.prototype.GetEffectName(self)
return "particles/units/heroes/hero_faceless_void/faceless_void_time_walk.vpcf"
end
function modifier_boss_nevermore_time_walk.prototype.GetStatusEffectName(self)
return "particles/status_fx/status_effect_abaddon_borrowed_time.vpcf"
end
function modifier_boss_nevermore_time_walk.prototype.StatusEffectPriority(self)
return 10
end
modifier_boss_nevermore_time_walk = __TS__Decorate(
modifier_boss_nevermore_time_walk,
modifier_boss_nevermore_time_walk,
{registerModifier(nil)},
{kind = "class", name = "modifier_boss_nevermore_time_walk"}
)
return ____exports
@@ -0,0 +1,382 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local modifier_boss_nevermore_triple_coil_aoe_lock
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local ____modifier_boss_nevermore_coil_debuff = require("abilities.creep.modifier_boss_nevermore_coil_debuff")
local modifier_boss_nevermore_coil_debuff = ____modifier_boss_nevermore_coil_debuff.modifier_boss_nevermore_coil_debuff
____exports.boss_nevermore_triple_coil_aoe = __TS__Class()
local boss_nevermore_triple_coil_aoe = ____exports.boss_nevermore_triple_coil_aoe
boss_nevermore_triple_coil_aoe.name = "boss_nevermore_triple_coil_aoe"
boss_nevermore_triple_coil_aoe.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_triple_coil_aoe.lua"
__TS__ClassExtends(boss_nevermore_triple_coil_aoe, BaseAbility)
function boss_nevermore_triple_coil_aoe.prototype.Precache(self, context)
PrecacheResource("particle", "particles/units/heroes/hero_nevermore/nevermore_shadowraze.vpcf", context)
PrecacheResource("particle", "particles/darkmoon_creep_warning.vpcf", context)
PrecacheResource("particle", "particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", context)
PrecacheResource("soundfile", "sounds/units/heroes/nevermore/shadowraze.vsnd", context)
end
function boss_nevermore_triple_coil_aoe.prototype.GetAOERadius(self)
return self:GetSpecialValueFor("radius")
end
function boss_nevermore_triple_coil_aoe.prototype.getSpecialOrDefault(self, name, fallback)
local value = self:GetSpecialValueFor(name)
if not value or value <= 0 then
return fallback
end
return value
end
function boss_nevermore_triple_coil_aoe.prototype.getBossPhase(self)
local caster = self:GetCaster()
if not caster or caster:IsNull() then
return 1
end
local hp = caster:GetHealthPercent()
if hp <= 25 then
return 4
end
if hp <= 50 then
return 3
end
if hp <= 75 then
return 2
end
return 1
end
function boss_nevermore_triple_coil_aoe.prototype.getConfiguredDelay(self)
local delay = self:GetSpecialValueFor("delay")
local startDelay = self:GetSpecialValueFor("start_delay")
local best = math.max(delay or 0, startDelay or 0)
if best > 0 then
return best
end
return ____exports.boss_nevermore_triple_coil_aoe.DEFAULT_DELAY
end
function boss_nevermore_triple_coil_aoe.prototype.buildCoilPoints(self, centerPoint, forward, sideDir)
local sideOffset = self:getSpecialOrDefault("side_offset", ____exports.boss_nevermore_triple_coil_aoe.DEFAULT_SIDE_OFFSET)
local forwardOffset = self:getSpecialOrDefault("forward_offset", ____exports.boss_nevermore_triple_coil_aoe.DEFAULT_FORWARD_OFFSET)
local leftPoint = GetGroundPosition(centerPoint + sideDir * sideOffset, nil)
local rightPoint = GetGroundPosition(centerPoint - sideDir * sideOffset, nil)
local frontPoint = GetGroundPosition(centerPoint + forward * forwardOffset, nil)
local backPoint = GetGroundPosition(centerPoint - forward * forwardOffset, nil)
return {
centerPoint,
leftPoint,
rightPoint,
frontPoint,
backPoint
}
end
function boss_nevermore_triple_coil_aoe.prototype.getCoilRadiusForPhase(self, phase)
return self:getSpecialOrDefault("coil_radius", ____exports.boss_nevermore_triple_coil_aoe.DEFAULT_COIL_RADIUS) + (phase - 1) * 15
end
function boss_nevermore_triple_coil_aoe.prototype.randomPointNearHero(self, heroOrigin, minDist, maxDist)
local angleDeg = RandomFloat(0, 360)
local dist = RandomFloat(minDist, maxDist)
local rad = angleDeg * math.pi / 180
local ox = math.cos(rad) * dist
local oy = math.sin(rad) * dist
return GetGroundPosition(
heroOrigin + Vector(ox, oy, 0),
nil
)
end
function boss_nevermore_triple_coil_aoe.prototype.spawnAoeAtPoint(self, centerPoint, phase, lockDuration, delayOverride)
local caster = self:GetCaster()
local castOrigin = caster:GetAbsOrigin()
local toCenter = centerPoint - castOrigin
local forward = toCenter:Length2D() < 1 and caster:GetForwardVector() or toCenter:Normalized()
local sideDir = Vector(-forward.y, forward.x, 0):Normalized()
local delay = delayOverride ~= nil and delayOverride or self:getConfiguredDelay()
local warningTime = self:getSpecialOrDefault("precast_warning_time", delay)
local coilRadius = self:getCoilRadiusForPhase(phase)
local coilPoints = self:buildCoilPoints(centerPoint, forward, sideDir)
caster:AddNewModifier(caster, self, modifier_boss_nevermore_triple_coil_aoe_lock.name, {duration = lockDuration})
local warningParticles = {}
for ____, coilPoint in ipairs(coilPoints) do
warningParticles[#warningParticles + 1] = self:createWarning(coilPoint, coilRadius, warningTime)
end
Timers:CreateTimer(
delay,
function()
for ____, ____value in ipairs(warningParticles) do
local warningParticle = ____value[1]
local aoeParticle = ____value[2]
ParticleManager:DestroyParticle(warningParticle, true)
ParticleManager:ReleaseParticleIndex(warningParticle)
ParticleManager:DestroyParticle(aoeParticle, true)
ParticleManager:ReleaseParticleIndex(aoeParticle)
end
local impactPhase = self:getBossPhase()
local baseDamage = caster:GetAttackDamage()
local bonusDamagePerStack = self:GetSpecialValueFor("coil_stack_bonus_damage")
local damageMultiplier = 1 + (impactPhase - 1) * 0.3
EmitSoundOn("Hero_Nevermore.Shadowraze", caster)
for ____, coilPoint in ipairs(coilPoints) do
self:applyMiniCoil(
coilPoint,
coilRadius,
baseDamage,
bonusDamagePerStack,
damageMultiplier
)
end
return nil
end
)
end
function boss_nevermore_triple_coil_aoe.prototype.scheduleHeroProximityCoils(self, phase, mainHitDelay, lockDuration)
if not IsServer() or phase < 1 then
return
end
local caster = self:GetCaster()
if not caster or caster:IsNull() then
return
end
local minD = self:getSpecialOrDefault("hero_coil_radius_min", ____exports.boss_nevermore_triple_coil_aoe.DEFAULT_HERO_RING_MIN)
local maxD = self:getSpecialOrDefault("hero_coil_radius_max", ____exports.boss_nevermore_triple_coil_aoe.DEFAULT_HERO_RING_MAX)
local stagger = self:getSpecialOrDefault("hero_coil_stagger", ____exports.boss_nevermore_triple_coil_aoe.DEFAULT_HERO_COIL_STAGGER)
local afterMain = self:getSpecialOrDefault("hero_coil_start_after_main", ____exports.boss_nevermore_triple_coil_aoe.DEFAULT_HERO_COIL_AFTER_MAIN)
local warningTime = self:getSpecialOrDefault("precast_warning_time", mainHitDelay)
local coilRadius = self:getCoilRadiusForPhase(phase)
local heroes = FindUnitsInRadius(
caster:GetTeamNumber(),
caster:GetAbsOrigin(),
nil,
____exports.boss_nevermore_triple_coil_aoe.HERO_SEARCH_RADIUS,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO,
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
local slot = 0
for ____, hero in ipairs(heroes) do
do
if not hero or hero:IsNull() or not hero:IsAlive() then
goto __continue27
end
local heroGround = GetGroundPosition(
hero:GetAbsOrigin(),
nil
)
do
local j = 0
while j < phase do
local coilPos = self:randomPointNearHero(heroGround, minD, maxD)
local hitTime = mainHitDelay + afterMain + slot * stagger
slot = slot + 1
self:spawnDelayedSingleCoil(
coilPos,
hitTime,
warningTime,
coilRadius,
lockDuration
)
j = j + 1
end
end
end
::__continue27::
end
end
function boss_nevermore_triple_coil_aoe.prototype.spawnDelayedSingleCoil(self, coilPoint, hitTime, warningTime, coilRadius, _lockDuration)
local caster = self:GetCaster()
local warnAt = math.max(0, hitTime - warningTime)
local state = {pair = nil}
Timers:CreateTimer(
warnAt,
function()
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
state.pair = self:createWarning(coilPoint, coilRadius, warningTime)
return nil
end
)
Timers:CreateTimer(
hitTime,
function()
if state.pair then
ParticleManager:DestroyParticle(state.pair[1], true)
ParticleManager:ReleaseParticleIndex(state.pair[1])
ParticleManager:DestroyParticle(state.pair[2], true)
ParticleManager:ReleaseParticleIndex(state.pair[2])
state.pair = nil
end
if not caster or caster:IsNull() or not caster:IsAlive() then
return nil
end
local impactPhase = self:getBossPhase()
local baseDamage = caster:GetAttackDamage()
local bonusDamagePerStack = self:GetSpecialValueFor("coil_stack_bonus_damage")
local damageMultiplier = 1 + (impactPhase - 1) * 0.3
self:applyMiniCoil(
coilPoint,
coilRadius,
baseDamage,
bonusDamagePerStack,
damageMultiplier
)
return nil
end
)
end
function boss_nevermore_triple_coil_aoe.prototype.OnSpellStart(self)
if not IsServer() then
return
end
local phase = self:getBossPhase()
local centerPoint = GetGroundPosition(
self:GetCursorPosition(),
nil
)
local mainDelay = self:getConfiguredDelay()
local stagger = self:getSpecialOrDefault("hero_coil_stagger", ____exports.boss_nevermore_triple_coil_aoe.DEFAULT_HERO_COIL_STAGGER)
local afterMain = self:getSpecialOrDefault("hero_coil_start_after_main", ____exports.boss_nevermore_triple_coil_aoe.DEFAULT_HERO_COIL_AFTER_MAIN)
local caster = self:GetCaster()
local heroes = FindUnitsInRadius(
caster:GetTeamNumber(),
caster:GetAbsOrigin(),
nil,
____exports.boss_nevermore_triple_coil_aoe.HERO_SEARCH_RADIUS,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO,
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
local heroCount = 0
for ____, h in ipairs(heroes) do
if h and not h:IsNull() and h:IsAlive() then
heroCount = heroCount + 1
end
end
local extraCoils = heroCount * phase
local lastHeroCoilTime = extraCoils > 0 and mainDelay + afterMain + (extraCoils - 1) * stagger or mainDelay
local lockDuration = lastHeroCoilTime + 0.55
self:spawnAoeAtPoint(centerPoint, phase, lockDuration)
self:scheduleHeroProximityCoils(phase, mainDelay, lockDuration)
end
function boss_nevermore_triple_coil_aoe.prototype.createWarning(self, point, radius, _duration)
if not IsServer() then
return {-1, -1}
end
local caster = self:GetCaster()
local warningParticle = ParticleManager:CreateParticle("particles/darkmoon_creep_warning.vpcf", PATTACH_CUSTOMORIGIN, caster)
local aoeParticle = ParticleManager:CreateParticle("particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(warningParticle, 0, point)
ParticleManager:SetParticleControl(
warningParticle,
1,
Vector(radius, 100, 100)
)
ParticleManager:SetParticleControl(aoeParticle, 0, point)
ParticleManager:SetParticleControl(
aoeParticle,
1,
Vector(radius, 0, 0)
)
ParticleManager:SetParticleControl(
aoeParticle,
2,
Vector(6, 0, 1)
)
ParticleManager:SetParticleControl(
aoeParticle,
3,
Vector(220, 0, 0)
)
ParticleManager:SetParticleControl(aoeParticle, 4, point)
return {warningParticle, aoeParticle}
end
function boss_nevermore_triple_coil_aoe.prototype.applyMiniCoil(self, point, radius, baseDamage, bonusDamagePerStack, damageMultiplier)
if not IsServer() then
return
end
local caster = self:GetCaster()
if not caster or caster:IsNull() or not caster:IsAlive() then
return
end
local enemies = FindUnitsInRadius(
caster:GetTeamNumber(),
point,
nil,
radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
for ____, enemy in ipairs(enemies) do
local coilDebuff = enemy:FindModifierByName(modifier_boss_nevermore_coil_debuff.name)
local stacks = coilDebuff and coilDebuff:GetStackCount() or 0
local damage = (baseDamage + stacks * bonusDamagePerStack) * damageMultiplier
ApplyDamage({
victim = enemy,
attacker = caster,
damage = damage,
damage_type = DAMAGE_TYPE_MAGICAL,
ability = self
})
local updatedDebuff = enemy:AddNewModifier(caster, self, modifier_boss_nevermore_coil_debuff.name, {})
if updatedDebuff ~= nil then
if stacks > 0 then
updatedDebuff:SetStackCount(stacks + 1)
else
updatedDebuff:SetStackCount(1)
end
end
end
local hitParticle = ParticleManager:CreateParticle("particles/units/heroes/hero_nevermore/nevermore_shadowraze.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(hitParticle, 0, point)
ParticleManager:SetParticleControl(
hitParticle,
1,
Vector(radius, 1, 1)
)
ParticleManager:ReleaseParticleIndex(hitParticle)
end
boss_nevermore_triple_coil_aoe.DEFAULT_DELAY = 2
boss_nevermore_triple_coil_aoe.DEFAULT_SIDE_OFFSET = 170
boss_nevermore_triple_coil_aoe.DEFAULT_FORWARD_OFFSET = 170
boss_nevermore_triple_coil_aoe.DEFAULT_COIL_RADIUS = 120
boss_nevermore_triple_coil_aoe.DEFAULT_HERO_RING_MIN = 100
boss_nevermore_triple_coil_aoe.DEFAULT_HERO_RING_MAX = 200
boss_nevermore_triple_coil_aoe.DEFAULT_HERO_COIL_STAGGER = 0.32
boss_nevermore_triple_coil_aoe.DEFAULT_HERO_COIL_AFTER_MAIN = 0.45
boss_nevermore_triple_coil_aoe.HERO_SEARCH_RADIUS = 3200
boss_nevermore_triple_coil_aoe = __TS__Decorate(
boss_nevermore_triple_coil_aoe,
boss_nevermore_triple_coil_aoe,
{registerAbility(nil)},
{kind = "class", name = "boss_nevermore_triple_coil_aoe"}
)
____exports.boss_nevermore_triple_coil_aoe = boss_nevermore_triple_coil_aoe
modifier_boss_nevermore_triple_coil_aoe_lock = __TS__Class()
modifier_boss_nevermore_triple_coil_aoe_lock.name = "modifier_boss_nevermore_triple_coil_aoe_lock"
modifier_boss_nevermore_triple_coil_aoe_lock.____file_path = "scripts/vscripts/abilities/creep/boss_nevermore_triple_coil_aoe.lua"
__TS__ClassExtends(modifier_boss_nevermore_triple_coil_aoe_lock, BaseModifier)
function modifier_boss_nevermore_triple_coil_aoe_lock.prototype.IsHidden(self)
return true
end
function modifier_boss_nevermore_triple_coil_aoe_lock.prototype.IsPurgable(self)
return false
end
function modifier_boss_nevermore_triple_coil_aoe_lock.prototype.CheckState(self)
return {[MODIFIER_STATE_DISARMED] = true}
end
modifier_boss_nevermore_triple_coil_aoe_lock = __TS__Decorate(
modifier_boss_nevermore_triple_coil_aoe_lock,
modifier_boss_nevermore_triple_coil_aoe_lock,
{registerModifier(nil)},
{kind = "class", name = "modifier_boss_nevermore_triple_coil_aoe_lock"}
)
return ____exports
@@ -0,0 +1,468 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____difficulty_manager = require("difficulty_manager")
local Difficulty = ____difficulty_manager.Difficulty
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local BaseModifierMotionBoth = ____dota_ts_adapter.BaseModifierMotionBoth
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
--- Та же физика дуги, что у `frogmen_acid_jump` / `modifier_acid_blob_jump`.
local CONTRACT_HEAD_LEAP_MIN_HEIGHT_ABOVE_LOWEST = 400
local CONTRACT_HEAD_LEAP_MIN_HEIGHT_ABOVE_HIGHEST = 200
local CONTRACT_HEAD_LEAP_ACCELERATION_Z = 1500
local CONTRACT_HEAD_LEAP_MAX_HORIZONTAL_ACCELERATION = 1500
--- Пассивка контракта: прыжок дугой к точке, где стоял герой; урон только если к моменту приземления он не ушёл из зоны.
____exports.contract_head_leap = __TS__Class()
local contract_head_leap = ____exports.contract_head_leap
contract_head_leap.name = "contract_head_leap"
contract_head_leap.____file_path = "scripts/vscripts/abilities/creep/contract_head_leap.lua"
__TS__ClassExtends(contract_head_leap, BaseAbility)
function contract_head_leap.prototype.Precache(self, context)
PrecacheResource("particle", "particles/generic_gameplay/generic_hit_blood.vpcf", context)
PrecacheResource("particle", "particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", context)
PrecacheResource("particle", "particles/econ/events/darkmoon_2017/darkmoon_calldown_marker_arrows.vpcf", context)
end
function contract_head_leap.prototype.GetIntrinsicModifierName(self)
return "modifier_contract_head_leap_passive"
end
function contract_head_leap.prototype.showLeapPrecastVisuals(self, caster, strikeGround, damageRadius, warningDuration)
if not IsServer() or warningDuration <= 0 then
return
end
local groundPos = GetGroundPosition(strikeGround, nil)
local r = math.max(1, damageRadius)
local particleAoe = ParticleManager:CreateParticle("particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf", PATTACH_CUSTOMORIGIN, nil)
if particleAoe ~= nil then
ParticleManager:SetParticleControl(particleAoe, 0, groundPos)
ParticleManager:SetParticleControl(
particleAoe,
1,
Vector(r, 0, 0)
)
ParticleManager:SetParticleControl(
particleAoe,
2,
Vector(6, 0, 1)
)
ParticleManager:SetParticleControl(
particleAoe,
3,
Vector(200, 0, 0)
)
ParticleManager:SetParticleControl(particleAoe, 4, groundPos)
Timers:CreateTimer(
warningDuration,
function()
ParticleManager:DestroyParticle(particleAoe, false)
ParticleManager:ReleaseParticleIndex(particleAoe)
end
)
end
local casterPos = GetGroundPosition(
caster:GetAbsOrigin(),
nil
)
local particleArrow = ParticleManager:CreateParticle("particles/econ/events/darkmoon_2017/darkmoon_calldown_marker_arrows.vpcf", PATTACH_CUSTOMORIGIN, nil)
if particleArrow ~= nil then
ParticleManager:SetParticleControl(particleArrow, 0, casterPos)
ParticleManager:SetParticleControl(particleArrow, 1, groundPos)
ParticleManager:SetParticleControl(
particleArrow,
2,
Vector(warningDuration, 0, 0)
)
Timers:CreateTimer(
warningDuration,
function()
ParticleManager:DestroyParticle(particleArrow, false)
ParticleManager:ReleaseParticleIndex(particleArrow)
end
)
end
end
function contract_head_leap.prototype.performLeapLanding(self, heroEntIndex, strikeGround)
if not IsServer() then
return
end
local creep = self:GetCaster()
if not creep or not IsValidEntity(creep) or not creep:IsAlive() then
return
end
local hero = EntIndexToHScript(heroEntIndex)
local hitRadius = math.max(
0,
self:GetSpecialValueFor("damage_radius")
)
local hpos = hero and IsValidEntity(hero) and hero:IsAlive() and hero:GetAbsOrigin() or nil
local inZone = false
if hpos ~= nil then
local dx = hpos.x - strikeGround.x
local dy = hpos.y - strikeGround.y
inZone = math.sqrt(dx * dx + dy * dy) <= hitRadius
end
if hero and IsValidEntity(hero) and hero:IsAlive() and not hero:IsInvulnerable() and inZone then
local scale = Difficulty:getNpcStatScale()
local flatDamage = math.max(
1,
math.floor(self:GetSpecialValueFor("leap_damage") * scale + 0.5)
)
local pctFromAttack = math.max(
0,
self:GetSpecialValueFor("damage_from_attack_pct")
)
local avgAtk = creep:GetAverageTrueAttackDamage(hero)
local fromAttack = math.floor(avgAtk * (pctFromAttack / 100) * scale + 0.5)
local totalDamage = flatDamage + fromAttack
ApplyDamage({
victim = hero,
attacker = creep,
damage = totalDamage,
damage_type = DAMAGE_TYPE_PHYSICAL,
ability = self
})
local hitFx = ParticleManager:CreateParticle("particles/generic_gameplay/generic_hit_blood.vpcf", PATTACH_CUSTOMORIGIN, nil)
ParticleManager:SetParticleControlEnt(
hitFx,
0,
hero,
PATTACH_POINT_FOLLOW,
"attach_hitloc",
hero:GetAbsOrigin(),
true
)
ParticleManager:ReleaseParticleIndex(hitFx)
EmitSoundOn("Hero_MonkeyKing.Spring.Channel", creep)
end
end
contract_head_leap = __TS__Decorate(
contract_head_leap,
contract_head_leap,
{registerAbility(nil)},
{kind = "class", name = "contract_head_leap"}
)
____exports.contract_head_leap = contract_head_leap
____exports.modifier_contract_head_leap_passive = __TS__Class()
local modifier_contract_head_leap_passive = ____exports.modifier_contract_head_leap_passive
modifier_contract_head_leap_passive.name = "modifier_contract_head_leap_passive"
modifier_contract_head_leap_passive.____file_path = "scripts/vscripts/abilities/creep/contract_head_leap.lua"
__TS__ClassExtends(modifier_contract_head_leap_passive, BaseModifier)
function modifier_contract_head_leap_passive.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.precastLockUntil = -1
end
function modifier_contract_head_leap_passive.prototype.IsHidden(self)
return true
end
function modifier_contract_head_leap_passive.prototype.IsDebuff(self)
return false
end
function modifier_contract_head_leap_passive.prototype.IsPurgable(self)
return false
end
function modifier_contract_head_leap_passive.prototype.OnCreated(self)
if not IsServer() then
return
end
local ability = self:GetAbility()
local interval = ability and math.max(
0.35,
ability:GetSpecialValueFor("leap_interval")
) or 2.4
self:StartIntervalThink(interval)
end
function modifier_contract_head_leap_passive.prototype.OnRefresh(self)
if not IsServer() then
return
end
local ability = self:GetAbility()
local interval = ability and math.max(
0.35,
ability:GetSpecialValueFor("leap_interval")
) or 2.4
self:StartIntervalThink(interval)
end
function modifier_contract_head_leap_passive.prototype.OnIntervalThink(self)
if not IsServer() then
return
end
local parent = self:GetParent()
local ability = self:GetAbility()
if not ability or not IsValidEntity(parent) or not parent:IsAlive() or parent:IsStunned() or parent:IsHexed() then
return
end
local now = GameRules:GetDOTATime(false, false)
if now < self.precastLockUntil then
return
end
local primary = parent:FindAbilityByName("contract_head_leap")
if not primary or primary ~= ability then
return
end
if parent:HasModifier("modifier_contract_head_leap_arc") then
return
end
local radius = math.max(
50,
ability:GetSpecialValueFor("search_radius")
)
local heroes = FindUnitsInRadius(
parent:GetTeamNumber(),
parent:GetAbsOrigin(),
nil,
radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO,
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_CLOSEST,
false
)
local hero
for ____, u in ipairs(heroes) do
do
if not u or not IsValidEntity(u) or not u:IsAlive() or not u:IsHero() then
goto __continue28
end
if not u:IsRealHero() then
goto __continue28
end
if u:IsInvulnerable() then
goto __continue28
end
if u:GetUnitName() == "npc_homer" then
goto __continue28
end
hero = u
break
end
::__continue28::
end
if not hero then
return
end
local height = math.max(
40,
ability:GetSpecialValueFor("height_above_hero")
)
local strikeGround = GetGroundPosition(
hero:GetAbsOrigin(),
hero
)
local headPos = Vector(strikeGround.x, strikeGround.y, strikeGround.z + height)
local warningTime = math.max(
0,
ability:GetSpecialValueFor("precast_warning_time")
)
local dmgRadius = math.max(
1,
ability:GetSpecialValueFor("damage_radius")
)
local arcPayload = {
vLocX = headPos.x,
vLocY = headPos.y,
vLocZ = headPos.z,
strikeX = strikeGround.x,
strikeY = strikeGround.y,
strikeZ = strikeGround.z,
hero_ei = hero:entindex()
}
if warningTime > 0 then
self.precastLockUntil = now + warningTime
ability:showLeapPrecastVisuals(parent, strikeGround, dmgRadius, warningTime)
local ____self = self
Timers:CreateTimer(
warningTime,
function()
____self.precastLockUntil = -1
if not IsServer() then
return
end
if not IsValidEntity(parent) or not parent:IsAlive() then
return
end
if parent:HasModifier("modifier_contract_head_leap_arc") then
return
end
local ab = parent:FindAbilityByName("contract_head_leap")
if not ab then
return
end
parent:AddNewModifier(parent, ab, "modifier_contract_head_leap_arc", arcPayload)
end
)
else
parent:AddNewModifier(parent, ability, "modifier_contract_head_leap_arc", arcPayload)
end
end
modifier_contract_head_leap_passive = __TS__Decorate(
modifier_contract_head_leap_passive,
modifier_contract_head_leap_passive,
{registerModifier(nil)},
{kind = "class", name = "modifier_contract_head_leap_passive"}
)
____exports.modifier_contract_head_leap_passive = modifier_contract_head_leap_passive
____exports.modifier_contract_head_leap_arc = __TS__Class()
local modifier_contract_head_leap_arc = ____exports.modifier_contract_head_leap_arc
modifier_contract_head_leap_arc.name = "modifier_contract_head_leap_arc"
modifier_contract_head_leap_arc.____file_path = "scripts/vscripts/abilities/creep/contract_head_leap.lua"
__TS__ClassExtends(modifier_contract_head_leap_arc, BaseModifierMotionBoth)
function modifier_contract_head_leap_arc.prototype.____constructor(self, ...)
BaseModifierMotionBoth.prototype.____constructor(self, ...)
self.bHorizontalMotionInterrupted = false
self.flCurrentTimeHoriz = 0
self.flCurrentTimeVert = 0
self.flInitialVelocityZ = 0
self.flPredictedTotalTime = 0
end
function modifier_contract_head_leap_arc.prototype.IsHidden(self)
return true
end
function modifier_contract_head_leap_arc.prototype.IsPurgable(self)
return false
end
function modifier_contract_head_leap_arc.prototype.RemoveOnDeath(self)
return true
end
function modifier_contract_head_leap_arc.prototype.OnCreated(self, params)
if not IsServer() then
return
end
local parent = self:GetParent()
local ability = self:GetAbility()
if not parent or not ability then
self:Destroy()
return
end
local hx = params.hero_ei
if hx == nil or hx == nil then
self:Destroy()
return
end
self.heroEntIndex = hx
local sx = params.strikeX or parent:GetOrigin().x
local sy = params.strikeY or parent:GetOrigin().y
local sz = params.strikeZ or parent:GetOrigin().z
self.strikeGround = Vector(sx, sy, sz)
self.bHorizontalMotionInterrupted = false
if not self:ApplyHorizontalMotionController() or not self:ApplyVerticalMotionController() then
self:Destroy()
return
end
self.vStartPosition = GetGroundPosition(
parent:GetOrigin(),
parent
)
self.flCurrentTimeHoriz = 0
self.flCurrentTimeVert = 0
local x = params.vLocX or parent:GetOrigin().x
local y = params.vLocY or parent:GetOrigin().y
local z = params.vLocZ or parent:GetOrigin().z
self.vLoc = Vector(x, y, z)
self.vLastKnownTargetPos = self.vLoc
local duration = math.max(
0.08,
ability:GetSpecialValueFor("jump_duration")
)
local flDesiredHeight = CONTRACT_HEAD_LEAP_MIN_HEIGHT_ABOVE_LOWEST * duration * duration
local flLowZ = math.min(self.vLastKnownTargetPos.z, self.vStartPosition.z)
local flHighZ = math.max(self.vLastKnownTargetPos.z, self.vStartPosition.z)
local flArcTopZ = math.max(flLowZ + flDesiredHeight, flHighZ + CONTRACT_HEAD_LEAP_MIN_HEIGHT_ABOVE_HIGHEST)
local flArcDeltaZ = flArcTopZ - self.vStartPosition.z
self.flInitialVelocityZ = math.sqrt(2 * flArcDeltaZ * CONTRACT_HEAD_LEAP_ACCELERATION_Z)
local flDeltaZ = self.vLastKnownTargetPos.z - self.vStartPosition.z
local flSqrtDet = math.sqrt(math.max(0, self.flInitialVelocityZ * self.flInitialVelocityZ - 2 * CONTRACT_HEAD_LEAP_ACCELERATION_Z * flDeltaZ))
self.flPredictedTotalTime = math.max((self.flInitialVelocityZ + flSqrtDet) / CONTRACT_HEAD_LEAP_ACCELERATION_Z, (self.flInitialVelocityZ - flSqrtDet) / CONTRACT_HEAD_LEAP_ACCELERATION_Z)
self.vHorizontalVelocity = (self.vLastKnownTargetPos - self.vStartPosition) / self.flPredictedTotalTime
self.vHorizontalVelocity.z = 0
end
function modifier_contract_head_leap_arc.prototype.OnDestroy(self)
if not IsServer() then
return
end
local parent = self:GetParent()
if parent ~= nil then
parent:RemoveHorizontalMotionController(self)
parent:RemoveVerticalMotionController(self)
end
end
function modifier_contract_head_leap_arc.prototype.CheckState(self)
return {[MODIFIER_STATE_STUNNED] = true, [MODIFIER_STATE_UNSELECTABLE] = true}
end
function modifier_contract_head_leap_arc.prototype.UpdateHorizontalMotion(self, me, dt)
if not IsServer() then
return
end
self.flCurrentTimeHoriz = math.min(self.flCurrentTimeHoriz + dt, self.flPredictedTotalTime)
local t = self.flCurrentTimeHoriz / self.flPredictedTotalTime
local vStartToTarget = self.vLastKnownTargetPos - self.vStartPosition
local vDesiredPos = self.vStartPosition + vStartToTarget * t
local vOldPos = me:GetOrigin()
local vToDesired = vDesiredPos - vOldPos
vToDesired.z = 0
local vDesiredVel = vToDesired / dt
local vVelDif = vDesiredVel - self.vHorizontalVelocity
local flVelDif = vVelDif:Length2D()
vVelDif = vVelDif:Normalized()
local flVelDelta = math.min(flVelDif, CONTRACT_HEAD_LEAP_MAX_HORIZONTAL_ACCELERATION)
self.vHorizontalVelocity = self.vHorizontalVelocity + vVelDif * flVelDelta * dt
local vNewPos = vOldPos + self.vHorizontalVelocity * dt
me:SetOrigin(vNewPos)
end
function modifier_contract_head_leap_arc.prototype.UpdateVerticalMotion(self, me, dt)
if not IsServer() then
return
end
self.flCurrentTimeVert = self.flCurrentTimeVert + dt
local bGoingDown = -CONTRACT_HEAD_LEAP_ACCELERATION_Z * self.flCurrentTimeVert + self.flInitialVelocityZ < 0
local vNewPos = me:GetOrigin()
vNewPos.z = self.vStartPosition.z + (-0.5 * CONTRACT_HEAD_LEAP_ACCELERATION_Z * self.flCurrentTimeVert * self.flCurrentTimeVert + self.flInitialVelocityZ * self.flCurrentTimeVert)
local flGroundHeight = GetGroundHeight(
vNewPos,
self:GetParent()
)
local bLanded = false
if vNewPos.z < flGroundHeight and bGoingDown then
vNewPos.z = flGroundHeight
bLanded = true
end
me:SetOrigin(vNewPos)
if bLanded then
if not self.bHorizontalMotionInterrupted then
local ability = self:GetAbility()
if ability then
ability:performLeapLanding(self.heroEntIndex, self.strikeGround)
end
end
self:Destroy()
end
end
function modifier_contract_head_leap_arc.prototype.OnHorizontalMotionInterrupted(self)
if not IsServer() then
return
end
self.bHorizontalMotionInterrupted = true
end
function modifier_contract_head_leap_arc.prototype.OnVerticalMotionInterrupted(self)
if not IsServer() then
return
end
self:Destroy()
end
function modifier_contract_head_leap_arc.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_OVERRIDE_ANIMATION}
end
function modifier_contract_head_leap_arc.prototype.GetOverrideAnimation(self)
return ACT_DOTA_CAST_ABILITY_1
end
modifier_contract_head_leap_arc = __TS__Decorate(
modifier_contract_head_leap_arc,
modifier_contract_head_leap_arc,
{registerModifier(nil)},
{kind = "class", name = "modifier_contract_head_leap_arc"}
)
____exports.modifier_contract_head_leap_arc = modifier_contract_head_leap_arc
return ____exports
@@ -0,0 +1,50 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.harpy_passive = __TS__Class()
local harpy_passive = ____exports.harpy_passive
harpy_passive.name = "harpy_passive"
harpy_passive.____file_path = "scripts/vscripts/abilities/creep/dead_harpy.lua"
__TS__ClassExtends(harpy_passive, BaseAbility)
function harpy_passive.prototype.GetIntrinsicModifierName(self)
return "modifier_harpy_passive"
end
harpy_passive = __TS__Decorate(
harpy_passive,
harpy_passive,
{registerAbility(nil)},
{kind = "class", name = "harpy_passive"}
)
____exports.harpy_passive = harpy_passive
____exports.modifier_harpy_passive = __TS__Class()
local modifier_harpy_passive = ____exports.modifier_harpy_passive
modifier_harpy_passive.name = "modifier_harpy_passive"
modifier_harpy_passive.____file_path = "scripts/vscripts/abilities/creep/dead_harpy.lua"
__TS__ClassExtends(modifier_harpy_passive, BaseModifier)
function modifier_harpy_passive.prototype.IsHidden(self)
return true
end
function modifier_harpy_passive.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_VISUAL_Z_DELTA}
end
function modifier_harpy_passive.prototype.CheckState(self)
return {[MODIFIER_STATE_FLYING] = true, [MODIFIER_STATE_NO_UNIT_COLLISION] = true}
end
function modifier_harpy_passive.prototype.GetVisualZDelta(self)
return 100
end
modifier_harpy_passive = __TS__Decorate(
modifier_harpy_passive,
modifier_harpy_passive,
{registerModifier(nil)},
{kind = "class", name = "modifier_harpy_passive"}
)
____exports.modifier_harpy_passive = modifier_harpy_passive
return ____exports
@@ -0,0 +1,117 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local ____incoming_damage_reduction_combine = require("utils.incoming_damage_reduction_combine")
local removeIncomingDamageReductionSource = ____incoming_damage_reduction_combine.removeIncomingDamageReductionSource
local setIncomingDamageReductionSource = ____incoming_damage_reduction_combine.setIncomingDamageReductionSource
local ANIMATION_STUN_INCOMING_SOURCE = "modifier_animation_stun"
____exports.ability_animation = __TS__Class()
local ability_animation = ____exports.ability_animation
ability_animation.name = "ability_animation"
ability_animation.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/animation.lua"
__TS__ClassExtends(ability_animation, BaseAbility)
function ability_animation.prototype.GetIntrinsicModifierName(self)
return "modifier_animation_checker"
end
ability_animation = __TS__Decorate(
ability_animation,
ability_animation,
{registerAbility(nil)},
{kind = "class", name = "ability_animation"}
)
____exports.ability_animation = ability_animation
____exports.modifier_animation_checker = __TS__Class()
local modifier_animation_checker = ____exports.modifier_animation_checker
modifier_animation_checker.name = "modifier_animation_checker"
modifier_animation_checker.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/animation.lua"
__TS__ClassExtends(modifier_animation_checker, BaseModifier)
function modifier_animation_checker.prototype.IsHidden(self)
return true
end
function modifier_animation_checker.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_TAKEDAMAGE}
end
function modifier_animation_checker.prototype.OnTakeDamage(self, event)
if not IsServer() then
return
end
local unit = event.unit
if unit ~= self:GetParent() then
return
end
local maxHealth = unit:GetMaxHealth()
local currentHealth = unit:GetHealth()
local ability = self:GetAbility()
if currentHealth <= maxHealth * 0.75 and self:GetStackCount() < 1 then
self:IncrementStackCount()
unit:AddNewModifier(unit, ability, "modifier_animation_stun", {duration = 3.7})
end
if currentHealth <= maxHealth * 0.5 and self:GetStackCount() < 2 then
self:IncrementStackCount()
unit:AddNewModifier(unit, ability, "modifier_animation_stun", {duration = 3.7})
end
if currentHealth <= maxHealth * 0.25 and self:GetStackCount() < 3 then
self:IncrementStackCount()
unit:AddNewModifier(unit, ability, "modifier_animation_stun", {duration = 3.7})
end
end
modifier_animation_checker = __TS__Decorate(
modifier_animation_checker,
modifier_animation_checker,
{registerModifier(nil)},
{kind = "class", name = "modifier_animation_checker"}
)
____exports.modifier_animation_checker = modifier_animation_checker
____exports.modifier_animation_stun = __TS__Class()
local modifier_animation_stun = ____exports.modifier_animation_stun
modifier_animation_stun.name = "modifier_animation_stun"
modifier_animation_stun.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/animation.lua"
__TS__ClassExtends(modifier_animation_stun, BaseModifier)
function modifier_animation_stun.prototype.IsHidden(self)
return false
end
function modifier_animation_stun.prototype.OnCreated(self)
if not IsServer() then
return
end
local parent = self:GetParent()
parent:StartGestureWithFade(ACT_DOTA_NIAN_PIN_TO_STUN, 0.5, 0)
setIncomingDamageReductionSource(
nil,
parent,
ANIMATION_STUN_INCOMING_SOURCE,
function() return 50 end
)
end
function modifier_animation_stun.prototype.OnDestroy(self)
if not IsServer() then
return
end
local parent = self:GetParent()
removeIncomingDamageReductionSource(nil, parent, ANIMATION_STUN_INCOMING_SOURCE)
parent:RemoveGesture(ACT_DOTA_NIAN_PIN_TO_STUN)
end
function modifier_animation_stun.prototype.CheckState(self)
return {
[MODIFIER_STATE_COMMAND_RESTRICTED] = false,
[MODIFIER_STATE_DISARMED] = true,
[MODIFIER_STATE_IGNORING_MOVE_AND_ATTACK_ORDERS] = true,
[MODIFIER_STATE_IGNORING_MOVE_ORDERS] = true,
[MODIFIER_STATE_SILENCED] = true
}
end
modifier_animation_stun = __TS__Decorate(
modifier_animation_stun,
modifier_animation_stun,
{registerModifier(nil)},
{kind = "class", name = "modifier_animation_stun"}
)
____exports.modifier_animation_stun = modifier_animation_stun
return ____exports
@@ -0,0 +1,92 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.back_stun = __TS__Class()
local back_stun = ____exports.back_stun
back_stun.name = "back_stun"
back_stun.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/back_stun.lua"
__TS__ClassExtends(back_stun, BaseAbility)
function back_stun.prototype.Precache(self, context)
PrecacheResource("particle", "particles/econ/items/earthshaker/deep_magma/deep_magma_10th/deep_magma_10th_echoslam_start.vpcf", context)
PrecacheResource("particle", "particles/generic_gameplay/generic_stunned.vpcf", context)
end
function back_stun.prototype.GetCastRange(self)
return self:GetSpecialValueFor("cast_range")
end
function back_stun.prototype.OnSpellStart(self)
local caster = self:GetCaster()
local duration = self:GetSpecialValueFor("duration")
local radius = self:GetSpecialValueFor("cast_range")
if not caster then
return
end
local direction = caster:GetForwardVector()
local backPosition = caster:GetOrigin():__sub(direction:__mul(radius))
self.particle = ParticleManager:CreateParticle("particles/econ/items/earthshaker/deep_magma/deep_magma_10th/deep_magma_10th_echoslam_start.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(self.particle, 0, backPosition)
local units = FindUnitsInRadius(
caster:GetTeamNumber(),
backPosition,
nil,
radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
for ____, unit in ipairs(units) do
unit:AddNewModifier(caster, self, "modifier_back_stunned", {duration = duration})
local damage = self:GetSpecialValueFor("damage") + self:GetCaster():GetAverageTrueAttackDamage(unit) * 3
ApplyDamage({victim = unit, attacker = caster, damage = damage, damage_type = DAMAGE_TYPE_PURE})
EmitSoundOn("Hero_Centaur.HoofStomp", unit)
end
end
back_stun = __TS__Decorate(
back_stun,
back_stun,
{registerAbility(nil)},
{kind = "class", name = "back_stun"}
)
____exports.back_stun = back_stun
____exports.modifier_back_stunned = __TS__Class()
local modifier_back_stunned = ____exports.modifier_back_stunned
modifier_back_stunned.name = "modifier_back_stunned"
modifier_back_stunned.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/back_stun.lua"
__TS__ClassExtends(modifier_back_stunned, BaseModifier)
function modifier_back_stunned.prototype.IsHidden(self)
return false
end
function modifier_back_stunned.prototype.IsDebuff(self)
return true
end
function modifier_back_stunned.prototype.IsStunDebuff(self)
return true
end
function modifier_back_stunned.prototype.IsPurgable(self)
return true
end
function modifier_back_stunned.prototype.GetEffectName(self)
return "particles/generic_gameplay/generic_stunned.vpcf"
end
function modifier_back_stunned.prototype.GetEffectAttachType(self)
return PATTACH_OVERHEAD_FOLLOW
end
function modifier_back_stunned.prototype.CheckState(self)
return {[MODIFIER_STATE_STUNNED] = true}
end
modifier_back_stunned = __TS__Decorate(
modifier_back_stunned,
modifier_back_stunned,
{registerModifier(nil)},
{kind = "class", name = "modifier_back_stunned"}
)
____exports.modifier_back_stunned = modifier_back_stunned
return ____exports
@@ -0,0 +1,92 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.face_stun = __TS__Class()
local face_stun = ____exports.face_stun
face_stun.name = "face_stun"
face_stun.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/face_stun.lua"
__TS__ClassExtends(face_stun, BaseAbility)
function face_stun.prototype.Precache(self, context)
PrecacheResource("particle", "particles/econ/items/earthshaker/deep_magma/deep_magma_10th/deep_magma_10th_echoslam_start.vpcf", context)
PrecacheResource("particle", "particles/generic_gameplay/generic_stunned.vpcf", context)
end
function face_stun.prototype.GetCastRange(self)
return self:GetSpecialValueFor("cast_range")
end
function face_stun.prototype.OnSpellStart(self)
local caster = self:GetCaster()
local duration = self:GetSpecialValueFor("duration")
local radius = self:GetSpecialValueFor("cast_range")
if not caster then
return
end
local direction = caster:GetForwardVector()
local frontPosition = caster:GetOrigin():__add(direction:__mul(radius))
self.particle = ParticleManager:CreateParticle("particles/econ/items/earthshaker/deep_magma/deep_magma_10th/deep_magma_10th_echoslam_start.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(self.particle, 0, frontPosition)
local units = FindUnitsInRadius(
caster:GetTeamNumber(),
frontPosition,
nil,
radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
for ____, unit in ipairs(units) do
unit:AddNewModifier(caster, self, "modifier_face_stunned", {duration = duration})
local damage = self:GetSpecialValueFor("damage") + self:GetCaster():GetAverageTrueAttackDamage(unit) * 3
ApplyDamage({victim = unit, attacker = caster, damage = damage, damage_type = DAMAGE_TYPE_PURE})
EmitSoundOn("Hero_Centaur.HoofStomp", unit)
end
end
face_stun = __TS__Decorate(
face_stun,
face_stun,
{registerAbility(nil)},
{kind = "class", name = "face_stun"}
)
____exports.face_stun = face_stun
____exports.modifier_face_stunned = __TS__Class()
local modifier_face_stunned = ____exports.modifier_face_stunned
modifier_face_stunned.name = "modifier_face_stunned"
modifier_face_stunned.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/face_stun.lua"
__TS__ClassExtends(modifier_face_stunned, BaseModifier)
function modifier_face_stunned.prototype.IsHidden(self)
return false
end
function modifier_face_stunned.prototype.IsDebuff(self)
return true
end
function modifier_face_stunned.prototype.IsStunDebuff(self)
return true
end
function modifier_face_stunned.prototype.IsPurgable(self)
return true
end
function modifier_face_stunned.prototype.GetEffectName(self)
return "particles/generic_gameplay/generic_stunned.vpcf"
end
function modifier_face_stunned.prototype.GetEffectAttachType(self)
return PATTACH_OVERHEAD_FOLLOW
end
function modifier_face_stunned.prototype.CheckState(self)
return {[MODIFIER_STATE_STUNNED] = true}
end
modifier_face_stunned = __TS__Decorate(
modifier_face_stunned,
modifier_face_stunned,
{registerModifier(nil)},
{kind = "class", name = "modifier_face_stunned"}
)
____exports.modifier_face_stunned = modifier_face_stunned
return ____exports
@@ -0,0 +1,132 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.fear = __TS__Class()
local fear = ____exports.fear
fear.name = "fear"
fear.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/fear.lua"
__TS__ClassExtends(fear, BaseAbility)
function fear.prototype.GetCastRange(self)
return self:GetSpecialValueFor("cast_range")
end
function fear.prototype.OnSpellStart(self)
local caster = self:GetCaster()
local duration = self:GetSpecialValueFor("duration")
if not caster then
return
end
local units = FindUnitsInRadius(
caster:GetTeamNumber(),
caster:GetAbsOrigin(),
nil,
1200,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
local particle = ParticleManager:CreateParticle("particles/econ/items/terrorblade/terrorblade_back_ti8/terrorblade_sunder_ti8_swirl_rope.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(
particle,
0,
caster:GetAbsOrigin()
)
ParticleManager:ReleaseParticleIndex(particle)
for ____, unit in ipairs(units) do
unit:AddNewModifier(caster, self, "modifier_fear_debuff", {duration = duration})
EmitSoundOn("Hero_NightStalker.Void", unit)
end
end
fear = __TS__Decorate(
fear,
fear,
{registerAbility(nil)},
{kind = "class", name = "fear"}
)
____exports.fear = fear
____exports.modifier_fear_debuff = __TS__Class()
local modifier_fear_debuff = ____exports.modifier_fear_debuff
modifier_fear_debuff.name = "modifier_fear_debuff"
modifier_fear_debuff.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/fear.lua"
__TS__ClassExtends(modifier_fear_debuff, BaseModifier)
function modifier_fear_debuff.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.interval = 0.03
end
function modifier_fear_debuff.prototype.IsHidden(self)
return false
end
function modifier_fear_debuff.prototype.IsDebuff(self)
return true
end
function modifier_fear_debuff.prototype.IsPurgable(self)
return true
end
function modifier_fear_debuff.prototype.GetEffectName(self)
return "particles/econ/items/nightstalker/nightstalker_black_nihility/nightstalker_black_nihility_void.vpcf"
end
function modifier_fear_debuff.prototype.GetEffectAttachType(self)
return PATTACH_CENTER_FOLLOW
end
function modifier_fear_debuff.prototype.OnCreated(self)
if not IsServer() then
return
end
self.particle = ParticleManager:CreateParticle(
"particles/generic_gameplay/generic_feared.vpcf",
PATTACH_OVERHEAD_FOLLOW,
self:GetParent()
)
self:StartIntervalThink(self.interval)
local ____opt_0 = self:GetCaster()
self.casterPos = ____opt_0 and ____opt_0:GetAbsOrigin()
end
function modifier_fear_debuff.prototype.OnDestroy(self)
if not IsServer() then
return
end
if self.particle then
ParticleManager:DestroyParticle(self.particle, false)
ParticleManager:ReleaseParticleIndex(self.particle)
end
end
function modifier_fear_debuff.prototype.OnIntervalThink(self)
if not IsServer() or not self.casterPos then
return
end
local unit = self:GetParent()
local unitPos = unit:GetAbsOrigin()
local direction = unitPos:__sub(self.casterPos):Normalized()
unit:MoveToPosition(unitPos:__add(direction:__mul(150)))
end
function modifier_fear_debuff.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_PROVIDES_FOW_POSITION, MODIFIER_PROPERTY_BONUS_VISION_PERCENTAGE, MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE}
end
function modifier_fear_debuff.prototype.BonusVisionPercentage(self)
return -100
end
function modifier_fear_debuff.prototype.MovespeedBonusPercentage(self)
return -100
end
function modifier_fear_debuff.prototype.GetModifierProvidesFOWVision(self)
return 0
end
function modifier_fear_debuff.prototype.CheckState(self)
return {[MODIFIER_STATE_FEARED] = true, [MODIFIER_STATE_COMMAND_RESTRICTED] = true}
end
modifier_fear_debuff = __TS__Decorate(
modifier_fear_debuff,
modifier_fear_debuff,
{registerModifier(nil)},
{kind = "class", name = "modifier_fear_debuff"}
)
____exports.modifier_fear_debuff = modifier_fear_debuff
return ____exports
@@ -0,0 +1,171 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.ability_grab = __TS__Class()
local ability_grab = ____exports.ability_grab
ability_grab.name = "ability_grab"
ability_grab.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/grab.lua"
__TS__ClassExtends(ability_grab, BaseAbility)
function ability_grab.prototype.CancelGrabCast(self)
self:EndChannel(true)
self:EndCooldown()
self:RefundManaCost()
end
function ability_grab.prototype.GetCastRange(self)
return 150
end
function ability_grab.prototype.GetChannelTime(self)
return 4.37
end
function ability_grab.prototype.GetBehavior(self)
return bit.bor(DOTA_ABILITY_BEHAVIOR_POINT, DOTA_ABILITY_BEHAVIOR_CHANNELLED)
end
function ability_grab.prototype.OnSpellStart(self)
if not IsServer() then
return
end
local caster = self:GetCaster()
local point = self:GetCursorPosition()
local direction = (point - caster:GetAbsOrigin()):Normalized()
local units = FindUnitsInLine(
caster:GetTeamNumber(),
caster:GetAbsOrigin(),
caster:GetAbsOrigin() + direction * self:GetCastRange(),
nil,
100,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
DOTA_UNIT_TARGET_FLAG_NONE
)
if #units == 0 then
self:CancelGrabCast()
return
end
local target = units[1]
if not target then
self:CancelGrabCast()
return
end
target:AddNewModifier(
caster,
self,
"modifier_grab_stunned",
{duration = self:GetChannelTime()}
)
caster:AddNewModifier(
caster,
self,
"modifier_grab_caster",
{duration = self:GetChannelTime()}
)
caster:StartGesture(ACT_DOTA_NIAN_PIN_LOOP)
target:SetParent(caster, "attach_pindown")
target:SetOrigin(caster:GetAbsOrigin())
self.target = target
self.damageTimer = Timers:CreateTimer(
0.33,
function()
if self.target and not self.target:IsNull() and self.target:IsAlive() then
ParticleManager:CreateParticle("particles/econ/items/lifestealer/ls_ti9_immortal/ls_ti9_open_wounds_blood_bulk.vpcf", PATTACH_ABSORIGIN_FOLLOW, self.target)
EmitSoundOn("Hero_Pudge.Dismember", self.target)
ApplyDamage({
victim = self.target,
attacker = caster,
damage = self:GetSpecialValueFor("damage") + self:GetCaster():GetAverageTrueAttackDamage(target) * 3,
damage_type = DAMAGE_TYPE_PURE
})
return 0.33
end
return nil
end
)
end
function ability_grab.prototype.OnChannelFinish(self, interrupted)
if not IsServer() then
return
end
self:GetCaster():RemoveGesture(ACT_DOTA_NIAN_PIN_LOOP)
if self.damageTimer then
Timers:RemoveTimer(self.damageTimer)
self.damageTimer = nil
end
if self.target then
self.target:RemoveModifierByName("modifier_grab_stunned")
self.target:SetParent(nil, "")
self.target:RemoveHorizontalMotionController(self.target)
self.target:RemoveVerticalMotionController(self.target)
self.target:InterruptMotionControllers(true)
local casterPos = self:GetCaster():GetAbsOrigin()
local casterForward = self:GetCaster():GetForwardVector()
local dropPoint = casterPos + casterForward * 100
FindClearSpaceForUnit(self.target, dropPoint, true)
ApplyDamage({
victim = self.target,
attacker = self:GetCaster(),
damage = self:GetSpecialValueFor("damage"),
damage_type = DAMAGE_TYPE_PHYSICAL
})
end
self:GetCaster():RemoveModifierByName("modifier_grab_caster")
self.target = nil
end
ability_grab = __TS__Decorate(
ability_grab,
ability_grab,
{registerAbility(nil)},
{kind = "class", name = "ability_grab"}
)
____exports.ability_grab = ability_grab
____exports.modifier_grab_stunned = __TS__Class()
local modifier_grab_stunned = ____exports.modifier_grab_stunned
modifier_grab_stunned.name = "modifier_grab_stunned"
modifier_grab_stunned.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/grab.lua"
__TS__ClassExtends(modifier_grab_stunned, BaseModifier)
function modifier_grab_stunned.prototype.IsDebuff(self)
return true
end
function modifier_grab_stunned.prototype.IsStunDebuff(self)
return true
end
function modifier_grab_stunned.prototype.CheckState(self)
return {[MODIFIER_STATE_STUNNED] = true, [MODIFIER_STATE_NO_UNIT_COLLISION] = true}
end
function modifier_grab_stunned.prototype.GetEffectName(self)
return "particles/generic_gameplay/generic_stunned.vpcf"
end
function modifier_grab_stunned.prototype.GetEffectAttachType(self)
return PATTACH_OVERHEAD_FOLLOW
end
modifier_grab_stunned = __TS__Decorate(
modifier_grab_stunned,
modifier_grab_stunned,
{registerModifier(nil)},
{kind = "class", name = "modifier_grab_stunned"}
)
____exports.modifier_grab_stunned = modifier_grab_stunned
____exports.modifier_grab_caster = __TS__Class()
local modifier_grab_caster = ____exports.modifier_grab_caster
modifier_grab_caster.name = "modifier_grab_caster"
modifier_grab_caster.____file_path = "scripts/vscripts/abilities/creep/demon_dragon_satyr/grab.lua"
__TS__ClassExtends(modifier_grab_caster, BaseModifier)
function modifier_grab_caster.prototype.IsHidden(self)
return false
end
function modifier_grab_caster.prototype.CheckState(self)
return {[MODIFIER_STATE_DISARMED] = true, [MODIFIER_STATE_ROOTED] = true}
end
modifier_grab_caster = __TS__Decorate(
modifier_grab_caster,
modifier_grab_caster,
{registerModifier(nil)},
{kind = "class", name = "modifier_grab_caster"}
)
____exports.modifier_grab_caster = modifier_grab_caster
return ____exports
@@ -0,0 +1,290 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifierMotionBoth = ____dota_ts_adapter.BaseModifierMotionBoth
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.frogmen_acid_jump = __TS__Class()
local frogmen_acid_jump = ____exports.frogmen_acid_jump
frogmen_acid_jump.name = "frogmen_acid_jump"
frogmen_acid_jump.____file_path = "scripts/vscripts/abilities/creep/frogmen_acid_jump.lua"
__TS__ClassExtends(frogmen_acid_jump, BaseAbility)
function frogmen_acid_jump.prototype.____constructor(self, ...)
BaseAbility.prototype.____constructor(self, ...)
self.radius = 0
self.stun_duration = 0
self.land_damage = 0
end
function frogmen_acid_jump.prototype.Precache(self, context)
PrecacheResource("particle", "particles/neutral_fx/ogre_bruiser_smash.vpcf", context)
end
function frogmen_acid_jump.prototype.OnAbilityPhaseStart(self)
if not IsServer() then
return true
end
return true
end
function frogmen_acid_jump.prototype.OnAbilityPhaseInterrupted(self)
if not IsServer() then
return
end
end
function frogmen_acid_jump.prototype.OnSpellStart(self)
if not IsServer() then
return
end
local caster = self:GetCaster()
if not caster then
return
end
local cursorPos = self:GetCursorPosition()
local kv = {vLocX = cursorPos.x, vLocY = cursorPos.y, vLocZ = cursorPos.z}
caster:AddNewModifier(caster, self, "modifier_acid_blob_jump", kv)
self.radius = self:GetSpecialValueFor("radius")
self.stun_duration = self:GetSpecialValueFor("stun_duration")
self.land_damage = self:GetSpecialValueFor("land_damage")
end
function frogmen_acid_jump.prototype.Smash(self)
if not IsServer() then
return
end
local caster = self:GetCaster()
if not caster then
return
end
local origin = caster:GetOrigin()
EmitSoundOnLocationWithCaster(origin, "OgreTank.GroundSmash", caster)
local smashFX = ParticleManager:CreateParticle("particles/neutral_fx/ogre_bruiser_smash.vpcf", PATTACH_WORLDORIGIN, caster)
ParticleManager:SetParticleControl(smashFX, 0, origin)
ParticleManager:SetParticleControl(
smashFX,
1,
Vector(self.radius, self.radius, self.radius)
)
ParticleManager:ReleaseParticleIndex(smashFX)
caster:Interrupt()
local enemies = FindUnitsInRadius(
caster:GetTeamNumber(),
origin,
caster,
self.radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES,
FIND_ANY_ORDER,
false
)
for ____, enemy in ipairs(enemies) do
do
if not enemy then
goto __continue13
end
if enemy:IsInvulnerable() then
goto __continue13
end
ApplyDamage({
victim = enemy,
attacker = caster,
damage = self.land_damage + self:GetCaster():GetAverageTrueAttackDamage(enemy) * 2,
damage_type = DAMAGE_TYPE_PHYSICAL,
ability = self
})
if not enemy:IsAlive() then
local critFX = ParticleManager:CreateParticle("particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil)
ParticleManager:SetParticleControlEnt(
critFX,
0,
enemy,
PATTACH_POINT_FOLLOW,
"attach_hitloc",
enemy:GetOrigin(),
true
)
ParticleManager:SetParticleControl(
critFX,
1,
enemy:GetOrigin()
)
local forward = caster:GetForwardVector()
ParticleManager:SetParticleControlForward(critFX, 1, forward * -1)
ParticleManager:SetParticleControlEnt(
critFX,
10,
enemy,
PATTACH_ABSORIGIN_FOLLOW,
nil,
enemy:GetOrigin(),
true
)
ParticleManager:ReleaseParticleIndex(critFX)
EmitSoundOn("Dungeon.BloodSplatterImpact", enemy)
else
enemy:AddNewModifier(caster, self, "modifier_stunned", {duration = self.stun_duration})
end
end
::__continue13::
end
end
frogmen_acid_jump = __TS__Decorate(
frogmen_acid_jump,
frogmen_acid_jump,
{registerAbility(nil)},
{kind = "class", name = "frogmen_acid_jump"}
)
____exports.frogmen_acid_jump = frogmen_acid_jump
local AMOEBA_MINIMUM_HEIGHT_ABOVE_LOWEST = 400
local AMOEBA_MINIMUM_HEIGHT_ABOVE_HIGHEST = 200
local AMOEBA_ACCELERATION_Z = 1500
local AMOEBA_MAX_HORIZONTAL_ACCELERATION = 1500
____exports.modifier_acid_blob_jump = __TS__Class()
local modifier_acid_blob_jump = ____exports.modifier_acid_blob_jump
modifier_acid_blob_jump.name = "modifier_acid_blob_jump"
modifier_acid_blob_jump.____file_path = "scripts/vscripts/abilities/creep/frogmen_acid_jump.lua"
__TS__ClassExtends(modifier_acid_blob_jump, BaseModifierMotionBoth)
function modifier_acid_blob_jump.prototype.____constructor(self, ...)
BaseModifierMotionBoth.prototype.____constructor(self, ...)
self.bHorizontalMotionInterrupted = false
self.flCurrentTimeHoriz = 0
self.flCurrentTimeVert = 0
self.flInitialVelocityZ = 0
self.flPredictedTotalTime = 0
end
function modifier_acid_blob_jump.prototype.IsHidden(self)
return true
end
function modifier_acid_blob_jump.prototype.IsPurgable(self)
return false
end
function modifier_acid_blob_jump.prototype.RemoveOnDeath(self)
return false
end
function modifier_acid_blob_jump.prototype.OnCreated(self, params)
if not IsServer() then
return
end
local parent = self:GetParent()
local ability = self:GetAbility()
if not parent or not ability then
self:Destroy()
return
end
self.bHorizontalMotionInterrupted = false
if not self:ApplyHorizontalMotionController() or not self:ApplyVerticalMotionController() then
self:Destroy()
return
end
self.vStartPosition = GetGroundPosition(
parent:GetOrigin(),
parent
)
self.flCurrentTimeHoriz = 0
self.flCurrentTimeVert = 0
local x = params.vLocX or parent:GetOrigin().x
local y = params.vLocY or parent:GetOrigin().y
local z = params.vLocZ or parent:GetOrigin().z
self.vLoc = Vector(x, y, z)
self.vLastKnownTargetPos = self.vLoc
local duration = ability:GetSpecialValueFor("duration")
local flDesiredHeight = AMOEBA_MINIMUM_HEIGHT_ABOVE_LOWEST * duration * duration
local flLowZ = math.min(self.vLastKnownTargetPos.z, self.vStartPosition.z)
local flHighZ = math.max(self.vLastKnownTargetPos.z, self.vStartPosition.z)
local flArcTopZ = math.max(flLowZ + flDesiredHeight, flHighZ + AMOEBA_MINIMUM_HEIGHT_ABOVE_HIGHEST)
local flArcDeltaZ = flArcTopZ - self.vStartPosition.z
self.flInitialVelocityZ = math.sqrt(2 * flArcDeltaZ * AMOEBA_ACCELERATION_Z)
local flDeltaZ = self.vLastKnownTargetPos.z - self.vStartPosition.z
local flSqrtDet = math.sqrt(math.max(0, self.flInitialVelocityZ * self.flInitialVelocityZ - 2 * AMOEBA_ACCELERATION_Z * flDeltaZ))
self.flPredictedTotalTime = math.max((self.flInitialVelocityZ + flSqrtDet) / AMOEBA_ACCELERATION_Z, (self.flInitialVelocityZ - flSqrtDet) / AMOEBA_ACCELERATION_Z)
self.vHorizontalVelocity = (self.vLastKnownTargetPos - self.vStartPosition) / self.flPredictedTotalTime
self.vHorizontalVelocity.z = 0
end
function modifier_acid_blob_jump.prototype.OnDestroy(self)
if not IsServer() then
return
end
local parent = self:GetParent()
if parent ~= nil then
parent:RemoveHorizontalMotionController(self)
parent:RemoveVerticalMotionController(self)
end
end
function modifier_acid_blob_jump.prototype.CheckState(self)
return {[MODIFIER_STATE_STUNNED] = true, [MODIFIER_STATE_UNSELECTABLE] = true}
end
function modifier_acid_blob_jump.prototype.UpdateHorizontalMotion(self, me, dt)
if not IsServer() then
return
end
self.flCurrentTimeHoriz = math.min(self.flCurrentTimeHoriz + dt, self.flPredictedTotalTime)
local t = self.flCurrentTimeHoriz / self.flPredictedTotalTime
local vStartToTarget = self.vLastKnownTargetPos - self.vStartPosition
local vDesiredPos = self.vStartPosition + vStartToTarget * t
local vOldPos = me:GetOrigin()
local vToDesired = vDesiredPos - vOldPos
vToDesired.z = 0
local vDesiredVel = vToDesired / dt
local vVelDif = vDesiredVel - self.vHorizontalVelocity
local flVelDif = vVelDif:Length2D()
vVelDif = vVelDif:Normalized()
local flVelDelta = math.min(flVelDif, AMOEBA_MAX_HORIZONTAL_ACCELERATION)
self.vHorizontalVelocity = self.vHorizontalVelocity + vVelDif * flVelDelta * dt
local vNewPos = vOldPos + self.vHorizontalVelocity * dt
me:SetOrigin(vNewPos)
end
function modifier_acid_blob_jump.prototype.UpdateVerticalMotion(self, me, dt)
if not IsServer() then
return
end
self.flCurrentTimeVert = self.flCurrentTimeVert + dt
local bGoingDown = -AMOEBA_ACCELERATION_Z * self.flCurrentTimeVert + self.flInitialVelocityZ < 0
local vNewPos = me:GetOrigin()
vNewPos.z = self.vStartPosition.z + (-0.5 * AMOEBA_ACCELERATION_Z * self.flCurrentTimeVert * self.flCurrentTimeVert + self.flInitialVelocityZ * self.flCurrentTimeVert)
local flGroundHeight = GetGroundHeight(
vNewPos,
self:GetParent()
)
local bLanded = false
if vNewPos.z < flGroundHeight and bGoingDown then
vNewPos.z = flGroundHeight
bLanded = true
end
me:SetOrigin(vNewPos)
if bLanded then
if not self.bHorizontalMotionInterrupted then
local ability = self:GetAbility()
if ability then
ability:Smash()
end
end
self:Destroy()
end
end
function modifier_acid_blob_jump.prototype.OnHorizontalMotionInterrupted(self)
if not IsServer() then
return
end
self.bHorizontalMotionInterrupted = true
end
function modifier_acid_blob_jump.prototype.OnVerticalMotionInterrupted(self)
if not IsServer() then
return
end
self:Destroy()
end
function modifier_acid_blob_jump.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_OVERRIDE_ANIMATION}
end
function modifier_acid_blob_jump.prototype.GetOverrideAnimation(self)
return ACT_DOTA_CAST_ABILITY_1
end
modifier_acid_blob_jump = __TS__Decorate(
modifier_acid_blob_jump,
modifier_acid_blob_jump,
{registerModifier(nil)},
{kind = "class", name = "modifier_acid_blob_jump"}
)
____exports.modifier_acid_blob_jump = modifier_acid_blob_jump
return ____exports
@@ -0,0 +1,60 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.ghost_evasive = __TS__Class()
local ghost_evasive = ____exports.ghost_evasive
ghost_evasive.name = "ghost_evasive"
ghost_evasive.____file_path = "scripts/vscripts/abilities/creep/ghost_evasive.lua"
__TS__ClassExtends(ghost_evasive, BaseAbility)
function ghost_evasive.prototype.GetIntrinsicModifierName(self)
return "modifier_ghost_evasive_passive"
end
ghost_evasive = __TS__Decorate(
ghost_evasive,
ghost_evasive,
{registerAbility(nil)},
{kind = "class", name = "ghost_evasive"}
)
____exports.ghost_evasive = ghost_evasive
____exports.modifier_ghost_evasive_passive = __TS__Class()
local modifier_ghost_evasive_passive = ____exports.modifier_ghost_evasive_passive
modifier_ghost_evasive_passive.name = "modifier_ghost_evasive_passive"
modifier_ghost_evasive_passive.____file_path = "scripts/vscripts/abilities/creep/ghost_evasive.lua"
__TS__ClassExtends(modifier_ghost_evasive_passive, BaseModifier)
function modifier_ghost_evasive_passive.prototype.IsHidden(self)
return true
end
function modifier_ghost_evasive_passive.prototype.IsDebuff(self)
return false
end
function modifier_ghost_evasive_passive.prototype.IsPurgable(self)
return false
end
function modifier_ghost_evasive_passive.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_EVASION_CONSTANT}
end
function modifier_ghost_evasive_passive.prototype.GetModifierEvasion_Constant(self, event)
local ab = self:GetAbility()
if not ab then
return 0
end
return ab:GetSpecialValueFor("evasive")
end
function modifier_ghost_evasive_passive.prototype.CheckState(self)
return {[MODIFIER_STATE_FLYING] = true, [MODIFIER_STATE_NO_UNIT_COLLISION] = true}
end
modifier_ghost_evasive_passive = __TS__Decorate(
modifier_ghost_evasive_passive,
modifier_ghost_evasive_passive,
{registerModifier(nil)},
{kind = "class", name = "modifier_ghost_evasive_passive"}
)
____exports.modifier_ghost_evasive_passive = modifier_ghost_evasive_passive
return ____exports
@@ -0,0 +1,158 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.kaban_rofl_ability = __TS__Class()
local kaban_rofl_ability = ____exports.kaban_rofl_ability
kaban_rofl_ability.name = "kaban_rofl_ability"
kaban_rofl_ability.____file_path = "scripts/vscripts/abilities/creep/kaban_rofl_ability.lua"
__TS__ClassExtends(kaban_rofl_ability, BaseAbility)
function kaban_rofl_ability.prototype.GetIntrinsicModifierName(self)
return "modifier_kaban_rofl_ability"
end
kaban_rofl_ability = __TS__Decorate(
kaban_rofl_ability,
kaban_rofl_ability,
{registerAbility(nil)},
{kind = "class", name = "kaban_rofl_ability"}
)
____exports.kaban_rofl_ability = kaban_rofl_ability
____exports.modifier_kaban_rofl_ability = __TS__Class()
local modifier_kaban_rofl_ability = ____exports.modifier_kaban_rofl_ability
modifier_kaban_rofl_ability.name = "modifier_kaban_rofl_ability"
modifier_kaban_rofl_ability.____file_path = "scripts/vscripts/abilities/creep/kaban_rofl_ability.lua"
__TS__ClassExtends(modifier_kaban_rofl_ability, BaseModifier)
function modifier_kaban_rofl_ability.prototype.IsHidden(self)
return true
end
function modifier_kaban_rofl_ability.prototype.OnCreated(self, params)
Timers:CreateTimer(
30,
function()
UTIL_Remove(self:GetParent())
end
)
end
function modifier_kaban_rofl_ability.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_TAKEDAMAGE, MODIFIER_PROPERTY_MIN_HEALTH}
end
function modifier_kaban_rofl_ability.prototype.CheckState(self)
return {[MODIFIER_STATE_NO_HEALTH_BAR] = true}
end
function modifier_kaban_rofl_ability.prototype.GetMinHealth(self)
return 1
end
function modifier_kaban_rofl_ability.prototype.OnTakeDamage(self, event)
if not IsServer() then
return
end
if event.attacker ~= self:GetParent():GetOwner() then
return
end
if event.unit ~= self:GetParent() then
return
end
local parent = self:GetParent()
local parentPos = parent:GetAbsOrigin()
local attacker = event.attacker
local hasEasterEgg = self:GetParent():HasModifier("modifier_easter_egg_dropped")
if not hasEasterEgg and RandomFloat(0, 100) <= 2 then
local easterEgg = CreateItem("item_easter_egg", nil, nil)
if easterEgg then
local physicalItem = CreateItemOnPositionForLaunch(parentPos, easterEgg)
if physicalItem ~= nil then
local randomAngle = RandomFloat(0, 2 * math.pi)
local randomDistance = RandomFloat(100, 500)
local randomX = parentPos.x + randomDistance * math.cos(randomAngle)
local randomY = parentPos.y + randomDistance * math.sin(randomAngle)
local randomPos = Vector(randomX, randomY, parentPos.z)
local dropRadius = RandomFloat(50, 100)
easterEgg:LaunchLootInitialHeight(
false,
0,
150,
0.5,
randomPos + RandomVector(dropRadius)
)
self:GetParent():AddNewModifier(
self:GetParent(),
getModifierSourceAbility(
nil,
self:GetParent()
),
"modifier_easter_egg_dropped",
{}
)
end
end
elseif RandomFloat(0, 100) <= 20 then
local item = CreateItem("item_candy", nil, nil)
if item then
local physicalItem = CreateItemOnPositionForLaunch(parentPos, item)
if physicalItem ~= nil then
local randomAngle = RandomFloat(0, 2 * math.pi)
local randomDistance = RandomFloat(100, 500)
local randomX = parentPos.x + randomDistance * math.cos(randomAngle)
local randomY = parentPos.y + randomDistance * math.sin(randomAngle)
local randomPos = Vector(randomX, randomY, parentPos.z)
local dropRadius = RandomFloat(50, 100)
item:LaunchLootInitialHeight(
false,
0,
150,
0.5,
randomPos + RandomVector(dropRadius)
)
Timers:CreateTimer(
30,
function()
if IsValidEntity(physicalItem) then
UTIL_Remove(physicalItem)
end
end
)
end
end
end
if attacker and attacker:IsAlive() then
self:MakeUnitFlee(parent, attacker)
end
end
function modifier_kaban_rofl_ability.prototype.MakeUnitFlee(self, fleeingUnit, fromUnit)
local fleeingPos = fleeingUnit:GetAbsOrigin()
local fromPos = fromUnit:GetAbsOrigin()
local directionX = fleeingPos.x - fromPos.x
local directionY = fleeingPos.y - fromPos.y
local distance = math.sqrt(directionX * directionX + directionY * directionY)
if distance > 0 then
local normalizedX = directionX / distance
local normalizedY = directionY / distance
local fleeDistance = math.min(800, distance * 2)
local fleeX = fleeingPos.x + normalizedX * fleeDistance
local fleeY = fleeingPos.y + normalizedY * fleeDistance
local fleePos = Vector(fleeX, fleeY, fleeingPos.z)
local groundHeight = GetGroundHeight(fleePos, nil)
local validPos = Vector(fleeX, fleeY, groundHeight)
fleeingUnit:MoveToPosition(toVectorWS(nil, validPos))
fleeingUnit:AddNewModifier(
fleeingUnit,
getModifierSourceAbility(nil, fleeingUnit),
"modifier_phased",
{duration = 2}
)
end
end
modifier_kaban_rofl_ability = __TS__Decorate(
modifier_kaban_rofl_ability,
modifier_kaban_rofl_ability,
{registerModifier(nil)},
{kind = "class", name = "modifier_kaban_rofl_ability"}
)
____exports.modifier_kaban_rofl_ability = modifier_kaban_rofl_ability
return ____exports
@@ -0,0 +1,54 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.modifier_boss_nevermore_coil_debuff = __TS__Class()
local modifier_boss_nevermore_coil_debuff = ____exports.modifier_boss_nevermore_coil_debuff
modifier_boss_nevermore_coil_debuff.name = "modifier_boss_nevermore_coil_debuff"
modifier_boss_nevermore_coil_debuff.____file_path = "scripts/vscripts/abilities/creep/modifier_boss_nevermore_coil_debuff.lua"
__TS__ClassExtends(modifier_boss_nevermore_coil_debuff, BaseModifier)
function modifier_boss_nevermore_coil_debuff.prototype.IsHidden(self)
return false
end
function modifier_boss_nevermore_coil_debuff.prototype.IsPurgable(self)
return true
end
function modifier_boss_nevermore_coil_debuff.prototype.IsDebuff(self)
return true
end
function modifier_boss_nevermore_coil_debuff.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, MODIFIER_PROPERTY_TOOLTIP}
end
function modifier_boss_nevermore_coil_debuff.prototype.GetModifierMoveSpeedBonus_Percentage(self)
local ability = self:GetAbility()
if not ability then
return 0
end
local slowPerStack = ability:GetSpecialValueFor("coil_slow_per_stack")
return -slowPerStack * self:GetStackCount()
end
function modifier_boss_nevermore_coil_debuff.prototype.OnTooltip(self)
local ability = self:GetAbility()
if not ability then
return 0
end
return ability:GetSpecialValueFor("coil_stack_bonus_damage") * self:GetStackCount()
end
function modifier_boss_nevermore_coil_debuff.prototype.GetEffectName(self)
return "particles/units/heroes/hero_nevermore/nevermore_requiemofsouls_debuff.vpcf"
end
function modifier_boss_nevermore_coil_debuff.prototype.GetEffectAttachType(self)
return PATTACH_ABSORIGIN_FOLLOW
end
modifier_boss_nevermore_coil_debuff = __TS__Decorate(
modifier_boss_nevermore_coil_debuff,
modifier_boss_nevermore_coil_debuff,
{registerModifier(nil)},
{kind = "class", name = "modifier_boss_nevermore_coil_debuff"}
)
____exports.modifier_boss_nevermore_coil_debuff = modifier_boss_nevermore_coil_debuff
return ____exports
@@ -0,0 +1,47 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerModifier = ____dota_ts_adapter.registerModifier
--- Только для npc_boss_nevermore: без DEBUFF_IMMUNE на общем no_healthbar (Луна и др.),
-- чтобы там не ломать диспелы. Боссу сайленс/орчид и прочие дебаффы с героев не цепляются.
____exports.modifier_boss_nevermore_debuff_immune = __TS__Class()
local modifier_boss_nevermore_debuff_immune = ____exports.modifier_boss_nevermore_debuff_immune
modifier_boss_nevermore_debuff_immune.name = "modifier_boss_nevermore_debuff_immune"
modifier_boss_nevermore_debuff_immune.____file_path = "scripts/vscripts/abilities/creep/modifier_boss_nevermore_debuff_immune.lua"
__TS__ClassExtends(modifier_boss_nevermore_debuff_immune, BaseModifier)
function modifier_boss_nevermore_debuff_immune.prototype.IsHidden(self)
return true
end
function modifier_boss_nevermore_debuff_immune.prototype.IsPurgable(self)
return false
end
function modifier_boss_nevermore_debuff_immune.prototype.IsDebuff(self)
return false
end
function modifier_boss_nevermore_debuff_immune.prototype.GetPriority(self)
return MODIFIER_PRIORITY_SUPER_ULTRA
end
function modifier_boss_nevermore_debuff_immune.prototype.CheckState(self)
return {[MODIFIER_STATE_SILENCED] = false, [MODIFIER_STATE_ROOTED] = false}
end
function modifier_boss_nevermore_debuff_immune.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_PROVIDES_FOW_POSITION}
end
function modifier_boss_nevermore_debuff_immune.prototype.providesFOWPosition(self)
return true
end
function modifier_boss_nevermore_debuff_immune.prototype.GetModifierProvidesFOWVision(self)
return 1
end
modifier_boss_nevermore_debuff_immune = __TS__Decorate(
modifier_boss_nevermore_debuff_immune,
modifier_boss_nevermore_debuff_immune,
{registerModifier(nil)},
{kind = "class", name = "modifier_boss_nevermore_debuff_immune"}
)
____exports.modifier_boss_nevermore_debuff_immune = modifier_boss_nevermore_debuff_immune
return ____exports
@@ -0,0 +1,152 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerModifier = ____dota_ts_adapter.registerModifier
local ____nevermore_boss_requiem_bridge = require("ai.nevermore_boss_requiem_bridge")
local tryForceNevermoreRequiemCast = ____nevermore_boss_requiem_bridge.tryForceNevermoreRequiemCast
local TERROR_WAVE_ABILITY = "terrorblade_terror_wave"
--- Задержка между несколькими волнами, если за один удар пересечено несколько порогов HP.
local MULTI_WAVE_STAGGER = 0.22
--- После последней Terror Wave — пауза перед телепортом в центр и реквиемом.
local AFTER_TERROR_WAVE_TO_REQUIEM = 0.72
--- Фаза босса Nevermore по HP (как у coil_wave / ИИ).
local function getNevermoreBossHpPhase(self, unit)
local hp = unit:GetHealthPercent()
if hp <= 25 then
return 4
end
if hp <= 50 then
return 3
end
if hp <= 75 then
return 2
end
return 1
end
local function tryCastTerrorWave(self, boss)
if not IsServer() then
return
end
if not boss or boss:IsNull() or not boss:IsAlive() then
return
end
local ab = boss:FindAbilityByName(TERROR_WAVE_ABILITY)
if not ab or ab:IsNull() then
return
end
if ab:GetLevel() < 1 then
ab:SetLevel(1)
end
ab:EndCooldown()
ExecuteOrderFromTable({
UnitIndex = boss:entindex(),
OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET,
AbilityIndex = ab:entindex()
})
end
--- Вешается на npc_boss_nevermore: при каждом переходе на новую фазу по HP — Terror Wave.
function ____exports.applyNevermorePhaseTerrorWave(self, boss)
if not IsServer() or not boss or boss:IsNull() or not boss:IsAlive() then
return
end
if boss:HasModifier(____exports.modifier_boss_nevermore_phase_terror_wave.name) then
return
end
boss:AddNewModifier(
boss,
getModifierSourceAbility(nil, boss),
____exports.modifier_boss_nevermore_phase_terror_wave.name,
{}
)
end
____exports.modifier_boss_nevermore_phase_terror_wave = __TS__Class()
local modifier_boss_nevermore_phase_terror_wave = ____exports.modifier_boss_nevermore_phase_terror_wave
modifier_boss_nevermore_phase_terror_wave.name = "modifier_boss_nevermore_phase_terror_wave"
modifier_boss_nevermore_phase_terror_wave.____file_path = "scripts/vscripts/abilities/creep/modifier_boss_nevermore_phase_terror_wave.lua"
__TS__ClassExtends(modifier_boss_nevermore_phase_terror_wave, BaseModifier)
function modifier_boss_nevermore_phase_terror_wave.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.storedPhase = 1
end
function modifier_boss_nevermore_phase_terror_wave.prototype.IsHidden(self)
return true
end
function modifier_boss_nevermore_phase_terror_wave.prototype.IsPurgable(self)
return false
end
function modifier_boss_nevermore_phase_terror_wave.prototype.RemoveOnDeath(self)
return true
end
function modifier_boss_nevermore_phase_terror_wave.prototype.OnCreated(self)
if not IsServer() then
return
end
self.parent = self:GetParent()
self.storedPhase = getNevermoreBossHpPhase(nil, self.parent)
self:StartIntervalThink(0.2)
end
function modifier_boss_nevermore_phase_terror_wave.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_TAKEDAMAGE}
end
function modifier_boss_nevermore_phase_terror_wave.prototype.OnTakeDamage(self)
self:checkPhaseTransitions()
end
function modifier_boss_nevermore_phase_terror_wave.prototype.OnIntervalThink(self)
if not IsValidEntity(self.parent) or not self.parent:IsAlive() then
self:StartIntervalThink(-1)
return
end
self:checkPhaseTransitions()
end
function modifier_boss_nevermore_phase_terror_wave.prototype.checkPhaseTransitions(self)
if not IsServer() then
return
end
if not IsValidEntity(self.parent) or not self.parent:IsAlive() then
return
end
local newPhase = getNevermoreBossHpPhase(nil, self.parent)
if newPhase <= self.storedPhase then
return
end
local wavesToFire = newPhase - self.storedPhase
self.storedPhase = newPhase
local entIndex = self.parent:entindex()
do
local i = 0
while i < wavesToFire do
local delay = i * MULTI_WAVE_STAGGER
Timers:CreateTimer(
delay,
function()
local u = EntIndexToHScript(entIndex)
tryCastTerrorWave(nil, u)
end
)
i = i + 1
end
end
local lastWaveDelay = wavesToFire > 0 and (wavesToFire - 1) * MULTI_WAVE_STAGGER or 0
local requiemDelay = lastWaveDelay + AFTER_TERROR_WAVE_TO_REQUIEM
Timers:CreateTimer(
requiemDelay,
function()
local u = EntIndexToHScript(entIndex)
if u and not u:IsNull() and u:IsAlive() then
tryForceNevermoreRequiemCast(nil, u)
end
end
)
end
modifier_boss_nevermore_phase_terror_wave = __TS__Decorate(
modifier_boss_nevermore_phase_terror_wave,
modifier_boss_nevermore_phase_terror_wave,
{registerModifier(nil)},
{kind = "class", name = "modifier_boss_nevermore_phase_terror_wave"}
)
____exports.modifier_boss_nevermore_phase_terror_wave = modifier_boss_nevermore_phase_terror_wave
return ____exports
@@ -0,0 +1,116 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerModifier = ____dota_ts_adapter.registerModifier
local ____nevermore_boss_requiem_bridge = require("ai.nevermore_boss_requiem_bridge")
local NEVERMORE_REQUIEM_DAMAGE_REDUCTION_PCT = ____nevermore_boss_requiem_bridge.NEVERMORE_REQUIEM_DAMAGE_REDUCTION_PCT
local NEVERMORE_REQUIEM_HP_THRESHOLD = ____nevermore_boss_requiem_bridge.NEVERMORE_REQUIEM_HP_THRESHOLD
local NEVERMORE_REQUIEM_REQUIRED_CASTS = ____nevermore_boss_requiem_bridge.NEVERMORE_REQUIEM_REQUIRED_CASTS
local nevermoreGetRequiemCastCount = ____nevermore_boss_requiem_bridge.nevermoreGetRequiemCastCount
local nevermoreNeedsMandatoryRequiem = ____nevermore_boss_requiem_bridge.nevermoreNeedsMandatoryRequiem
local tryForceNevermoreRequiemCast = ____nevermore_boss_requiem_bridge.tryForceNevermoreRequiemCast
--- Снижение входящего урона, пока HP < 50% и реквием не скастован 3 раза; дожим каста ульты.
____exports.modifier_boss_nevermore_requiem_gate = __TS__Class()
local modifier_boss_nevermore_requiem_gate = ____exports.modifier_boss_nevermore_requiem_gate
modifier_boss_nevermore_requiem_gate.name = "modifier_boss_nevermore_requiem_gate"
modifier_boss_nevermore_requiem_gate.____file_path = "scripts/vscripts/abilities/creep/modifier_boss_nevermore_requiem_gate.lua"
__TS__ClassExtends(modifier_boss_nevermore_requiem_gate, BaseModifier)
function modifier_boss_nevermore_requiem_gate.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.nextForceCastAt = 0
end
function modifier_boss_nevermore_requiem_gate.prototype.IsHidden(self)
return false
end
function modifier_boss_nevermore_requiem_gate.prototype.IsPurgable(self)
return false
end
function modifier_boss_nevermore_requiem_gate.prototype.IsDebuff(self)
return false
end
function modifier_boss_nevermore_requiem_gate.prototype.RemoveOnDeath(self)
return true
end
function modifier_boss_nevermore_requiem_gate.prototype.OnCreated(self)
if not IsServer() then
return
end
self.parent = self:GetParent()
self:syncStacks()
self:StartIntervalThink(0.35)
end
function modifier_boss_nevermore_requiem_gate.prototype.OnIntervalThink(self)
if not IsServer() then
return
end
if not IsValidEntity(self.parent) or not self.parent:IsAlive() then
self:StartIntervalThink(-1)
return
end
self:syncStacks()
if not nevermoreNeedsMandatoryRequiem(nil, self.parent) then
return
end
local now = GameRules:GetGameTime()
if now < self.nextForceCastAt then
return
end
if self.parent:IsChanneling() then
return
end
if tryForceNevermoreRequiemCast(nil, self.parent) then
self.nextForceCastAt = now + 5
else
self.nextForceCastAt = now + 1.25
end
end
function modifier_boss_nevermore_requiem_gate.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE, MODIFIER_EVENT_ON_TAKEDAMAGE}
end
function modifier_boss_nevermore_requiem_gate.prototype.OnTakeDamage(self)
if not IsServer() then
return
end
self:syncStacks()
end
function modifier_boss_nevermore_requiem_gate.prototype.GetModifierIncomingDamage_Percentage(self, event)
if event.target ~= self.parent then
return 0
end
if nevermoreGetRequiemCastCount(nil, self.parent) >= NEVERMORE_REQUIEM_REQUIRED_CASTS then
return 0
end
if self.parent:GetHealthPercent() >= NEVERMORE_REQUIEM_HP_THRESHOLD then
return 0
end
return -NEVERMORE_REQUIEM_DAMAGE_REDUCTION_PCT
end
function modifier_boss_nevermore_requiem_gate.prototype.syncStacks(self)
self:SetStackCount(nevermoreGetRequiemCastCount(nil, self.parent))
end
modifier_boss_nevermore_requiem_gate = __TS__Decorate(
modifier_boss_nevermore_requiem_gate,
modifier_boss_nevermore_requiem_gate,
{registerModifier(nil)},
{kind = "class", name = "modifier_boss_nevermore_requiem_gate"}
)
____exports.modifier_boss_nevermore_requiem_gate = modifier_boss_nevermore_requiem_gate
function ____exports.applyNevermoreRequiemGate(self, boss)
if not IsServer() or not boss or boss:IsNull() or not boss:IsAlive() then
return
end
if boss:HasModifier(____exports.modifier_boss_nevermore_requiem_gate.name) then
return
end
boss:AddNewModifier(
boss,
getModifierSourceAbility(nil, boss),
____exports.modifier_boss_nevermore_requiem_gate.name,
{}
)
end
return ____exports
@@ -0,0 +1,57 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.modifier_boss_nevermore_requiem_magic_resist_debuff = __TS__Class()
local modifier_boss_nevermore_requiem_magic_resist_debuff = ____exports.modifier_boss_nevermore_requiem_magic_resist_debuff
modifier_boss_nevermore_requiem_magic_resist_debuff.name = "modifier_boss_nevermore_requiem_magic_resist_debuff"
modifier_boss_nevermore_requiem_magic_resist_debuff.____file_path = "scripts/vscripts/abilities/creep/modifier_boss_nevermore_requiem_magic_resist_debuff.lua"
__TS__ClassExtends(modifier_boss_nevermore_requiem_magic_resist_debuff, BaseModifier)
function modifier_boss_nevermore_requiem_magic_resist_debuff.prototype.IsHidden(self)
return false
end
function modifier_boss_nevermore_requiem_magic_resist_debuff.prototype.IsDebuff(self)
return true
end
function modifier_boss_nevermore_requiem_magic_resist_debuff.prototype.IsPurgable(self)
return false
end
function modifier_boss_nevermore_requiem_magic_resist_debuff.prototype.RemoveOnDeath(self)
return false
end
function modifier_boss_nevermore_requiem_magic_resist_debuff.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_MAGICAL_RESISTANCE_DECREPIFY_UNIQUE, MODIFIER_PROPERTY_TOOLTIP}
end
function modifier_boss_nevermore_requiem_magic_resist_debuff.prototype.GetModifierMagicalResistanceDecrepifyUnique(self)
local ability = self:GetAbility()
if not ability then
return 0
end
local reducePerStack = ability:GetSpecialValueFor("permanent_magic_resist_reduce_per_hit")
return -reducePerStack * self:GetStackCount()
end
function modifier_boss_nevermore_requiem_magic_resist_debuff.prototype.OnTooltip(self)
local ability = self:GetAbility()
if not ability then
return 0
end
return -ability:GetSpecialValueFor("permanent_magic_resist_reduce_per_hit") * self:GetStackCount()
end
function modifier_boss_nevermore_requiem_magic_resist_debuff.prototype.GetEffectName(self)
return "particles/items4_fx/nullifier_mute_debuff.vpcf"
end
function modifier_boss_nevermore_requiem_magic_resist_debuff.prototype.GetEffectAttachType(self)
return PATTACH_ABSORIGIN_FOLLOW
end
modifier_boss_nevermore_requiem_magic_resist_debuff = __TS__Decorate(
modifier_boss_nevermore_requiem_magic_resist_debuff,
modifier_boss_nevermore_requiem_magic_resist_debuff,
{registerModifier(nil)},
{kind = "class", name = "modifier_boss_nevermore_requiem_magic_resist_debuff"}
)
____exports.modifier_boss_nevermore_requiem_magic_resist_debuff = modifier_boss_nevermore_requiem_magic_resist_debuff
return ____exports
@@ -0,0 +1,242 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerModifier = ____dota_ts_adapter.registerModifier
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local registerAbility = ____dota_ts_adapter.registerAbility
____exports.sheep_coil = __TS__Class()
local sheep_coil = ____exports.sheep_coil
sheep_coil.name = "sheep_coil"
sheep_coil.____file_path = "scripts/vscripts/abilities/creep/sheep_coil.lua"
__TS__ClassExtends(sheep_coil, BaseAbility)
function sheep_coil.prototype.GetAOERadius(self)
return self:GetSpecialValueFor("radius")
end
function sheep_coil.prototype.OnSpellStart(self)
local caster = self:GetCaster()
local cursorPt = self:GetCursorPosition()
local targetPoint = GetGroundPosition(cursorPt, nil)
local spawnOrigin
do
local function ____catch()
spawnOrigin = caster:GetAbsOrigin()
end
local ____try = pcall(function()
local attachId = caster:ScriptLookupAttachment("attach_attack1")
if attachId ~= nil and attachId >= 0 then
spawnOrigin = caster:GetAttachmentOrigin(attachId)
else
spawnOrigin = caster:GetAbsOrigin()
end
end)
if not ____try then
____catch()
end
end
local projectileSpeed = self:GetSpecialValueFor("projectile_speed")
local direction = targetPoint - spawnOrigin
direction.z = 0
local directionLength = math.sqrt(direction.x * direction.x + direction.y * direction.y)
if directionLength < 0.01 then
return
end
direction = direction:Normalized()
local distance = directionLength
local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_abaddon/abaddon_death_coil.vpcf", PATTACH_CUSTOMORIGIN, nil)
ParticleManager:SetParticleControl(particle, 0, spawnOrigin)
ParticleManager:SetParticleControl(particle, 1, targetPoint)
ParticleManager:SetParticleControl(
particle,
2,
Vector(projectileSpeed, 0, 0)
)
ParticleManager:SetParticleControl(
particle,
3,
Vector(distance, 0, 0)
)
ParticleManager:SetParticleControl(
particle,
4,
Vector(0, 0, 0)
)
ParticleManager:SetParticleControl(particle, 9, spawnOrigin)
ParticleManager:SetParticleControl(particle, 13, direction)
self.projectile_particle = particle
self.projectile_start_pos = spawnOrigin
self.projectile_target_pos = targetPoint
self.projectile_direction = direction
self.projectile_speed = projectileSpeed
self.projectile_distance = distance
local info = {
Ability = self,
EffectName = "",
vSpawnOrigin = spawnOrigin,
fDistance = distance,
fStartRadius = 0,
fEndRadius = 0,
Source = caster,
bHasFrontalCone = false,
bReplaceExisting = false,
iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY,
iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE,
iUnitTargetType = bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
fExpireTime = GameRules:GetGameTime() + 10,
bDeleteOnHit = true,
vVelocity = direction * projectileSpeed,
iMoveSpeed = projectileSpeed,
bProvidesVision = true,
iVisionRadius = 200,
iVisionTeamNumber = caster:GetTeamNumber()
}
ProjectileManager:CreateLinearProjectile(info)
Timers:CreateTimer(
distance / projectileSpeed + 0.1,
function()
if self.projectile_particle ~= nil then
ParticleManager:DestroyParticle(self.projectile_particle, false)
ParticleManager:ReleaseParticleIndex(self.projectile_particle)
self.projectile_particle = nil
end
return nil
end
)
self.target_point = targetPoint
local travelTime = distance / projectileSpeed
Timers:CreateTimer(
travelTime,
function()
if not self.projectile_hit then
self:OnProjectileHit(nil, targetPoint)
end
return nil
end
)
local effectCast = ParticleManager:CreateParticle("particles/units/heroes/hero_abaddon/abaddon_death_coil_abaddon.vpcf", PATTACH_ABSORIGIN_FOLLOW, caster)
ParticleManager:ReleaseParticleIndex(effectCast)
EmitSoundOn("Hero_Abaddon.DeathCoil.Cast", caster)
end
function sheep_coil.prototype.OnProjectileThink(self, location)
if self.projectile_particle ~= nil then
local currentPos = GetGroundPosition(location, nil)
ParticleManager:SetParticleControl(self.projectile_particle, 0, currentPos)
ParticleManager:SetParticleControl(self.projectile_particle, 9, currentPos)
local startPos = self.projectile_start_pos
local targetPos = self.projectile_target_pos
local totalDist = self.projectile_distance
local currentDist = math.sqrt((currentPos.x - startPos.x) * (currentPos.x - startPos.x) + (currentPos.y - startPos.y) * (currentPos.y - startPos.y))
local progress = math.min(currentDist / totalDist, 1)
ParticleManager:SetParticleControl(
self.projectile_particle,
3,
Vector(totalDist * (1 - progress), 0, 0)
)
end
end
function sheep_coil.prototype.OnProjectileHit(self, target, location)
self.projectile_hit = true
if self.projectile_particle ~= nil then
ParticleManager:DestroyParticle(self.projectile_particle, false)
ParticleManager:ReleaseParticleIndex(self.projectile_particle)
self.projectile_particle = nil
end
local caster = self:GetCaster()
local slow_duration = self:GetSpecialValueFor("slow_duration")
local radius = self:GetSpecialValueFor("radius")
local hitPoint = self.target_point or location
local units = FindUnitsInRadius(
caster:GetTeamNumber(),
hitPoint,
nil,
radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
for ____, unit in ipairs(units) do
ApplyDamage({
victim = unit,
attacker = caster,
damage = caster:GetAttackDamage(),
damage_type = DAMAGE_TYPE_MAGICAL,
ability = self
})
local existingModifier = unit:FindModifierByName("modifier_sheep_coil_slow")
if existingModifier then
existingModifier:IncrementStackCount()
existingModifier:SetDuration(slow_duration, true)
else
local modifier = unit:AddNewModifier(caster, self, "modifier_sheep_coil_slow", {duration = slow_duration})
if modifier ~= nil then
modifier:SetStackCount(1)
end
end
EmitSoundOn("Hero_Abaddon.DeathCoil.Target", unit)
end
local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_abaddon/abaddon_death_coil_explosion.vpcf", PATTACH_CUSTOMORIGIN, nil)
ParticleManager:SetParticleControl(particle, 0, hitPoint)
ParticleManager:SetParticleControl(
particle,
1,
Vector(radius, 0, 0)
)
ParticleManager:ReleaseParticleIndex(particle)
return true
end
function sheep_coil.prototype.GetAbilityTextureName(self)
return "abaddon_death_coil"
end
sheep_coil = __TS__Decorate(
sheep_coil,
sheep_coil,
{registerAbility(nil)},
{kind = "class", name = "sheep_coil"}
)
____exports.sheep_coil = sheep_coil
____exports.modifier_sheep_coil_slow = __TS__Class()
local modifier_sheep_coil_slow = ____exports.modifier_sheep_coil_slow
modifier_sheep_coil_slow.name = "modifier_sheep_coil_slow"
modifier_sheep_coil_slow.____file_path = "scripts/vscripts/abilities/creep/sheep_coil.lua"
__TS__ClassExtends(modifier_sheep_coil_slow, BaseModifier)
function modifier_sheep_coil_slow.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE}
end
function modifier_sheep_coil_slow.prototype.GetModifierMoveSpeedBonus_Percentage(self)
local ability = self:GetAbility()
if not ability then
return 0
end
return ability:GetSpecialValueFor("movement_slow") * self:GetStackCount()
end
function modifier_sheep_coil_slow.prototype.OnCreated(self)
if not IsServer() then
return
end
end
function modifier_sheep_coil_slow.prototype.GetEffectName(self)
return "particles/items4_fx/nullifier_slow.vpcf"
end
function modifier_sheep_coil_slow.prototype.GetEffectAttachType(self)
return PATTACH_ABSORIGIN_FOLLOW
end
function modifier_sheep_coil_slow.prototype.RemoveOnDeath(self)
return true
end
function modifier_sheep_coil_slow.prototype.IsPurgable(self)
return true
end
modifier_sheep_coil_slow = __TS__Decorate(
modifier_sheep_coil_slow,
modifier_sheep_coil_slow,
{registerModifier(nil)},
{kind = "class", name = "modifier_sheep_coil_slow"}
)
____exports.modifier_sheep_coil_slow = modifier_sheep_coil_slow
return ____exports
@@ -0,0 +1,91 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerModifier = ____dota_ts_adapter.registerModifier
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local registerAbility = ____dota_ts_adapter.registerAbility
____exports.skeleton_archer_fire_arrow = __TS__Class()
local skeleton_archer_fire_arrow = ____exports.skeleton_archer_fire_arrow
skeleton_archer_fire_arrow.name = "skeleton_archer_fire_arrow"
skeleton_archer_fire_arrow.____file_path = "scripts/vscripts/abilities/creep/skeleton_archer.lua"
__TS__ClassExtends(skeleton_archer_fire_arrow, BaseAbility)
function skeleton_archer_fire_arrow.prototype.GetIntrinsicModifierName(self)
return "modifier_skeleton_archer_fire_arrow"
end
skeleton_archer_fire_arrow = __TS__Decorate(
skeleton_archer_fire_arrow,
skeleton_archer_fire_arrow,
{registerAbility(nil)},
{kind = "class", name = "skeleton_archer_fire_arrow"}
)
____exports.skeleton_archer_fire_arrow = skeleton_archer_fire_arrow
____exports.modifier_skeleton_archer_fire_arrow = __TS__Class()
local modifier_skeleton_archer_fire_arrow = ____exports.modifier_skeleton_archer_fire_arrow
modifier_skeleton_archer_fire_arrow.name = "modifier_skeleton_archer_fire_arrow"
modifier_skeleton_archer_fire_arrow.____file_path = "scripts/vscripts/abilities/creep/skeleton_archer.lua"
__TS__ClassExtends(modifier_skeleton_archer_fire_arrow, BaseModifier)
function modifier_skeleton_archer_fire_arrow.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.bonusDamage = 0
end
function modifier_skeleton_archer_fire_arrow.prototype.IsHidden(self)
return true
end
function modifier_skeleton_archer_fire_arrow.prototype.IsPurgable(self)
return false
end
function modifier_skeleton_archer_fire_arrow.prototype.OnCreated(self, params)
if not IsServer() then
return
end
if not self:GetAbility() then
return
end
self.bonusDamage = self:GetAbility():GetSpecialValueFor("bonus_damage")
end
function modifier_skeleton_archer_fire_arrow.prototype.OnRefresh(self, params)
if not IsServer() then
return
end
if not self:GetAbility() then
return
end
self.bonusDamage = self:GetAbility():GetSpecialValueFor("bonus_damage")
end
function modifier_skeleton_archer_fire_arrow.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_ATTACK_LANDED}
end
function modifier_skeleton_archer_fire_arrow.prototype.OnAttackLanded(self, event)
if not IsServer() then
return
end
if event.attacker ~= self:GetParent() then
return
end
if not event.target then
return
end
if not event.target:IsAlive() then
return
end
ApplyDamage({
victim = event.target,
attacker = event.attacker,
damage = self.bonusDamage,
damage_type = DAMAGE_TYPE_MAGICAL,
ability = self:GetAbility()
})
end
modifier_skeleton_archer_fire_arrow = __TS__Decorate(
modifier_skeleton_archer_fire_arrow,
modifier_skeleton_archer_fire_arrow,
{registerModifier(nil)},
{kind = "class", name = "modifier_skeleton_archer_fire_arrow"}
)
____exports.modifier_skeleton_archer_fire_arrow = modifier_skeleton_archer_fire_arrow
return ____exports
@@ -0,0 +1,123 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local registerAbility = ____dota_ts_adapter.registerAbility
____exports.thief_arrow = __TS__Class()
local thief_arrow = ____exports.thief_arrow
thief_arrow.name = "thief_arrow"
thief_arrow.____file_path = "scripts/vscripts/abilities/creep/thief_arrow.lua"
__TS__ClassExtends(thief_arrow, BaseAbility)
function thief_arrow.prototype.Precache(self, context)
PrecacheResource("soundfile", "sounds/units/heroes/mirana/arrow.vsnd", context)
PrecacheResource("soundfile", "sounds/units/heroes/mirana/arrow_target.vsnd", context)
PrecacheResource("particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context)
end
function thief_arrow.prototype.OnAbilityPhaseStart(self)
if IsServer() then
self:GetCaster():StartGestureWithPlaybackRate(ACT_DOTA_ATTACK, 0.5)
self.preParticle = ParticleManager:CreateParticle(
"particles/darkmoon_creep_warning.vpcf",
PATTACH_ABSORIGIN_FOLLOW,
self:GetCaster()
)
ParticleManager:SetParticleControlEnt(
self.preParticle,
0,
self:GetCaster(),
PATTACH_ABSORIGIN_FOLLOW,
"",
self:GetCaster():GetOrigin(),
true
)
ParticleManager:SetParticleControl(
self.preParticle,
1,
Vector(100, 100, 100)
)
end
return true
end
function thief_arrow.prototype.OnAbilityPhaseInterrupted(self)
if IsClient() or not self.preParticle then
return
end
self:GetCaster():FadeGesture(ACT_DOTA_ATTACK)
ParticleManager:DestroyParticle(self.preParticle, false)
end
function thief_arrow.prototype.OnSpellStart(self)
if self.preParticle then
ParticleManager:DestroyParticle(self.preParticle, false)
end
self:GetCaster():FadeGesture(ACT_DOTA_ATTACK)
local caster = self:GetCaster()
local origin = caster:GetOrigin()
local point = self:GetCursorPosition()
local projectile_speed = self:GetSpecialValueFor("arrow_speed")
local projectile_distance = self:GetSpecialValueFor("arrow_range")
local projectile_start_radius = self:GetSpecialValueFor("arrow_width")
local projectile_end_radius = self:GetSpecialValueFor("arrow_width")
local projectile_direction = Vector(point.x - origin.x, point.y - origin.y, 0):Normalized()
ProjectileManager:CreateLinearProjectile({
Source = caster,
Ability = self,
vSpawnOrigin = caster:GetOrigin(),
iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY,
iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE,
iUnitTargetType = bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
EffectName = "particles/units/heroes/hero_mirana/mirana_spell_arrow.vpcf",
fDistance = projectile_distance,
fStartRadius = projectile_start_radius,
fEndRadius = projectile_end_radius,
vVelocity = projectile_direction * projectile_speed,
bHasFrontalCone = false,
fExpireTime = GameRules:GetGameTime() + 10
})
self:EmitSound("Hero_Mirana.ArrowCast")
end
function thief_arrow.prototype.OnProjectileHit_ExtraData(self, target, location)
if not target then
return
end
local effect_cast = ParticleManager:CreateParticle("particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_POINT_FOLLOW, target)
ParticleManager:SetParticleControlEnt(
effect_cast,
0,
target,
PATTACH_POINT_FOLLOW,
"attach_hitloc",
target:GetOrigin(),
true
)
ParticleManager:SetParticleControl(
effect_cast,
1,
target:GetAbsOrigin()
)
ParticleManager:SetParticleControlForward(
effect_cast,
1,
(self:GetCaster():GetOrigin() - target:GetOrigin()):Normalized()
)
ParticleManager:ReleaseParticleIndex(effect_cast)
ApplyDamage({
victim = target,
attacker = self:GetCaster(),
damage = self:GetCaster():GetAttackDamage(),
damage_type = DAMAGE_TYPE_PHYSICAL,
ability = self
})
EmitSoundOn("Hero_Mirana.ArrowImpact", target)
return true
end
thief_arrow = __TS__Decorate(
thief_arrow,
thief_arrow,
{registerAbility(nil)},
{kind = "class", name = "thief_arrow"}
)
____exports.thief_arrow = thief_arrow
return ____exports
+844
View File
@@ -0,0 +1,844 @@
local ____lualib = require("lualib_bundle")
local __TS__NumberIsFinite = ____lualib.__TS__NumberIsFinite
local __TS__ArraySort = ____lualib.__TS__ArraySort
local Map = ____lualib.Map
local __TS__New = ____lualib.__TS__New
local __TS__ArrayFilter = ____lualib.__TS__ArrayFilter
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local clampToxinPoolRadius, toxinIsValidUnit, isToxinPoolThinker, toxinIsValidAbility, toxinPoolsOverlap, getToxinPoolRadiusForThinker, getToxinPoolMergeStackForThinker, getToxinDamagePerTickForThinker, getToxinPoolRemainingDuration, toxinDistSqHoriz, buildToxinOverlapCluster, computeMergedPoolStats, toxinSortDedupeEntIndices, toxinEnqueuePoolMergeForThinker, toxinDrainToxinMergeQueueFrame, toxinTryResolvePoolMergeForThinkerIndex, TOXIN_POOL_MODIFIER_NAME, TOXIN_MERGE_SCAN_RADIUS, TOXIN_MERGE_OVERLAP_EPSILON, TOXIN_THINKER_CLASS, TOXIN_POOL_MAX_RADIUS, TOXIN_MAX_MERGE_SCAN_THINKERS, toxinMergeQueue, toxinMergeDrainScheduled, toxinIsDrainingMerge
local ____difficulty_manager = require("difficulty_manager")
local Difficulty = ____difficulty_manager.Difficulty
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local ____creep_render_color = require("utils.creep_render_color")
local trySetIntrinsicCreepRenderColor = ____creep_render_color.trySetIntrinsicCreepRenderColor
local ____entity_radius = require("utils.entity_radius")
local findAllByClassnameInRadius = ____entity_radius.findAllByClassnameInRadius
function clampToxinPoolRadius(self, r)
return math.max(
1,
math.min(r, TOXIN_POOL_MAX_RADIUS)
)
end
function toxinIsValidUnit(self, unit)
return unit ~= nil and unit ~= nil and not unit:IsNull() and IsValidEntity(unit)
end
function isToxinPoolThinker(self, unit)
return toxinIsValidUnit(nil, unit) and unit:GetClassname() == TOXIN_THINKER_CLASS
end
function toxinIsValidAbility(self, ab)
return ab ~= nil and ab ~= nil and not ab:IsNull() and IsValidEntity(ab)
end
function toxinPoolsOverlap(self, centerA, radiusA, centerB, radiusB)
local dx = centerA.x - centerB.x
local dy = centerA.y - centerB.y
local dist = math.sqrt(dx * dx + dy * dy)
return dist <= radiusA + radiusB + TOXIN_MERGE_OVERLAP_EPSILON
end
function getToxinPoolRadiusForThinker(self, thinker, poolMod, ability)
if not toxinIsValidAbility(nil, ability) then
return 0
end
local raw
if poolMod and poolMod.effectiveRadius > 0 then
raw = poolMod.effectiveRadius
else
raw = ability:GetSpecialValueFor("radius")
end
return clampToxinPoolRadius(nil, raw)
end
function getToxinPoolMergeStackForThinker(self, poolMod, _ability)
if poolMod ~= nil and poolMod.poolMergeStackCount > 0 then
return math.floor(poolMod.poolMergeStackCount)
end
return 1
end
function getToxinDamagePerTickForThinker(self, poolMod, ability)
if not toxinIsValidAbility(nil, ability) then
return 0
end
if poolMod and poolMod.damagePerTick > 0 then
return poolMod.damagePerTick
end
return ability:GetSpecialValueFor("damage") * 0.33
end
function getToxinPoolRemainingDuration(self, poolMod, fallbackDuration)
local getter = poolMod.GetRemainingTime
if getter ~= nil then
local v = getter(poolMod)
if type(v) == "number" and __TS__NumberIsFinite(v) then
return math.max(0, v)
end
end
return math.max(0, fallbackDuration)
end
function toxinDistSqHoriz(self, ax, bx)
local dx = ax.x - bx.x
local dy = ax.y - bx.y
return dx * dx + dy * dy
end
function buildToxinOverlapCluster(self, seed, ability)
if not toxinIsValidUnit(nil, seed) or not toxinIsValidAbility(nil, ability) then
return {}
end
local seedTeam = seed:GetTeamNumber()
local origin = seed:GetAbsOrigin()
local raw = findAllByClassnameInRadius("npc_dota_thinker", origin, TOXIN_MERGE_SCAN_RADIUS)
local toxinThinkers = {}
for ____, ent in ipairs(raw) do
do
local npc = ent
if not toxinIsValidUnit(nil, npc) then
goto __continue22
end
if npc:GetTeamNumber() ~= seedTeam then
goto __continue22
end
if not npc:FindModifierByName(TOXIN_POOL_MODIFIER_NAME) then
goto __continue22
end
toxinThinkers[#toxinThinkers + 1] = npc
end
::__continue22::
end
if #toxinThinkers > TOXIN_MAX_MERGE_SCAN_THINKERS then
__TS__ArraySort(
toxinThinkers,
function(____, a, b) return toxinDistSqHoriz(
nil,
a:GetAbsOrigin(),
origin
) - toxinDistSqHoriz(
nil,
b:GetAbsOrigin(),
origin
) end
)
while #toxinThinkers > TOXIN_MAX_MERGE_SCAN_THINKERS do
table.remove(toxinThinkers)
end
end
local cluster = {}
local visited = __TS__New(Map)
local queue = {seed}
while #queue > 0 do
do
local cur = table.remove(queue)
if not toxinIsValidUnit(nil, cur) then
goto __continue30
end
local idx = cur:GetEntityIndex()
if visited:get(idx) then
goto __continue30
end
visited:set(idx, true)
cluster[#cluster + 1] = cur
local curMod = cur:FindModifierByName(TOXIN_POOL_MODIFIER_NAME)
local rCur = getToxinPoolRadiusForThinker(nil, cur, curMod, ability)
local pCur = cur:GetAbsOrigin()
for ____, other in ipairs(toxinThinkers) do
do
if not toxinIsValidUnit(nil, other) then
goto __continue33
end
local oIdx = other:GetEntityIndex()
if visited:get(oIdx) then
goto __continue33
end
local oMod = other:FindModifierByName(TOXIN_POOL_MODIFIER_NAME)
local rO = getToxinPoolRadiusForThinker(nil, other, oMod, ability)
if toxinPoolsOverlap(
nil,
pCur,
rCur,
other:GetAbsOrigin(),
rO
) then
queue[#queue + 1] = other
end
end
::__continue33::
end
end
::__continue30::
end
return cluster
end
function computeMergedPoolStats(self, cluster, ability)
if not toxinIsValidAbility(nil, ability) then
return {
centroid = Vector(0, 0, 0),
damagePerTick = 0,
radius = 1,
duration = 0.05,
mergeStackCount = 1
}
end
local valid = __TS__ArrayFilter(
cluster,
function(____, t) return toxinIsValidUnit(nil, t) end
)
local n = #valid
if n <= 0 then
local baseRadius = ability:GetSpecialValueFor("radius")
local baseDur = ability:GetSpecialValueFor("duration")
return {
centroid = Vector(0, 0, 0),
damagePerTick = ability:GetSpecialValueFor("damage") * 0.33,
radius = clampToxinPoolRadius(nil, baseRadius),
duration = math.max(0.05, baseDur),
mergeStackCount = 1
}
end
local baseDuration = ability:GetSpecialValueFor("duration")
local radiusBonusPerMerge = math.max(
0,
ability:GetSpecialValueFor("merge_radius_bonus")
)
local durationBonusPerMerge = math.max(
0,
ability:GetSpecialValueFor("merge_duration_bonus")
)
local sumR2 = 0
local sumDmg = 0
local sumStacks = 0
local maxRem = 0
local sx = 0
local sy = 0
local sz = 0
for ____, t in ipairs(valid) do
local mod = t:FindModifierByName(TOXIN_POOL_MODIFIER_NAME)
local r = getToxinPoolRadiusForThinker(nil, t, mod, ability)
sumR2 = sumR2 + r * r
sumDmg = sumDmg + getToxinDamagePerTickForThinker(nil, mod, ability)
sumStacks = sumStacks + getToxinPoolMergeStackForThinker(nil, mod, ability)
local p = t:GetAbsOrigin()
sx = sx + p.x
sy = sy + p.y
sz = sz + p.z
if mod then
maxRem = math.max(
maxRem,
getToxinPoolRemainingDuration(nil, mod, baseDuration)
)
else
maxRem = math.max(maxRem, baseDuration)
end
end
local mergedRadiusUncapped = math.max(
1,
math.sqrt(sumR2) + math.max(0, n - 1) * radiusBonusPerMerge
)
local mergedRadius = clampToxinPoolRadius(nil, mergedRadiusUncapped)
local mergedDuration = math.max(
0.05,
maxRem + math.max(0, n - 1) * durationBonusPerMerge
)
return {
centroid = Vector(sx / n, sy / n, sz / n),
damagePerTick = sumDmg,
radius = mergedRadius,
duration = mergedDuration,
mergeStackCount = math.max(1, sumStacks)
}
end
function toxinSortDedupeEntIndices(self, arr)
if #arr <= 1 then
return arr
end
local sorted = {unpack(arr)}
__TS__ArraySort(
sorted,
function(____, a, b) return a - b end
)
local out = {}
local prev = -2147483648
for ____, x in ipairs(sorted) do
local n = x
if n ~= prev then
out[#out + 1] = x
prev = n
end
end
return out
end
function toxinEnqueuePoolMergeForThinker(self, entIndex)
if not IsServer() then
return
end
toxinMergeQueue[#toxinMergeQueue + 1] = entIndex
if toxinMergeDrainScheduled or toxinIsDrainingMerge then
return
end
toxinMergeDrainScheduled = true
Timers:CreateTimer(0, toxinDrainToxinMergeQueueFrame)
end
function toxinDrainToxinMergeQueueFrame(self)
if not IsServer() then
return
end
toxinIsDrainingMerge = true
toxinMergeDrainScheduled = false
local batch = toxinMergeQueue
toxinMergeQueue = {}
local uniq = toxinSortDedupeEntIndices(nil, batch)
for ____, idx in ipairs(uniq) do
toxinTryResolvePoolMergeForThinkerIndex(nil, idx)
end
toxinIsDrainingMerge = false
if #toxinMergeQueue > 0 then
toxinMergeDrainScheduled = true
Timers:CreateTimer(0, toxinDrainToxinMergeQueueFrame)
end
end
function toxinTryResolvePoolMergeForThinkerIndex(self, entIndex)
if not IsServer() then
return
end
local npc = EntIndexToHScript(entIndex)
if not isToxinPoolThinker(nil, npc) then
return
end
local buff = npc:FindModifierByName(TOXIN_POOL_MODIFIER_NAME)
if not buff then
return
end
local poolMod = buff
local abilityRaw = buff:GetAbility()
if not toxinIsValidAbility(nil, abilityRaw) then
return
end
local ability = abilityRaw
local caster = buff:GetCaster()
if not toxinIsValidUnit(nil, caster) then
return
end
local cluster = buildToxinOverlapCluster(nil, npc, ability)
if #cluster < 2 then
poolMod:initializeSinglePoolFromAbility()
return
end
local mergeLeader
local minIdx = 2147483647
for ____, t in ipairs(cluster) do
do
if not toxinIsValidUnit(nil, t) then
goto __continue141
end
local ei = t:GetEntityIndex()
if ei < minIdx then
minIdx = ei
mergeLeader = t
end
end
::__continue141::
end
if not mergeLeader or not toxinIsValidUnit(nil, mergeLeader) then
return
end
if npc:GetEntityIndex() ~= mergeLeader:GetEntityIndex() then
toxinEnqueuePoolMergeForThinker(
nil,
mergeLeader:GetEntityIndex()
)
return
end
local merged = computeMergedPoolStats(nil, cluster, ability)
local spawnParams = {duration = merged.duration, merged_damage_per_tick = merged.damagePerTick, merged_radius = merged.radius, merged_stack_count = merged.mergeStackCount}
for ____, t in ipairs(cluster) do
if toxinIsValidUnit(nil, t) then
UTIL_Remove(t)
end
end
if not toxinIsValidAbility(nil, ability) or not toxinIsValidUnit(nil, caster) then
return
end
CreateModifierThinker(
caster,
ability,
TOXIN_POOL_MODIFIER_NAME,
spawnParams,
merged.centroid,
caster:GetTeamNumber(),
false
)
end
TOXIN_POOL_MODIFIER_NAME = "modifier_spider_nethertoxin_lua"
TOXIN_MERGE_SCAN_RADIUS = 2400
TOXIN_MERGE_OVERLAP_EPSILON = 12
TOXIN_THINKER_CLASS = "npc_dota_thinker"
TOXIN_POOL_MAX_RADIUS = 900
TOXIN_MAX_MERGE_SCAN_THINKERS = 220
toxinMergeQueue = {}
toxinMergeDrainScheduled = false
toxinIsDrainingMerge = false
____exports.toxin = __TS__Class()
local toxin = ____exports.toxin
toxin.name = "toxin"
toxin.____file_path = "scripts/vscripts/abilities/creep/toxin.lua"
__TS__ClassExtends(toxin, BaseAbility)
function toxin.prototype.Precache(self, context)
PrecacheResource("particle", "particles/units/heroes/hero_alchemist/alchemist_acid_spray.vpcf", context)
PrecacheResource("particle", "particles/units/heroes/hero_viper/viper_nethertoxin.vpcf", context)
PrecacheResource("particle", "particles/units/heroes/hero_viper/viper_nethertoxin_debuff.vpcf", context)
PrecacheResource("soundfile", "soundevents/game_sounds_heroes/game_sounds_broodmother.vsndevts", context)
PrecacheResource("soundfile", "soundevents/game_sounds_heroes/game_sounds_viper.vsndevts", context)
end
function toxin.prototype.GetIntrinsicModifierName(self)
return "modifier_spider_toxin_death_listener"
end
toxin = __TS__Decorate(
toxin,
toxin,
{registerAbility(nil)},
{kind = "class", name = "toxin"}
)
____exports.toxin = toxin
____exports.modifier_spider_toxin_death_listener = __TS__Class()
local modifier_spider_toxin_death_listener = ____exports.modifier_spider_toxin_death_listener
modifier_spider_toxin_death_listener.name = "modifier_spider_toxin_death_listener"
modifier_spider_toxin_death_listener.____file_path = "scripts/vscripts/abilities/creep/toxin.lua"
__TS__ClassExtends(modifier_spider_toxin_death_listener, BaseModifier)
function modifier_spider_toxin_death_listener.prototype.IsHidden(self)
return true
end
function modifier_spider_toxin_death_listener.prototype.IsPurgable(self)
return false
end
function modifier_spider_toxin_death_listener.prototype.OnCreated(self, _params)
if not IsServer() then
return
end
local parent = self:GetParent()
if not toxinIsValidUnit(nil, parent) then
return
end
trySetIntrinsicCreepRenderColor(
nil,
parent,
51,
102,
0
)
end
function modifier_spider_toxin_death_listener.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_DEATH}
end
function modifier_spider_toxin_death_listener.prototype.OnDeath(self, event)
if not IsServer() then
return
end
if event.unit ~= self:GetParent() then
return
end
local ability = self:GetAbility()
if not toxinIsValidAbility(nil, ability) then
return
end
local caster = self:GetCaster()
if not toxinIsValidUnit(nil, caster) then
return
end
local parent = self:GetParent()
local spawnOrigin = parent:GetAbsOrigin()
local duration = ability:GetSpecialValueFor("duration")
local radius = clampToxinPoolRadius(
nil,
ability:GetSpecialValueFor("radius")
)
local splashPfx = ParticleManager:CreateParticle("particles/units/heroes/hero_alchemist/alchemist_acid_spray.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(splashPfx, 0, spawnOrigin)
ParticleManager:SetParticleControl(
splashPfx,
1,
Vector(radius, 1, 1)
)
ParticleManager:SetParticleControl(
splashPfx,
15,
Vector(255, 153, 102)
)
ParticleManager:SetParticleControl(
splashPfx,
16,
Vector(1, 0, 0)
)
Timers:CreateTimer(
4,
function()
if not IsServer() then
return
end
ParticleManager:DestroyParticle(splashPfx, false)
ParticleManager:ReleaseParticleIndex(splashPfx)
end
)
EmitSoundOn("Hero_Broodmother.SpawnSpiderlings", parent)
CreateModifierThinker(
caster,
ability,
TOXIN_POOL_MODIFIER_NAME,
{duration = duration},
spawnOrigin,
caster:GetTeamNumber(),
false
)
end
modifier_spider_toxin_death_listener = __TS__Decorate(
modifier_spider_toxin_death_listener,
modifier_spider_toxin_death_listener,
{registerModifier(nil)},
{kind = "class", name = "modifier_spider_toxin_death_listener"}
)
____exports.modifier_spider_toxin_death_listener = modifier_spider_toxin_death_listener
____exports.modifier_spider_nethertoxin_lua = __TS__Class()
local modifier_spider_nethertoxin_lua = ____exports.modifier_spider_nethertoxin_lua
modifier_spider_nethertoxin_lua.name = "modifier_spider_nethertoxin_lua"
modifier_spider_nethertoxin_lua.____file_path = "scripts/vscripts/abilities/creep/toxin.lua"
__TS__ClassExtends(modifier_spider_nethertoxin_lua, BaseModifier)
function modifier_spider_nethertoxin_lua.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.effectiveRadius = 0
self.damagePerTick = 0
self.poolMergeStackCount = 0
self.auraPenaltyStack = 1
self.damageTable = {}
end
function modifier_spider_nethertoxin_lua.prototype.GetTexture(self)
return "viper_nethertoxin"
end
function modifier_spider_nethertoxin_lua.prototype.IsHidden(self)
return false
end
function modifier_spider_nethertoxin_lua.prototype.IsDebuff(self)
return true
end
function modifier_spider_nethertoxin_lua.prototype.IsStunDebuff(self)
return false
end
function modifier_spider_nethertoxin_lua.prototype.IsPurgable(self)
return false
end
function modifier_spider_nethertoxin_lua.prototype.initializeAuraVictimDebuff(self)
local ability = self:GetAbility()
if toxinIsValidAbility(nil, ability) then
self:SetDuration(
math.max(
0.05,
self:GetAuraDuration()
),
true
)
end
self.effectiveRadius = 0
self.damagePerTick = 0
self.poolMergeStackCount = 0
if IsServer() then
self:syncAuraPenaltyFromCasterThinker()
self:SetStackCount(math.max(
1,
math.floor(self.auraPenaltyStack)
))
end
end
function modifier_spider_nethertoxin_lua.prototype.syncAuraPenaltyFromCasterThinker(self)
local parent = self:GetParent()
if isToxinPoolThinker(nil, parent) then
return
end
local source = self:GetCaster()
if not toxinIsValidUnit(nil, source) then
return
end
local srcMod = source:FindModifierByName(TOXIN_POOL_MODIFIER_NAME)
if srcMod ~= nil and srcMod.poolMergeStackCount > 0 then
self.auraPenaltyStack = math.floor(srcMod.poolMergeStackCount)
else
self.auraPenaltyStack = math.max(1, self.auraPenaltyStack)
end
end
function modifier_spider_nethertoxin_lua.prototype.initializeSinglePoolFromAbility(self)
local ability = self:GetAbility()
local caster = self:GetCaster()
local parent = self:GetParent()
if not toxinIsValidAbility(nil, ability) or not toxinIsValidUnit(nil, caster) or not toxinIsValidUnit(nil, parent) then
return
end
local baseDamage = ability:GetSpecialValueFor("damage")
local baseRadius = ability:GetSpecialValueFor("radius")
local baseDuration = ability:GetSpecialValueFor("duration")
self.damagePerTick = (baseDamage + self:GetCaster():GetAttackDamage() * 0.15) * 0.33
local totaldamage = self:GetParent():IsRangedAttacker() and self.damagePerTick or self.damagePerTick * 0.25
self.effectiveRadius = clampToxinPoolRadius(nil, baseRadius)
self.poolMergeStackCount = 1
self:SetDuration(
math.max(0.05, baseDuration),
true
)
self.damageTable = {
victim = caster,
attacker = caster,
damage = totaldamage,
damage_type = ability:GetAbilityDamageType(),
ability = ability
}
self:StartIntervalThink(0.33)
self:PlayEffects()
end
function modifier_spider_nethertoxin_lua.prototype.initializeMergedPoolFromParams(self, params)
local ability = self:GetAbility()
local caster = self:GetCaster()
local parent = self:GetParent()
if not toxinIsValidAbility(nil, ability) or not toxinIsValidUnit(nil, caster) or not toxinIsValidUnit(nil, parent) then
return
end
self.damagePerTick = params.merged_damage_per_tick
self.effectiveRadius = clampToxinPoolRadius(nil, params.merged_radius)
self.poolMergeStackCount = math.max(
1,
math.floor(params.merged_stack_count or 1)
)
self:SetDuration(
math.max(0.05, params.duration),
true
)
self.damageTable = {
victim = caster,
attacker = caster,
damage = self.damagePerTick,
damage_type = ability:GetAbilityDamageType(),
ability = ability
}
self:StartIntervalThink(0.33)
self:PlayEffects()
end
function modifier_spider_nethertoxin_lua.prototype.OnCreated(self, params)
if not IsServer() then
return
end
local parent = self:GetParent()
if not isToxinPoolThinker(nil, parent) then
self:initializeAuraVictimDebuff()
return
end
local p = params
if p.merged_damage_per_tick ~= nil and p.merged_radius ~= nil and p.duration ~= nil then
self:initializeMergedPoolFromParams(p)
return
end
toxinEnqueuePoolMergeForThinker(
nil,
parent:GetEntityIndex()
)
end
function modifier_spider_nethertoxin_lua.prototype.OnRefresh(self, _params)
if not IsServer() then
return
end
local ability = self:GetAbility()
if not toxinIsValidAbility(nil, ability) then
return
end
if not isToxinPoolThinker(
nil,
self:GetParent()
) then
self:syncAuraPenaltyFromCasterThinker()
self:SetStackCount(math.max(
1,
math.floor(self.auraPenaltyStack)
))
return
end
self.damageTable.damage = self.damagePerTick
self.damageTable.damage_type = ability:GetAbilityDamageType()
end
function modifier_spider_nethertoxin_lua.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS}
end
function modifier_spider_nethertoxin_lua.prototype.GetModifierPhysicalArmorBonus(self)
local parent = self:GetParent()
if isToxinPoolThinker(nil, parent) then
return 0
end
local ability = self:GetAbility()
if not toxinIsValidAbility(nil, ability) then
return 0
end
local per = math.max(
0,
ability:GetSpecialValueFor("armor_magic_reduce_per_stack")
)
local scale = Difficulty:getNpcStatScale()
return -per * math.max(
1,
math.floor(self.auraPenaltyStack)
) * scale
end
function modifier_spider_nethertoxin_lua.prototype.GetModifierMagicalResistanceBonus(self)
local parent = self:GetParent()
if isToxinPoolThinker(nil, parent) then
return 0
end
local ability = self:GetAbility()
if not toxinIsValidAbility(nil, ability) then
return 0
end
local per = math.max(
0,
ability:GetSpecialValueFor("armor_magic_reduce_per_stack")
)
local scale = Difficulty:getNpcStatScale()
return -per * math.max(
1,
math.floor(self.auraPenaltyStack)
) * scale
end
function modifier_spider_nethertoxin_lua.prototype.OnDestroy(self)
if not IsServer() then
return
end
local parent = self:GetParent()
if not isToxinPoolThinker(nil, parent) then
return
end
local entIndex = parent:GetEntityIndex()
Timers:CreateTimer(
0,
function()
if not IsServer() then
return
end
local npc = EntIndexToHScript(entIndex)
if not toxinIsValidUnit(nil, npc) then
return
end
if npc:GetClassname() ~= TOXIN_THINKER_CLASS then
return
end
UTIL_Remove(npc)
end
)
end
function modifier_spider_nethertoxin_lua.prototype.CheckState(self)
return {[MODIFIER_STATE_PASSIVES_DISABLED] = true}
end
function modifier_spider_nethertoxin_lua.prototype.OnIntervalThink(self)
local parent = self:GetParent()
if not isToxinPoolThinker(nil, parent) then
return
end
local caster = self:GetCaster()
local ability = self:GetAbility()
if not toxinIsValidUnit(nil, caster) or not toxinIsValidAbility(nil, ability) then
return
end
local units = FindUnitsInRadius(
caster:GetTeamNumber(),
parent:GetAbsOrigin(),
nil,
self.effectiveRadius,
self:GetAuraSearchTeam(),
self:GetAuraSearchType(),
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
self.damageTable.attacker = caster
self.damageTable.ability = ability
self.damageTable.damage_type = ability:GetAbilityDamageType()
local damagedAny = false
for ____, unit in ipairs(units) do
do
if not toxinIsValidUnit(nil, unit) or not unit:IsAlive() then
goto __continue104
end
self.damageTable.victim = unit
ApplyDamage(self.damageTable)
damagedAny = true
end
::__continue104::
end
if damagedAny then
EmitSoundOn("Hero_Viper.NetherToxin.Damage", parent)
end
end
function modifier_spider_nethertoxin_lua.prototype.IsAura(self)
return isToxinPoolThinker(
nil,
self:GetParent()
)
end
function modifier_spider_nethertoxin_lua.prototype.GetModifierAura(self)
return TOXIN_POOL_MODIFIER_NAME
end
function modifier_spider_nethertoxin_lua.prototype.GetAuraRadius(self)
local ability = self:GetAbility()
if self.effectiveRadius > 0 then
return self.effectiveRadius
end
if toxinIsValidAbility(nil, ability) then
return clampToxinPoolRadius(
nil,
ability:GetSpecialValueFor("radius")
)
end
return 0
end
function modifier_spider_nethertoxin_lua.prototype.GetAuraDuration(self)
return 0.25
end
function modifier_spider_nethertoxin_lua.prototype.GetAuraSearchTeam(self)
return DOTA_UNIT_TARGET_TEAM_ENEMY
end
function modifier_spider_nethertoxin_lua.prototype.GetAuraSearchType(self)
return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC
end
function modifier_spider_nethertoxin_lua.prototype.GetEffectName(self)
return "particles/units/heroes/hero_viper/viper_nethertoxin_debuff.vpcf"
end
function modifier_spider_nethertoxin_lua.prototype.GetEffectAttachType(self)
return PATTACH_ABSORIGIN_FOLLOW
end
function modifier_spider_nethertoxin_lua.prototype.PlayEffects(self)
local parent = self:GetParent()
if not toxinIsValidUnit(nil, parent) then
return
end
local particle_cast = "particles/units/heroes/hero_viper/viper_nethertoxin.vpcf"
local sound_cast = "Hero_Viper.NetherToxin"
local effect_cast = ParticleManager:CreateParticle(particle_cast, PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(
effect_cast,
0,
parent:GetOrigin()
)
ParticleManager:SetParticleControl(
effect_cast,
1,
Vector(self.effectiveRadius, 1, 1)
)
self:AddParticle(
effect_cast,
false,
false,
-1,
false,
false
)
EmitSoundOn(sound_cast, parent)
end
modifier_spider_nethertoxin_lua = __TS__Decorate(
modifier_spider_nethertoxin_lua,
modifier_spider_nethertoxin_lua,
{registerModifier(nil)},
{kind = "class", name = "modifier_spider_nethertoxin_lua"}
)
____exports.modifier_spider_nethertoxin_lua = modifier_spider_nethertoxin_lua
return ____exports
@@ -0,0 +1,94 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____difficulty_manager = require("difficulty_manager")
local Difficulty = ____difficulty_manager.Difficulty
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
--- Пассивка для волновых крипов: при здоровье ниже порога атаки лечат на долю нанесённого урона.
____exports.wave_desperate_vampirism = __TS__Class()
local wave_desperate_vampirism = ____exports.wave_desperate_vampirism
wave_desperate_vampirism.name = "wave_desperate_vampirism"
wave_desperate_vampirism.____file_path = "scripts/vscripts/abilities/creep/wave_desperate_vampirism.lua"
__TS__ClassExtends(wave_desperate_vampirism, BaseAbility)
function wave_desperate_vampirism.prototype.GetIntrinsicModifierName(self)
return "modifier_wave_desperate_vampirism"
end
function wave_desperate_vampirism.prototype.Precache(self, context)
PrecacheResource("particle", "particles/units/heroes/hero_bloodseeker/bloodseeker_bloodbath.vpcf", context)
end
wave_desperate_vampirism = __TS__Decorate(
wave_desperate_vampirism,
wave_desperate_vampirism,
{registerAbility(nil)},
{kind = "class", name = "wave_desperate_vampirism"}
)
____exports.wave_desperate_vampirism = wave_desperate_vampirism
____exports.modifier_wave_desperate_vampirism = __TS__Class()
local modifier_wave_desperate_vampirism = ____exports.modifier_wave_desperate_vampirism
modifier_wave_desperate_vampirism.name = "modifier_wave_desperate_vampirism"
modifier_wave_desperate_vampirism.____file_path = "scripts/vscripts/abilities/creep/wave_desperate_vampirism.lua"
__TS__ClassExtends(modifier_wave_desperate_vampirism, BaseModifier)
function modifier_wave_desperate_vampirism.prototype.IsHidden(self)
return true
end
function modifier_wave_desperate_vampirism.prototype.IsDebuff(self)
return false
end
function modifier_wave_desperate_vampirism.prototype.IsPurgable(self)
return false
end
function modifier_wave_desperate_vampirism.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_ATTACK_LANDED}
end
function modifier_wave_desperate_vampirism.prototype.OnAttackLanded(self, event)
if not IsServer() then
return
end
local parent = self:GetParent()
local ability = self:GetAbility()
if not ability or not parent or event.attacker ~= parent then
return
end
local target = event.target
if not target or not target:IsAlive() or target:IsBuilding() or target:IsOther() then
return
end
local thresholdPct = ability:GetSpecialValueFor("hp_threshold_pct")
if parent:GetHealthPercent() >= thresholdPct then
return
end
local vampPct = ability:GetSpecialValueFor("vamp_pct")
local damage = event.damage or 0
if damage <= 0 then
damage = parent:GetAverageTrueAttackDamage(target)
end
if damage <= 0 then
return
end
local heal = damage * vampPct / 100 * Difficulty:getNpcStatScale()
if heal <= 0 then
return
end
parent:Heal(heal, ability)
local p = ParticleManager:CreateParticle("particles/units/heroes/hero_bloodseeker/bloodseeker_bloodbath.vpcf", PATTACH_ABSORIGIN_FOLLOW, parent)
ParticleManager:SetParticleControl(
p,
0,
parent:GetAbsOrigin()
)
ParticleManager:ReleaseParticleIndex(p)
end
modifier_wave_desperate_vampirism = __TS__Decorate(
modifier_wave_desperate_vampirism,
modifier_wave_desperate_vampirism,
{registerModifier(nil)},
{kind = "class", name = "modifier_wave_desperate_vampirism"}
)
____exports.modifier_wave_desperate_vampirism = modifier_wave_desperate_vampirism
return ____exports
@@ -0,0 +1,139 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local ____creep_render_color = require("utils.creep_render_color")
local trySetIntrinsicCreepRenderColor = ____creep_render_color.trySetIntrinsicCreepRenderColor
--- Пассив: усиливает юнита на bonus_pct процентов (по умолчанию 100 = удвоение по смыслу «+100%»).
-- HP/мана — плоский бонус от базового макс.; урон/IAS/мувспид/спелламп/реген HP% — через модификаторы.
____exports.wave_full_brutality = __TS__Class()
local wave_full_brutality = ____exports.wave_full_brutality
wave_full_brutality.name = "wave_full_brutality"
wave_full_brutality.____file_path = "scripts/vscripts/abilities/creep/wave_full_brutality.lua"
__TS__ClassExtends(wave_full_brutality, BaseAbility)
function wave_full_brutality.prototype.GetIntrinsicModifierName(self)
return "modifier_wave_full_brutality_passive"
end
wave_full_brutality = __TS__Decorate(
wave_full_brutality,
wave_full_brutality,
{registerAbility(nil)},
{kind = "class", name = "wave_full_brutality"}
)
____exports.wave_full_brutality = wave_full_brutality
____exports.modifier_wave_full_brutality_passive = __TS__Class()
local modifier_wave_full_brutality_passive = ____exports.modifier_wave_full_brutality_passive
modifier_wave_full_brutality_passive.name = "modifier_wave_full_brutality_passive"
modifier_wave_full_brutality_passive.____file_path = "scripts/vscripts/abilities/creep/wave_full_brutality.lua"
__TS__ClassExtends(modifier_wave_full_brutality_passive, BaseModifier)
function modifier_wave_full_brutality_passive.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.bonusPct = 100
self.effectiveBonusPct = 100
self.healthBonusFlat = 0
self.manaBonusFlat = 0
end
function modifier_wave_full_brutality_passive.prototype.IsHidden(self)
return false
end
function modifier_wave_full_brutality_passive.prototype.IsDebuff(self)
return false
end
function modifier_wave_full_brutality_passive.prototype.IsPurgable(self)
return false
end
function modifier_wave_full_brutality_passive.prototype.OnCreated(self)
local ability = self:GetAbility()
local parent = self:GetParent()
if not parent then
return
end
if IsServer() then
trySetIntrinsicCreepRenderColor(
nil,
self:GetParent(),
52,
0,
0
)
end
self.bonusPct = ability and ability:GetSpecialValueFor("bonus_pct") or 100
if self.bonusPct < 0 then
self.bonusPct = 0
end
self.effectiveBonusPct = self.bonusPct
local baseHp = math.max(
1,
parent:GetMaxHealth()
)
local baseMana = math.max(
0,
parent:GetMaxMana()
)
self.healthBonusFlat = math.floor(baseHp * (self.effectiveBonusPct / 100))
self.manaBonusFlat = math.floor(baseMana * (self.effectiveBonusPct / 100))
if IsServer() then
Timers:CreateTimer(
0,
function()
local p = self:GetParent()
if not p or not IsValidEntity(p) or not p:IsAlive() then
return nil
end
p:SetHealth(p:GetMaxHealth() * 2)
if p:GetMaxMana() > 0 then
p:SetMana(p:GetMaxMana() * 2)
end
return nil
end
)
end
end
function modifier_wave_full_brutality_passive.prototype.DeclareFunctions(self)
return {
MODIFIER_PROPERTY_HEALTH_BONUS,
MODIFIER_PROPERTY_MANA_BONUS,
MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE,
MODIFIER_PROPERTY_ATTACKSPEED_PERCENTAGE,
MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE,
MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE
}
end
function modifier_wave_full_brutality_passive.prototype.GetModifierHealthBonus(self)
return self.healthBonusFlat
end
function modifier_wave_full_brutality_passive.prototype.GetModifierManaBonus(self)
return self.manaBonusFlat
end
function modifier_wave_full_brutality_passive.prototype.GetModifierDamageOutgoing_Percentage(self, _event)
return self.effectiveBonusPct
end
function modifier_wave_full_brutality_passive.prototype.GetModifierAttackSpeedPercentage(self)
return self.effectiveBonusPct
end
function modifier_wave_full_brutality_passive.prototype.GetModifierMoveSpeedBonus_Percentage(self)
return self.effectiveBonusPct
end
function modifier_wave_full_brutality_passive.prototype.GetModifierSpellAmplify_Percentage(self, _event)
return self.effectiveBonusPct
end
function modifier_wave_full_brutality_passive.prototype.GetEffectName(self)
return "particles/items2_fx/mask_of_madness.vpcf"
end
function modifier_wave_full_brutality_passive.prototype.GetEffectAttachType(self)
return PATTACH_ABSORIGIN_FOLLOW
end
modifier_wave_full_brutality_passive = __TS__Decorate(
modifier_wave_full_brutality_passive,
modifier_wave_full_brutality_passive,
{registerModifier(nil)},
{kind = "class", name = "modifier_wave_full_brutality_passive"}
)
____exports.modifier_wave_full_brutality_passive = modifier_wave_full_brutality_passive
return ____exports
@@ -0,0 +1,63 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____difficulty_manager = require("difficulty_manager")
local Difficulty = ____difficulty_manager.Difficulty
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
--- Пассив волны: проход сквозь юнитов и бонус к скорости передвижения.
____exports.wave_phasing_march = __TS__Class()
local wave_phasing_march = ____exports.wave_phasing_march
wave_phasing_march.name = "wave_phasing_march"
wave_phasing_march.____file_path = "scripts/vscripts/abilities/creep/wave_phasing_march.lua"
__TS__ClassExtends(wave_phasing_march, BaseAbility)
function wave_phasing_march.prototype.GetIntrinsicModifierName(self)
return "modifier_wave_phasing_march_passive"
end
wave_phasing_march = __TS__Decorate(
wave_phasing_march,
wave_phasing_march,
{registerAbility(nil)},
{kind = "class", name = "wave_phasing_march"}
)
____exports.wave_phasing_march = wave_phasing_march
____exports.modifier_wave_phasing_march_passive = __TS__Class()
local modifier_wave_phasing_march_passive = ____exports.modifier_wave_phasing_march_passive
modifier_wave_phasing_march_passive.name = "modifier_wave_phasing_march_passive"
modifier_wave_phasing_march_passive.____file_path = "scripts/vscripts/abilities/creep/wave_phasing_march.lua"
__TS__ClassExtends(modifier_wave_phasing_march_passive, BaseModifier)
function modifier_wave_phasing_march_passive.prototype.IsHidden(self)
return true
end
function modifier_wave_phasing_march_passive.prototype.IsDebuff(self)
return false
end
function modifier_wave_phasing_march_passive.prototype.IsPurgable(self)
return false
end
function modifier_wave_phasing_march_passive.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT}
end
function modifier_wave_phasing_march_passive.prototype.GetModifierMoveSpeedBonus_Constant(self)
local ab = self:GetAbility()
if not ab then
return 0
end
return ab:GetSpecialValueFor("bonus_movement_speed") * Difficulty:getNpcStatScale()
end
function modifier_wave_phasing_march_passive.prototype.CheckState(self)
return {[MODIFIER_STATE_NO_UNIT_COLLISION] = true}
end
modifier_wave_phasing_march_passive = __TS__Decorate(
modifier_wave_phasing_march_passive,
modifier_wave_phasing_march_passive,
{registerModifier(nil)},
{kind = "class", name = "modifier_wave_phasing_march_passive"}
)
____exports.modifier_wave_phasing_march_passive = modifier_wave_phasing_march_passive
return ____exports
@@ -0,0 +1,137 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.weaking_impetus = __TS__Class()
local weaking_impetus = ____exports.weaking_impetus
weaking_impetus.name = "weaking_impetus"
weaking_impetus.____file_path = "scripts/vscripts/abilities/creep/weaking_impetus.lua"
__TS__ClassExtends(weaking_impetus, BaseAbility)
function weaking_impetus.prototype.GetIntrinsicModifierName(self)
return "modifier_weaking_impetus_passive"
end
weaking_impetus = __TS__Decorate(
weaking_impetus,
weaking_impetus,
{registerAbility(nil)},
{kind = "class", name = "weaking_impetus"}
)
____exports.weaking_impetus = weaking_impetus
____exports.modifier_weaking_impetus_passive = __TS__Class()
local modifier_weaking_impetus_passive = ____exports.modifier_weaking_impetus_passive
modifier_weaking_impetus_passive.name = "modifier_weaking_impetus_passive"
modifier_weaking_impetus_passive.____file_path = "scripts/vscripts/abilities/creep/weaking_impetus.lua"
__TS__ClassExtends(modifier_weaking_impetus_passive, BaseModifier)
function modifier_weaking_impetus_passive.prototype.IsHidden(self)
return true
end
function modifier_weaking_impetus_passive.prototype.IsDebuff(self)
return false
end
function modifier_weaking_impetus_passive.prototype.IsPurgable(self)
return false
end
function modifier_weaking_impetus_passive.prototype.GetStatusEffectName(self)
return "particles/status_fx/status_effect_abaddon_borrowed_time.vpcf"
end
function modifier_weaking_impetus_passive.prototype.GetEffectName(self)
return "particles/units/heroes/hero_abaddon/abaddon_borrowed_time.vpcf"
end
function modifier_weaking_impetus_passive.prototype.StatusEffectPriority(self)
return 10
end
function modifier_weaking_impetus_passive.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_ATTACK_LANDED}
end
function modifier_weaking_impetus_passive.prototype.OnAttackLanded(self, event)
if not IsServer() then
return
end
if event.attacker ~= self:GetParent() then
return
end
local target = event.target
if not target then
return
end
local parent = self:GetParent()
local ability = self:GetAbility()
if parent:GetMana() < self:GetAbility():GetSpecialValueFor("mana_hit") then
return
end
parent:SpendMana(
self:GetAbility():GetSpecialValueFor("mana_hit"),
ability
)
local duration = ability:GetSpecialValueFor("debuff_duration")
local modifier = target:FindModifierByName("modifier_weaking_impetus_debuff")
if modifier then
modifier:SetDuration(duration, true)
if modifier:GetStackCount() < self:GetAbility():GetSpecialValueFor("max_stacks") then
modifier:IncrementStackCount()
end
else
modifier = target:AddNewModifier(
self:GetParent(),
ability,
"modifier_weaking_impetus_debuff",
{duration = duration}
)
modifier:SetStackCount(1)
end
end
modifier_weaking_impetus_passive = __TS__Decorate(
modifier_weaking_impetus_passive,
modifier_weaking_impetus_passive,
{registerModifier(nil)},
{kind = "class", name = "modifier_weaking_impetus_passive"}
)
____exports.modifier_weaking_impetus_passive = modifier_weaking_impetus_passive
____exports.modifier_weaking_impetus_debuff = __TS__Class()
local modifier_weaking_impetus_debuff = ____exports.modifier_weaking_impetus_debuff
modifier_weaking_impetus_debuff.name = "modifier_weaking_impetus_debuff"
modifier_weaking_impetus_debuff.____file_path = "scripts/vscripts/abilities/creep/weaking_impetus.lua"
__TS__ClassExtends(modifier_weaking_impetus_debuff, BaseModifier)
function modifier_weaking_impetus_debuff.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.damage_reduction = 0
end
function modifier_weaking_impetus_debuff.prototype.IsHidden(self)
return false
end
function modifier_weaking_impetus_debuff.prototype.IsDebuff(self)
return true
end
function modifier_weaking_impetus_debuff.prototype.IsPurgable(self)
return true
end
function modifier_weaking_impetus_debuff.prototype.OnCreated(self)
local ability = self:GetAbility()
if not ability then
return
end
self.damage_reduction = ability:GetSpecialValueFor("damage_reduction")
end
function modifier_weaking_impetus_debuff.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE, MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE}
end
function modifier_weaking_impetus_debuff.prototype.GetModifierDamageOutgoing_Percentage(self, event)
return -self.damage_reduction * self:GetStackCount()
end
function modifier_weaking_impetus_debuff.prototype.GetModifierSpellAmplify_Percentage(self, event)
return -self.damage_reduction * self:GetStackCount()
end
modifier_weaking_impetus_debuff = __TS__Decorate(
modifier_weaking_impetus_debuff,
modifier_weaking_impetus_debuff,
{registerModifier(nil)},
{kind = "class", name = "modifier_weaking_impetus_debuff"}
)
____exports.modifier_weaking_impetus_debuff = modifier_weaking_impetus_debuff
return ____exports
@@ -0,0 +1,72 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____difficulty_manager = require("difficulty_manager")
local Difficulty = ____difficulty_manager.Difficulty
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.witch_base = __TS__Class()
local witch_base = ____exports.witch_base
witch_base.name = "witch_base"
witch_base.____file_path = "scripts/vscripts/abilities/creep/witch_base.lua"
__TS__ClassExtends(witch_base, BaseAbility)
function witch_base.prototype.GetIntrinsicModifierName(self)
return "modifier_witch_base"
end
witch_base = __TS__Decorate(
witch_base,
witch_base,
{registerAbility(nil)},
{kind = "class", name = "witch_base"}
)
____exports.witch_base = witch_base
____exports.modifier_witch_base = __TS__Class()
local modifier_witch_base = ____exports.modifier_witch_base
modifier_witch_base.name = "modifier_witch_base"
modifier_witch_base.____file_path = "scripts/vscripts/abilities/creep/witch_base.lua"
__TS__ClassExtends(modifier_witch_base, BaseModifier)
function modifier_witch_base.prototype.IsHidden(self)
return true
end
function modifier_witch_base.prototype.OnCreated(self, params)
local difficulty = Difficulty:getNpcStatScale()
local gameTime = GameRules:GetGameTime() / 60
self:SetStackCount(math.floor(gameTime))
end
function modifier_witch_base.prototype.OnRefresh(self, params)
self:OnCreated(params)
end
function modifier_witch_base.prototype.DeclareFunctions(self)
return {
MODIFIER_EVENT_ON_DEATH,
MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE,
MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
MODIFIER_PROPERTY_EXTRA_HEALTH_BONUS,
MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS
}
end
function modifier_witch_base.prototype.GetModifierSpellAmplify_Percentage(self, event)
return self:GetStackCount() * self:GetAbility():GetSpecialValueFor("amp_death_bonus") * Difficulty:getNpcStatScale()
end
function modifier_witch_base.prototype.GetModifierPreAttack_BonusDamage(self)
return self:GetStackCount() * self:GetAbility():GetSpecialValueFor("attack_death_bonus") * Difficulty:getNpcStatScale()
end
function modifier_witch_base.prototype.GetModifierExtraHealthBonus(self)
return self:GetStackCount() * self:GetAbility():GetSpecialValueFor("health_death_bonus") * Difficulty:getNpcStatScale()
end
function modifier_witch_base.prototype.GetModifierPhysicalArmorBonus(self, event)
return self:GetStackCount() * self:GetAbility():GetSpecialValueFor("armor_death_bonus") * Difficulty:getNpcStatScale()
end
modifier_witch_base = __TS__Decorate(
modifier_witch_base,
modifier_witch_base,
{registerModifier(nil)},
{kind = "class", name = "modifier_witch_base"}
)
____exports.modifier_witch_base = modifier_witch_base
return ____exports
@@ -0,0 +1,115 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____difficulty_manager = require("difficulty_manager")
local Difficulty = ____difficulty_manager.Difficulty
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.zombie_armor_decress = __TS__Class()
local zombie_armor_decress = ____exports.zombie_armor_decress
zombie_armor_decress.name = "zombie_armor_decress"
zombie_armor_decress.____file_path = "scripts/vscripts/abilities/creep/zombie_armor_decress.lua"
__TS__ClassExtends(zombie_armor_decress, BaseAbility)
function zombie_armor_decress.prototype.GetIntrinsicModifierName(self)
return "modifier_zombie_armor_decress"
end
zombie_armor_decress = __TS__Decorate(
zombie_armor_decress,
zombie_armor_decress,
{registerAbility(nil)},
{kind = "class", name = "zombie_armor_decress"}
)
____exports.zombie_armor_decress = zombie_armor_decress
____exports.modifier_zombie_armor_decress = __TS__Class()
local modifier_zombie_armor_decress = ____exports.modifier_zombie_armor_decress
modifier_zombie_armor_decress.name = "modifier_zombie_armor_decress"
modifier_zombie_armor_decress.____file_path = "scripts/vscripts/abilities/creep/zombie_armor_decress.lua"
__TS__ClassExtends(modifier_zombie_armor_decress, BaseModifier)
function modifier_zombie_armor_decress.prototype.IsHidden(self)
return true
end
function modifier_zombie_armor_decress.prototype.IsPurgable(self)
return false
end
function modifier_zombie_armor_decress.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_ATTACK_LANDED}
end
function modifier_zombie_armor_decress.prototype.OnAttackLanded(self, event)
if not IsServer() then
return
end
if event.attacker ~= self:GetParent() then
return
end
if not event.target or not event.target:IsAlive() then
return
end
local ability = self:GetAbility()
if not ability then
return
end
local duration = ability:GetSpecialValueFor("corruption_duration")
event.target:AddNewModifier(
self:GetParent(),
ability,
____exports.modifier_zombie_armor_decress_debuff.name,
{duration = duration}
)
end
modifier_zombie_armor_decress = __TS__Decorate(
modifier_zombie_armor_decress,
modifier_zombie_armor_decress,
{registerModifier(nil)},
{kind = "class", name = "modifier_zombie_armor_decress"}
)
____exports.modifier_zombie_armor_decress = modifier_zombie_armor_decress
____exports.modifier_zombie_armor_decress_debuff = __TS__Class()
local modifier_zombie_armor_decress_debuff = ____exports.modifier_zombie_armor_decress_debuff
modifier_zombie_armor_decress_debuff.name = "modifier_zombie_armor_decress_debuff"
modifier_zombie_armor_decress_debuff.____file_path = "scripts/vscripts/abilities/creep/zombie_armor_decress.lua"
__TS__ClassExtends(modifier_zombie_armor_decress_debuff, BaseModifier)
function modifier_zombie_armor_decress_debuff.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.armorDebuffBase = 0
end
function modifier_zombie_armor_decress_debuff.prototype.IsHidden(self)
return true
end
function modifier_zombie_armor_decress_debuff.prototype.GetAttributes(self)
return MODIFIER_ATTRIBUTE_MULTIPLE
end
function modifier_zombie_armor_decress_debuff.prototype.IsDebuff(self)
return true
end
function modifier_zombie_armor_decress_debuff.prototype.IsPurgable(self)
return true
end
function modifier_zombie_armor_decress_debuff.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS}
end
function modifier_zombie_armor_decress_debuff.prototype.OnCreated(self)
local ability = self:GetAbility()
if not ability then
return
end
self.armorDebuffBase = ability:GetSpecialValueFor("armor_debuff")
end
function modifier_zombie_armor_decress_debuff.prototype.OnRefresh(self)
self:OnCreated()
end
function modifier_zombie_armor_decress_debuff.prototype.GetModifierPhysicalArmorBonus(self)
return self.armorDebuffBase * Difficulty:getNpcStatScale()
end
modifier_zombie_armor_decress_debuff = __TS__Decorate(
modifier_zombie_armor_decress_debuff,
modifier_zombie_armor_decress_debuff,
{registerModifier(nil)},
{kind = "class", name = "modifier_zombie_armor_decress_debuff"}
)
____exports.modifier_zombie_armor_decress_debuff = modifier_zombie_armor_decress_debuff
return ____exports
@@ -0,0 +1,123 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local ____creep_render_color = require("utils.creep_render_color")
local trySetIntrinsicCreepRenderColor = ____creep_render_color.trySetIntrinsicCreepRenderColor
--- Пассив: при смерти взрыв по радиусу — урон и союзникам, и врагам (герои и крипы).
____exports.zombie_death_explosion = __TS__Class()
local zombie_death_explosion = ____exports.zombie_death_explosion
zombie_death_explosion.name = "zombie_death_explosion"
zombie_death_explosion.____file_path = "scripts/vscripts/abilities/creep/zombie_death_explosion.lua"
__TS__ClassExtends(zombie_death_explosion, BaseAbility)
function zombie_death_explosion.prototype.GetIntrinsicModifierName(self)
return "modifier_zombie_death_explosion_listener"
end
function zombie_death_explosion.prototype.Precache(self, context)
PrecacheResource("particle", "particles/units/heroes/hero_techies/techies_remote_mines_detonate.vpcf", context)
end
zombie_death_explosion = __TS__Decorate(
zombie_death_explosion,
zombie_death_explosion,
{registerAbility(nil)},
{kind = "class", name = "zombie_death_explosion"}
)
____exports.zombie_death_explosion = zombie_death_explosion
____exports.modifier_zombie_death_explosion_listener = __TS__Class()
local modifier_zombie_death_explosion_listener = ____exports.modifier_zombie_death_explosion_listener
modifier_zombie_death_explosion_listener.name = "modifier_zombie_death_explosion_listener"
modifier_zombie_death_explosion_listener.____file_path = "scripts/vscripts/abilities/creep/zombie_death_explosion.lua"
__TS__ClassExtends(modifier_zombie_death_explosion_listener, BaseModifier)
function modifier_zombie_death_explosion_listener.prototype.IsHidden(self)
return true
end
function modifier_zombie_death_explosion_listener.prototype.IsPurgable(self)
return false
end
function modifier_zombie_death_explosion_listener.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_DEATH}
end
function modifier_zombie_death_explosion_listener.prototype.OnCreated(self, params)
if IsServer() then
trySetIntrinsicCreepRenderColor(
nil,
self:GetParent(),
255,
0,
0
)
end
end
function modifier_zombie_death_explosion_listener.prototype.OnDeath(self, event)
if not IsServer() then
return
end
local parent = self:GetParent()
if event.unit ~= parent then
return
end
local ability = self:GetAbility()
if not ability then
return
end
local radius = ability:GetSpecialValueFor("radius")
local baseDamage = ability:GetSpecialValueFor("explosion_damage") + self:GetCaster():GetAttackDamage() * 0.35
local origin = parent:GetAbsOrigin()
local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_techies/techies_remote_mines_detonate.vpcf", PATTACH_WORLDORIGIN, nil)
ParticleManager:SetParticleControl(particle, 0, origin)
ParticleManager:SetParticleControl(
particle,
1,
Vector(radius, radius, radius)
)
ParticleManager:ReleaseParticleIndex(particle)
EmitSoundOn("Hero_Techies.RemoteMine.Detonate", parent)
local units = FindUnitsInRadius(
parent:GetTeamNumber(),
origin,
nil,
radius,
DOTA_UNIT_TARGET_TEAM_BOTH,
bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
local deadIndex = parent:entindex()
for ____, target in ipairs(units) do
do
if not target or not IsValidEntity(target) or not target:IsAlive() then
goto __continue13
end
if target:entindex() == deadIndex then
goto __continue13
end
local damage = target:IsRangedAttacker() and baseDamage or baseDamage * 0.25
if target:GetTeamNumber() == parent:GetTeamNumber() then
damage = damage * 0.5
end
ApplyDamage({
victim = target,
attacker = parent,
damage = damage,
damage_type = DAMAGE_TYPE_PHYSICAL,
ability = ability
})
end
::__continue13::
end
end
modifier_zombie_death_explosion_listener = __TS__Decorate(
modifier_zombie_death_explosion_listener,
modifier_zombie_death_explosion_listener,
{registerModifier(nil)},
{kind = "class", name = "modifier_zombie_death_explosion_listener"}
)
____exports.modifier_zombie_death_explosion_listener = modifier_zombie_death_explosion_listener
return ____exports
@@ -0,0 +1,227 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____difficulty_manager = require("difficulty_manager")
local Difficulty = ____difficulty_manager.Difficulty
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local ZOMBIE_VIRUS_DEBUFF_NAME = "modifier_zombie_virus_debuff"
local ZOMBIE_VIRUS_MAX_INSTANCES = 9
local function countZombieVirusDebuffInstances(self, unit)
local n = 0
do
local i = 0
while i < unit:GetModifierCount() do
if unit:GetModifierNameByIndex(i) == ZOMBIE_VIRUS_DEBUFF_NAME then
n = n + 1
end
i = i + 1
end
end
return n
end
____exports.zombie_virus = __TS__Class()
local zombie_virus = ____exports.zombie_virus
zombie_virus.name = "zombie_virus"
zombie_virus.____file_path = "scripts/vscripts/abilities/creep/zombie_virus.lua"
__TS__ClassExtends(zombie_virus, BaseAbility)
function zombie_virus.prototype.GetIntrinsicModifierName(self)
return "modifier_zombie_virus_intrinsic"
end
zombie_virus = __TS__Decorate(
zombie_virus,
zombie_virus,
{registerAbility(nil)},
{kind = "class", name = "zombie_virus"}
)
____exports.zombie_virus = zombie_virus
____exports.modifier_zombie_virus_intrinsic = __TS__Class()
local modifier_zombie_virus_intrinsic = ____exports.modifier_zombie_virus_intrinsic
modifier_zombie_virus_intrinsic.name = "modifier_zombie_virus_intrinsic"
modifier_zombie_virus_intrinsic.____file_path = "scripts/vscripts/abilities/creep/zombie_virus.lua"
__TS__ClassExtends(modifier_zombie_virus_intrinsic, BaseModifier)
function modifier_zombie_virus_intrinsic.prototype.IsHidden(self)
return true
end
function modifier_zombie_virus_intrinsic.prototype.IsDebuff(self)
return false
end
function modifier_zombie_virus_intrinsic.prototype.IsPurgable(self)
return false
end
function modifier_zombie_virus_intrinsic.prototype.OnCreated(self)
if not IsServer() then
return
end
end
function modifier_zombie_virus_intrinsic.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_ATTACK_LANDED}
end
function modifier_zombie_virus_intrinsic.prototype.OnAttackLanded(self, event)
if not IsServer() then
return
end
if event.attacker ~= self:GetParent() then
return
end
local ability = self:GetAbility()
if not ability then
return
end
local primaryZombieVirus = event.attacker:FindAbilityByName("zombie_virus")
if not primaryZombieVirus or ability ~= primaryZombieVirus then
return
end
local target = event.target
if not target or target:GetUnitName() == "npc_homer" then
return
end
local duration = ability:GetSpecialValueFor("duration")
if RandomInt(1, 100) > ability:GetSpecialValueFor("chance") then
return
end
if countZombieVirusDebuffInstances(nil, target) >= ZOMBIE_VIRUS_MAX_INSTANCES then
return
end
target:AddNewModifier(
self:GetParent(),
ability,
ZOMBIE_VIRUS_DEBUFF_NAME,
{duration = duration}
)
end
modifier_zombie_virus_intrinsic = __TS__Decorate(
modifier_zombie_virus_intrinsic,
modifier_zombie_virus_intrinsic,
{registerModifier(nil)},
{kind = "class", name = "modifier_zombie_virus_intrinsic"}
)
____exports.modifier_zombie_virus_intrinsic = modifier_zombie_virus_intrinsic
____exports.modifier_zombie_virus_debuff = __TS__Class()
local modifier_zombie_virus_debuff = ____exports.modifier_zombie_virus_debuff
modifier_zombie_virus_debuff.name = "modifier_zombie_virus_debuff"
modifier_zombie_virus_debuff.____file_path = "scripts/vscripts/abilities/creep/zombie_virus.lua"
__TS__ClassExtends(modifier_zombie_virus_debuff, BaseModifier)
function modifier_zombie_virus_debuff.prototype.IsHidden(self)
return true
end
function modifier_zombie_virus_debuff.prototype.IsDebuff(self)
return true
end
function modifier_zombie_virus_debuff.prototype.IsPurgable(self)
return true
end
function modifier_zombie_virus_debuff.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS}
end
function modifier_zombie_virus_debuff.prototype.GetModifierMoveSpeedBonus_Percentage(self)
local ability = self:GetAbility()
if not ability then
return 0
end
return -ability:GetSpecialValueFor("slow_movespeed") * Difficulty:getNpcStatScale()
end
function modifier_zombie_virus_debuff.prototype.GetModifierPhysicalArmorBonus(self)
local ability = self:GetAbility()
if not ability then
return 0
end
return -ability:GetSpecialValueFor("armor") * Difficulty:getNpcStatScale()
end
function modifier_zombie_virus_debuff.prototype.OnCreated(self)
local ability = self:GetAbility()
if not ability then
return
end
self.damage = ability:GetSpecialValueFor("damage")
self.tickInterval = ability:GetSpecialValueFor("tick_interval")
if IsServer() then
local caster = self:GetCaster()
if not caster or caster:IsNull() or not IsValidEntity(caster) or not caster:IsAlive() then
self:Destroy()
return
end
self:StartIntervalThink(self.tickInterval)
self.particleId = ParticleManager:CreateParticle(
"particles/econ/items/viper/viper_ti7_immortal/viper_poison_debuff_ti7.vpcf",
PATTACH_ABSORIGIN_FOLLOW,
self:GetParent()
)
ParticleManager:SetParticleControl(
self.particleId,
0,
self:GetParent():GetAbsOrigin()
)
ParticleManager:SetParticleControl(
self.particleId,
1,
self:GetParent():GetAbsOrigin()
)
end
end
function modifier_zombie_virus_debuff.prototype.OnRefresh(self, params)
if self.particleId then
ParticleManager:DestroyParticle(self.particleId, false)
ParticleManager:ReleaseParticleIndex(self.particleId)
end
end
function modifier_zombie_virus_debuff.prototype.OnIntervalThink(self)
if not IsServer() then
return
end
local ability = self:GetAbility()
local caster = self:GetCaster()
local target = self:GetParent()
if not ability or ability:IsNull() or not caster or caster:IsNull() or not IsValidEntity(caster) or not caster:IsAlive() then
self:Destroy()
return
end
local tickDamage = self.damage * self.tickInterval * Difficulty:getNpcStatScale()
if target and target:IsAlive() then
ApplyDamage({
victim = target,
attacker = caster,
damage = tickDamage,
damage_type = DAMAGE_TYPE_PHYSICAL,
ability = ability
})
SendOverheadEventMessage(
nil,
OVERHEAD_ALERT_DAMAGE,
target,
tickDamage,
nil
)
end
end
function modifier_zombie_virus_debuff.prototype.OnDestroy(self)
if IsClient() then
return
end
if self.particleId then
ParticleManager:DestroyParticle(self.particleId, false)
ParticleManager:ReleaseParticleIndex(self.particleId)
end
end
function modifier_zombie_virus_debuff.prototype.GetEffectName(self)
return "particles/econ/items/void_spirit/void_spirit_immortal_2021/void_spirit_immortal_2021_astral_step_debuff.vpcf"
end
function modifier_zombie_virus_debuff.prototype.GetTexture(self)
return "life_stealer_open_wounds"
end
function modifier_zombie_virus_debuff.prototype.GetEffectAttachType(self)
return PATTACH_ABSORIGIN_FOLLOW
end
modifier_zombie_virus_debuff = __TS__Decorate(
modifier_zombie_virus_debuff,
modifier_zombie_virus_debuff,
{registerModifier(nil)},
{kind = "class", name = "modifier_zombie_virus_debuff"}
)
____exports.modifier_zombie_virus_debuff = modifier_zombie_virus_debuff
return ____exports
+56
View File
@@ -0,0 +1,56 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.fish_basic = __TS__Class()
local fish_basic = ____exports.fish_basic
fish_basic.name = "fish_basic"
fish_basic.____file_path = "scripts/vscripts/abilities/fish_basic.lua"
__TS__ClassExtends(fish_basic, BaseAbility)
function fish_basic.prototype.GetIntrinsicModifierName(self)
return "modifier_fish_basic"
end
fish_basic = __TS__Decorate(
fish_basic,
fish_basic,
{registerAbility(nil)},
{kind = "class", name = "fish_basic"}
)
____exports.fish_basic = fish_basic
____exports.modifier_fish_basic = __TS__Class()
local modifier_fish_basic = ____exports.modifier_fish_basic
modifier_fish_basic.name = "modifier_fish_basic"
modifier_fish_basic.____file_path = "scripts/vscripts/abilities/fish_basic.lua"
__TS__ClassExtends(modifier_fish_basic, BaseModifier)
function modifier_fish_basic.prototype.IsHidden(self)
return true
end
function modifier_fish_basic.prototype.IsPurgable(self)
return false
end
function modifier_fish_basic.prototype.IsDebuff(self)
return false
end
function modifier_fish_basic.prototype.CheckState(self)
return {[MODIFIER_STATE_NO_HEALTH_BAR] = true, [MODIFIER_STATE_UNSELECTABLE] = true, [MODIFIER_STATE_UNTARGETABLE] = true}
end
function modifier_fish_basic.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_MIN_HEALTH}
end
function modifier_fish_basic.prototype.GetMinHealth(self)
return self:GetParent():GetHealth()
end
modifier_fish_basic = __TS__Decorate(
modifier_fish_basic,
modifier_fish_basic,
{registerModifier(nil)},
{kind = "class", name = "modifier_fish_basic"}
)
____exports.modifier_fish_basic = modifier_fish_basic
return ____exports
@@ -0,0 +1,39 @@
--[[ Generated with https://github.com/TypeScriptToLua/TypeScriptToLua ]]
local ____exports = {}
local ____hero_rage_whitelist = require("abilities.hero_rage.hero_rage_whitelist")
local isUnitNameAllowedForHeroRage = ____hero_rage_whitelist.isUnitNameAllowedForHeroRage
--- Параметры в духе infinity_levels / hero_rage.
local DEFAULT_HERO_RAGE = {
max_rage = 100,
rage_per_attack = 3,
rage_per_damage = 1,
time_decrase_rage = 4,
tick_decrase_rage = 0.5
}
local MOD_NAME = "modifier_hero_rage"
--- Вешает систему «ярости» (мана = ярость) на героя, если ещё не висит.
-- Нужна любая способность-носитель для AddNewModifier (у всех наших героев есть ability_stacking_crit).
-- **Только** герои из `hero_rage_whitelist.ts`.
function ____exports.tryApplyDefaultHeroRage(self, hero)
if not IsServer() then
return
end
if not hero:IsRealHero() or hero:IsIllusion() then
return
end
if not isUnitNameAllowedForHeroRage(
nil,
hero:GetUnitName()
) then
return
end
if hero:HasModifier(MOD_NAME) then
return
end
local host = hero:FindAbilityByName("ability_stacking_crit")
if not host then
return
end
hero:AddNewModifier(hero, host, MOD_NAME, DEFAULT_HERO_RAGE)
end
return ____exports
@@ -0,0 +1,222 @@
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerModifier = ____dota_ts_adapter.registerModifier
local ____hero_rage_nettable = require("abilities.hero_rage.hero_rage_nettable")
local clearHeroRageNetTable = ____hero_rage_nettable.clearHeroRageNetTable
local syncHeroRageNetTable = ____hero_rage_nettable.syncHeroRageNetTable
local DEFAULT_MAX = 100
local DEFAULT_RAGE_PER_ATTACK = 3
local DEFAULT_RAGE_WHEN_HIT = 1
local DEFAULT_OUT_OF_COMBAT = 4
--- Как у infinity: шаг, с которым списывается 1 ед. ярости после тайм-аута «без прироста».
local DEFAULT_DECAY_COOLDOWN = 0.5
--- Реже тик — меньше нагрузка (раньше 0.05 сильно лагало).
local MANA_SYNC = 0.12
local function readParam(self, params, key, def)
if params == nil then
return def
end
local t = params
local v = t[key]
if v == nil or v == nil then
return def
end
local n = tonumber(v)
return n ~= nil and n ~= nil and n or def
end
--- Максимальная и текущая «мана» героя = шкала ярости; списание маны при кастах = ярость.
-- Накопление: удары и получение автоатак, затухание после простоя.
____exports.modifier_hero_rage = __TS__Class()
local modifier_hero_rage = ____exports.modifier_hero_rage
modifier_hero_rage.name = "modifier_hero_rage"
modifier_hero_rage.____file_path = "scripts/vscripts/abilities/hero_rage/hero_rage_modifiers.lua"
__TS__ClassExtends(modifier_hero_rage, BaseModifier)
function modifier_hero_rage.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.maxRage = DEFAULT_MAX
self.ragePerAttack = DEFAULT_RAGE_PER_ATTACK
self.rageWhenHit = DEFAULT_RAGE_WHEN_HIT
self.timeOutForDecay = DEFAULT_OUT_OF_COMBAT
self.decayStep = DEFAULT_DECAY_COOLDOWN
self.manaDelta = 0
self.timeSinceRageGain = 0
self.decayAcc = 0
self.lastNetCur = -1
self.lastNetMax = -1
self.intellectReadLock = false
end
function modifier_hero_rage.prototype.IsHidden(self)
return true
end
function modifier_hero_rage.prototype.IsDebuff(self)
return false
end
function modifier_hero_rage.prototype.IsPurgable(self)
return false
end
function modifier_hero_rage.prototype.RemoveOnDeath(self)
return false
end
function modifier_hero_rage.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_MANA_BONUS, MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, MODIFIER_EVENT_ON_ATTACK_LANDED, MODIFIER_EVENT_ON_DEATH}
end
function modifier_hero_rage.prototype.OnCreated(self, params)
self.parentHero = self:GetParent()
self.maxRage = readParam(nil, params, "max_rage", DEFAULT_MAX)
self.ragePerAttack = readParam(nil, params, "rage_per_attack", DEFAULT_RAGE_PER_ATTACK)
self.rageWhenHit = readParam(nil, params, "rage_per_damage", DEFAULT_RAGE_WHEN_HIT)
self.timeOutForDecay = readParam(nil, params, "time_decrase_rage", DEFAULT_OUT_OF_COMBAT)
self.decayStep = readParam(nil, params, "tick_decrase_rage", DEFAULT_DECAY_COOLDOWN)
self.timeSinceRageGain = 0
self.decayAcc = 0
self.manaDelta = 0
if IsServer() then
self:StartIntervalThink(MANA_SYNC)
self.parentHero:SetMana(0)
self.lastNetCur = -1
self.lastNetMax = -1
self.parentHero:CalculateStatBonus(true)
syncHeroRageNetTable(
nil,
self.parentHero,
0,
self.maxRage,
true
)
end
end
function modifier_hero_rage.prototype.OnRefresh(self, params)
self.maxRage = readParam(nil, params, "max_rage", self.maxRage)
end
function modifier_hero_rage.prototype.GetModifierManaBonus(self)
return self.manaDelta
end
function modifier_hero_rage.prototype.GetModifierBonusStats_Intellect(self)
if self.intellectReadLock then
return 0
end
local p = self:GetParent()
if not p or p:IsNull() then
return 0
end
self.intellectReadLock = true
local int = p:GetIntellect(true)
self.intellectReadLock = false
return int * -1
end
function modifier_hero_rage.prototype.OnAttackLanded(self, event)
if not IsServer() then
return
end
local p = self.parentHero
if event.attacker == p then
self:bumpRage(self.ragePerAttack)
elseif event.target == p then
self:bumpRage(self.rageWhenHit)
end
end
function modifier_hero_rage.prototype.OnDeath(self, event)
if not IsServer() then
return
end
if event.unit ~= self:GetParent() then
return
end
self.parentHero:SetMana(0)
self:pushNet(0, self.maxRage, true)
end
function modifier_hero_rage.prototype.bumpRage(self, amt)
if amt <= 0 then
return
end
self.timeSinceRageGain = 0
self.decayAcc = 0
local p = self.parentHero
local m = p:GetMaxMana()
p:SetMana(math.min(
m,
p:GetMana() + amt
))
end
function modifier_hero_rage.prototype.stripPassiveManaRegen(self, p)
if not p or p:IsNull() then
return
end
local regenPerSec = p:GetManaRegen()
if regenPerSec > 0 then
p:SetMana(math.max(
0,
p:GetMana() - regenPerSec * MANA_SYNC
))
end
end
function modifier_hero_rage.prototype.pushNet(self, cur, max, force)
if force == nil then
force = false
end
if not force and self.lastNetCur == cur and self.lastNetMax == max then
return
end
self.lastNetCur = cur
self.lastNetMax = max
syncHeroRageNetTable(
nil,
self.parentHero,
cur,
max,
true
)
end
function modifier_hero_rage.prototype.OnIntervalThink(self)
if not IsServer() then
return
end
local p = self.parentHero
if not p or p:IsNull() or not p:IsAlive() then
return
end
self.manaDelta = self.maxRage - p:GetMaxMana() + (self.manaDelta or 0)
p:CalculateStatBonus(true)
p:SetMana(math.min(
p:GetMana(),
p:GetMaxMana()
))
self:stripPassiveManaRegen(p)
self.timeSinceRageGain = self.timeSinceRageGain + MANA_SYNC
if self.timeSinceRageGain >= self.timeOutForDecay then
self.decayAcc = self.decayAcc + MANA_SYNC
if self.decayAcc >= self.decayStep then
p:SetMana(math.max(
0,
p:GetMana() - 1
))
self.decayAcc = self.decayAcc - self.decayStep
end
end
self:pushNet(
p:GetMana(),
math.min(
p:GetMaxMana(),
self.maxRage
),
false
)
end
function modifier_hero_rage.prototype.OnDestroy(self)
if IsServer() then
clearHeroRageNetTable(nil, self.parentHero)
end
end
modifier_hero_rage = __TS__Decorate(
modifier_hero_rage,
modifier_hero_rage,
{registerModifier(nil)},
{kind = "class", name = "modifier_hero_rage"}
)
____exports.modifier_hero_rage = modifier_hero_rage
return ____exports
@@ -0,0 +1,41 @@
--[[ Generated with https://github.com/TypeScriptToLua/TypeScriptToLua ]]
local ____exports = {}
--- Синхронизация «ярости» (игровая мана) с клиентом для кастомного HUD.
local TABLE = "hero_rage"
function ____exports.syncHeroRageNetTable(self, hero, current, max, active)
if not IsServer() then
return
end
local pid = hero:GetPlayerOwnerID()
if pid < 0 then
return
end
local row = {
current = math.floor(current + 0.5),
max = math.max(
0,
math.floor(max + 0.5)
),
active = active and 1 or 0
}
CustomNetTables:SetTableValue(
TABLE,
tostring(pid),
row
)
end
function ____exports.clearHeroRageNetTable(self, hero)
if not IsServer() then
return
end
local pid = hero:GetPlayerOwnerID()
if pid < 0 then
return
end
CustomNetTables:SetTableValue(
TABLE,
tostring(pid),
{current = 0, max = 0, active = 0}
)
end
return ____exports

Some files were not shown because too many files have changed in this diff Show More