initial commit
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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.
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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"
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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 — 25 000 зомби-осколков."
|
||||
"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→10–15; овца 6→7, 20–25→14–19; курица 11→13, 30–35→24–29; волк 24→29, 42–47→36–41; энт 25→30, 28–38→22–32; скелеты (4 типа) XP 14→17, золота нет."
|
||||
"4" "Лягушки: мини 40→48 XP, 75–90→69–84 з; magi 72→86, 88–93→82–87; головастик 55→66, 72–77→66–71; лягушонок 72→86, 75–80→69–74. Драконы: чёрный/синий/красный 160→192 XP, 100–105→94–99 з; малый синий 124→149, 127–135→121–129; малый красный 41→49, 120–125→114–119."
|
||||
"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 1–5; 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 75–83; 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 81–83; 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 80–83 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 16–21→10–15; sheep 6→7, 20–25→14–19; chicken 11→13, 30–35→24–29; wolf 24→29, 42–47→36–41; ent 25→30, 28–38→22–32; skeletons (4 types) XP 14→17, no gold."
|
||||
"4" "Frogs: mini 40→48 XP, 75–90→69–84 g; magi 72→86, 88–93→82–87; tadpole 55→66, 72–77→66–71; froglet 72→86, 75–80→69–74. Dragons: black/blue/red 160→192 XP, 100–105→94–99 g; small blue 124→149, 127–135→121–129; small red 41→49, 120–125→114–119."
|
||||
"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 59–61 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 2–3); Toxin — / 18→4 (waves 2–3); 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, 145–325 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 12–30 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)."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
+57
@@ -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
|
||||
@@ -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
|
||||
@@ -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
Reference in New Issue
Block a user