initial commit
This commit is contained in:
@@ -0,0 +1,180 @@
|
||||
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.item_armlet_of_eternal_hunger = __TS__Class()
|
||||
local item_armlet_of_eternal_hunger = ____exports.item_armlet_of_eternal_hunger
|
||||
item_armlet_of_eternal_hunger.name = "item_armlet_of_eternal_hunger"
|
||||
item_armlet_of_eternal_hunger.____file_path = "scripts/vscripts/items/default_items/item_armlet_of_eternal_hunger.lua"
|
||||
__TS__ClassExtends(item_armlet_of_eternal_hunger, BaseAbility)
|
||||
function item_armlet_of_eternal_hunger.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_armlet_of_eternal_hunger"
|
||||
end
|
||||
function item_armlet_of_eternal_hunger.prototype.GetAbilityTextureName(self)
|
||||
local caster = self:GetCaster()
|
||||
if caster and caster:HasModifier("modifier_item_armlet_of_eternal_hunger_buff") then
|
||||
return "default_items/armlet_of_eternal_hunger/armlet2"
|
||||
else
|
||||
return "default_items/armlet_of_eternal_hunger/armlet2_off"
|
||||
end
|
||||
end
|
||||
function item_armlet_of_eternal_hunger.prototype.OnToggle(self)
|
||||
local caster = self:GetCaster()
|
||||
local toggle = self:GetToggleState()
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if toggle then
|
||||
self:EndCooldown()
|
||||
caster:AddNewModifier(caster, self, "modifier_item_armlet_of_eternal_hunger_buff", {})
|
||||
else
|
||||
local mod = caster:FindModifierByName("modifier_item_armlet_of_eternal_hunger_buff")
|
||||
if mod then
|
||||
mod:Destroy()
|
||||
self:UseResources(false, false, false, true)
|
||||
end
|
||||
end
|
||||
end
|
||||
item_armlet_of_eternal_hunger = __TS__Decorate(
|
||||
item_armlet_of_eternal_hunger,
|
||||
item_armlet_of_eternal_hunger,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_armlet_of_eternal_hunger"}
|
||||
)
|
||||
____exports.item_armlet_of_eternal_hunger = item_armlet_of_eternal_hunger
|
||||
____exports.modifier_item_armlet_of_eternal_hunger = __TS__Class()
|
||||
local modifier_item_armlet_of_eternal_hunger = ____exports.modifier_item_armlet_of_eternal_hunger
|
||||
modifier_item_armlet_of_eternal_hunger.name = "modifier_item_armlet_of_eternal_hunger"
|
||||
modifier_item_armlet_of_eternal_hunger.____file_path = "scripts/vscripts/items/default_items/item_armlet_of_eternal_hunger.lua"
|
||||
__TS__ClassExtends(modifier_item_armlet_of_eternal_hunger, BaseModifier)
|
||||
function modifier_item_armlet_of_eternal_hunger.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_PERMANENT
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger.prototype.OnCreated(self, params)
|
||||
addPhysicalVampirism(
|
||||
nil,
|
||||
self:GetParent(),
|
||||
self:GetAbility():GetSpecialValueFor("lifesteal")
|
||||
)
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger.prototype.OnDestroy(self)
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
reducePhysicalVampirism(
|
||||
nil,
|
||||
self:GetParent(),
|
||||
self:GetAbility():GetSpecialValueFor("lifesteal")
|
||||
)
|
||||
local mod = self:GetParent():FindModifierByName("modifier_item_armlet_of_eternal_hunger_buff")
|
||||
if mod then
|
||||
mod:Destroy()
|
||||
end
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT}
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger.prototype.GetModifierPhysicalArmorBonus(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_armor")
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_attack_speed")
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger.prototype.GetModifierConstantHealthRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_hp_regen")
|
||||
end
|
||||
modifier_item_armlet_of_eternal_hunger = __TS__Decorate(
|
||||
modifier_item_armlet_of_eternal_hunger,
|
||||
modifier_item_armlet_of_eternal_hunger,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_armlet_of_eternal_hunger"}
|
||||
)
|
||||
____exports.modifier_item_armlet_of_eternal_hunger = modifier_item_armlet_of_eternal_hunger
|
||||
____exports.modifier_item_armlet_of_eternal_hunger_buff = __TS__Class()
|
||||
local modifier_item_armlet_of_eternal_hunger_buff = ____exports.modifier_item_armlet_of_eternal_hunger_buff
|
||||
modifier_item_armlet_of_eternal_hunger_buff.name = "modifier_item_armlet_of_eternal_hunger_buff"
|
||||
modifier_item_armlet_of_eternal_hunger_buff.____file_path = "scripts/vscripts/items/default_items/item_armlet_of_eternal_hunger.lua"
|
||||
__TS__ClassExtends(modifier_item_armlet_of_eternal_hunger_buff, BaseModifier)
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
addPhysicalVampirism(
|
||||
nil,
|
||||
self:GetParent(),
|
||||
self:GetAbility():GetSpecialValueFor("lifesteal_active")
|
||||
)
|
||||
self:StartIntervalThink(0.25)
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.OnDestroy(self)
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
reducePhysicalVampirism(
|
||||
nil,
|
||||
self:GetParent(),
|
||||
self:GetAbility():GetSpecialValueFor("lifesteal_active")
|
||||
)
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.OnIntervalThink(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
self:GetParent():SetHealth(math.max(
|
||||
self:GetParent():GetHealth() - self:GetAbility():GetSpecialValueFor("health_per_sec") * 0.25,
|
||||
1
|
||||
))
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, MODIFIER_PROPERTY_STATS_STRENGTH_BONUS}
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.CheckState(self)
|
||||
return {[MODIFIER_STATE_SILENCED] = true}
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage_active")
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_attack_speed_active")
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.GetModifierMoveSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("movespeed_active")
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_str_active")
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.GetAbilityTextureName(self)
|
||||
return "default_items/armlet_of_eternal_hunger/armlet2"
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.GetEffectName(self)
|
||||
return "particles/units/heroes/hero_bloodseeker/bloodseeker_bloodrage.vpcf"
|
||||
end
|
||||
function modifier_item_armlet_of_eternal_hunger_buff.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
modifier_item_armlet_of_eternal_hunger_buff = __TS__Decorate(
|
||||
modifier_item_armlet_of_eternal_hunger_buff,
|
||||
modifier_item_armlet_of_eternal_hunger_buff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_armlet_of_eternal_hunger_buff"}
|
||||
)
|
||||
____exports.modifier_item_armlet_of_eternal_hunger_buff = modifier_item_armlet_of_eternal_hunger_buff
|
||||
return ____exports
|
||||
@@ -0,0 +1,55 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
____exports.item_bag_of_gold = __TS__Class()
|
||||
local item_bag_of_gold = ____exports.item_bag_of_gold
|
||||
item_bag_of_gold.name = "item_bag_of_gold"
|
||||
item_bag_of_gold.____file_path = "scripts/vscripts/items/default_items/item_bag_of_gold.lua"
|
||||
__TS__ClassExtends(item_bag_of_gold, BaseItem)
|
||||
function item_bag_of_gold.prototype.____constructor(self, ...)
|
||||
BaseItem.prototype.____constructor(self, ...)
|
||||
self.GOLD_AMOUNT = RandomInt(10, 50)
|
||||
end
|
||||
function item_bag_of_gold.prototype.OnSpellStart(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
if not caster then
|
||||
return
|
||||
end
|
||||
local playerID = caster:GetPlayerOwnerID()
|
||||
if not PlayerResource:IsValidPlayerID(playerID) then
|
||||
return
|
||||
end
|
||||
PlayerResource:ModifyGold(playerID, self.GOLD_AMOUNT, true, DOTA_ModifyGold_SharedGold)
|
||||
EmitSoundOnClient(
|
||||
"General.Coins",
|
||||
PlayerResource:GetPlayer(playerID)
|
||||
)
|
||||
SendOverheadEventMessage(
|
||||
PlayerResource:GetPlayer(playerID),
|
||||
OVERHEAD_ALERT_GOLD,
|
||||
caster,
|
||||
self.GOLD_AMOUNT,
|
||||
nil
|
||||
)
|
||||
local container = self:GetContainer()
|
||||
if container then
|
||||
container:RemoveSelf()
|
||||
end
|
||||
self:RemoveSelf()
|
||||
end
|
||||
item_bag_of_gold = __TS__Decorate(
|
||||
item_bag_of_gold,
|
||||
item_bag_of_gold,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_bag_of_gold"}
|
||||
)
|
||||
____exports.item_bag_of_gold = item_bag_of_gold
|
||||
return ____exports
|
||||
@@ -0,0 +1,298 @@
|
||||
local ____lualib = require("lualib_bundle")
|
||||
local Map = ____lualib.Map
|
||||
local __TS__New = ____lualib.__TS__New
|
||||
local __TS__Class = ____lualib.__TS__Class
|
||||
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
|
||||
local __TS__Decorate = ____lualib.__TS__Decorate
|
||||
local Set = ____lualib.Set
|
||||
local ____exports = {}
|
||||
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
|
||||
local BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local chainHitTargets = __TS__New(Map)
|
||||
local chainIdCounter = 0
|
||||
____exports.item_balist_custom = __TS__Class()
|
||||
local item_balist_custom = ____exports.item_balist_custom
|
||||
item_balist_custom.name = "item_balist_custom"
|
||||
item_balist_custom.____file_path = "scripts/vscripts/items/default_items/item_balist_custom.lua"
|
||||
__TS__ClassExtends(item_balist_custom, BaseItem)
|
||||
function item_balist_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_balist_custom"
|
||||
end
|
||||
function item_balist_custom.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", "particles/items_fx/chain_lightning.vpcf", context)
|
||||
end
|
||||
item_balist_custom = __TS__Decorate(
|
||||
item_balist_custom,
|
||||
item_balist_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_balist_custom"}
|
||||
)
|
||||
____exports.item_balist_custom = item_balist_custom
|
||||
____exports.modifier_balist_custom = __TS__Class()
|
||||
local modifier_balist_custom = ____exports.modifier_balist_custom
|
||||
modifier_balist_custom.name = "modifier_balist_custom"
|
||||
modifier_balist_custom.____file_path = "scripts/vscripts/items/default_items/item_balist_custom.lua"
|
||||
__TS__ClassExtends(modifier_balist_custom, BaseModifier)
|
||||
function modifier_balist_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_balist_custom.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_balist_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_balist_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_balist_custom.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_EVENT_ON_ATTACK_LANDED}
|
||||
end
|
||||
function modifier_balist_custom.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_balist_custom.prototype.OnAttackLanded(self, event)
|
||||
if event.attacker ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
if RandomInt(1, 100) > self:GetAbility():GetSpecialValueFor("chance") then
|
||||
return
|
||||
end
|
||||
local ____opt_0 = self:GetAbility()
|
||||
if (____opt_0 and ____opt_0:IsCooldownReady()) == false then
|
||||
return
|
||||
end
|
||||
local mainTarget = event.target
|
||||
local attacker = self:GetCaster()
|
||||
local ability = self:GetAbility()
|
||||
local boltRadius = ability:GetSpecialValueFor("bolt_radius")
|
||||
chainIdCounter = chainIdCounter + 1
|
||||
local chainId = chainIdCounter
|
||||
chainHitTargets:set(
|
||||
chainId,
|
||||
__TS__New(
|
||||
Set,
|
||||
{mainTarget:entindex()}
|
||||
)
|
||||
)
|
||||
mainTarget:AddNewModifier(
|
||||
self:GetParent(),
|
||||
ability,
|
||||
"modifier_balist_custom_dps",
|
||||
{duration = 0.26, initial_stacks = 3, chain_id = chainId, chain_radius = boltRadius}
|
||||
)
|
||||
ability:StartCooldown(ability:GetSpecialValueFor("ability_cooldown"))
|
||||
end
|
||||
function modifier_balist_custom.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local stackingCritMod = self:GetParent():FindModifierByName("modifier_stacking_crit")
|
||||
local ____addCritMult_5 = addCritMult
|
||||
local ____temp_4 = self:GetCaster()
|
||||
local ____opt_2 = self:GetAbility()
|
||||
____addCritMult_5(
|
||||
nil,
|
||||
____temp_4,
|
||||
____opt_2 and ____opt_2:GetSpecialValueFor("crit_multiplier") or 0
|
||||
)
|
||||
if stackingCritMod then
|
||||
local ability = self:GetAbility()
|
||||
local ____self_11 = stackingCritMod
|
||||
local ____self_11_AddCustomCrit_12 = ____self_11.AddCustomCrit
|
||||
local ____opt_6 = self:GetAbility()
|
||||
local ____temp_10 = ____opt_6 and ____opt_6:GetSpecialValueFor("crit_chance") or 0
|
||||
local ____opt_8 = self:GetAbility()
|
||||
____self_11_AddCustomCrit_12(
|
||||
____self_11,
|
||||
____temp_10,
|
||||
____opt_8 and ____opt_8:GetSpecialValueFor("crit_mult") or 0,
|
||||
"item_balist_custom",
|
||||
ability
|
||||
)
|
||||
end
|
||||
end
|
||||
function modifier_balist_custom.prototype.OnDestroy(self)
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if not parent or not IsValidEntity(parent) then
|
||||
return
|
||||
end
|
||||
local stackingCritModifier = parent:FindModifierByName("modifier_stacking_crit")
|
||||
if not stackingCritModifier then
|
||||
return
|
||||
end
|
||||
local ____reduceCritMult_16 = reduceCritMult
|
||||
local ____temp_15 = self:GetCaster()
|
||||
local ____opt_13 = self:GetAbility()
|
||||
____reduceCritMult_16(
|
||||
nil,
|
||||
____temp_15,
|
||||
____opt_13 and ____opt_13:GetSpecialValueFor("crit_multiplier") or 0
|
||||
)
|
||||
local ability = self:GetAbility()
|
||||
stackingCritModifier:RemoveCrit("item_balist_custom", ability)
|
||||
end
|
||||
modifier_balist_custom = __TS__Decorate(
|
||||
modifier_balist_custom,
|
||||
modifier_balist_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_balist_custom"}
|
||||
)
|
||||
____exports.modifier_balist_custom = modifier_balist_custom
|
||||
local function hitWithBolt(self, attacker, victim, ability, sourceForParticle)
|
||||
local particle = ParticleManager:CreateParticle("particles/items_fx/chain_lightning.vpcf", PATTACH_ABSORIGIN_FOLLOW, victim)
|
||||
if sourceForParticle and IsValidEntity(sourceForParticle) then
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
particle,
|
||||
0,
|
||||
sourceForParticle,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
sourceForParticle:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
else
|
||||
ParticleManager:SetParticleControl(
|
||||
particle,
|
||||
0,
|
||||
victim:GetAbsOrigin()
|
||||
)
|
||||
end
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
particle,
|
||||
1,
|
||||
victim,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
victim:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
ParticleManager:SetParticleControl(
|
||||
particle,
|
||||
2,
|
||||
Vector(1, 1, 1)
|
||||
)
|
||||
ParticleManager:ReleaseParticleIndex(particle)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
attacker:PerformAttack(
|
||||
victim,
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
true
|
||||
)
|
||||
ApplyDamage({
|
||||
victim = victim,
|
||||
attacker = attacker,
|
||||
damage = ability:GetSpecialValueFor("bolt_damage"),
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NONE,
|
||||
ability = ability
|
||||
})
|
||||
victim:AddNewModifier(
|
||||
victim,
|
||||
ability,
|
||||
"modifier_stunned",
|
||||
{duration = ability:GetSpecialValueFor("stun")}
|
||||
)
|
||||
end
|
||||
____exports.modifier_balist_custom_dps = __TS__Class()
|
||||
local modifier_balist_custom_dps = ____exports.modifier_balist_custom_dps
|
||||
modifier_balist_custom_dps.name = "modifier_balist_custom_dps"
|
||||
modifier_balist_custom_dps.____file_path = "scripts/vscripts/items/default_items/item_balist_custom.lua"
|
||||
__TS__ClassExtends(modifier_balist_custom_dps, BaseModifier)
|
||||
function modifier_balist_custom_dps.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_balist_custom_dps.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_balist_custom_dps.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_balist_custom_dps.prototype.OnCreated(self, params)
|
||||
local stacks = params and params.initial_stacks or 3
|
||||
self:SetStackCount(stacks)
|
||||
if (params and params.chain_id) ~= nil and (params and params.chain_radius) ~= nil then
|
||||
self.chainParams = {chain_id = params.chain_id, chain_radius = params.chain_radius}
|
||||
end
|
||||
self:StartIntervalThink(0.25)
|
||||
end
|
||||
function modifier_balist_custom_dps.prototype.OnIntervalThink(self)
|
||||
if self:GetStackCount() == 0 then
|
||||
return
|
||||
end
|
||||
local mainTarget = self:GetParent()
|
||||
local attacker = self:GetCaster()
|
||||
local ability = self:GetAbility()
|
||||
local params = self.chainParams
|
||||
if not attacker or not ability then
|
||||
return
|
||||
end
|
||||
self:SetDuration(0.26, true)
|
||||
self:SetStackCount(self:GetStackCount() - 1)
|
||||
hitWithBolt(
|
||||
nil,
|
||||
attacker,
|
||||
mainTarget,
|
||||
ability,
|
||||
attacker
|
||||
)
|
||||
if params and IsServer() then
|
||||
local hitSet = chainHitTargets:get(params.chain_id)
|
||||
if hitSet then
|
||||
local nearbyEnemies = FindUnitsInRadius(
|
||||
attacker:GetTeamNumber(),
|
||||
mainTarget:GetAbsOrigin(),
|
||||
nil,
|
||||
params.chain_radius,
|
||||
DOTA_UNIT_TARGET_TEAM_ENEMY,
|
||||
bit.bor(
|
||||
bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
|
||||
DOTA_UNIT_TARGET_BUILDING
|
||||
),
|
||||
DOTA_UNIT_TARGET_FLAG_NONE,
|
||||
FIND_CLOSEST,
|
||||
false
|
||||
)
|
||||
for ____, enemy in ipairs(nearbyEnemies) do
|
||||
if enemy and enemy:IsAlive() and not hitSet:has(enemy:entindex()) then
|
||||
hitSet:add(enemy:entindex())
|
||||
hitWithBolt(
|
||||
nil,
|
||||
attacker,
|
||||
enemy,
|
||||
ability,
|
||||
mainTarget
|
||||
)
|
||||
break
|
||||
end
|
||||
end
|
||||
if self:GetStackCount() == 0 then
|
||||
chainHitTargets:delete(params.chain_id)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function modifier_balist_custom_dps.prototype.GetTexture(self)
|
||||
return "default_items/balist_custom"
|
||||
end
|
||||
modifier_balist_custom_dps = __TS__Decorate(
|
||||
modifier_balist_custom_dps,
|
||||
modifier_balist_custom_dps,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_balist_custom_dps"}
|
||||
)
|
||||
____exports.modifier_balist_custom_dps = modifier_balist_custom_dps
|
||||
return ____exports
|
||||
@@ -0,0 +1 @@
|
||||
--[[ Generated with https://github.com/TypeScriptToLua/TypeScriptToLua ]]
|
||||
@@ -0,0 +1,110 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_battle_fury_custom = __TS__Class()
|
||||
local item_battle_fury_custom = ____exports.item_battle_fury_custom
|
||||
item_battle_fury_custom.name = "item_battle_fury_custom"
|
||||
item_battle_fury_custom.____file_path = "scripts/vscripts/items/default_items/item_battle_fury_custom.lua"
|
||||
__TS__ClassExtends(item_battle_fury_custom, BaseItem)
|
||||
function item_battle_fury_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_battle_fury_custom"
|
||||
end
|
||||
function item_battle_fury_custom.prototype.GetAOERadius(self)
|
||||
return self:GetSpecialValueFor("tree")
|
||||
end
|
||||
function item_battle_fury_custom.prototype.OnSpellStart(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local point = self:GetCursorPosition()
|
||||
local trees = GridNav:GetAllTreesAroundPoint(
|
||||
point,
|
||||
self:GetSpecialValueFor("tree"),
|
||||
true
|
||||
)
|
||||
if trees and #trees > 0 then
|
||||
self:CutTree(caster, point)
|
||||
end
|
||||
end
|
||||
function item_battle_fury_custom.prototype.CutTree(self, caster, position)
|
||||
GridNav:DestroyTreesAroundPoint(
|
||||
position,
|
||||
self:GetSpecialValueFor("tree"),
|
||||
true
|
||||
)
|
||||
end
|
||||
item_battle_fury_custom = __TS__Decorate(
|
||||
item_battle_fury_custom,
|
||||
item_battle_fury_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_battle_fury_custom"}
|
||||
)
|
||||
____exports.item_battle_fury_custom = item_battle_fury_custom
|
||||
____exports.modifier_battle_fury_custom = __TS__Class()
|
||||
local modifier_battle_fury_custom = ____exports.modifier_battle_fury_custom
|
||||
modifier_battle_fury_custom.name = "modifier_battle_fury_custom"
|
||||
modifier_battle_fury_custom.____file_path = "scripts/vscripts/items/default_items/item_battle_fury_custom.lua"
|
||||
__TS__ClassExtends(modifier_battle_fury_custom, BaseModifier)
|
||||
function modifier_battle_fury_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_battle_fury_custom.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_battle_fury_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_battle_fury_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_battle_fury_custom.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_EVENT_ON_ATTACK_LANDED}
|
||||
end
|
||||
function modifier_battle_fury_custom.prototype.OnAttackLanded(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if self:GetParent():IsRangedAttacker() then
|
||||
return
|
||||
end
|
||||
local parent = event.attacker
|
||||
if parent ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return
|
||||
end
|
||||
local target = event.target
|
||||
local attackDamage = parent:GetAverageTrueAttackDamage(target)
|
||||
local cleaveDamage = attackDamage * (self:GetAbility():GetSpecialValueFor("cleave_damage") / 100)
|
||||
DoCleaveAttack(
|
||||
parent,
|
||||
target,
|
||||
ability,
|
||||
cleaveDamage,
|
||||
self:GetAbility():GetSpecialValueFor("cleave_starting_width"),
|
||||
self:GetAbility():GetSpecialValueFor("cleave_ending_width"),
|
||||
self:GetAbility():GetSpecialValueFor("cleave_distance"),
|
||||
"particles/items_fx/battlefury_cleave.vpcf"
|
||||
)
|
||||
end
|
||||
function modifier_battle_fury_custom.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
modifier_battle_fury_custom = __TS__Decorate(
|
||||
modifier_battle_fury_custom,
|
||||
modifier_battle_fury_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_battle_fury_custom"}
|
||||
)
|
||||
____exports.modifier_battle_fury_custom = modifier_battle_fury_custom
|
||||
return ____exports
|
||||
@@ -0,0 +1,138 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
____exports.item_bearstbow = __TS__Class()
|
||||
local item_bearstbow = ____exports.item_bearstbow
|
||||
item_bearstbow.name = "item_bearstbow"
|
||||
item_bearstbow.____file_path = "scripts/vscripts/items/default_items/item_bearstbow.lua"
|
||||
__TS__ClassExtends(item_bearstbow, BaseItem)
|
||||
function item_bearstbow.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_bearstbow"
|
||||
end
|
||||
item_bearstbow = __TS__Decorate(
|
||||
item_bearstbow,
|
||||
item_bearstbow,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_bearstbow"}
|
||||
)
|
||||
____exports.item_bearstbow = item_bearstbow
|
||||
____exports.modifier_item_bearstbow = __TS__Class()
|
||||
local modifier_item_bearstbow = ____exports.modifier_item_bearstbow
|
||||
modifier_item_bearstbow.name = "modifier_item_bearstbow"
|
||||
modifier_item_bearstbow.____file_path = "scripts/vscripts/items/default_items/item_bearstbow.lua"
|
||||
__TS__ClassExtends(modifier_item_bearstbow, BaseModifier)
|
||||
function modifier_item_bearstbow.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_bearstbow.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_bearstbow.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_bearstbow.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
end
|
||||
function modifier_item_bearstbow.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_EVENT_ON_ATTACK,
|
||||
MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
|
||||
MODIFIER_PROPERTY_ATTACK_RANGE_BONUS,
|
||||
MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
|
||||
MODIFIER_PROPERTY_HEALTH_BONUS
|
||||
}
|
||||
end
|
||||
function modifier_item_bearstbow.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("attack_speed")
|
||||
end
|
||||
function modifier_item_bearstbow.prototype.GetModifierAttackRangeBonus(self)
|
||||
if not self:GetParent():IsRangedAttacker() then
|
||||
return 0
|
||||
end
|
||||
return self:GetAbility():GetSpecialValueFor("attack_range")
|
||||
end
|
||||
function modifier_item_bearstbow.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:GetAbility():GetSpecialValueFor("strength")
|
||||
end
|
||||
function modifier_item_bearstbow.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:GetAbility():GetSpecialValueFor("agility")
|
||||
end
|
||||
function modifier_item_bearstbow.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self:GetAbility():GetSpecialValueFor("intellect")
|
||||
end
|
||||
function modifier_item_bearstbow.prototype.GetModifierHealthBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("health")
|
||||
end
|
||||
function modifier_item_bearstbow.prototype.OnAttack(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local attacker = event.attacker
|
||||
local target = event.target
|
||||
if not attacker or not target then
|
||||
return
|
||||
end
|
||||
if not attacker:IsRealHero() then
|
||||
return
|
||||
end
|
||||
if attacker ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
if not attacker:IsRangedAttacker() then
|
||||
return
|
||||
end
|
||||
if event.no_attack_cooldown then
|
||||
return
|
||||
end
|
||||
local radius = self:GetParent():GetAttackRangeBuffer() + self:GetParent():GetBaseAttackRange()
|
||||
local units = FindUnitsInRadius(
|
||||
attacker:GetTeamNumber(),
|
||||
attacker:GetAbsOrigin(),
|
||||
nil,
|
||||
radius,
|
||||
DOTA_UNIT_TARGET_TEAM_ENEMY,
|
||||
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING,
|
||||
DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE,
|
||||
FIND_CLOSEST,
|
||||
false
|
||||
)
|
||||
local attackCount = 0
|
||||
for ____, unit in ipairs(units) do
|
||||
if unit and not unit:IsNull() and unit ~= target and unit:IsAlive() then
|
||||
attacker:PerformAttack(
|
||||
unit,
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
false
|
||||
)
|
||||
attackCount = attackCount + 1
|
||||
end
|
||||
if attackCount >= self:GetAbility():GetSpecialValueFor("attack_count") then
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
modifier_item_bearstbow = __TS__Decorate(
|
||||
modifier_item_bearstbow,
|
||||
modifier_item_bearstbow,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_bearstbow"}
|
||||
)
|
||||
____exports.modifier_item_bearstbow = modifier_item_bearstbow
|
||||
return ____exports
|
||||
@@ -0,0 +1,260 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local PARTICLE_BLADEMAIL = "particles/econ/items/spectre/spectre_arcana/spectre_arcana_blademail.vpcf"
|
||||
____exports.item_blademail_2 = __TS__Class()
|
||||
local item_blademail_2 = ____exports.item_blademail_2
|
||||
item_blademail_2.name = "item_blademail_2"
|
||||
item_blademail_2.____file_path = "scripts/vscripts/items/default_items/item_blademail_2.lua"
|
||||
__TS__ClassExtends(item_blademail_2, BaseItem)
|
||||
function item_blademail_2.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", PARTICLE_BLADEMAIL, context)
|
||||
end
|
||||
function item_blademail_2.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_blademail_2"
|
||||
end
|
||||
function item_blademail_2.prototype.GetAOERadius(self)
|
||||
return self:GetSpecialValueFor("radius")
|
||||
end
|
||||
function item_blademail_2.prototype.OnSpellStart(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
if not caster then
|
||||
return
|
||||
end
|
||||
local duration = self:GetSpecialValueFor("active_duration")
|
||||
caster:AddNewModifier(caster, self, ____exports.modifier_item_blademail_2_active.name, {duration = duration})
|
||||
EmitSoundOn("DOTA_Item.BladeMail.Activate", caster)
|
||||
end
|
||||
item_blademail_2 = __TS__Decorate(
|
||||
item_blademail_2,
|
||||
item_blademail_2,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_blademail_2"}
|
||||
)
|
||||
____exports.item_blademail_2 = item_blademail_2
|
||||
--- Носитель: отражение части входящего урона; аура на союзников и врагов в радиусе.
|
||||
____exports.modifier_item_blademail_2 = __TS__Class()
|
||||
local modifier_item_blademail_2 = ____exports.modifier_item_blademail_2
|
||||
modifier_item_blademail_2.name = "modifier_item_blademail_2"
|
||||
modifier_item_blademail_2.____file_path = "scripts/vscripts/items/default_items/item_blademail_2.lua"
|
||||
__TS__ClassExtends(modifier_item_blademail_2, BaseModifier)
|
||||
function modifier_item_blademail_2.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.IsAura(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.GetModifierAura(self)
|
||||
return "modifier_item_blademail_2_aura"
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.GetAuraRadius(self)
|
||||
return self:GetAbility():GetSpecialValueFor("radius")
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.GetAuraDuration(self)
|
||||
return 0.5
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.GetAuraSearchTeam(self)
|
||||
return DOTA_UNIT_TARGET_TEAM_BOTH
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.GetAuraSearchType(self)
|
||||
return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.GetAuraSearchFlags(self)
|
||||
return DOTA_UNIT_TARGET_FLAG_NONE
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_EVENT_ON_TAKEDAMAGE, MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT}
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.GetModifierPhysicalArmorBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_armor")
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("attack_speed")
|
||||
end
|
||||
function modifier_item_blademail_2.prototype.OnTakeDamage(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
local ability = self:GetAbility()
|
||||
if not ability or event.unit ~= parent then
|
||||
return
|
||||
end
|
||||
if event.damage <= 0 then
|
||||
return
|
||||
end
|
||||
if bit.band(event.damage_flags, DOTA_DAMAGE_FLAG_HPLOSS) == DOTA_DAMAGE_FLAG_HPLOSS then
|
||||
return
|
||||
end
|
||||
if bit.band(event.damage_flags, DOTA_DAMAGE_FLAG_REFLECTION) == DOTA_DAMAGE_FLAG_REFLECTION then
|
||||
return
|
||||
end
|
||||
local attacker = event.attacker
|
||||
if not attacker or attacker:IsNull() or not attacker:IsAlive() then
|
||||
return
|
||||
end
|
||||
if attacker == parent then
|
||||
return
|
||||
end
|
||||
if attacker:GetTeamNumber() == parent:GetTeamNumber() then
|
||||
return
|
||||
end
|
||||
if attacker:IsBuilding() or attacker:IsOther() then
|
||||
return
|
||||
end
|
||||
local isActive = parent:HasModifier(____exports.modifier_item_blademail_2_active.name)
|
||||
local reflectPct = ability:GetSpecialValueFor("reflect_pct") * 0.01
|
||||
if isActive then
|
||||
reflectPct = ability:GetSpecialValueFor("active_reflect_pct") * 0.01
|
||||
parent:HealWithParams(
|
||||
event.damage,
|
||||
ability,
|
||||
false,
|
||||
false,
|
||||
parent,
|
||||
false
|
||||
)
|
||||
SendOverheadEventMessage(
|
||||
nil,
|
||||
OVERHEAD_ALERT_HEAL,
|
||||
parent,
|
||||
event.damage,
|
||||
nil
|
||||
)
|
||||
end
|
||||
if reflectPct <= 0 then
|
||||
return
|
||||
end
|
||||
local reflectDamage = event.damage * reflectPct
|
||||
if reflectDamage <= 0 then
|
||||
return
|
||||
end
|
||||
ApplyDamage({
|
||||
victim = attacker,
|
||||
attacker = parent,
|
||||
damage = reflectDamage,
|
||||
damage_type = event.damage_type,
|
||||
ability = ability,
|
||||
damage_flags = DOTA_DAMAGE_FLAG_REFLECTION + DOTA_DAMAGE_FLAG_NO_SPELL_AMPLIFICATION
|
||||
})
|
||||
end
|
||||
modifier_item_blademail_2 = __TS__Decorate(
|
||||
modifier_item_blademail_2,
|
||||
modifier_item_blademail_2,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_blademail_2"}
|
||||
)
|
||||
____exports.modifier_item_blademail_2 = modifier_item_blademail_2
|
||||
--- Актив: ванильный визуал и 100% отражения из KV.
|
||||
____exports.modifier_item_blademail_2_active = __TS__Class()
|
||||
local modifier_item_blademail_2_active = ____exports.modifier_item_blademail_2_active
|
||||
modifier_item_blademail_2_active.name = "modifier_item_blademail_2_active"
|
||||
modifier_item_blademail_2_active.____file_path = "scripts/vscripts/items/default_items/item_blademail_2.lua"
|
||||
__TS__ClassExtends(modifier_item_blademail_2_active, BaseModifier)
|
||||
function modifier_item_blademail_2_active.prototype.RemoveOnDeath(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_blademail_2_active.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_blademail_2_active.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_blademail_2_active.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_blademail_2_active.prototype.GetEffectName(self)
|
||||
return PARTICLE_BLADEMAIL
|
||||
end
|
||||
function modifier_item_blademail_2_active.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
function modifier_item_blademail_2_active.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_MIN_HEALTH}
|
||||
end
|
||||
function modifier_item_blademail_2_active.prototype.GetMinHealth(self)
|
||||
return 1
|
||||
end
|
||||
function modifier_item_blademail_2_active.prototype.GetTexture(self)
|
||||
return "../items/default_items/blademail_2"
|
||||
end
|
||||
modifier_item_blademail_2_active = __TS__Decorate(
|
||||
modifier_item_blademail_2_active,
|
||||
modifier_item_blademail_2_active,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_blademail_2_active"}
|
||||
)
|
||||
____exports.modifier_item_blademail_2_active = modifier_item_blademail_2_active
|
||||
--- Аура: союзникам +броня и +скорость атаки, врагам столько же со знаком минус.
|
||||
____exports.modifier_item_blademail_2_aura = __TS__Class()
|
||||
local modifier_item_blademail_2_aura = ____exports.modifier_item_blademail_2_aura
|
||||
modifier_item_blademail_2_aura.name = "modifier_item_blademail_2_aura"
|
||||
modifier_item_blademail_2_aura.____file_path = "scripts/vscripts/items/default_items/item_blademail_2.lua"
|
||||
__TS__ClassExtends(modifier_item_blademail_2_aura, BaseModifier)
|
||||
function modifier_item_blademail_2_aura.prototype.RemoveOnDeath(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_blademail_2_aura.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_blademail_2_aura.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_blademail_2_aura.prototype.IsDebuff(self)
|
||||
local caster = self:GetCaster()
|
||||
if not caster then
|
||||
return true
|
||||
end
|
||||
return self:GetParent():GetTeamNumber() ~= caster:GetTeamNumber()
|
||||
end
|
||||
function modifier_item_blademail_2_aura.prototype.IsBuff(self)
|
||||
return not self:IsDebuff()
|
||||
end
|
||||
function modifier_item_blademail_2_aura.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT}
|
||||
end
|
||||
function modifier_item_blademail_2_aura.prototype.GetModifierPhysicalArmorBonus(self)
|
||||
local ability = self:GetAbility()
|
||||
local caster = self:GetCaster()
|
||||
if not ability or not caster then
|
||||
return 0
|
||||
end
|
||||
local v = ability:GetSpecialValueFor("aura_armor")
|
||||
return self:GetParent():GetTeamNumber() == caster:GetTeamNumber() and v or -v
|
||||
end
|
||||
function modifier_item_blademail_2_aura.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
local ability = self:GetAbility()
|
||||
local caster = self:GetCaster()
|
||||
if not ability or not caster then
|
||||
return 0
|
||||
end
|
||||
local v = ability:GetSpecialValueFor("aura_attack_speed")
|
||||
return self:GetParent():GetTeamNumber() == caster:GetTeamNumber() and v or -v
|
||||
end
|
||||
function modifier_item_blademail_2_aura.prototype.GetTexture(self)
|
||||
return "../items/default_items/blademail_2"
|
||||
end
|
||||
modifier_item_blademail_2_aura = __TS__Decorate(
|
||||
modifier_item_blademail_2_aura,
|
||||
modifier_item_blademail_2_aura,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_blademail_2_aura"}
|
||||
)
|
||||
____exports.modifier_item_blademail_2_aura = modifier_item_blademail_2_aura
|
||||
return ____exports
|
||||
@@ -0,0 +1,272 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____modifier_general_fired = require("abilities.modifiers.modifier_general_fired")
|
||||
local modifier_general_fired = ____modifier_general_fired.modifier_general_fired
|
||||
local ____modifier_stats_multiplier = require("modifiers.modifier_stats_multiplier")
|
||||
local removeStatsMultiplierSource = ____modifier_stats_multiplier.removeStatsMultiplierSource
|
||||
local setStatsMultiplierSource = ____modifier_stats_multiplier.setStatsMultiplierSource
|
||||
local BLAZING_RADIANCE_SOURCE_PREFIX = "item_blazing_radiance_custom"
|
||||
local RADIANCE_PARTICLE = "particles/items2_fx/radiance_owner.vpcf"
|
||||
local function getOwnerHealthRegenPerSecond(self, unit)
|
||||
local u = unit
|
||||
if u.GetHealthRegen ~= nil and type(u.GetHealthRegen) == "function" then
|
||||
return math.max(
|
||||
0,
|
||||
u:GetHealthRegen()
|
||||
)
|
||||
end
|
||||
return math.max(
|
||||
0,
|
||||
unit:GetBaseHealthRegen()
|
||||
)
|
||||
end
|
||||
____exports.item_blazing_radiance_custom = __TS__Class()
|
||||
local item_blazing_radiance_custom = ____exports.item_blazing_radiance_custom
|
||||
item_blazing_radiance_custom.name = "item_blazing_radiance_custom"
|
||||
item_blazing_radiance_custom.____file_path = "scripts/vscripts/items/default_items/item_blazing_radiance_custom.lua"
|
||||
__TS__ClassExtends(item_blazing_radiance_custom, BaseItem)
|
||||
function item_blazing_radiance_custom.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", RADIANCE_PARTICLE, context)
|
||||
end
|
||||
function item_blazing_radiance_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return ____exports.modifier_item_blazing_radiance_custom.name
|
||||
end
|
||||
function item_blazing_radiance_custom.prototype.GetAOERadius(self)
|
||||
return self:GetSpecialValueFor("radius")
|
||||
end
|
||||
item_blazing_radiance_custom = __TS__Decorate(
|
||||
item_blazing_radiance_custom,
|
||||
item_blazing_radiance_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_blazing_radiance_custom"}
|
||||
)
|
||||
____exports.item_blazing_radiance_custom = item_blazing_radiance_custom
|
||||
____exports.modifier_item_blazing_radiance_custom = __TS__Class()
|
||||
local modifier_item_blazing_radiance_custom = ____exports.modifier_item_blazing_radiance_custom
|
||||
modifier_item_blazing_radiance_custom.name = "modifier_item_blazing_radiance_custom"
|
||||
modifier_item_blazing_radiance_custom.____file_path = "scripts/vscripts/items/default_items/item_blazing_radiance_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_blazing_radiance_custom, BaseModifier)
|
||||
function modifier_item_blazing_radiance_custom.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.statsSourceId = ""
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.IsAura(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetModifierAura(self)
|
||||
return ____exports.modifier_item_blazing_radiance_custom_enemy_aura.name
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetAuraRadius(self)
|
||||
return self:GetAbility():GetSpecialValueFor("radius")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetAuraDuration(self)
|
||||
return 1
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetAuraSearchTeam(self)
|
||||
return DOTA_UNIT_TARGET_TEAM_ENEMY
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetAuraSearchType(self)
|
||||
return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetAuraSearchFlags(self)
|
||||
return DOTA_UNIT_TARGET_FLAG_NONE
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
|
||||
MODIFIER_PROPERTY_EVASION_CONSTANT,
|
||||
MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
|
||||
MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS,
|
||||
MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS,
|
||||
MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS
|
||||
}
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_all_stats")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_all_stats")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_all_stats")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetModifierEvasion_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("evasion")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_attack_speed")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetModifierMagicalResistanceBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_magic_resistance")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetModifierPhysicalArmorBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_physical_armor")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetModifierConstantHealthRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_health_regen")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.GetModifierConstantManaRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana_regen")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
self:StartIntervalThink(ability:GetSpecialValueFor("tick_interval"))
|
||||
self.particleId = ParticleManager:CreateParticle(
|
||||
RADIANCE_PARTICLE,
|
||||
PATTACH_ABSORIGIN_FOLLOW,
|
||||
self:GetParent()
|
||||
)
|
||||
ParticleManager:SetParticleShouldCheckFoW(self.particleId, false)
|
||||
local hero = self:GetParent()
|
||||
if hero and hero:IsRealHero() then
|
||||
self.statsSourceId = (BLAZING_RADIANCE_SOURCE_PREFIX .. "_") .. tostring(hero:entindex())
|
||||
setStatsMultiplierSource(
|
||||
nil,
|
||||
hero,
|
||||
self.statsSourceId,
|
||||
function()
|
||||
if not hero or not IsValidEntity(hero) or not hero:IsRealHero() then
|
||||
return 0
|
||||
end
|
||||
return ability and ability:GetSpecialValueFor("all_stats_pct") or 0
|
||||
end,
|
||||
"all_stats_pct"
|
||||
)
|
||||
end
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if self.particleId ~= nil then
|
||||
ParticleManager:DestroyParticle(self.particleId, false)
|
||||
ParticleManager:ReleaseParticleIndex(self.particleId)
|
||||
self.particleId = nil
|
||||
end
|
||||
if self.statsSourceId ~= "" then
|
||||
local hero = self:GetParent()
|
||||
if hero and IsValidEntity(hero) then
|
||||
removeStatsMultiplierSource(nil, hero, self.statsSourceId)
|
||||
end
|
||||
self.statsSourceId = ""
|
||||
end
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom.prototype.OnIntervalThink(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if not self:GetParent():IsAlive() then
|
||||
return
|
||||
end
|
||||
local ____opt_4 = self:GetCaster()
|
||||
if ____opt_4 and ____opt_4:IsIllusion() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
local owner = self:GetParent()
|
||||
local radius = ability:GetSpecialValueFor("radius")
|
||||
local tickInterval = ability:GetSpecialValueFor("tick_interval")
|
||||
local healthRegen = getOwnerHealthRegenPerSecond(nil, owner)
|
||||
local damage = (ability:GetSpecialValueFor("damage") + owner:GetMaxHealth() * (ability:GetSpecialValueFor("health_damage_pct") / 100) + healthRegen * ability:GetSpecialValueFor("health_regen_damage") + owner:GetMaxMana() * (ability:GetSpecialValueFor("mana_damage_pct") / 100)) * tickInterval
|
||||
local enemies = FindUnitsInRadius(
|
||||
owner:GetTeamNumber(),
|
||||
owner:GetAbsOrigin(),
|
||||
nil,
|
||||
radius,
|
||||
DOTA_UNIT_TARGET_TEAM_ENEMY,
|
||||
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
|
||||
DOTA_UNIT_TARGET_FLAG_NONE,
|
||||
FIND_ANY_ORDER,
|
||||
false
|
||||
)
|
||||
local stacksPerTick = ability:GetSpecialValueFor("fire_stack")
|
||||
for ____, enemy in ipairs(enemies) do
|
||||
local burnModifier = enemy:AddNewModifier(owner, ability, modifier_general_fired.name, {})
|
||||
if burnModifier then
|
||||
do
|
||||
local i = 0
|
||||
while i < stacksPerTick do
|
||||
burnModifier:IncrementStackCount()
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
ApplyDamage({
|
||||
victim = enemy,
|
||||
attacker = owner,
|
||||
damage = damage,
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
ability = ability,
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NO_SPELL_AMPLIFICATION
|
||||
})
|
||||
end
|
||||
end
|
||||
modifier_item_blazing_radiance_custom = __TS__Decorate(
|
||||
modifier_item_blazing_radiance_custom,
|
||||
modifier_item_blazing_radiance_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_blazing_radiance_custom"}
|
||||
)
|
||||
____exports.modifier_item_blazing_radiance_custom = modifier_item_blazing_radiance_custom
|
||||
--- Дебафф ауры: подавление магии врагов (Blazing Shroud).
|
||||
____exports.modifier_item_blazing_radiance_custom_enemy_aura = __TS__Class()
|
||||
local modifier_item_blazing_radiance_custom_enemy_aura = ____exports.modifier_item_blazing_radiance_custom_enemy_aura
|
||||
modifier_item_blazing_radiance_custom_enemy_aura.name = "modifier_item_blazing_radiance_custom_enemy_aura"
|
||||
modifier_item_blazing_radiance_custom_enemy_aura.____file_path = "scripts/vscripts/items/default_items/item_blazing_radiance_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_blazing_radiance_custom_enemy_aura, BaseModifier)
|
||||
function modifier_item_blazing_radiance_custom_enemy_aura.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom_enemy_aura.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom_enemy_aura.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom_enemy_aura.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom_enemy_aura.prototype.GetModifierMagicalResistanceBonus(self)
|
||||
return -self:GetAbility():GetSpecialValueFor("aura_magic_resistance_reduction")
|
||||
end
|
||||
function modifier_item_blazing_radiance_custom_enemy_aura.prototype.GetModifierSpellAmplify_Percentage(self)
|
||||
return -self:GetAbility():GetSpecialValueFor("aura_spell_amp_reduction")
|
||||
end
|
||||
modifier_item_blazing_radiance_custom_enemy_aura = __TS__Decorate(
|
||||
modifier_item_blazing_radiance_custom_enemy_aura,
|
||||
modifier_item_blazing_radiance_custom_enemy_aura,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_blazing_radiance_custom_enemy_aura"}
|
||||
)
|
||||
____exports.modifier_item_blazing_radiance_custom_enemy_aura = modifier_item_blazing_radiance_custom_enemy_aura
|
||||
return ____exports
|
||||
@@ -0,0 +1,207 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
____exports.item_bloodstone_magical = __TS__Class()
|
||||
local item_bloodstone_magical = ____exports.item_bloodstone_magical
|
||||
item_bloodstone_magical.name = "item_bloodstone_magical"
|
||||
item_bloodstone_magical.____file_path = "scripts/vscripts/items/default_items/item_bloodstone_magical.lua"
|
||||
__TS__ClassExtends(item_bloodstone_magical, BaseItem)
|
||||
function item_bloodstone_magical.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_bloodstone_magical"
|
||||
end
|
||||
function item_bloodstone_magical.prototype.OnSpellStart(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
self:GetCaster():AddNewModifier(
|
||||
self:GetCaster(),
|
||||
self,
|
||||
"modifier_item_bloodstone_magical_vampirism",
|
||||
{duration = self:GetSpecialValueFor("duration")}
|
||||
)
|
||||
end
|
||||
item_bloodstone_magical = __TS__Decorate(
|
||||
item_bloodstone_magical,
|
||||
item_bloodstone_magical,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_bloodstone_magical"}
|
||||
)
|
||||
____exports.item_bloodstone_magical = item_bloodstone_magical
|
||||
____exports.modifier_item_bloodstone_magical = __TS__Class()
|
||||
local modifier_item_bloodstone_magical = ____exports.modifier_item_bloodstone_magical
|
||||
modifier_item_bloodstone_magical.name = "modifier_item_bloodstone_magical"
|
||||
modifier_item_bloodstone_magical.____file_path = "scripts/vscripts/items/default_items/item_bloodstone_magical.lua"
|
||||
__TS__ClassExtends(modifier_item_bloodstone_magical, BaseModifier)
|
||||
function modifier_item_bloodstone_magical.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_bloodstone_magical.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_bloodstone_magical.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_bloodstone_magical.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_HEALTH_BONUS,
|
||||
MODIFIER_PROPERTY_MANA_BONUS,
|
||||
MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE,
|
||||
MODIFIER_PROPERTY_COOLDOWN_PERCENTAGE
|
||||
}
|
||||
end
|
||||
function modifier_item_bloodstone_magical.prototype.OnCreated(self, params)
|
||||
local caster = self:GetCaster()
|
||||
if not caster then
|
||||
return
|
||||
end
|
||||
addMagicalVampirism(
|
||||
nil,
|
||||
caster,
|
||||
self:GetAbility():GetSpecialValueFor("spell_lifesteal")
|
||||
)
|
||||
end
|
||||
function modifier_item_bloodstone_magical.prototype.OnDestroy(self)
|
||||
local caster = self:GetCaster()
|
||||
if not caster then
|
||||
return
|
||||
end
|
||||
reduceMagicalVampirism(
|
||||
nil,
|
||||
caster,
|
||||
self:GetAbility():GetSpecialValueFor("spell_lifesteal")
|
||||
)
|
||||
end
|
||||
function modifier_item_bloodstone_magical.prototype.GetModifierHealthBonus(self)
|
||||
local item = self:GetAbility()
|
||||
if not item then
|
||||
return 0
|
||||
end
|
||||
local ____opt_0 = self:GetCaster()
|
||||
if not (____opt_0 and ____opt_0:HasItemInInventory("item_bloodstone_magical")) then
|
||||
return 0
|
||||
end
|
||||
return item:GetSpecialValueFor("bonus_health")
|
||||
end
|
||||
function modifier_item_bloodstone_magical.prototype.GetModifierManaBonus(self)
|
||||
local item = self:GetAbility()
|
||||
if not item then
|
||||
return 0
|
||||
end
|
||||
local ____opt_2 = self:GetCaster()
|
||||
if not (____opt_2 and ____opt_2:HasItemInInventory("item_bloodstone_magical")) then
|
||||
return 0
|
||||
end
|
||||
return item:GetSpecialValueFor("bonus_mana")
|
||||
end
|
||||
function modifier_item_bloodstone_magical.prototype.GetModifierConstantHealthRegen(self)
|
||||
local item = self:GetAbility()
|
||||
if not item then
|
||||
return 0
|
||||
end
|
||||
local ____opt_4 = self:GetCaster()
|
||||
if not (____opt_4 and ____opt_4:HasItemInInventory("item_bloodstone_magical")) then
|
||||
return 0
|
||||
end
|
||||
return item:GetSpecialValueFor("bonus_health_regen")
|
||||
end
|
||||
function modifier_item_bloodstone_magical.prototype.GetModifierConstantManaRegen(self)
|
||||
local item = self:GetAbility()
|
||||
if not item then
|
||||
return 0
|
||||
end
|
||||
local ____opt_6 = self:GetCaster()
|
||||
if not (____opt_6 and ____opt_6:HasItemInInventory("item_bloodstone_magical")) then
|
||||
return 0
|
||||
end
|
||||
return item:GetSpecialValueFor("bonus_mana_regen")
|
||||
end
|
||||
modifier_item_bloodstone_magical = __TS__Decorate(
|
||||
modifier_item_bloodstone_magical,
|
||||
modifier_item_bloodstone_magical,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_bloodstone_magical"}
|
||||
)
|
||||
____exports.modifier_item_bloodstone_magical = modifier_item_bloodstone_magical
|
||||
____exports.modifier_item_bloodstone_magical_vampirism = __TS__Class()
|
||||
local modifier_item_bloodstone_magical_vampirism = ____exports.modifier_item_bloodstone_magical_vampirism
|
||||
modifier_item_bloodstone_magical_vampirism.name = "modifier_item_bloodstone_magical_vampirism"
|
||||
modifier_item_bloodstone_magical_vampirism.____file_path = "scripts/vscripts/items/default_items/item_bloodstone_magical.lua"
|
||||
__TS__ClassExtends(modifier_item_bloodstone_magical_vampirism, BaseModifier)
|
||||
function modifier_item_bloodstone_magical_vampirism.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_bloodstone_magical_vampirism.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_bloodstone_magical_vampirism.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_bloodstone_magical_vampirism.prototype.GetTexture(self)
|
||||
return "default_items/bloodstone2"
|
||||
end
|
||||
function modifier_item_bloodstone_magical_vampirism.prototype.OnCreated(self, params)
|
||||
local caster = self:GetCaster()
|
||||
if not caster then
|
||||
return
|
||||
end
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
local player = caster:GetPlayerOwner()
|
||||
if not player then
|
||||
return
|
||||
end
|
||||
addMagicalVampirism(
|
||||
nil,
|
||||
caster,
|
||||
self:GetAbility():GetSpecialValueFor("spell_lifesteal_active")
|
||||
)
|
||||
self.particle = ParticleManager:CreateParticleForPlayer("particles/bloodstone_full_screen_effect.vpcf", PATTACH_ABSORIGIN_FOLLOW, caster, player)
|
||||
EmitSoundOn("bloodstone_magical_sound", caster)
|
||||
end
|
||||
function modifier_item_bloodstone_magical_vampirism.prototype.OnRefresh(self, params)
|
||||
if self.particle then
|
||||
ParticleManager:DestroyParticle(self.particle, false)
|
||||
end
|
||||
self:OnCreated(params)
|
||||
end
|
||||
function modifier_item_bloodstone_magical_vampirism.prototype.OnDestroy(self)
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
if self.particle then
|
||||
ParticleManager:DestroyParticle(self.particle, false)
|
||||
end
|
||||
reduceMagicalVampirism(
|
||||
nil,
|
||||
caster,
|
||||
self:GetAbility():GetSpecialValueFor("spell_lifesteal_active")
|
||||
)
|
||||
end
|
||||
function modifier_item_bloodstone_magical_vampirism.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_CASTTIME_PERCENTAGE, MODIFIER_PROPERTY_COOLDOWN_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_bloodstone_magical_vampirism.prototype.GetModifierPercentageCasttime(self)
|
||||
return self:GetAbility():GetSpecialValueFor("casttime_reduction")
|
||||
end
|
||||
function modifier_item_bloodstone_magical_vampirism.prototype.GetModifierPercentageCooldown(self)
|
||||
return self:GetAbility():GetSpecialValueFor("cooldown_reduction_active")
|
||||
end
|
||||
modifier_item_bloodstone_magical_vampirism = __TS__Decorate(
|
||||
modifier_item_bloodstone_magical_vampirism,
|
||||
modifier_item_bloodstone_magical_vampirism,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_bloodstone_magical_vampirism"}
|
||||
)
|
||||
____exports.modifier_item_bloodstone_magical_vampirism = modifier_item_bloodstone_magical_vampirism
|
||||
return ____exports
|
||||
@@ -0,0 +1,266 @@
|
||||
local ____lualib = require("lualib_bundle")
|
||||
local __TS__Class = ____lualib.__TS__Class
|
||||
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
|
||||
local __TS__Decorate = ____lualib.__TS__Decorate
|
||||
local __TS__StringIncludes = ____lualib.__TS__StringIncludes
|
||||
local __TS__ArrayForEach = ____lualib.__TS__ArrayForEach
|
||||
local ____exports = {}
|
||||
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
|
||||
local BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____clean_harbor_flag_markers = require("quests.clean_harbor_flag_markers")
|
||||
local hideCleanHarborFlagPlacementMarkers = ____clean_harbor_flag_markers.hideCleanHarborFlagPlacementMarkers
|
||||
local isNearCleanHarborFlagPlacement = ____clean_harbor_flag_markers.isNearCleanHarborFlagPlacement
|
||||
local ____SpawnManager = require("SpawnManager")
|
||||
local SpawnManager = ____SpawnManager.SpawnManager
|
||||
local ____QuestSystem = require("quests.QuestSystem")
|
||||
local QuestSystem = ____QuestSystem.QuestSystem
|
||||
____exports.item_clean_harbor = __TS__Class()
|
||||
local item_clean_harbor = ____exports.item_clean_harbor
|
||||
item_clean_harbor.name = "item_clean_harbor"
|
||||
item_clean_harbor.____file_path = "scripts/vscripts/items/default_items/item_clean_harbor.lua"
|
||||
__TS__ClassExtends(item_clean_harbor, BaseItem)
|
||||
function item_clean_harbor.prototype.canPlaceFlagHere(self, caster)
|
||||
return isNearCleanHarborFlagPlacement(
|
||||
nil,
|
||||
caster:GetAbsOrigin()
|
||||
)
|
||||
end
|
||||
function item_clean_harbor.prototype.CastFilterResult(self)
|
||||
if IsServer() then
|
||||
local caster = self:GetCaster()
|
||||
if not self:canPlaceFlagHere(caster) then
|
||||
return UF_FAIL_CUSTOM
|
||||
end
|
||||
return UF_SUCCESS
|
||||
end
|
||||
return UF_SUCCESS
|
||||
end
|
||||
function item_clean_harbor.prototype.GetCustomCastError(self)
|
||||
if IsServer() then
|
||||
local caster = self:GetCaster()
|
||||
if not self:canPlaceFlagHere(caster) then
|
||||
return "#dota_hud_error_not_in_zone"
|
||||
end
|
||||
end
|
||||
return ""
|
||||
end
|
||||
function item_clean_harbor.prototype.OnSpellStart(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
if not self:canPlaceFlagHere(caster) then
|
||||
self:EndCooldown()
|
||||
return
|
||||
end
|
||||
hideCleanHarborFlagPlacementMarkers(nil)
|
||||
local duration = 60
|
||||
CreateModifierThinker(
|
||||
caster,
|
||||
self,
|
||||
____exports.modifier_clean_harbor_flag.name,
|
||||
{duration = duration},
|
||||
caster:GetAbsOrigin(),
|
||||
caster:GetTeamNumber(),
|
||||
false
|
||||
)
|
||||
self:RemoveSelf()
|
||||
end
|
||||
item_clean_harbor = __TS__Decorate(
|
||||
item_clean_harbor,
|
||||
item_clean_harbor,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_clean_harbor"}
|
||||
)
|
||||
____exports.item_clean_harbor = item_clean_harbor
|
||||
____exports.modifier_clean_harbor_flag = __TS__Class()
|
||||
local modifier_clean_harbor_flag = ____exports.modifier_clean_harbor_flag
|
||||
modifier_clean_harbor_flag.name = "modifier_clean_harbor_flag"
|
||||
modifier_clean_harbor_flag.____file_path = "scripts/vscripts/items/default_items/item_clean_harbor.lua"
|
||||
__TS__ClassExtends(modifier_clean_harbor_flag, BaseModifier)
|
||||
function modifier_clean_harbor_flag.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.lastHeroInRangeTime = 0
|
||||
self.lastBuffTime = 0
|
||||
end
|
||||
function modifier_clean_harbor_flag.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_clean_harbor_flag.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_clean_harbor_flag.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
local pos = parent:GetAbsOrigin()
|
||||
self.flagEntity = SpawnEntityFromTableSynchronous("prop_dynamic", {model = "models/props_gameplay/roshans_banner.vmdl", targetname = "clean_harbor_flag", origin = pos})
|
||||
if self.flagParticleId ~= nil then
|
||||
ParticleManager:DestroyParticle(self.flagParticleId, false)
|
||||
ParticleManager:ReleaseParticleIndex(self.flagParticleId)
|
||||
end
|
||||
self.flagParticleId = ParticleManager:CreateParticle("particles/bloodbath_circle.vpcf", PATTACH_WORLDORIGIN, nil)
|
||||
ParticleManager:SetParticleControl(self.flagParticleId, 0, pos)
|
||||
ParticleManager:SetParticleControl(
|
||||
self.flagParticleId,
|
||||
1,
|
||||
Vector(350, 0, 0)
|
||||
)
|
||||
self.lastHeroInRangeTime = GameRules:GetGameTime()
|
||||
self.lastBuffTime = self.lastHeroInRangeTime
|
||||
self:StartIntervalThink(0.25)
|
||||
end
|
||||
function modifier_clean_harbor_flag.prototype.OnIntervalThink(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if not parent or parent:IsNull() then
|
||||
return
|
||||
end
|
||||
local pos = parent:GetAbsOrigin()
|
||||
local heroes = FindUnitsInRadius(
|
||||
parent:GetTeamNumber(),
|
||||
pos,
|
||||
nil,
|
||||
350,
|
||||
DOTA_UNIT_TARGET_TEAM_FRIENDLY,
|
||||
DOTA_UNIT_TARGET_HERO,
|
||||
DOTA_UNIT_TARGET_FLAG_NOT_ILLUSIONS,
|
||||
FIND_ANY_ORDER,
|
||||
false
|
||||
)
|
||||
local now = GameRules:GetGameTime()
|
||||
if #heroes > 0 then
|
||||
self.lastHeroInRangeTime = now
|
||||
local targetHero = heroes[1]
|
||||
local spawnManager = SpawnManager:getInstance()
|
||||
local skeletonZoneIds = spawnManager:GetZoneIdsByPrefixes({"zone_skeletons_", "zone_skeletons2_"})
|
||||
local shouldBuff = now - self.lastBuffTime >= 1
|
||||
__TS__ArrayForEach(
|
||||
skeletonZoneIds,
|
||||
function(____, zoneId)
|
||||
local units = spawnManager:GetSpawnedUnits(zoneId)
|
||||
__TS__ArrayForEach(
|
||||
units,
|
||||
function(____, unit)
|
||||
if unit and IsValidEntity(unit) and unit.IsAlive and unit:IsAlive() then
|
||||
local creep = unit
|
||||
creep:MoveToTargetToAttack(targetHero)
|
||||
if shouldBuff then
|
||||
local name
|
||||
do
|
||||
local function ____catch()
|
||||
name = ""
|
||||
end
|
||||
local ____try = pcall(function()
|
||||
name = creep:GetUnitName()
|
||||
end)
|
||||
if not ____try then
|
||||
____catch()
|
||||
end
|
||||
end
|
||||
if __TS__StringIncludes(name, "skeleton") then
|
||||
local anyCreep = creep
|
||||
if anyCreep._cleanHarborBaseMin == nil then
|
||||
anyCreep._cleanHarborBaseMin = creep:GetBaseDamageMin()
|
||||
anyCreep._cleanHarborBaseMax = creep:GetBaseDamageMax()
|
||||
anyCreep._cleanHarborBuffStacks = 0
|
||||
end
|
||||
anyCreep._cleanHarborBuffStacks = (anyCreep._cleanHarborBuffStacks or 0) + 1
|
||||
local stacks = anyCreep._cleanHarborBuffStacks
|
||||
local mult = 1 + 0.02 * stacks
|
||||
local newMin = math.floor(anyCreep._cleanHarborBaseMin * mult)
|
||||
local newMax = math.floor(anyCreep._cleanHarborBaseMax * mult)
|
||||
creep:SetBaseDamageMin(newMin)
|
||||
creep:SetBaseDamageMax(newMax)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
end
|
||||
)
|
||||
if shouldBuff then
|
||||
self.lastBuffTime = now
|
||||
end
|
||||
else
|
||||
if now - self.lastHeroInRangeTime >= 1 then
|
||||
CustomGameEventManager:Send_ServerToAllClients("CreateIngameErrorMessage", {reason = 80, message = "#clean_harbor_no_hero_near_flag"})
|
||||
end
|
||||
if now - self.lastHeroInRangeTime >= 5 then
|
||||
local questSystem = QuestSystem:getInstance()
|
||||
questSystem:failQuest("kunkka_quest_clean_harbor")
|
||||
self:Destroy()
|
||||
return
|
||||
end
|
||||
end
|
||||
local enemies = FindUnitsInRadius(
|
||||
DOTA_TEAM_NEUTRALS,
|
||||
pos,
|
||||
nil,
|
||||
400,
|
||||
DOTA_UNIT_TARGET_TEAM_ENEMY,
|
||||
DOTA_UNIT_TARGET_BASIC,
|
||||
DOTA_UNIT_TARGET_FLAG_NONE,
|
||||
FIND_ANY_ORDER,
|
||||
false
|
||||
)
|
||||
if #enemies > 0 then
|
||||
local questSystem = QuestSystem:getInstance()
|
||||
questSystem:failQuest("kunkka_quest_clean_harbor")
|
||||
self:Destroy()
|
||||
end
|
||||
end
|
||||
function modifier_clean_harbor_flag.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if not parent or parent:IsNull() then
|
||||
return
|
||||
end
|
||||
if self.flagParticleId ~= nil then
|
||||
ParticleManager:DestroyParticle(self.flagParticleId, false)
|
||||
ParticleManager:ReleaseParticleIndex(self.flagParticleId)
|
||||
self.flagParticleId = nil
|
||||
end
|
||||
if self.flagEntity and IsValidEntity(self.flagEntity) then
|
||||
UTIL_Remove(self.flagEntity)
|
||||
self.flagEntity = nil
|
||||
end
|
||||
if self:GetRemainingTime() <= 0 then
|
||||
local spawnManager = SpawnManager:getInstance()
|
||||
spawnManager:RemoveSpawnZonesByType("skeletons")
|
||||
spawnManager:RemoveSpawnZonesByType("skeletons2")
|
||||
local skeletonZoneIds = spawnManager:GetZoneIdsByPrefixes({"zone_skeletons_", "zone_skeletons2_"})
|
||||
__TS__ArrayForEach(
|
||||
skeletonZoneIds,
|
||||
function(____, zoneId)
|
||||
local units = spawnManager:GetSpawnedUnits(zoneId)
|
||||
__TS__ArrayForEach(
|
||||
units,
|
||||
function(____, unit)
|
||||
if unit and IsValidEntity(unit) and unit.IsAlive and unit:IsAlive() then
|
||||
unit:ForceKill(false)
|
||||
end
|
||||
end
|
||||
)
|
||||
end
|
||||
)
|
||||
local questSystem = QuestSystem:getInstance()
|
||||
questSystem:addQuestProgress("kunkka_quest_clean_harbor", "clean_harbor", 1)
|
||||
end
|
||||
end
|
||||
modifier_clean_harbor_flag = __TS__Decorate(
|
||||
modifier_clean_harbor_flag,
|
||||
modifier_clean_harbor_flag,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_clean_harbor_flag"}
|
||||
)
|
||||
____exports.modifier_clean_harbor_flag = modifier_clean_harbor_flag
|
||||
return ____exports
|
||||
@@ -0,0 +1,643 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____modifier_stats_multiplier = require("modifiers.modifier_stats_multiplier")
|
||||
local removeStatsMultiplierSource = ____modifier_stats_multiplier.removeStatsMultiplierSource
|
||||
local setStatsMultiplierSource = ____modifier_stats_multiplier.setStatsMultiplierSource
|
||||
local ____luck = require("utils.luck")
|
||||
local rollLuckChance = ____luck.rollLuckChance
|
||||
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 CRIMSON_SHIVAS_SOURCE_PREFIX = "item_crimson_shivas_custom"
|
||||
local CRIMSON_SHIVAS_ALLY_AURA_INCOMING_SOURCE = "modifier_item_crimson_shivas_custom_ally_aura_buff"
|
||||
local CRIMSON_SHIVAS_GUARD_BUFF_INCOMING_SOURCE = "modifier_item_crimson_shivas_custom_guard_buff"
|
||||
local SHIVAS_BLAST_PARTICLE = "particles/items2_fx/shivas_guard_active.vpcf"
|
||||
local SHIVAS_IMPACT_PARTICLE = "particles/items2_fx/shivas_guard_impact.vpcf"
|
||||
local SHIVAS_SLOW_PARTICLE = "particles/generic_gameplay/generic_slowed_cold.vpcf"
|
||||
local GUARD_BUFF_PARTICLE = "particles/units/heroes/hero_grimstroke/grimstroke_ink_swell_buff.vpcf"
|
||||
local MELEE_STRENGTH_BLOCK_PCT = 50
|
||||
____exports.item_crimson_shivas_custom = __TS__Class()
|
||||
local item_crimson_shivas_custom = ____exports.item_crimson_shivas_custom
|
||||
item_crimson_shivas_custom.name = "item_crimson_shivas_custom"
|
||||
item_crimson_shivas_custom.____file_path = "scripts/vscripts/items/default_items/item_crimson_shivas_custom.lua"
|
||||
__TS__ClassExtends(item_crimson_shivas_custom, BaseItem)
|
||||
function item_crimson_shivas_custom.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", SHIVAS_BLAST_PARTICLE, context)
|
||||
PrecacheResource("particle", SHIVAS_IMPACT_PARTICLE, context)
|
||||
PrecacheResource("particle", SHIVAS_SLOW_PARTICLE, context)
|
||||
PrecacheResource("particle", GUARD_BUFF_PARTICLE, context)
|
||||
PrecacheResource("soundfile", "soundevents/game_sounds_items.vsndevts", context)
|
||||
end
|
||||
function item_crimson_shivas_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return ____exports.modifier_item_crimson_shivas_custom.name
|
||||
end
|
||||
function item_crimson_shivas_custom.prototype.GetAOERadius(self)
|
||||
return self:GetSpecialValueFor("guard_radius")
|
||||
end
|
||||
function item_crimson_shivas_custom.prototype.GetCastRange(self)
|
||||
local blastRadius = self:GetSpecialValueFor("blast_radius")
|
||||
if IsServer() then
|
||||
return blastRadius
|
||||
end
|
||||
local ____opt_0 = self:GetCaster()
|
||||
local bonus = ____opt_0 and ____opt_0:GetCastRangeBonus() or 0
|
||||
return blastRadius - bonus
|
||||
end
|
||||
function item_crimson_shivas_custom.prototype.OnSpellStart(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local blastRadius = self:GetSpecialValueFor("blast_radius")
|
||||
local blastSpeed = self:GetSpecialValueFor("blast_speed")
|
||||
local guardRadius = self:GetSpecialValueFor("guard_radius")
|
||||
local guardDuration = self:GetSpecialValueFor("guard_duration")
|
||||
caster:EmitSound("DOTA_Item.ShivasGuard.Activate")
|
||||
caster:AddNewModifier(caster, self, ____exports.modifier_item_crimson_shivas_custom_blast_thinker.name, {duration = blastRadius / blastSpeed})
|
||||
local allies = FindUnitsInRadius(
|
||||
caster:GetTeamNumber(),
|
||||
caster:GetAbsOrigin(),
|
||||
nil,
|
||||
guardRadius,
|
||||
DOTA_UNIT_TARGET_TEAM_FRIENDLY,
|
||||
DOTA_UNIT_TARGET_HERO,
|
||||
DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES,
|
||||
FIND_CLOSEST,
|
||||
false
|
||||
)
|
||||
for ____, ally in ipairs(allies) do
|
||||
ally:AddNewModifier(caster, self, ____exports.modifier_item_crimson_shivas_custom_guard_buff.name, {duration = guardDuration})
|
||||
ally:EmitSound("Hero_LegionCommander.Overwhelming.Cast")
|
||||
end
|
||||
end
|
||||
item_crimson_shivas_custom = __TS__Decorate(
|
||||
item_crimson_shivas_custom,
|
||||
item_crimson_shivas_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_crimson_shivas_custom"}
|
||||
)
|
||||
____exports.item_crimson_shivas_custom = item_crimson_shivas_custom
|
||||
--- Пассив владельца: статы, блок, аура замедления атаки врагам.
|
||||
____exports.modifier_item_crimson_shivas_custom = __TS__Class()
|
||||
local modifier_item_crimson_shivas_custom = ____exports.modifier_item_crimson_shivas_custom
|
||||
modifier_item_crimson_shivas_custom.name = "modifier_item_crimson_shivas_custom"
|
||||
modifier_item_crimson_shivas_custom.____file_path = "scripts/vscripts/items/default_items/item_crimson_shivas_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_crimson_shivas_custom, BaseModifier)
|
||||
function modifier_item_crimson_shivas_custom.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.statsSourceId = ""
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
|
||||
MODIFIER_PROPERTY_HEALTH_BONUS,
|
||||
MODIFIER_PROPERTY_MANA_BONUS,
|
||||
MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS,
|
||||
MODIFIER_PROPERTY_PHYSICAL_CONSTANT_BLOCK
|
||||
}
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.IsAura(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetModifierAura(self)
|
||||
return ____exports.modifier_item_crimson_shivas_custom_enemy_aura.name
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetAuraRadius(self)
|
||||
return self:GetAbility():GetSpecialValueFor("aura_radius")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetAuraDuration(self)
|
||||
return 1
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetAuraSearchTeam(self)
|
||||
return DOTA_UNIT_TARGET_TEAM_ENEMY
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetAuraSearchType(self)
|
||||
return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetAuraSearchFlags(self)
|
||||
return DOTA_UNIT_TARGET_FLAG_NONE
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetModifierBonusStats_Strength(self)
|
||||
local ability = self:GetAbility()
|
||||
return ability:GetSpecialValueFor("bonus_stats")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetModifierBonusStats_Agility(self)
|
||||
local ability = self:GetAbility()
|
||||
return ability:GetSpecialValueFor("bonus_stats")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetModifierBonusStats_Intellect(self)
|
||||
local ability = self:GetAbility()
|
||||
return ability:GetSpecialValueFor("bonus_stats")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetModifierHealthBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_health")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetModifierManaBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetModifierConstantHealthRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_hp_regen")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetModifierConstantManaRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana_regen")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetModifierPhysicalArmorBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_armor")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.GetModifierPhysical_ConstantBlock(self)
|
||||
if not IsServer() then
|
||||
return 0
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
local chancePct = ability:GetSpecialValueFor("damage_block_chance")
|
||||
local parent = self:GetParent()
|
||||
local ____parent_IsRealHero_result_2
|
||||
if parent:IsRealHero() then
|
||||
____parent_IsRealHero_result_2 = rollLuckChance(nil, parent, chancePct / 100)
|
||||
else
|
||||
____parent_IsRealHero_result_2 = RollPercentage(chancePct)
|
||||
end
|
||||
local blocked = ____parent_IsRealHero_result_2
|
||||
if not blocked then
|
||||
return 0
|
||||
end
|
||||
local blockAmount = ability:GetSpecialValueFor("damage_block")
|
||||
local baseBlock = parent:IsRangedAttacker() and blockAmount * 0.5 or blockAmount
|
||||
if not parent:IsRealHero() or parent:IsRangedAttacker() then
|
||||
return baseBlock
|
||||
end
|
||||
return baseBlock + parent:GetStrength() * (MELEE_STRENGTH_BLOCK_PCT / 100)
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return
|
||||
end
|
||||
self:GetParent():AddNewModifier(
|
||||
self:GetParent(),
|
||||
ability,
|
||||
____exports.modifier_item_crimson_shivas_custom_ally_aura.name,
|
||||
{}
|
||||
)
|
||||
local hero = self:GetParent()
|
||||
if hero and hero:IsRealHero() then
|
||||
self.statsSourceId = (CRIMSON_SHIVAS_SOURCE_PREFIX .. "_") .. tostring(hero:entindex())
|
||||
setStatsMultiplierSource(
|
||||
nil,
|
||||
hero,
|
||||
self.statsSourceId,
|
||||
function()
|
||||
if not hero or not IsValidEntity(hero) or not hero:IsRealHero() then
|
||||
return 0
|
||||
end
|
||||
return ability:GetSpecialValueFor("all_stats_pct")
|
||||
end,
|
||||
"all_stats_pct"
|
||||
)
|
||||
end
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
self:GetParent():RemoveModifierByName(____exports.modifier_item_crimson_shivas_custom_ally_aura.name)
|
||||
if self.statsSourceId ~= "" then
|
||||
local hero = self:GetParent()
|
||||
if hero and IsValidEntity(hero) then
|
||||
removeStatsMultiplierSource(nil, hero, self.statsSourceId)
|
||||
end
|
||||
self.statsSourceId = ""
|
||||
end
|
||||
end
|
||||
modifier_item_crimson_shivas_custom = __TS__Decorate(
|
||||
modifier_item_crimson_shivas_custom,
|
||||
modifier_item_crimson_shivas_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_crimson_shivas_custom"}
|
||||
)
|
||||
____exports.modifier_item_crimson_shivas_custom = modifier_item_crimson_shivas_custom
|
||||
--- Пассивная аура на союзников вокруг владельца.
|
||||
____exports.modifier_item_crimson_shivas_custom_ally_aura = __TS__Class()
|
||||
local modifier_item_crimson_shivas_custom_ally_aura = ____exports.modifier_item_crimson_shivas_custom_ally_aura
|
||||
modifier_item_crimson_shivas_custom_ally_aura.name = "modifier_item_crimson_shivas_custom_ally_aura"
|
||||
modifier_item_crimson_shivas_custom_ally_aura.____file_path = "scripts/vscripts/items/default_items/item_crimson_shivas_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_crimson_shivas_custom_ally_aura, BaseModifier)
|
||||
function modifier_item_crimson_shivas_custom_ally_aura.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura.prototype.IsAura(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura.prototype.GetModifierAura(self)
|
||||
return ____exports.modifier_item_crimson_shivas_custom_ally_aura_buff.name
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura.prototype.GetAuraRadius(self)
|
||||
return self:GetAbility():GetSpecialValueFor("aura_radius")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura.prototype.GetAuraDuration(self)
|
||||
return 1
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura.prototype.GetAuraSearchTeam(self)
|
||||
return DOTA_UNIT_TARGET_TEAM_FRIENDLY
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura.prototype.GetAuraSearchType(self)
|
||||
return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura.prototype.GetAuraSearchFlags(self)
|
||||
return DOTA_UNIT_TARGET_FLAG_NONE
|
||||
end
|
||||
modifier_item_crimson_shivas_custom_ally_aura = __TS__Decorate(
|
||||
modifier_item_crimson_shivas_custom_ally_aura,
|
||||
modifier_item_crimson_shivas_custom_ally_aura,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_crimson_shivas_custom_ally_aura"}
|
||||
)
|
||||
____exports.modifier_item_crimson_shivas_custom_ally_aura = modifier_item_crimson_shivas_custom_ally_aura
|
||||
--- Аура Шивы: снижение скорости атаки врагам.
|
||||
____exports.modifier_item_crimson_shivas_custom_enemy_aura = __TS__Class()
|
||||
local modifier_item_crimson_shivas_custom_enemy_aura = ____exports.modifier_item_crimson_shivas_custom_enemy_aura
|
||||
modifier_item_crimson_shivas_custom_enemy_aura.name = "modifier_item_crimson_shivas_custom_enemy_aura"
|
||||
modifier_item_crimson_shivas_custom_enemy_aura.____file_path = "scripts/vscripts/items/default_items/item_crimson_shivas_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_crimson_shivas_custom_enemy_aura, BaseModifier)
|
||||
function modifier_item_crimson_shivas_custom_enemy_aura.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_enemy_aura.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_enemy_aura.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_enemy_aura.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_enemy_aura.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return -self:GetAbility():GetSpecialValueFor("aura_as_reduction")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_enemy_aura.prototype.GetModifierIncomingDamage_Percentage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("aura_enemy_incoming_amp")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_enemy_aura.prototype.GetTexture(self)
|
||||
return "item_shivas_guard"
|
||||
end
|
||||
modifier_item_crimson_shivas_custom_enemy_aura = __TS__Decorate(
|
||||
modifier_item_crimson_shivas_custom_enemy_aura,
|
||||
modifier_item_crimson_shivas_custom_enemy_aura,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_crimson_shivas_custom_enemy_aura"}
|
||||
)
|
||||
____exports.modifier_item_crimson_shivas_custom_enemy_aura = modifier_item_crimson_shivas_custom_enemy_aura
|
||||
--- Аура на союзников: снижение входящего урона.
|
||||
____exports.modifier_item_crimson_shivas_custom_ally_aura_buff = __TS__Class()
|
||||
local modifier_item_crimson_shivas_custom_ally_aura_buff = ____exports.modifier_item_crimson_shivas_custom_ally_aura_buff
|
||||
modifier_item_crimson_shivas_custom_ally_aura_buff.name = "modifier_item_crimson_shivas_custom_ally_aura_buff"
|
||||
modifier_item_crimson_shivas_custom_ally_aura_buff.____file_path = "scripts/vscripts/items/default_items/item_crimson_shivas_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_crimson_shivas_custom_ally_aura_buff, BaseModifier)
|
||||
function modifier_item_crimson_shivas_custom_ally_aura_buff.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura_buff.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura_buff.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
setIncomingDamageReductionSource(
|
||||
nil,
|
||||
self:GetParent(),
|
||||
CRIMSON_SHIVAS_ALLY_AURA_INCOMING_SOURCE,
|
||||
function()
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
return math.max(
|
||||
0,
|
||||
ability:GetSpecialValueFor("aura_ally_incoming_reduction")
|
||||
)
|
||||
end
|
||||
)
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura_buff.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
removeIncomingDamageReductionSource(
|
||||
nil,
|
||||
self:GetParent(),
|
||||
CRIMSON_SHIVAS_ALLY_AURA_INCOMING_SOURCE
|
||||
)
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_ally_aura_buff.prototype.GetTexture(self)
|
||||
return "item_crimson_guard"
|
||||
end
|
||||
modifier_item_crimson_shivas_custom_ally_aura_buff = __TS__Decorate(
|
||||
modifier_item_crimson_shivas_custom_ally_aura_buff,
|
||||
modifier_item_crimson_shivas_custom_ally_aura_buff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_crimson_shivas_custom_ally_aura_buff"}
|
||||
)
|
||||
____exports.modifier_item_crimson_shivas_custom_ally_aura_buff = modifier_item_crimson_shivas_custom_ally_aura_buff
|
||||
--- Расходящаяся волна Шивы.
|
||||
____exports.modifier_item_crimson_shivas_custom_blast_thinker = __TS__Class()
|
||||
local modifier_item_crimson_shivas_custom_blast_thinker = ____exports.modifier_item_crimson_shivas_custom_blast_thinker
|
||||
modifier_item_crimson_shivas_custom_blast_thinker.name = "modifier_item_crimson_shivas_custom_blast_thinker"
|
||||
modifier_item_crimson_shivas_custom_blast_thinker.____file_path = "scripts/vscripts/items/default_items/item_crimson_shivas_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_crimson_shivas_custom_blast_thinker, BaseModifier)
|
||||
function modifier_item_crimson_shivas_custom_blast_thinker.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.hitted = {}
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_thinker.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_thinker.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_thinker.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_thinker.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
self.hitted = {}
|
||||
self:StartIntervalThink(FrameTime())
|
||||
local particle = ParticleManager:CreateParticle(
|
||||
SHIVAS_BLAST_PARTICLE,
|
||||
PATTACH_ABSORIGIN_FOLLOW,
|
||||
self:GetParent()
|
||||
)
|
||||
ParticleManager:SetParticleControl(
|
||||
particle,
|
||||
1,
|
||||
Vector(
|
||||
ability:GetSpecialValueFor("blast_radius"),
|
||||
self:GetDuration() * 1.33,
|
||||
ability:GetSpecialValueFor("blast_speed")
|
||||
)
|
||||
)
|
||||
self:AddParticle(
|
||||
particle,
|
||||
false,
|
||||
false,
|
||||
15,
|
||||
false,
|
||||
false
|
||||
)
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_thinker.prototype.OnIntervalThink(self)
|
||||
local ability = self:GetAbility()
|
||||
local caster = self:GetCaster()
|
||||
if not ability or not caster then
|
||||
return
|
||||
end
|
||||
local radiusIncrease = ability:GetSpecialValueFor("blast_speed") / (1 / FrameTime()) * 100
|
||||
self:SetStackCount(self:GetStackCount() + radiusIncrease)
|
||||
local radius = self:GetStackCount() / 100
|
||||
AddFOWViewer(
|
||||
caster:GetTeamNumber(),
|
||||
self:GetParent():GetAbsOrigin(),
|
||||
radius,
|
||||
FrameTime(),
|
||||
false
|
||||
)
|
||||
local enemies = FindUnitsInRadius(
|
||||
caster:GetTeamNumber(),
|
||||
self:GetParent():GetAbsOrigin(),
|
||||
nil,
|
||||
radius,
|
||||
DOTA_UNIT_TARGET_TEAM_ENEMY,
|
||||
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
|
||||
DOTA_UNIT_TARGET_FLAG_NONE,
|
||||
FIND_ANY_ORDER,
|
||||
false
|
||||
)
|
||||
local blastDamage = ability:GetSpecialValueFor("blast_damage")
|
||||
local slowDuration = ability:GetSpecialValueFor("slow_duration")
|
||||
for ____, enemy in ipairs(enemies) do
|
||||
do
|
||||
local entIndex = enemy:entindex()
|
||||
if self.hitted[entIndex] then
|
||||
goto __continue77
|
||||
end
|
||||
self.hitted[entIndex] = true
|
||||
local impact = ParticleManager:CreateParticle(SHIVAS_IMPACT_PARTICLE, PATTACH_ABSORIGIN_FOLLOW, enemy)
|
||||
ParticleManager:SetParticleControl(
|
||||
impact,
|
||||
1,
|
||||
self:GetParent():GetAbsOrigin()
|
||||
)
|
||||
ParticleManager:ReleaseParticleIndex(impact)
|
||||
ApplyDamage({
|
||||
victim = enemy,
|
||||
attacker = caster,
|
||||
damage = blastDamage,
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
ability = ability
|
||||
})
|
||||
local duration = slowDuration * (1 - enemy:GetStatusResistance())
|
||||
enemy:AddNewModifier(caster, ability, ____exports.modifier_item_crimson_shivas_custom_blast_debuff.name, {duration = duration})
|
||||
end
|
||||
::__continue77::
|
||||
end
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_thinker.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
local caster = self:GetCaster()
|
||||
if ability and caster then
|
||||
local radius = self:GetStackCount() / 100
|
||||
AddFOWViewer(
|
||||
caster:GetTeamNumber(),
|
||||
self:GetParent():GetAbsOrigin(),
|
||||
radius,
|
||||
ability:GetSpecialValueFor("slow_duration"),
|
||||
false
|
||||
)
|
||||
end
|
||||
self.hitted = {}
|
||||
end
|
||||
modifier_item_crimson_shivas_custom_blast_thinker = __TS__Decorate(
|
||||
modifier_item_crimson_shivas_custom_blast_thinker,
|
||||
modifier_item_crimson_shivas_custom_blast_thinker,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_crimson_shivas_custom_blast_thinker"}
|
||||
)
|
||||
____exports.modifier_item_crimson_shivas_custom_blast_thinker = modifier_item_crimson_shivas_custom_blast_thinker
|
||||
--- Замедление от волны Шивы.
|
||||
____exports.modifier_item_crimson_shivas_custom_blast_debuff = __TS__Class()
|
||||
local modifier_item_crimson_shivas_custom_blast_debuff = ____exports.modifier_item_crimson_shivas_custom_blast_debuff
|
||||
modifier_item_crimson_shivas_custom_blast_debuff.name = "modifier_item_crimson_shivas_custom_blast_debuff"
|
||||
modifier_item_crimson_shivas_custom_blast_debuff.____file_path = "scripts/vscripts/items/default_items/item_crimson_shivas_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_crimson_shivas_custom_blast_debuff, BaseModifier)
|
||||
function modifier_item_crimson_shivas_custom_blast_debuff.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_debuff.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_debuff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_debuff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_debuff.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("slow_move_pct")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_debuff.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("active_as_reduction")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_debuff.prototype.GetModifierIncomingDamage_Percentage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("aura_enemy_incoming_amp")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_debuff.prototype.GetEffectName(self)
|
||||
return SHIVAS_SLOW_PARTICLE
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_debuff.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_blast_debuff.prototype.GetTexture(self)
|
||||
return "item_shivas_guard"
|
||||
end
|
||||
modifier_item_crimson_shivas_custom_blast_debuff = __TS__Decorate(
|
||||
modifier_item_crimson_shivas_custom_blast_debuff,
|
||||
modifier_item_crimson_shivas_custom_blast_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_crimson_shivas_custom_blast_debuff"}
|
||||
)
|
||||
____exports.modifier_item_crimson_shivas_custom_blast_debuff = modifier_item_crimson_shivas_custom_blast_debuff
|
||||
--- Актив Crimson Guard: усиление союзников.
|
||||
____exports.modifier_item_crimson_shivas_custom_guard_buff = __TS__Class()
|
||||
local modifier_item_crimson_shivas_custom_guard_buff = ____exports.modifier_item_crimson_shivas_custom_guard_buff
|
||||
modifier_item_crimson_shivas_custom_guard_buff.name = "modifier_item_crimson_shivas_custom_guard_buff"
|
||||
modifier_item_crimson_shivas_custom_guard_buff.____file_path = "scripts/vscripts/items/default_items/item_crimson_shivas_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_crimson_shivas_custom_guard_buff, BaseModifier)
|
||||
function modifier_item_crimson_shivas_custom_guard_buff.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_guard_buff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_guard_buff.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
self.buffParticle = ParticleManager:CreateParticle(GUARD_BUFF_PARTICLE, PATTACH_ABSORIGIN, parent)
|
||||
if parent:ScriptLookupAttachment("attach_hitloc") == 0 then
|
||||
ParticleManager:SetParticleControl(
|
||||
self.buffParticle,
|
||||
1,
|
||||
parent:GetAbsOrigin():__add(Vector(0, 0, 120))
|
||||
)
|
||||
else
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
self.buffParticle,
|
||||
1,
|
||||
parent,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
Vector(0, 0, 0),
|
||||
true
|
||||
)
|
||||
end
|
||||
setIncomingDamageReductionSource(
|
||||
nil,
|
||||
parent,
|
||||
CRIMSON_SHIVAS_GUARD_BUFF_INCOMING_SOURCE,
|
||||
function()
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
return math.max(
|
||||
0,
|
||||
ability:GetSpecialValueFor("aura_ally_incoming_reduction")
|
||||
)
|
||||
end
|
||||
)
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_guard_buff.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
removeIncomingDamageReductionSource(
|
||||
nil,
|
||||
self:GetParent(),
|
||||
CRIMSON_SHIVAS_GUARD_BUFF_INCOMING_SOURCE
|
||||
)
|
||||
if self.buffParticle ~= nil then
|
||||
ParticleManager:DestroyParticle(self.buffParticle, false)
|
||||
ParticleManager:ReleaseParticleIndex(self.buffParticle)
|
||||
self.buffParticle = nil
|
||||
end
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_guard_buff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, MODIFIER_PROPERTY_PHYSICAL_CONSTANT_BLOCK}
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_guard_buff.prototype.GetModifierPhysicalArmorBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_armor_active")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_guard_buff.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_attack_speed_active")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_guard_buff.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_movespeed_active")
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_guard_buff.prototype.GetModifierPhysical_ConstantBlock(self)
|
||||
local ability = self:GetAbility()
|
||||
local caster = self:GetCaster()
|
||||
if not ability or not caster then
|
||||
return 0
|
||||
end
|
||||
local baseBlock = ability:GetSpecialValueFor("damage_block_active")
|
||||
local strBonus = caster:GetStrength() * (ability:GetSpecialValueFor("block_strength_pct") / 100)
|
||||
return baseBlock + strBonus
|
||||
end
|
||||
function modifier_item_crimson_shivas_custom_guard_buff.prototype.GetTexture(self)
|
||||
return "item_crimson_guard"
|
||||
end
|
||||
modifier_item_crimson_shivas_custom_guard_buff = __TS__Decorate(
|
||||
modifier_item_crimson_shivas_custom_guard_buff,
|
||||
modifier_item_crimson_shivas_custom_guard_buff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_crimson_shivas_custom_guard_buff"}
|
||||
)
|
||||
____exports.modifier_item_crimson_shivas_custom_guard_buff = modifier_item_crimson_shivas_custom_guard_buff
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_crystalys = __TS__Class()
|
||||
local item_crystalys = ____exports.item_crystalys
|
||||
item_crystalys.name = "item_crystalys"
|
||||
item_crystalys.____file_path = "scripts/vscripts/items/default_items/item_crystalys.lua"
|
||||
__TS__ClassExtends(item_crystalys, BaseItem)
|
||||
function item_crystalys.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_crystalys"
|
||||
end
|
||||
item_crystalys = __TS__Decorate(
|
||||
item_crystalys,
|
||||
item_crystalys,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_crystalys"}
|
||||
)
|
||||
____exports.item_crystalys = item_crystalys
|
||||
____exports.modifier_crystalys = __TS__Class()
|
||||
local modifier_crystalys = ____exports.modifier_crystalys
|
||||
modifier_crystalys.name = "modifier_crystalys"
|
||||
modifier_crystalys.____file_path = "scripts/vscripts/items/default_items/item_crystalys.lua"
|
||||
__TS__ClassExtends(modifier_crystalys, BaseModifier)
|
||||
function modifier_crystalys.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_crystalys.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_crystalys.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_crystalys.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_crystalys.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE}
|
||||
end
|
||||
function modifier_crystalys.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_crystalys.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local stackingCritMod = self:GetParent():FindModifierByName("modifier_stacking_crit")
|
||||
if stackingCritMod then
|
||||
local ability = self:GetAbility()
|
||||
local ____self_5 = stackingCritMod
|
||||
local ____self_5_AddCustomCrit_6 = ____self_5.AddCustomCrit
|
||||
local ____opt_0 = self:GetAbility()
|
||||
local ____temp_4 = ____opt_0 and ____opt_0:GetSpecialValueFor("crit_chance") or 0
|
||||
local ____opt_2 = self:GetAbility()
|
||||
____self_5_AddCustomCrit_6(
|
||||
____self_5,
|
||||
____temp_4,
|
||||
____opt_2 and ____opt_2:GetSpecialValueFor("crit_mult") or 0,
|
||||
"item_crystalys",
|
||||
ability
|
||||
)
|
||||
end
|
||||
end
|
||||
function modifier_crystalys.prototype.OnDestroy(self)
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if not parent or not IsValidEntity(parent) then
|
||||
return
|
||||
end
|
||||
local stackingCritModifier = parent:FindModifierByName("modifier_stacking_crit")
|
||||
if not stackingCritModifier then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
stackingCritModifier:RemoveCrit("item_crystalys", ability)
|
||||
end
|
||||
modifier_crystalys = __TS__Decorate(
|
||||
modifier_crystalys,
|
||||
modifier_crystalys,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_crystalys"}
|
||||
)
|
||||
____exports.modifier_crystalys = modifier_crystalys
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_dark_crystalys = __TS__Class()
|
||||
local item_dark_crystalys = ____exports.item_dark_crystalys
|
||||
item_dark_crystalys.name = "item_dark_crystalys"
|
||||
item_dark_crystalys.____file_path = "scripts/vscripts/items/default_items/item_dark_crystalys.lua"
|
||||
__TS__ClassExtends(item_dark_crystalys, BaseItem)
|
||||
function item_dark_crystalys.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_dark_crystalys"
|
||||
end
|
||||
item_dark_crystalys = __TS__Decorate(
|
||||
item_dark_crystalys,
|
||||
item_dark_crystalys,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_dark_crystalys"}
|
||||
)
|
||||
____exports.item_dark_crystalys = item_dark_crystalys
|
||||
____exports.modifier_dark_crystalys = __TS__Class()
|
||||
local modifier_dark_crystalys = ____exports.modifier_dark_crystalys
|
||||
modifier_dark_crystalys.name = "modifier_dark_crystalys"
|
||||
modifier_dark_crystalys.____file_path = "scripts/vscripts/items/default_items/item_dark_crystalys.lua"
|
||||
__TS__ClassExtends(modifier_dark_crystalys, BaseModifier)
|
||||
function modifier_dark_crystalys.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_dark_crystalys.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_dark_crystalys.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_dark_crystalys.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_dark_crystalys.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE}
|
||||
end
|
||||
function modifier_dark_crystalys.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_dark_crystalys.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local stackingCritMod = self:GetParent():FindModifierByName("modifier_stacking_crit")
|
||||
if stackingCritMod then
|
||||
local ability = self:GetAbility()
|
||||
local ____self_5 = stackingCritMod
|
||||
local ____self_5_AddCustomCrit_6 = ____self_5.AddCustomCrit
|
||||
local ____opt_0 = self:GetAbility()
|
||||
local ____temp_4 = ____opt_0 and ____opt_0:GetSpecialValueFor("crit_chance") or 0
|
||||
local ____opt_2 = self:GetAbility()
|
||||
____self_5_AddCustomCrit_6(
|
||||
____self_5,
|
||||
____temp_4,
|
||||
____opt_2 and ____opt_2:GetSpecialValueFor("crit_mult") or 0,
|
||||
"item_dark_crystalys",
|
||||
ability
|
||||
)
|
||||
end
|
||||
end
|
||||
function modifier_dark_crystalys.prototype.OnDestroy(self)
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if not parent or not IsValidEntity(parent) then
|
||||
return
|
||||
end
|
||||
local stackingCritModifier = parent:FindModifierByName("modifier_stacking_crit")
|
||||
if not stackingCritModifier then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
stackingCritModifier:RemoveCrit("item_dark_crystalys", ability)
|
||||
end
|
||||
modifier_dark_crystalys = __TS__Decorate(
|
||||
modifier_dark_crystalys,
|
||||
modifier_dark_crystalys,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_dark_crystalys"}
|
||||
)
|
||||
____exports.modifier_dark_crystalys = modifier_dark_crystalys
|
||||
return ____exports
|
||||
@@ -0,0 +1,299 @@
|
||||
local ____lualib = require("lualib_bundle")
|
||||
local __TS__Class = ____lualib.__TS__Class
|
||||
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
|
||||
local __TS__Decorate = ____lualib.__TS__Decorate
|
||||
local __TS__StringStartsWith = ____lualib.__TS__StringStartsWith
|
||||
local ____exports = {}
|
||||
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
|
||||
local BaseItem = ____dota_ts_adapter.BaseItem
|
||||
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 DEMON_SLAYER_OWNER_INCOMING_SOURCE = "modifier_item_demon_slayer"
|
||||
--- Demon Slayer: пассивы Zombie Slayer + статы/эффект Mage Slayer (маг. сопр., регены, DoT + штраф spell amp на цели),
|
||||
-- плюс снижение входящего и бонус ко всему исходящему урону у носителя.
|
||||
____exports.item_demon_slayer = __TS__Class()
|
||||
local item_demon_slayer = ____exports.item_demon_slayer
|
||||
item_demon_slayer.name = "item_demon_slayer"
|
||||
item_demon_slayer.____file_path = "scripts/vscripts/items/default_items/item_demon_slayer.lua"
|
||||
__TS__ClassExtends(item_demon_slayer, BaseItem)
|
||||
function item_demon_slayer.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", "particles/demon_slayer_slash.vpcf", context)
|
||||
PrecacheResource("particle", "particles/items2_fx/mage_slayer_debuff.vpcf", context)
|
||||
PrecacheResource("particle", "particles/units/heroes/hero_dark_willow/dark_willow_wisp_spell_debuff.vpcf", context)
|
||||
end
|
||||
function item_demon_slayer.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_demon_slayer"
|
||||
end
|
||||
item_demon_slayer = __TS__Decorate(
|
||||
item_demon_slayer,
|
||||
item_demon_slayer,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_demon_slayer"}
|
||||
)
|
||||
____exports.item_demon_slayer = item_demon_slayer
|
||||
____exports.modifier_item_demon_slayer = __TS__Class()
|
||||
local modifier_item_demon_slayer = ____exports.modifier_item_demon_slayer
|
||||
modifier_item_demon_slayer.name = "modifier_item_demon_slayer"
|
||||
modifier_item_demon_slayer.____file_path = "scripts/vscripts/items/default_items/item_demon_slayer.lua"
|
||||
__TS__ClassExtends(modifier_item_demon_slayer, BaseModifier)
|
||||
function modifier_item_demon_slayer.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_HEALTH_BONUS,
|
||||
MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS,
|
||||
MODIFIER_EVENT_ON_ATTACK_LANDED,
|
||||
MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE
|
||||
}
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
setIncomingDamageReductionSource(
|
||||
nil,
|
||||
self:GetParent(),
|
||||
DEMON_SLAYER_OWNER_INCOMING_SOURCE,
|
||||
function()
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
return math.max(
|
||||
0,
|
||||
math.abs(ability:GetSpecialValueFor("incoming_damage_reduction"))
|
||||
)
|
||||
end
|
||||
)
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
removeIncomingDamageReductionSource(
|
||||
nil,
|
||||
self:GetParent(),
|
||||
DEMON_SLAYER_OWNER_INCOMING_SOURCE
|
||||
)
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.GetModifierHealthBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_health")
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.GetModifierConstantManaRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana_regen")
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.GetModifierConstantHealthRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_health_regen")
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.GetModifierMagicalResistanceBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_magic_resistance")
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_agility")
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.GetModifierDamageOutgoing_Percentage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("outgoing_damage_bonus")
|
||||
end
|
||||
function modifier_item_demon_slayer.prototype.OnAttackLanded(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if event.attacker ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
if not event.target or event.target:IsBuilding() or event.target:IsOther() then
|
||||
return
|
||||
end
|
||||
if event.target ~= nil then
|
||||
local ability = self:GetAbility()
|
||||
local durCorrosion = ability and ability:GetSpecialValueFor("debuff_duration") or 4
|
||||
local durMage = ability and ability:GetSpecialValueFor("duration") or 3
|
||||
event.target:AddNewModifier(
|
||||
self:GetParent(),
|
||||
ability,
|
||||
"modifier_item_demon_slayer_debuff_2",
|
||||
{duration = durCorrosion}
|
||||
)
|
||||
event.target:AddNewModifier(
|
||||
self:GetParent(),
|
||||
ability,
|
||||
"modifier_item_demon_slayer_mage",
|
||||
{duration = durMage}
|
||||
)
|
||||
local ____this_5
|
||||
____this_5 = event.target
|
||||
local ____opt_4 = ____this_5.GetUnitName
|
||||
local targetName = ____opt_4 and ____opt_4(____this_5) or ""
|
||||
if __TS__StringStartsWith(targetName, "npc_wave") then
|
||||
ParticleManager:CreateParticle("particles/demon_slayer_slash.vpcf", PATTACH_ABSORIGIN_FOLLOW, event.target)
|
||||
event.target:AddNewModifier(
|
||||
self:GetParent(),
|
||||
ability,
|
||||
"modifier_item_demon_slayer_debuff",
|
||||
{duration = durCorrosion}
|
||||
)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
modifier_item_demon_slayer = __TS__Decorate(
|
||||
modifier_item_demon_slayer,
|
||||
modifier_item_demon_slayer,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_demon_slayer"}
|
||||
)
|
||||
____exports.modifier_item_demon_slayer = modifier_item_demon_slayer
|
||||
--- Доп. урон по нежити волн (как Zombie Slayer).
|
||||
____exports.modifier_item_demon_slayer_debuff = __TS__Class()
|
||||
local modifier_item_demon_slayer_debuff = ____exports.modifier_item_demon_slayer_debuff
|
||||
modifier_item_demon_slayer_debuff.name = "modifier_item_demon_slayer_debuff"
|
||||
modifier_item_demon_slayer_debuff.____file_path = "scripts/vscripts/items/default_items/item_demon_slayer.lua"
|
||||
__TS__ClassExtends(modifier_item_demon_slayer_debuff, BaseModifier)
|
||||
function modifier_item_demon_slayer_debuff.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff.prototype.GetEffectName(self)
|
||||
return "particles/items2_fx/mage_slayer_debuff.vpcf"
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff.prototype.GetModifierIncomingDamage_Percentage(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("incress_damage")
|
||||
end
|
||||
modifier_item_demon_slayer_debuff = __TS__Decorate(
|
||||
modifier_item_demon_slayer_debuff,
|
||||
modifier_item_demon_slayer_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_demon_slayer_debuff"}
|
||||
)
|
||||
____exports.modifier_item_demon_slayer_debuff = modifier_item_demon_slayer_debuff
|
||||
--- Коррозия (броня / хил / скорость), без дублирования штрафа spell amp — его даёт Mage Slayer-дебафф.
|
||||
____exports.modifier_item_demon_slayer_debuff_2 = __TS__Class()
|
||||
local modifier_item_demon_slayer_debuff_2 = ____exports.modifier_item_demon_slayer_debuff_2
|
||||
modifier_item_demon_slayer_debuff_2.name = "modifier_item_demon_slayer_debuff_2"
|
||||
modifier_item_demon_slayer_debuff_2.____file_path = "scripts/vscripts/items/default_items/item_demon_slayer.lua"
|
||||
__TS__ClassExtends(modifier_item_demon_slayer_debuff_2, BaseModifier)
|
||||
function modifier_item_demon_slayer_debuff_2.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff_2.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff_2.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff_2.prototype.GetEffectName(self)
|
||||
return "particles/units/heroes/hero_dark_willow/dark_willow_wisp_spell_debuff.vpcf"
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff_2.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_OVERHEAD_FOLLOW
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff_2.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_HEALTH_REGEN_PERCENTAGE, MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff_2.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("movespeed_reduction")
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff_2.prototype.GetModifierHealthRegenPercentage(self)
|
||||
return 1 + (self:GetAbility():GetSpecialValueFor("health_reduction") - 100) * 0.01
|
||||
end
|
||||
function modifier_item_demon_slayer_debuff_2.prototype.GetModifierPhysicalArmorBonus(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("armor_reduction")
|
||||
end
|
||||
modifier_item_demon_slayer_debuff_2 = __TS__Decorate(
|
||||
modifier_item_demon_slayer_debuff_2,
|
||||
modifier_item_demon_slayer_debuff_2,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_demon_slayer_debuff_2"}
|
||||
)
|
||||
____exports.modifier_item_demon_slayer_debuff_2 = modifier_item_demon_slayer_debuff_2
|
||||
--- Эффект как у Mage Slayer: −spell amp и магический DoT раз в секунду.
|
||||
____exports.modifier_item_demon_slayer_mage = __TS__Class()
|
||||
local modifier_item_demon_slayer_mage = ____exports.modifier_item_demon_slayer_mage
|
||||
modifier_item_demon_slayer_mage.name = "modifier_item_demon_slayer_mage"
|
||||
modifier_item_demon_slayer_mage.____file_path = "scripts/vscripts/items/default_items/item_demon_slayer.lua"
|
||||
__TS__ClassExtends(modifier_item_demon_slayer_mage, BaseModifier)
|
||||
function modifier_item_demon_slayer_mage.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_demon_slayer_mage.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_demon_slayer_mage.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_demon_slayer_mage.prototype.GetEffectName(self)
|
||||
return "particles/items2_fx/mage_slayer_debuff.vpcf"
|
||||
end
|
||||
function modifier_item_demon_slayer_mage.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
function modifier_item_demon_slayer_mage.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_demon_slayer_mage.prototype.GetModifierSpellAmplify_Percentage(self)
|
||||
return -math.abs(self:GetAbility():GetSpecialValueFor("spell_amp_debuff"))
|
||||
end
|
||||
function modifier_item_demon_slayer_mage.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
self:PulseDps()
|
||||
self:StartIntervalThink(1)
|
||||
end
|
||||
function modifier_item_demon_slayer_mage.prototype.OnIntervalThink(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
self:PulseDps()
|
||||
end
|
||||
function modifier_item_demon_slayer_mage.prototype.PulseDps(self)
|
||||
local parent = self:GetParent()
|
||||
local ability = self:GetAbility()
|
||||
local caster = self:GetCaster()
|
||||
if not ability or not caster or not (parent and parent:IsAlive()) then
|
||||
return
|
||||
end
|
||||
local d = ability:GetSpecialValueFor("dps")
|
||||
ApplyDamage({
|
||||
victim = parent,
|
||||
attacker = caster,
|
||||
damage = d,
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
ability = ability,
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NO_SPELL_AMPLIFICATION
|
||||
})
|
||||
end
|
||||
modifier_item_demon_slayer_mage = __TS__Decorate(
|
||||
modifier_item_demon_slayer_mage,
|
||||
modifier_item_demon_slayer_mage,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_demon_slayer_mage"}
|
||||
)
|
||||
____exports.modifier_item_demon_slayer_mage = modifier_item_demon_slayer_mage
|
||||
return ____exports
|
||||
@@ -0,0 +1,148 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
____exports.item_demonic_bow = __TS__Class()
|
||||
local item_demonic_bow = ____exports.item_demonic_bow
|
||||
item_demonic_bow.name = "item_demonic_bow"
|
||||
item_demonic_bow.____file_path = "scripts/vscripts/items/default_items/item_demonic_bow.lua"
|
||||
__TS__ClassExtends(item_demonic_bow, BaseItem)
|
||||
function item_demonic_bow.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_demonic_bow"
|
||||
end
|
||||
item_demonic_bow = __TS__Decorate(
|
||||
item_demonic_bow,
|
||||
item_demonic_bow,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_demonic_bow"}
|
||||
)
|
||||
____exports.item_demonic_bow = item_demonic_bow
|
||||
____exports.modifier_item_demonic_bow = __TS__Class()
|
||||
local modifier_item_demonic_bow = ____exports.modifier_item_demonic_bow
|
||||
modifier_item_demonic_bow.name = "modifier_item_demonic_bow"
|
||||
modifier_item_demonic_bow.____file_path = "scripts/vscripts/items/default_items/item_demonic_bow.lua"
|
||||
__TS__ClassExtends(modifier_item_demonic_bow, BaseModifier)
|
||||
function modifier_item_demonic_bow.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.CheckState(self)
|
||||
return {[MODIFIER_STATE_CANNOT_MISS] = true}
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_EVENT_ON_ATTACK,
|
||||
MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
|
||||
MODIFIER_PROPERTY_ATTACK_RANGE_BONUS,
|
||||
MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
|
||||
MODIFIER_PROPERTY_HEALTH_BONUS,
|
||||
MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_MAGICAL
|
||||
}
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.GetModifierProcAttack_BonusDamage_Magical(self, event)
|
||||
if self:GetParent():IsIllusion() or not self:GetParent():IsRangedAttacker() then
|
||||
return 0
|
||||
end
|
||||
return self:GetAbility():GetSpecialValueFor("proc_damage_magical")
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("attack_speed")
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.GetModifierAttackRangeBonus(self)
|
||||
if not self:GetParent():IsRangedAttacker() then
|
||||
return 0
|
||||
end
|
||||
return self:GetAbility():GetSpecialValueFor("attack_range")
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:GetAbility():GetSpecialValueFor("strength")
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:GetAbility():GetSpecialValueFor("agility")
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self:GetAbility():GetSpecialValueFor("intellect")
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.GetModifierHealthBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("health")
|
||||
end
|
||||
function modifier_item_demonic_bow.prototype.OnAttack(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local attacker = event.attacker
|
||||
local target = event.target
|
||||
if not attacker or not target then
|
||||
return
|
||||
end
|
||||
if not attacker:IsRealHero() then
|
||||
return
|
||||
end
|
||||
if attacker ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
if not attacker:IsRangedAttacker() then
|
||||
return
|
||||
end
|
||||
if event.no_attack_cooldown then
|
||||
return
|
||||
end
|
||||
local radius = self:GetParent():GetAttackRangeBuffer() + self:GetParent():GetBaseAttackRange()
|
||||
local units = FindUnitsInRadius(
|
||||
attacker:GetTeamNumber(),
|
||||
attacker:GetAbsOrigin(),
|
||||
nil,
|
||||
radius,
|
||||
DOTA_UNIT_TARGET_TEAM_ENEMY,
|
||||
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING,
|
||||
DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE,
|
||||
FIND_CLOSEST,
|
||||
false
|
||||
)
|
||||
local attackCount = 0
|
||||
for ____, unit in ipairs(units) do
|
||||
if unit and not unit:IsNull() and unit ~= target and unit:IsAlive() then
|
||||
attacker:PerformAttack(
|
||||
unit,
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
false
|
||||
)
|
||||
attackCount = attackCount + 1
|
||||
end
|
||||
if attackCount >= self:GetAbility():GetSpecialValueFor("attack_count") then
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
modifier_item_demonic_bow = __TS__Decorate(
|
||||
modifier_item_demonic_bow,
|
||||
modifier_item_demonic_bow,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_demonic_bow"}
|
||||
)
|
||||
____exports.modifier_item_demonic_bow = modifier_item_demonic_bow
|
||||
return ____exports
|
||||
@@ -0,0 +1,414 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____luck = require("utils.luck")
|
||||
local rollLuckChance = ____luck.rollLuckChance
|
||||
local DESOLATOR_PROJECTILE = "particles/items_fx/desolator_projectile.vpcf"
|
||||
--- Кастомный Desolator (порт zombie_invasion): урон, HP, заряды с убийств, коррупция брони, снаряд.
|
||||
____exports.item_desolator_custom = __TS__Class()
|
||||
local item_desolator_custom = ____exports.item_desolator_custom
|
||||
item_desolator_custom.name = "item_desolator_custom"
|
||||
item_desolator_custom.____file_path = "scripts/vscripts/items/default_items/item_desolator_custom.lua"
|
||||
__TS__ClassExtends(item_desolator_custom, BaseItem)
|
||||
function item_desolator_custom.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", DESOLATOR_PROJECTILE, context)
|
||||
PrecacheResource("particle", "particles/units/heroes/hero_spectre/spectre_desolate_debuff.vpcf", context)
|
||||
end
|
||||
function item_desolator_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return ____exports.modifier_item_desolator_custom.name
|
||||
end
|
||||
item_desolator_custom = __TS__Decorate(
|
||||
item_desolator_custom,
|
||||
item_desolator_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_desolator_custom"}
|
||||
)
|
||||
____exports.item_desolator_custom = item_desolator_custom
|
||||
____exports.modifier_item_desolator_custom = __TS__Class()
|
||||
local modifier_item_desolator_custom = ____exports.modifier_item_desolator_custom
|
||||
modifier_item_desolator_custom.name = "modifier_item_desolator_custom"
|
||||
modifier_item_desolator_custom.____file_path = "scripts/vscripts/items/default_items/item_desolator_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_desolator_custom, BaseModifier)
|
||||
function modifier_item_desolator_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_desolator_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_desolator_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_desolator_custom.prototype.GetPriority(self)
|
||||
return MODIFIER_PRIORITY_ULTRA
|
||||
end
|
||||
function modifier_item_desolator_custom.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
|
||||
MODIFIER_PROPERTY_EXTRA_HEALTH_BONUS,
|
||||
MODIFIER_EVENT_ON_ATTACK_LANDED,
|
||||
MODIFIER_EVENT_ON_DEATH,
|
||||
MODIFIER_PROPERTY_PROJECTILE_NAME
|
||||
}
|
||||
end
|
||||
function modifier_item_desolator_custom.prototype.GetModifierProjectileName(self)
|
||||
return DESOLATOR_PROJECTILE
|
||||
end
|
||||
function modifier_item_desolator_custom.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
return ability:GetSpecialValueFor("bonus_damage") + ability:GetCurrentCharges()
|
||||
end
|
||||
function modifier_item_desolator_custom.prototype.GetModifierExtraHealthBonus(self)
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
return ability:GetSpecialValueFor("bonus_health") + ability:GetCurrentCharges()
|
||||
end
|
||||
function modifier_item_desolator_custom.prototype.OnAttackLanded(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if event.attacker ~= parent or not event.target then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return
|
||||
end
|
||||
local duration = ability:GetSpecialValueFor("corruption_duration")
|
||||
event.target:AddNewModifier(parent, ability, ____exports.modifier_item_desolator_custom_debuff.name, {duration = duration})
|
||||
end
|
||||
function modifier_item_desolator_custom.prototype.OnDeath(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
local ability = self:GetAbility()
|
||||
if not ability or not (parent and parent:IsAlive()) then
|
||||
return
|
||||
end
|
||||
if event.attacker ~= parent then
|
||||
return
|
||||
end
|
||||
local victim = event.unit
|
||||
if not victim or victim == parent or not IsValidEntity(victim) then
|
||||
return
|
||||
end
|
||||
if not victim:HasModifier(____exports.modifier_item_desolator_custom_debuff.name) then
|
||||
return
|
||||
end
|
||||
local chancePct = ability:GetSpecialValueFor("chance_to_stack")
|
||||
if chancePct <= 0 then
|
||||
return
|
||||
end
|
||||
local ____parent_IsRealHero_result_2
|
||||
if parent:IsRealHero() then
|
||||
____parent_IsRealHero_result_2 = rollLuckChance(nil, parent, chancePct / 100)
|
||||
else
|
||||
____parent_IsRealHero_result_2 = RollPercentage(chancePct)
|
||||
end
|
||||
local stacked = ____parent_IsRealHero_result_2
|
||||
if not stacked then
|
||||
return
|
||||
end
|
||||
local maxCap = ability:GetSpecialValueFor("max_damage")
|
||||
local perKill = ability:GetSpecialValueFor("bonus_damage_per_kill")
|
||||
local next = math.min(
|
||||
ability:GetCurrentCharges() + perKill,
|
||||
maxCap
|
||||
)
|
||||
ability:SetCurrentCharges(next)
|
||||
if parent:IsRealHero() then
|
||||
parent:CalculateStatBonus(true)
|
||||
end
|
||||
end
|
||||
function modifier_item_desolator_custom.prototype.GetTexture(self)
|
||||
return "item_desolator"
|
||||
end
|
||||
modifier_item_desolator_custom = __TS__Decorate(
|
||||
modifier_item_desolator_custom,
|
||||
modifier_item_desolator_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_desolator_custom"}
|
||||
)
|
||||
____exports.modifier_item_desolator_custom = modifier_item_desolator_custom
|
||||
____exports.modifier_item_desolator_custom_debuff = __TS__Class()
|
||||
local modifier_item_desolator_custom_debuff = ____exports.modifier_item_desolator_custom_debuff
|
||||
modifier_item_desolator_custom_debuff.name = "modifier_item_desolator_custom_debuff"
|
||||
modifier_item_desolator_custom_debuff.____file_path = "scripts/vscripts/items/default_items/item_desolator_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_desolator_custom_debuff, BaseModifier)
|
||||
function modifier_item_desolator_custom_debuff.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.armorDebuff = 0
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.OnCreated(self)
|
||||
self:RefreshVals()
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.OnRefresh(self)
|
||||
self:RefreshVals()
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.RefreshVals(self)
|
||||
local ability = self:GetAbility()
|
||||
self.armorDebuff = ability and ability:GetSpecialValueFor("corruption_armor") or 0
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_HEALTH_REGEN_PERCENTAGE, MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.GetModifierPhysicalArmorBonus(self)
|
||||
return self.armorDebuff
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
local ability = self:GetAbility()
|
||||
return ability and ability:GetSpecialValueFor("corruption_movespeed_slow") or 0
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.GetModifierHealthRegenPercentage(self)
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 1
|
||||
end
|
||||
local v = ability:GetSpecialValueFor("corruption_heal_reduction")
|
||||
return 1 + (v - 100) * 0.01
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.GetEffectName(self)
|
||||
return "particles/units/heroes/hero_spectre/spectre_desolate_debuff.vpcf"
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
function modifier_item_desolator_custom_debuff.prototype.GetTexture(self)
|
||||
return "item_desolator"
|
||||
end
|
||||
modifier_item_desolator_custom_debuff = __TS__Decorate(
|
||||
modifier_item_desolator_custom_debuff,
|
||||
modifier_item_desolator_custom_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_desolator_custom_debuff"}
|
||||
)
|
||||
____exports.modifier_item_desolator_custom_debuff = modifier_item_desolator_custom_debuff
|
||||
____exports.item_desolator_custom_2 = __TS__Class()
|
||||
local item_desolator_custom_2 = ____exports.item_desolator_custom_2
|
||||
item_desolator_custom_2.name = "item_desolator_custom_2"
|
||||
item_desolator_custom_2.____file_path = "scripts/vscripts/items/default_items/item_desolator_custom.lua"
|
||||
__TS__ClassExtends(item_desolator_custom_2, BaseItem)
|
||||
function item_desolator_custom_2.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", DESOLATOR_PROJECTILE, context)
|
||||
PrecacheResource("particle", "particles/units/heroes/hero_spectre/spectre_desolate_debuff.vpcf", context)
|
||||
end
|
||||
function item_desolator_custom_2.prototype.GetIntrinsicModifierName(self)
|
||||
return ____exports.modifier_item_desolator_custom_2.name
|
||||
end
|
||||
item_desolator_custom_2 = __TS__Decorate(
|
||||
item_desolator_custom_2,
|
||||
item_desolator_custom_2,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_desolator_custom_2"}
|
||||
)
|
||||
____exports.item_desolator_custom_2 = item_desolator_custom_2
|
||||
____exports.modifier_item_desolator_custom_2 = __TS__Class()
|
||||
local modifier_item_desolator_custom_2 = ____exports.modifier_item_desolator_custom_2
|
||||
modifier_item_desolator_custom_2.name = "modifier_item_desolator_custom_2"
|
||||
modifier_item_desolator_custom_2.____file_path = "scripts/vscripts/items/default_items/item_desolator_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_desolator_custom_2, BaseModifier)
|
||||
function modifier_item_desolator_custom_2.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_desolator_custom_2.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_desolator_custom_2.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_desolator_custom_2.prototype.GetPriority(self)
|
||||
return MODIFIER_PRIORITY_ULTRA
|
||||
end
|
||||
function modifier_item_desolator_custom_2.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
|
||||
MODIFIER_PROPERTY_EXTRA_HEALTH_BONUS,
|
||||
MODIFIER_EVENT_ON_ATTACK_LANDED,
|
||||
MODIFIER_EVENT_ON_DEATH,
|
||||
MODIFIER_PROPERTY_PROJECTILE_NAME
|
||||
}
|
||||
end
|
||||
function modifier_item_desolator_custom_2.prototype.GetModifierProjectileName(self)
|
||||
return DESOLATOR_PROJECTILE
|
||||
end
|
||||
function modifier_item_desolator_custom_2.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
return ability:GetSpecialValueFor("bonus_damage") + ability:GetCurrentCharges()
|
||||
end
|
||||
function modifier_item_desolator_custom_2.prototype.GetModifierExtraHealthBonus(self)
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
return ability:GetSpecialValueFor("bonus_health") + ability:GetCurrentCharges()
|
||||
end
|
||||
function modifier_item_desolator_custom_2.prototype.OnAttackLanded(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if event.attacker ~= parent or not event.target then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return
|
||||
end
|
||||
local duration = ability:GetSpecialValueFor("corruption_duration")
|
||||
local perStack = ability:GetSpecialValueFor("corruption_armor_per_stack")
|
||||
local cap = ability:GetSpecialValueFor("corruption_armor_cap")
|
||||
local maxStacks = math.max(
|
||||
1,
|
||||
math.ceil(cap / math.max(1, perStack))
|
||||
)
|
||||
local target = event.target
|
||||
local existing = target:FindModifierByName(____exports.modifier_item_desolator_custom_2_debuff.name)
|
||||
if existing then
|
||||
if existing:GetStackCount() < maxStacks then
|
||||
existing:IncrementStackCount()
|
||||
end
|
||||
existing:SetDuration(duration, true)
|
||||
else
|
||||
local m = target:AddNewModifier(parent, ability, ____exports.modifier_item_desolator_custom_2_debuff.name, {duration = duration})
|
||||
if m ~= nil then
|
||||
m:SetStackCount(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
function modifier_item_desolator_custom_2.prototype.OnDeath(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
local ability = self:GetAbility()
|
||||
if not ability or not (parent and parent:IsAlive()) then
|
||||
return
|
||||
end
|
||||
if event.attacker ~= parent then
|
||||
return
|
||||
end
|
||||
local victim = event.unit
|
||||
if not victim or victim == parent or not IsValidEntity(victim) then
|
||||
return
|
||||
end
|
||||
if not victim:HasModifier(____exports.modifier_item_desolator_custom_2_debuff.name) then
|
||||
return
|
||||
end
|
||||
local chancePct = ability:GetSpecialValueFor("chance_to_stack")
|
||||
if chancePct <= 0 then
|
||||
return
|
||||
end
|
||||
local ____parent_IsRealHero_result_7
|
||||
if parent:IsRealHero() then
|
||||
____parent_IsRealHero_result_7 = rollLuckChance(nil, parent, chancePct / 100)
|
||||
else
|
||||
____parent_IsRealHero_result_7 = RollPercentage(chancePct)
|
||||
end
|
||||
local stacked = ____parent_IsRealHero_result_7
|
||||
if not stacked then
|
||||
return
|
||||
end
|
||||
local maxCap = ability:GetSpecialValueFor("max_damage")
|
||||
local perKill = ability:GetSpecialValueFor("bonus_damage_per_kill")
|
||||
local next = math.min(
|
||||
ability:GetCurrentCharges() + perKill,
|
||||
maxCap
|
||||
)
|
||||
ability:SetCurrentCharges(next)
|
||||
if parent:IsRealHero() then
|
||||
parent:CalculateStatBonus(true)
|
||||
end
|
||||
end
|
||||
function modifier_item_desolator_custom_2.prototype.GetTexture(self)
|
||||
return "item_desolator_2"
|
||||
end
|
||||
modifier_item_desolator_custom_2 = __TS__Decorate(
|
||||
modifier_item_desolator_custom_2,
|
||||
modifier_item_desolator_custom_2,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_desolator_custom_2"}
|
||||
)
|
||||
____exports.modifier_item_desolator_custom_2 = modifier_item_desolator_custom_2
|
||||
____exports.modifier_item_desolator_custom_2_debuff = __TS__Class()
|
||||
local modifier_item_desolator_custom_2_debuff = ____exports.modifier_item_desolator_custom_2_debuff
|
||||
modifier_item_desolator_custom_2_debuff.name = "modifier_item_desolator_custom_2_debuff"
|
||||
modifier_item_desolator_custom_2_debuff.____file_path = "scripts/vscripts/items/default_items/item_desolator_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_desolator_custom_2_debuff, BaseModifier)
|
||||
function modifier_item_desolator_custom_2_debuff.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_desolator_custom_2_debuff.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_desolator_custom_2_debuff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_desolator_custom_2_debuff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_HEALTH_REGEN_PERCENTAGE, MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_desolator_custom_2_debuff.prototype.GetModifierPhysicalArmorBonus(self)
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
local perStack = ability:GetSpecialValueFor("corruption_armor_per_stack")
|
||||
local cap = ability:GetSpecialValueFor("corruption_armor_cap")
|
||||
return -math.min(
|
||||
self:GetStackCount() * perStack,
|
||||
cap
|
||||
)
|
||||
end
|
||||
function modifier_item_desolator_custom_2_debuff.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
local ability = self:GetAbility()
|
||||
return ability and ability:GetSpecialValueFor("corruption_movespeed_slow") or 0
|
||||
end
|
||||
function modifier_item_desolator_custom_2_debuff.prototype.GetModifierHealthRegenPercentage(self)
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 1
|
||||
end
|
||||
local v = ability:GetSpecialValueFor("corruption_heal_reduction")
|
||||
return 1 + (v - 100) * 0.01
|
||||
end
|
||||
function modifier_item_desolator_custom_2_debuff.prototype.GetEffectName(self)
|
||||
return "particles/units/heroes/hero_spectre/spectre_desolate_debuff.vpcf"
|
||||
end
|
||||
function modifier_item_desolator_custom_2_debuff.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
function modifier_item_desolator_custom_2_debuff.prototype.GetTexture(self)
|
||||
return "item_desolator_2"
|
||||
end
|
||||
modifier_item_desolator_custom_2_debuff = __TS__Decorate(
|
||||
modifier_item_desolator_custom_2_debuff,
|
||||
modifier_item_desolator_custom_2_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_desolator_custom_2_debuff"}
|
||||
)
|
||||
____exports.modifier_item_desolator_custom_2_debuff = modifier_item_desolator_custom_2_debuff
|
||||
return ____exports
|
||||
@@ -0,0 +1,76 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_divine_rapier_custom = __TS__Class()
|
||||
local item_divine_rapier_custom = ____exports.item_divine_rapier_custom
|
||||
item_divine_rapier_custom.name = "item_divine_rapier_custom"
|
||||
item_divine_rapier_custom.____file_path = "scripts/vscripts/items/default_items/item_divine_rapier_custom.lua"
|
||||
__TS__ClassExtends(item_divine_rapier_custom, BaseItem)
|
||||
function item_divine_rapier_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_divine_rapier_custom"
|
||||
end
|
||||
item_divine_rapier_custom = __TS__Decorate(
|
||||
item_divine_rapier_custom,
|
||||
item_divine_rapier_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_divine_rapier_custom"}
|
||||
)
|
||||
____exports.item_divine_rapier_custom = item_divine_rapier_custom
|
||||
____exports.modifier_divine_rapier_custom = __TS__Class()
|
||||
local modifier_divine_rapier_custom = ____exports.modifier_divine_rapier_custom
|
||||
modifier_divine_rapier_custom.name = "modifier_divine_rapier_custom"
|
||||
modifier_divine_rapier_custom.____file_path = "scripts/vscripts/items/default_items/item_divine_rapier_custom.lua"
|
||||
__TS__ClassExtends(modifier_divine_rapier_custom, BaseModifier)
|
||||
function modifier_divine_rapier_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_divine_rapier_custom.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_divine_rapier_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_divine_rapier_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_divine_rapier_custom.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_PURE, MODIFIER_EVENT_ON_ATTACK_LANDED}
|
||||
end
|
||||
function modifier_divine_rapier_custom.prototype.OnAttackLanded(self, event)
|
||||
if self:GetParent() == event.attacker then
|
||||
local damage = self:GetAbility():GetSpecialValueFor("proc_damage") / 100 * self:GetParent():GetAverageTrueAttackDamage(event.target)
|
||||
SendOverheadEventMessage(
|
||||
nil,
|
||||
OVERHEAD_ALERT_DAMAGE,
|
||||
event.target,
|
||||
damage,
|
||||
nil
|
||||
)
|
||||
local particle = ParticleManager:CreateParticle("models/heroes/phantom_assassin_persona/debut/particles/pa_debutdash/pa_debutdash_fragments.vpcf", PATTACH_CUSTOMORIGIN, nil)
|
||||
ParticleManager:SetParticleControl(
|
||||
particle,
|
||||
0,
|
||||
event.target:GetAbsOrigin()
|
||||
)
|
||||
ParticleManager:ReleaseParticleIndex(particle)
|
||||
ApplyDamage({victim = event.target, attacker = event.attacker, damage = damage, damage_type = DAMAGE_TYPE_PURE})
|
||||
end
|
||||
end
|
||||
function modifier_divine_rapier_custom.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
modifier_divine_rapier_custom = __TS__Decorate(
|
||||
modifier_divine_rapier_custom,
|
||||
modifier_divine_rapier_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_divine_rapier_custom"}
|
||||
)
|
||||
____exports.modifier_divine_rapier_custom = modifier_divine_rapier_custom
|
||||
return ____exports
|
||||
@@ -0,0 +1,324 @@
|
||||
local ____lualib = require("lualib_bundle")
|
||||
local __TS__Class = ____lualib.__TS__Class
|
||||
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
|
||||
local __TS__Decorate = ____lualib.__TS__Decorate
|
||||
local __TS__ArrayPush = ____lualib.__TS__ArrayPush
|
||||
local ____exports = {}
|
||||
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
|
||||
local BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ETHEREAL_BLADE_PARTICLE = "particles/items_fx/ethereal_blade.vpcf"
|
||||
local ETHEREAL_STATUS_PARTICLE = "particles/status_fx/status_effect_ghost.vpcf"
|
||||
____exports.item_ethereal_blade_custom = __TS__Class()
|
||||
local item_ethereal_blade_custom = ____exports.item_ethereal_blade_custom
|
||||
item_ethereal_blade_custom.name = "item_ethereal_blade_custom"
|
||||
item_ethereal_blade_custom.____file_path = "scripts/vscripts/items/default_items/item_ethereal_blade_custom.lua"
|
||||
__TS__ClassExtends(item_ethereal_blade_custom, BaseItem)
|
||||
function item_ethereal_blade_custom.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", ETHEREAL_BLADE_PARTICLE, context)
|
||||
PrecacheResource("particle", ETHEREAL_STATUS_PARTICLE, context)
|
||||
PrecacheResource("soundfile", "soundevents/game_sounds_items.vsndevts", context)
|
||||
end
|
||||
function item_ethereal_blade_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return ____exports.modifier_item_ethereal_blade_custom.name
|
||||
end
|
||||
function item_ethereal_blade_custom.prototype.GetAOERadius(self)
|
||||
return self:GetSpecialValueFor("splash_radius")
|
||||
end
|
||||
function item_ethereal_blade_custom.prototype.GetCastRange(self)
|
||||
local range = self:GetSpecialValueFor("abilitycastrange")
|
||||
if IsServer() then
|
||||
return range
|
||||
end
|
||||
local ____opt_0 = self:GetCaster()
|
||||
local bonus = ____opt_0 and ____opt_0:GetCastRangeBonus() or 0
|
||||
return range - bonus
|
||||
end
|
||||
function item_ethereal_blade_custom.prototype.OnSpellStart(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local target = self:GetCursorTarget()
|
||||
if not target then
|
||||
return
|
||||
end
|
||||
local splashRadius = self:GetSpecialValueFor("splash_radius")
|
||||
local projectileSpeed = self:GetSpecialValueFor("projectile_speed")
|
||||
local sourceLoc = caster:GetAbsOrigin()
|
||||
caster:EmitSound("DOTA_Item.EtherealBlade.Activate")
|
||||
local isAlly = target:GetTeamNumber() == caster:GetTeamNumber()
|
||||
local units = {}
|
||||
if isAlly then
|
||||
units = {target}
|
||||
else
|
||||
units = FindUnitsInRadius(
|
||||
caster:GetTeamNumber(),
|
||||
target:GetAbsOrigin(),
|
||||
nil,
|
||||
splashRadius,
|
||||
DOTA_UNIT_TARGET_TEAM_ENEMY,
|
||||
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
|
||||
DOTA_UNIT_TARGET_FLAG_NONE,
|
||||
FIND_ANY_ORDER,
|
||||
false
|
||||
)
|
||||
if #units == 0 then
|
||||
units = {target}
|
||||
end
|
||||
end
|
||||
for ____, enemy in ipairs(units) do
|
||||
ProjectileManager:CreateTrackingProjectile({
|
||||
Target = enemy,
|
||||
Source = caster,
|
||||
Ability = self,
|
||||
EffectName = ETHEREAL_BLADE_PARTICLE,
|
||||
iMoveSpeed = projectileSpeed,
|
||||
vSourceLoc = sourceLoc,
|
||||
bDodgeable = true,
|
||||
bProvidesVision = false
|
||||
})
|
||||
end
|
||||
end
|
||||
function item_ethereal_blade_custom.prototype.OnProjectileHit(self, target)
|
||||
if not IsServer() or not target then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
if target:IsMagicImmune() then
|
||||
return
|
||||
end
|
||||
if target:TriggerSpellAbsorb(self) then
|
||||
return
|
||||
end
|
||||
target:EmitSound("DOTA_Item.EtherealBlade.Target")
|
||||
local durationEnemy = self:GetSpecialValueFor("duration")
|
||||
local durationAlly = self:GetSpecialValueFor("duration_ally")
|
||||
local isAlly = target:GetTeamNumber() == caster:GetTeamNumber()
|
||||
if isAlly then
|
||||
target:AddNewModifier(caster, self, ____exports.modifier_item_ethereal_blade_custom_ethereal.name, {duration = durationAlly, is_ally = 1})
|
||||
target:AddNewModifier(caster, self, ____exports.modifier_item_ethereal_blade_custom_ally_haste.name, {duration = durationAlly})
|
||||
return
|
||||
end
|
||||
local resistDuration = durationEnemy * (1 - target:GetStatusResistance())
|
||||
target:AddNewModifier(caster, self, ____exports.modifier_item_ethereal_blade_custom_ethereal.name, {duration = resistDuration, is_ally = 0})
|
||||
local hero = caster
|
||||
local statMult = self:GetSpecialValueFor("blast_stat_multiplier")
|
||||
local baseDamage = self:GetSpecialValueFor("blast_damage_base")
|
||||
local damage = (hero:IsHero() and hero:GetPrimaryStatValue() or 0) * statMult + baseDamage
|
||||
ApplyDamage({
|
||||
victim = target,
|
||||
attacker = caster,
|
||||
damage = damage,
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
ability = self
|
||||
})
|
||||
end
|
||||
item_ethereal_blade_custom = __TS__Decorate(
|
||||
item_ethereal_blade_custom,
|
||||
item_ethereal_blade_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_ethereal_blade_custom"}
|
||||
)
|
||||
____exports.item_ethereal_blade_custom = item_ethereal_blade_custom
|
||||
____exports.modifier_item_ethereal_blade_custom = __TS__Class()
|
||||
local modifier_item_ethereal_blade_custom = ____exports.modifier_item_ethereal_blade_custom
|
||||
modifier_item_ethereal_blade_custom.name = "modifier_item_ethereal_blade_custom"
|
||||
modifier_item_ethereal_blade_custom.____file_path = "scripts/vscripts/items/default_items/item_ethereal_blade_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_ethereal_blade_custom, BaseModifier)
|
||||
function modifier_item_ethereal_blade_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
|
||||
MODIFIER_PROPERTY_STATUS_RESISTANCE_STACKING,
|
||||
MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
|
||||
MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE,
|
||||
MODIFIER_PROPERTY_HP_REGEN_AMPLIFY_PERCENTAGE,
|
||||
MODIFIER_PROPERTY_MP_REGEN_AMPLIFY_PERCENTAGE,
|
||||
MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE,
|
||||
MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_MAGICAL
|
||||
}
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.getValue(self, name)
|
||||
local ____opt_2 = self:GetAbility()
|
||||
return ____opt_2 and ____opt_2:GetSpecialValueFor(name) or 0
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:getValue("bonus_strength")
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:getValue("bonus_agility")
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self:getValue("bonus_intellect")
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.GetModifierStatusResistanceStacking(self)
|
||||
return self:getValue("status_resistance")
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:getValue("bonus_attack_speed")
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return self:getValue("movement_speed_percent_bonus")
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.GetModifierHPRegenAmplify_Percentage(self)
|
||||
return self:getValue("hp_regen_amp")
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.GetModifierMPRegenAmplify_Percentage(self)
|
||||
return self:getValue("mana_regen_multiplier")
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.GetModifierSpellAmplify_Percentage(self)
|
||||
return self:getValue("spell_amp")
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom.prototype.GetModifierProcAttack_BonusDamage_Magical(self)
|
||||
return self:getValue("magic_damage_attack")
|
||||
end
|
||||
modifier_item_ethereal_blade_custom = __TS__Decorate(
|
||||
modifier_item_ethereal_blade_custom,
|
||||
modifier_item_ethereal_blade_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_ethereal_blade_custom"}
|
||||
)
|
||||
____exports.modifier_item_ethereal_blade_custom = modifier_item_ethereal_blade_custom
|
||||
____exports.modifier_item_ethereal_blade_custom_ethereal = __TS__Class()
|
||||
local modifier_item_ethereal_blade_custom_ethereal = ____exports.modifier_item_ethereal_blade_custom_ethereal
|
||||
modifier_item_ethereal_blade_custom_ethereal.name = "modifier_item_ethereal_blade_custom_ethereal"
|
||||
modifier_item_ethereal_blade_custom_ethereal.____file_path = "scripts/vscripts/items/default_items/item_ethereal_blade_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_ethereal_blade_custom_ethereal, BaseModifier)
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.blastMovementSlow = 0
|
||||
self.etherealDamageBonus = 0
|
||||
self.turnRateReduction = 0
|
||||
self.isAlly = false
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.IsDebuff(self)
|
||||
return not self.isAlly
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.GetStatusEffectName(self)
|
||||
return ETHEREAL_STATUS_PARTICLE
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.StatusEffectPriority(self)
|
||||
return MODIFIER_PRIORITY_NORMAL
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.OnCreated(self, params)
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
self:Destroy()
|
||||
return
|
||||
end
|
||||
self.isAlly = (params.is_ally or 0) == 1
|
||||
self.blastMovementSlow = ability:GetSpecialValueFor("blast_movement_slow")
|
||||
self.etherealDamageBonus = ability:GetSpecialValueFor("ethereal_damage_bonus")
|
||||
self.turnRateReduction = ability:GetSpecialValueFor("turn_rate_reduction")
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.CheckState(self)
|
||||
return {[MODIFIER_STATE_ATTACK_IMMUNE] = true, [MODIFIER_STATE_DISARMED] = true}
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.DeclareFunctions(self)
|
||||
local funcs = {MODIFIER_PROPERTY_MAGICAL_RESISTANCE_DECREPIFY_UNIQUE, MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_PHYSICAL}
|
||||
if self.isAlly then
|
||||
funcs[#funcs + 1] = MODIFIER_PROPERTY_IGNORE_CAST_ANGLE
|
||||
else
|
||||
__TS__ArrayPush(funcs, MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, MODIFIER_PROPERTY_TURN_RATE_PERCENTAGE)
|
||||
end
|
||||
return funcs
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
if self.isAlly then
|
||||
return 0
|
||||
end
|
||||
return self.blastMovementSlow
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.GetModifierMagicalResistanceDecrepifyUnique(self)
|
||||
return self.etherealDamageBonus
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.GetAbsoluteNoDamagePhysical(self)
|
||||
return 1
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.GetModifierTurnRate_Percentage(self)
|
||||
return self.turnRateReduction
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.GetModifierIgnoreCastAngle(self)
|
||||
return self.isAlly and 1 or 0
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ethereal.prototype.GetTexture(self)
|
||||
return "item_ethereal_blade"
|
||||
end
|
||||
modifier_item_ethereal_blade_custom_ethereal = __TS__Decorate(
|
||||
modifier_item_ethereal_blade_custom_ethereal,
|
||||
modifier_item_ethereal_blade_custom_ethereal,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_ethereal_blade_custom_ethereal"}
|
||||
)
|
||||
____exports.modifier_item_ethereal_blade_custom_ethereal = modifier_item_ethereal_blade_custom_ethereal
|
||||
--- Ускорение при касте по союзнику (движение и атака).
|
||||
____exports.modifier_item_ethereal_blade_custom_ally_haste = __TS__Class()
|
||||
local modifier_item_ethereal_blade_custom_ally_haste = ____exports.modifier_item_ethereal_blade_custom_ally_haste
|
||||
modifier_item_ethereal_blade_custom_ally_haste.name = "modifier_item_ethereal_blade_custom_ally_haste"
|
||||
modifier_item_ethereal_blade_custom_ally_haste.____file_path = "scripts/vscripts/items/default_items/item_ethereal_blade_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_ethereal_blade_custom_ally_haste, BaseModifier)
|
||||
function modifier_item_ethereal_blade_custom_ally_haste.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.bonusMoveSpeedPct = 0
|
||||
self.bonusAttackSpeedPct = 0
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ally_haste.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ally_haste.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ally_haste.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ally_haste.prototype.OnCreated(self)
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
self:Destroy()
|
||||
return
|
||||
end
|
||||
self.bonusMoveSpeedPct = ability:GetSpecialValueFor("ally_bonus_movespeed")
|
||||
self.bonusAttackSpeedPct = ability:GetSpecialValueFor("ally_bonus_attack_speed")
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ally_haste.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, MODIFIER_PROPERTY_ATTACKSPEED_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ally_haste.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return self.bonusMoveSpeedPct
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ally_haste.prototype.GetModifierAttackSpeedPercentage(self)
|
||||
return self.bonusAttackSpeedPct
|
||||
end
|
||||
function modifier_item_ethereal_blade_custom_ally_haste.prototype.GetTexture(self)
|
||||
return "item_ethereal_blade"
|
||||
end
|
||||
modifier_item_ethereal_blade_custom_ally_haste = __TS__Decorate(
|
||||
modifier_item_ethereal_blade_custom_ally_haste,
|
||||
modifier_item_ethereal_blade_custom_ally_haste,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_ethereal_blade_custom_ally_haste"}
|
||||
)
|
||||
____exports.modifier_item_ethereal_blade_custom_ally_haste = modifier_item_ethereal_blade_custom_ally_haste
|
||||
return ____exports
|
||||
@@ -0,0 +1,184 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local ____modifier_general_fired = require("abilities.modifiers.modifier_general_fired")
|
||||
local modifier_general_fired = ____modifier_general_fired.modifier_general_fired
|
||||
____exports.item_fire_cape = __TS__Class()
|
||||
local item_fire_cape = ____exports.item_fire_cape
|
||||
item_fire_cape.name = "item_fire_cape"
|
||||
item_fire_cape.____file_path = "scripts/vscripts/items/default_items/item_fire_cape.lua"
|
||||
__TS__ClassExtends(item_fire_cape, BaseItem)
|
||||
function item_fire_cape.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_fire_cape"
|
||||
end
|
||||
function item_fire_cape.prototype.GetAOERadius(self)
|
||||
return self:GetSpecialValueFor("radius")
|
||||
end
|
||||
item_fire_cape = __TS__Decorate(
|
||||
item_fire_cape,
|
||||
item_fire_cape,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_fire_cape"}
|
||||
)
|
||||
____exports.item_fire_cape = item_fire_cape
|
||||
____exports.modifier_item_fire_cape = __TS__Class()
|
||||
local modifier_item_fire_cape = ____exports.modifier_item_fire_cape
|
||||
modifier_item_fire_cape.name = "modifier_item_fire_cape"
|
||||
modifier_item_fire_cape.____file_path = "scripts/vscripts/items/default_items/item_fire_cape.lua"
|
||||
__TS__ClassExtends(modifier_item_fire_cape, BaseModifier)
|
||||
function modifier_item_fire_cape.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.GetAuraRadius(self)
|
||||
return self:GetAbility():GetSpecialValueFor("radius")
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.GetAuraSearchTeam(self)
|
||||
return DOTA_UNIT_TARGET_TEAM_ENEMY
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.GetAuraSearchType(self)
|
||||
return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.GetModifierAura(self)
|
||||
return "modifier_item_fire_cape_aura"
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.IsAura(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.OnCreated(self, params)
|
||||
self:StartIntervalThink(1)
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.GetTexture(self)
|
||||
return "default_items/fire_cape"
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
|
||||
MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS,
|
||||
MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS,
|
||||
MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT
|
||||
}
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.GetModifierConstantManaRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana_regen")
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.GetModifierMagicalResistanceBonus(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_magic_resistance")
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.GetModifierConstantHealthRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_health_regen")
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.GetModifierPhysicalArmorBonus(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_physical_armor")
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_attack_speed")
|
||||
end
|
||||
function modifier_item_fire_cape.prototype.OnIntervalThink(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if not self:GetParent():IsAlive() then
|
||||
return
|
||||
end
|
||||
local ____opt_0 = self:GetCaster()
|
||||
if ____opt_0 and ____opt_0:IsIllusion() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local radius = self:GetAbility():GetSpecialValueFor("radius")
|
||||
local damage = self:GetAbility():GetSpecialValueFor("damage")
|
||||
local enemies = FindUnitsInRadius(
|
||||
caster:GetTeamNumber(),
|
||||
caster:GetAbsOrigin(),
|
||||
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 damage_table = {
|
||||
victim = enemy,
|
||||
attacker = caster,
|
||||
damage = damage + self:GetParent():GetMaxMana() * (self:GetAbility():GetSpecialValueFor("mana_damage_pct") / 100),
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
ability = self:GetAbility(),
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
||||
}
|
||||
local modifier = enemy:AddNewModifier(
|
||||
self:GetCaster(),
|
||||
self:GetAbility(),
|
||||
modifier_general_fired.name,
|
||||
{}
|
||||
)
|
||||
if modifier then
|
||||
local stacksPerLevel = self:GetAbility():GetSpecialValueFor("fire_stack")
|
||||
do
|
||||
local i = 0
|
||||
while i < stacksPerLevel do
|
||||
modifier:IncrementStackCount()
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
ApplyDamage(damage_table)
|
||||
end
|
||||
end
|
||||
modifier_item_fire_cape = __TS__Decorate(
|
||||
modifier_item_fire_cape,
|
||||
modifier_item_fire_cape,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_fire_cape"}
|
||||
)
|
||||
____exports.modifier_item_fire_cape = modifier_item_fire_cape
|
||||
____exports.modifier_item_fire_cape_aura = __TS__Class()
|
||||
local modifier_item_fire_cape_aura = ____exports.modifier_item_fire_cape_aura
|
||||
modifier_item_fire_cape_aura.name = "modifier_item_fire_cape_aura"
|
||||
modifier_item_fire_cape_aura.____file_path = "scripts/vscripts/items/default_items/item_fire_cape.lua"
|
||||
__TS__ClassExtends(modifier_item_fire_cape_aura, BaseModifier)
|
||||
function modifier_item_fire_cape_aura.prototype.RemoveOnDeath(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_fire_cape_aura.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_fire_cape_aura.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_fire_cape_aura.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_fire_cape_aura.prototype.GetModifierMagicalResistanceBonus(self)
|
||||
return -self:GetAbility():GetSpecialValueFor("bonus_magic_resistance")
|
||||
end
|
||||
function modifier_item_fire_cape_aura.prototype.GetModifierSpellAmplify_Percentage(self)
|
||||
return -self:GetAbility():GetSpecialValueFor("bonus_spell_amp")
|
||||
end
|
||||
modifier_item_fire_cape_aura = __TS__Decorate(
|
||||
modifier_item_fire_cape_aura,
|
||||
modifier_item_fire_cape_aura,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_fire_cape_aura"}
|
||||
)
|
||||
____exports.modifier_item_fire_cape_aura = modifier_item_fire_cape_aura
|
||||
return ____exports
|
||||
@@ -0,0 +1,615 @@
|
||||
local ____lualib = require("lualib_bundle")
|
||||
local __TS__Class = ____lualib.__TS__Class
|
||||
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
|
||||
local __TS__ArrayIncludes = ____lualib.__TS__ArrayIncludes
|
||||
local __TS__Decorate = ____lualib.__TS__Decorate
|
||||
local ____exports = {}
|
||||
local ____fish_basic = require("abilities.fish_basic")
|
||||
local modifier_fish_basic = ____fish_basic.modifier_fish_basic
|
||||
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
|
||||
local BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
--- Цепь из клиента Dota 2 (кастомный .vpcf без файла в content/particles не появится в игре)
|
||||
local PARTICLE_MEATHOOK = "particles/units/heroes/hero_pudge/pudge_meathook.vpcf"
|
||||
--- Юнит рыбы (npc_units_custom) — при успешном вываживании удаляется, дроп летит к герою
|
||||
local BOMB_UNIT_NAMES = {"npc_bomb"}
|
||||
local FISH_UNIT_NAMES = {"npc_fish_1", "npc_fish_2"}
|
||||
local FISH_CATCH_ITEM_DEFAULT = "item_meat"
|
||||
--- У Пуджа есть attach_weapon_chain_rt; у большинства героев — attach_attack1
|
||||
local function getMeathookAttachName(self, unit)
|
||||
local candidates = {"attach_attack1", "attach_attack2"}
|
||||
for ____, name in ipairs(candidates) do
|
||||
if unit:ScriptLookupAttachment(name) >= 0 then
|
||||
return name
|
||||
end
|
||||
end
|
||||
return "attach_hitloc"
|
||||
end
|
||||
____exports.item_fishing_rod = __TS__Class()
|
||||
local item_fishing_rod = ____exports.item_fishing_rod
|
||||
item_fishing_rod.name = "item_fishing_rod"
|
||||
item_fishing_rod.____file_path = "scripts/vscripts/items/default_items/item_fishing_rod.lua"
|
||||
__TS__ClassExtends(item_fishing_rod, BaseItem)
|
||||
function item_fishing_rod.prototype.____constructor(self, ...)
|
||||
BaseItem.prototype.____constructor(self, ...)
|
||||
self.vHookOffset = Vector(0, 0, 96)
|
||||
self.bRetracting = false
|
||||
self.vTargetPosition = Vector(0, 0, 0)
|
||||
self.vStartPosition = Vector(0, 0, 0)
|
||||
end
|
||||
function item_fishing_rod.prototype.GetAbilityDamageType(self)
|
||||
return DAMAGE_TYPE_PHYSICAL
|
||||
end
|
||||
function item_fishing_rod.prototype.GetAbilityDamage(self)
|
||||
return self:GetSpecialValueFor("Damage")
|
||||
end
|
||||
function item_fishing_rod.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", PARTICLE_MEATHOOK, context)
|
||||
PrecacheResource("particle", "particles/units/heroes/hero_pudge/pudge_meathook_impact.vpcf", context)
|
||||
end
|
||||
function item_fishing_rod.prototype.GetCastRange(self, location, target)
|
||||
return self:GetSpecialValueFor("hook_distance")
|
||||
end
|
||||
function item_fishing_rod.prototype.OnAbilityPhaseStart(self)
|
||||
self:GetCaster():StartGesture(ACT_DOTA_ATTACK)
|
||||
return true
|
||||
end
|
||||
function item_fishing_rod.prototype.OnAbilityPhaseInterrupted(self)
|
||||
self:GetCaster():RemoveGesture(ACT_DOTA_ATTACK)
|
||||
return true
|
||||
end
|
||||
function item_fishing_rod.prototype.clearHookedVictimPull(self)
|
||||
if self.hookedVictimEntIndex == nil then
|
||||
return
|
||||
end
|
||||
local ent = EntIndexToHScript(self.hookedVictimEntIndex)
|
||||
self.hookedVictimEntIndex = nil
|
||||
if ent and IsValidEntity(ent) and ent:IsBaseNPC() then
|
||||
ent:RemoveModifierByName(____exports.modifier_item_fishing_rod_hook_pull.name)
|
||||
end
|
||||
end
|
||||
function item_fishing_rod.prototype.releaseCasterMovementLock(self, caster)
|
||||
caster:RemoveModifierByName(____exports.modifier_item_fishing_rod_caster_root.name)
|
||||
end
|
||||
function item_fishing_rod.prototype.getFishCatchItemName(self)
|
||||
local raw = self:GetAbilityKeyValues()
|
||||
local ____opt_result_4
|
||||
if raw ~= nil then
|
||||
____opt_result_4 = raw.AbilityValues
|
||||
end
|
||||
local ____opt_result_5
|
||||
if ____opt_result_4 ~= nil then
|
||||
____opt_result_5 = ____opt_result_4.fish_catch_item
|
||||
end
|
||||
local ____opt_result_5_9 = ____opt_result_5
|
||||
if ____opt_result_5_9 == nil then
|
||||
local ____opt_result_8
|
||||
if raw ~= nil then
|
||||
____opt_result_8 = raw.fish_catch_item
|
||||
end
|
||||
____opt_result_5_9 = ____opt_result_8
|
||||
end
|
||||
local name = ____opt_result_5_9
|
||||
if type(name) == "string" and #name > 0 then
|
||||
return name
|
||||
end
|
||||
return FISH_CATCH_ITEM_DEFAULT
|
||||
end
|
||||
function item_fishing_rod.prototype.trySpawnFishCatchReward(self, caster, caughtEntIndex)
|
||||
if caughtEntIndex == nil then
|
||||
return
|
||||
end
|
||||
local ent = EntIndexToHScript(caughtEntIndex)
|
||||
if not ent or not IsValidEntity(ent) or not ent:IsBaseNPC() then
|
||||
return
|
||||
end
|
||||
local unit = ent
|
||||
local parent = self:GetCaster()
|
||||
if not caster then
|
||||
return
|
||||
end
|
||||
if __TS__ArrayIncludes(
|
||||
BOMB_UNIT_NAMES,
|
||||
unit:GetUnitName()
|
||||
) and unit:IsAlive() then
|
||||
local debuffs = {{name = "modifier_bad_cast_debuff", minDuration = 10, maxDuration = 20}, {name = "modifier_blind_debuff", minDuration = 1, maxDuration = 3.5}, {name = "modifier_stunned", minDuration = 1.5, maxDuration = 3.5}}
|
||||
ApplyDamage({
|
||||
victim = parent,
|
||||
attacker = caster,
|
||||
damage = self:GetCaster():GetMaxHealth() * 0.25,
|
||||
damage_type = DAMAGE_TYPE_PURE,
|
||||
ability = self
|
||||
})
|
||||
local randomDebuff = debuffs[RandomInt(0, #debuffs - 1) + 1]
|
||||
local duration = RandomFloat(randomDebuff.minDuration, randomDebuff.maxDuration)
|
||||
caster:AddNewModifier(caster, self, randomDebuff.name, {duration = duration})
|
||||
EmitSoundOn("Hero_TemplarAssassin.Trap.Explode", parent)
|
||||
unit:RemoveModifierByName(modifier_fish_basic.name)
|
||||
unit:Kill(self, caster)
|
||||
UTIL_Remove(unit)
|
||||
return
|
||||
end
|
||||
if not __TS__ArrayIncludes(
|
||||
FISH_UNIT_NAMES,
|
||||
unit:GetUnitName()
|
||||
) or not unit:IsAlive() then
|
||||
return
|
||||
end
|
||||
local fromPos = unit:GetAbsOrigin()
|
||||
unit:RemoveModifierByName(modifier_fish_basic.name)
|
||||
unit:Kill(self, caster)
|
||||
UTIL_Remove(unit)
|
||||
local itemName = self:getFishCatchItemName()
|
||||
local launchH = self:GetSpecialValueFor("fish_loot_launch_height")
|
||||
local launchDist = self:GetSpecialValueFor("fish_loot_launch_distance")
|
||||
local launchDur = self:GetSpecialValueFor("fish_loot_launch_duration")
|
||||
if launchH <= 0 then
|
||||
launchH = 100
|
||||
end
|
||||
if launchDist <= 0 then
|
||||
launchDist = 150
|
||||
end
|
||||
if launchDur <= 0 then
|
||||
launchDur = 0.5
|
||||
end
|
||||
local item = CreateItem(itemName, nil, nil)
|
||||
if not item then
|
||||
return
|
||||
end
|
||||
CreateItemOnPositionForLaunch(fromPos, item)
|
||||
item:LaunchLootInitialHeight(
|
||||
false,
|
||||
launchH,
|
||||
launchDist,
|
||||
launchDur,
|
||||
caster:GetAbsOrigin()
|
||||
)
|
||||
end
|
||||
function item_fishing_rod.prototype.OnSpellStart(self)
|
||||
local caster = self:GetCaster()
|
||||
self:clearHookedVictimPull()
|
||||
if not caster:IsInstance(CDOTA_BaseNPC_Hero) then
|
||||
return
|
||||
end
|
||||
local hero = caster
|
||||
self:releaseCasterMovementLock(hero)
|
||||
local hookSpeed = self:GetSpecialValueFor("hook_speed")
|
||||
local hookDistance = self:GetCastRange(
|
||||
caster:GetOrigin(),
|
||||
nil
|
||||
)
|
||||
local hookWidth = self:GetSpecialValueFor("hook_width")
|
||||
local attachName = getMeathookAttachName(nil, caster)
|
||||
local ____opt_10 = caster.clothes
|
||||
local hook = ____opt_10 and ____opt_10.weapon
|
||||
if not not hook then
|
||||
hook:AddEffects(EF_NODRAW)
|
||||
end
|
||||
local casterPoint = caster:GetOrigin()
|
||||
self.vStartPosition = casterPoint
|
||||
local vDirection = (casterPoint == self:GetCursorPosition() and self:GetCursorPosition() + Vector(1, 1, 0) or self:GetCursorPosition()) - casterPoint
|
||||
vDirection.z = 0
|
||||
if caster:HasModifier(____exports.modifier_bad_cast_debuff.name) then
|
||||
local angle = RandomFloat(0, 2 * math.pi)
|
||||
local randomDir = Vector(
|
||||
math.cos(angle),
|
||||
math.sin(angle),
|
||||
0
|
||||
)
|
||||
vDirection = randomDir * vDirection:Length2D()
|
||||
end
|
||||
vDirection = vDirection:Normalized() * hookDistance
|
||||
self.vTargetPosition = casterPoint + vDirection
|
||||
local vHookTarget = self.vTargetPosition + Vector(0, 0, 96)
|
||||
local vKillswitch = Vector(hookDistance / hookSpeed * 2, 0, 0)
|
||||
EmitSoundOn("Hero_Pudge.AttackHookExtend", caster)
|
||||
self.nChainParticleFXIndex = ParticleManager:CreateParticle(PARTICLE_MEATHOOK, PATTACH_CUSTOMORIGIN, caster)
|
||||
ParticleManager:SetParticleAlwaysSimulate(self.nChainParticleFXIndex)
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
self.nChainParticleFXIndex,
|
||||
0,
|
||||
caster,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
attachName,
|
||||
casterPoint + self.vHookOffset,
|
||||
true
|
||||
)
|
||||
ParticleManager:SetParticleControl(self.nChainParticleFXIndex, 1, vHookTarget)
|
||||
ParticleManager:SetParticleControl(
|
||||
self.nChainParticleFXIndex,
|
||||
2,
|
||||
Vector(hookSpeed, hookDistance, hookWidth)
|
||||
)
|
||||
ParticleManager:SetParticleControl(self.nChainParticleFXIndex, 3, vKillswitch)
|
||||
ParticleManager:SetParticleControl(
|
||||
self.nChainParticleFXIndex,
|
||||
4,
|
||||
Vector(1, 0, 0)
|
||||
)
|
||||
ParticleManager:SetParticleControl(
|
||||
self.nChainParticleFXIndex,
|
||||
5,
|
||||
Vector(0, 0, 0)
|
||||
)
|
||||
if hook then
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
self.nChainParticleFXIndex,
|
||||
7,
|
||||
hook,
|
||||
PATTACH_CUSTOMORIGIN,
|
||||
nil,
|
||||
hook:GetOrigin(),
|
||||
true
|
||||
)
|
||||
end
|
||||
ProjectileManager:CreateLinearProjectile({
|
||||
Ability = self,
|
||||
vSpawnOrigin = casterPoint,
|
||||
vVelocity = vDirection:Normalized() * hookSpeed,
|
||||
fDistance = hookDistance,
|
||||
fStartRadius = hookWidth,
|
||||
fEndRadius = hookWidth,
|
||||
Source = caster,
|
||||
iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY,
|
||||
iUnitTargetType = bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
|
||||
iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES
|
||||
})
|
||||
self.bRetracting = false
|
||||
____exports.modifier_item_fishing_rod_caster_root:apply(hero, hero, self, {})
|
||||
self:SetActivated(false)
|
||||
end
|
||||
function item_fishing_rod.prototype.OnProjectileHit(self, target, location)
|
||||
local caster = self:GetCaster()
|
||||
local attachName = getMeathookAttachName(nil, caster)
|
||||
if target == caster then
|
||||
return false
|
||||
end
|
||||
if self.bRetracting == false then
|
||||
if target then
|
||||
local isFish = __TS__ArrayIncludes(
|
||||
FISH_UNIT_NAMES,
|
||||
target:GetUnitName()
|
||||
)
|
||||
EmitSoundOn("Hero_Pudge.AttackHookImpact", target)
|
||||
if not isFish then
|
||||
local damage = self:GetAbilityDamage() + self:GetCaster():GetAverageTrueAttackDamage(caster)
|
||||
ApplyDamage({
|
||||
victim = target,
|
||||
attacker = caster,
|
||||
damage = damage,
|
||||
damage_type = self:GetAbilityDamageType(),
|
||||
ability = self
|
||||
})
|
||||
end
|
||||
local nFXIndex = ParticleManager:CreateParticle("particles/econ/items/pudge/pudge_ti6_immortal/pudge_meathook_impact_ti6.vpcf", PATTACH_CUSTOMORIGIN, target)
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
nFXIndex,
|
||||
0,
|
||||
target,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
caster:GetOrigin(),
|
||||
true
|
||||
)
|
||||
AddFOWViewer(
|
||||
caster:GetTeamNumber(),
|
||||
target:GetOrigin(),
|
||||
self:GetSpecialValueFor("vision_radius"),
|
||||
self:GetSpecialValueFor("vision_duration"),
|
||||
false
|
||||
)
|
||||
target:InterruptChannel()
|
||||
self.hookedVictimEntIndex = target:entindex()
|
||||
____exports.modifier_item_fishing_rod_hook_pull:apply(target, caster, self, {})
|
||||
if not isFish then
|
||||
____exports.modifier_item_fishing_rod_debuff:apply(
|
||||
target,
|
||||
caster,
|
||||
self,
|
||||
{duration = self:GetSpecialValueFor("duration")}
|
||||
)
|
||||
end
|
||||
end
|
||||
local flPad = caster:GetPaddedCollisionRadius()
|
||||
local vHookPos = self.vTargetPosition
|
||||
if target then
|
||||
vHookPos = target:GetOrigin()
|
||||
flPad = flPad + target:GetPaddedCollisionRadius()
|
||||
end
|
||||
local vVelocity = self.vStartPosition - vHookPos
|
||||
vVelocity.z = 0
|
||||
local flDistance = vVelocity:Length2D() - flPad
|
||||
vVelocity = vVelocity:Normalized() * self:GetSpecialValueFor("hook_speed")
|
||||
ProjectileManager:CreateLinearProjectile({
|
||||
Ability = self,
|
||||
vSpawnOrigin = vHookPos,
|
||||
vVelocity = vVelocity,
|
||||
fDistance = flDistance,
|
||||
Source = caster
|
||||
})
|
||||
if target then
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
self.nChainParticleFXIndex,
|
||||
1,
|
||||
caster,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
attachName,
|
||||
target:GetOrigin() + self.vHookOffset,
|
||||
true
|
||||
)
|
||||
else
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
self.nChainParticleFXIndex,
|
||||
1,
|
||||
caster,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
attachName,
|
||||
caster:GetOrigin() + self.vHookOffset,
|
||||
true
|
||||
)
|
||||
end
|
||||
StopSoundOn("Hero_Pudge.AttackHookExtend", caster)
|
||||
EmitSoundOn("Hero_Pudge.AttackHookRetract", caster)
|
||||
if caster:IsAlive() then
|
||||
caster:FadeGesture(ACT_DOTA_ATTACK)
|
||||
caster:StartGesture(ACT_DOTA_ATTACK)
|
||||
end
|
||||
local casterAny = caster
|
||||
local ____opt_12 = casterAny.SetRageTimeIncrease
|
||||
if ____opt_12 ~= nil then
|
||||
____opt_12(casterAny)
|
||||
end
|
||||
self.bRetracting = true
|
||||
else
|
||||
local caughtEntIndex = self.hookedVictimEntIndex
|
||||
self:clearHookedVictimPull()
|
||||
self:releaseCasterMovementLock(caster)
|
||||
self:trySpawnFishCatchReward(caster, caughtEntIndex)
|
||||
local ____opt_14 = caster.clothes
|
||||
local w = ____opt_14 and ____opt_14.weapon
|
||||
if not not w then
|
||||
w:RemoveEffects(EF_NODRAW)
|
||||
end
|
||||
ParticleManager:DestroyParticle(self.nChainParticleFXIndex, true)
|
||||
self:SetActivated(true)
|
||||
EmitSoundOn("Hero_Pudge.AttackHookRetractStop", caster)
|
||||
end
|
||||
return true
|
||||
end
|
||||
item_fishing_rod = __TS__Decorate(
|
||||
item_fishing_rod,
|
||||
item_fishing_rod,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_fishing_rod"}
|
||||
)
|
||||
____exports.item_fishing_rod = item_fishing_rod
|
||||
--- Кастер стоит на месте, пока крюк не вернётся (откат цепи завершён)
|
||||
____exports.modifier_item_fishing_rod_caster_root = __TS__Class()
|
||||
local modifier_item_fishing_rod_caster_root = ____exports.modifier_item_fishing_rod_caster_root
|
||||
modifier_item_fishing_rod_caster_root.name = "modifier_item_fishing_rod_caster_root"
|
||||
modifier_item_fishing_rod_caster_root.____file_path = "scripts/vscripts/items/default_items/item_fishing_rod.lua"
|
||||
__TS__ClassExtends(modifier_item_fishing_rod_caster_root, BaseModifier)
|
||||
function modifier_item_fishing_rod_caster_root.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_fishing_rod_caster_root.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_fishing_rod_caster_root.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_fishing_rod_caster_root.prototype.RemoveOnDeath(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_fishing_rod_caster_root.prototype.CheckState(self)
|
||||
return {[MODIFIER_STATE_ROOTED] = true, [MODIFIER_STATE_SILENCED] = true}
|
||||
end
|
||||
modifier_item_fishing_rod_caster_root = __TS__Decorate(
|
||||
modifier_item_fishing_rod_caster_root,
|
||||
modifier_item_fishing_rod_caster_root,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_fishing_rod_caster_root"}
|
||||
)
|
||||
____exports.modifier_item_fishing_rod_caster_root = modifier_item_fishing_rod_caster_root
|
||||
--- Притягивание к кастеру на скорости hook_speed (синхронно с откатом цепи)
|
||||
____exports.modifier_item_fishing_rod_hook_pull = __TS__Class()
|
||||
local modifier_item_fishing_rod_hook_pull = ____exports.modifier_item_fishing_rod_hook_pull
|
||||
modifier_item_fishing_rod_hook_pull.name = "modifier_item_fishing_rod_hook_pull"
|
||||
modifier_item_fishing_rod_hook_pull.____file_path = "scripts/vscripts/items/default_items/item_fishing_rod.lua"
|
||||
__TS__ClassExtends(modifier_item_fishing_rod_hook_pull, BaseModifier)
|
||||
function modifier_item_fishing_rod_hook_pull.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.thinkInterval = 0.03
|
||||
end
|
||||
function modifier_item_fishing_rod_hook_pull.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_fishing_rod_hook_pull.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_fishing_rod_hook_pull.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_fishing_rod_hook_pull.prototype.CheckState(self)
|
||||
return {[MODIFIER_STATE_STUNNED] = true}
|
||||
end
|
||||
function modifier_item_fishing_rod_hook_pull.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
self:StartIntervalThink(self.thinkInterval)
|
||||
end
|
||||
function modifier_item_fishing_rod_hook_pull.prototype.OnIntervalThink(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local parent = self:GetParent()
|
||||
if not caster or not caster:IsAlive() or not parent or not parent:IsAlive() then
|
||||
self:Destroy()
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
local speed = ability and ability:GetSpecialValueFor("hook_speed") or 1600
|
||||
local step = speed * self.thinkInterval
|
||||
local pos = parent:GetAbsOrigin()
|
||||
local casterPos = caster:GetAbsOrigin()
|
||||
local flatDelta = Vector(casterPos.x - pos.x, casterPos.y - pos.y, 0)
|
||||
local dist2d = flatDelta:Length2D()
|
||||
local stopDist = caster:GetPaddedCollisionRadius() + parent:GetPaddedCollisionRadius() + 32
|
||||
if dist2d <= stopDist then
|
||||
FindClearSpaceForUnit(
|
||||
parent,
|
||||
caster:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
self:Destroy()
|
||||
return
|
||||
end
|
||||
local dir = flatDelta:Normalized()
|
||||
local move = math.min(step, dist2d)
|
||||
local newPos = Vector(pos.x + dir.x * move, pos.y + dir.y * move, pos.z)
|
||||
parent:SetAbsOrigin(GetGroundPosition(newPos, nil))
|
||||
end
|
||||
function modifier_item_fishing_rod_hook_pull.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if parent and IsValidEntity(parent) and parent:IsAlive() then
|
||||
FindClearSpaceForUnit(
|
||||
parent,
|
||||
parent:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
end
|
||||
end
|
||||
modifier_item_fishing_rod_hook_pull = __TS__Decorate(
|
||||
modifier_item_fishing_rod_hook_pull,
|
||||
modifier_item_fishing_rod_hook_pull,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_fishing_rod_hook_pull"}
|
||||
)
|
||||
____exports.modifier_item_fishing_rod_hook_pull = modifier_item_fishing_rod_hook_pull
|
||||
____exports.modifier_item_fishing_rod_debuff = __TS__Class()
|
||||
local modifier_item_fishing_rod_debuff = ____exports.modifier_item_fishing_rod_debuff
|
||||
modifier_item_fishing_rod_debuff.name = "modifier_item_fishing_rod_debuff"
|
||||
modifier_item_fishing_rod_debuff.____file_path = "scripts/vscripts/items/default_items/item_fishing_rod.lua"
|
||||
__TS__ClassExtends(modifier_item_fishing_rod_debuff, BaseModifier)
|
||||
function modifier_item_fishing_rod_debuff.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.slow_movespeed = 0
|
||||
self.damage_per_tick = 0
|
||||
end
|
||||
function modifier_item_fishing_rod_debuff.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_fishing_rod_debuff.prototype.GetEffectName(self)
|
||||
return "particles/units/heroes/hero_bloodseeker/bloodseeker_rupture.vpcf"
|
||||
end
|
||||
function modifier_item_fishing_rod_debuff.prototype.OnCreated(self, params)
|
||||
local ability = self:GetAbility()
|
||||
self.slow_movespeed = ability:GetSpecialValueFor("slow_movespeed")
|
||||
self.damage_per_tick = ability:GetSpecialValueFor("damage_per_tick")
|
||||
self:StartIntervalThink(ability:GetSpecialValueFor("tick"))
|
||||
end
|
||||
function modifier_item_fishing_rod_debuff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_fishing_rod_debuff.prototype.OnIntervalThink(self)
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
ApplyDamage({
|
||||
victim = self:GetParent(),
|
||||
attacker = self:GetCaster(),
|
||||
damage_type = ability:GetAbilityDamageType(),
|
||||
damage = self.damage_per_tick,
|
||||
ability = ability
|
||||
})
|
||||
end
|
||||
function modifier_item_fishing_rod_debuff.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return self.slow_movespeed
|
||||
end
|
||||
modifier_item_fishing_rod_debuff = __TS__Decorate(
|
||||
modifier_item_fishing_rod_debuff,
|
||||
modifier_item_fishing_rod_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_fishing_rod_debuff"}
|
||||
)
|
||||
____exports.modifier_item_fishing_rod_debuff = modifier_item_fishing_rod_debuff
|
||||
____exports.modifier_blind_debuff = __TS__Class()
|
||||
local modifier_blind_debuff = ____exports.modifier_blind_debuff
|
||||
modifier_blind_debuff.name = "modifier_blind_debuff"
|
||||
modifier_blind_debuff.____file_path = "scripts/vscripts/items/default_items/item_fishing_rod.lua"
|
||||
__TS__ClassExtends(modifier_blind_debuff, BaseModifier)
|
||||
function modifier_blind_debuff.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_blind_debuff.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_blind_debuff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_blind_debuff.prototype.OnCreated(self, params)
|
||||
local particle = ParticleManager:CreateParticleForPlayer(
|
||||
"particles/fish_screen_effect.vpcf",
|
||||
PATTACH_ABSORIGIN_FOLLOW,
|
||||
self:GetCaster(),
|
||||
self:GetCaster():GetPlayerOwner()
|
||||
)
|
||||
self.particleId = particle
|
||||
end
|
||||
function modifier_blind_debuff.prototype.OnRefresh(self, params)
|
||||
if self.particleId then
|
||||
ParticleManager:DestroyParticle(self.particleId, false)
|
||||
end
|
||||
self:OnCreated(params)
|
||||
end
|
||||
function modifier_blind_debuff.prototype.OnDestroy(self)
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
if self.particleId then
|
||||
ParticleManager:DestroyParticle(self.particleId, false)
|
||||
end
|
||||
end
|
||||
function modifier_blind_debuff.prototype.GetTexture(self)
|
||||
return "templar_assassin_trap"
|
||||
end
|
||||
modifier_blind_debuff = __TS__Decorate(
|
||||
modifier_blind_debuff,
|
||||
modifier_blind_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_blind_debuff"}
|
||||
)
|
||||
____exports.modifier_blind_debuff = modifier_blind_debuff
|
||||
____exports.modifier_bad_cast_debuff = __TS__Class()
|
||||
local modifier_bad_cast_debuff = ____exports.modifier_bad_cast_debuff
|
||||
modifier_bad_cast_debuff.name = "modifier_bad_cast_debuff"
|
||||
modifier_bad_cast_debuff.____file_path = "scripts/vscripts/items/default_items/item_fishing_rod.lua"
|
||||
__TS__ClassExtends(modifier_bad_cast_debuff, BaseModifier)
|
||||
function modifier_bad_cast_debuff.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_bad_cast_debuff.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_bad_cast_debuff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_bad_cast_debuff.prototype.GetTexture(self)
|
||||
return "templar_assassin_trap"
|
||||
end
|
||||
modifier_bad_cast_debuff = __TS__Decorate(
|
||||
modifier_bad_cast_debuff,
|
||||
modifier_bad_cast_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_bad_cast_debuff"}
|
||||
)
|
||||
____exports.modifier_bad_cast_debuff = modifier_bad_cast_debuff
|
||||
return ____exports
|
||||
@@ -0,0 +1,59 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_ice_spine = __TS__Class()
|
||||
local item_ice_spine = ____exports.item_ice_spine
|
||||
item_ice_spine.name = "item_ice_spine"
|
||||
item_ice_spine.____file_path = "scripts/vscripts/items/default_items/item_ice_spine.lua"
|
||||
__TS__ClassExtends(item_ice_spine, BaseItem)
|
||||
function item_ice_spine.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_ice_spine"
|
||||
end
|
||||
item_ice_spine = __TS__Decorate(
|
||||
item_ice_spine,
|
||||
item_ice_spine,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_ice_spine"}
|
||||
)
|
||||
____exports.item_ice_spine = item_ice_spine
|
||||
____exports.modifier_ice_spine = __TS__Class()
|
||||
local modifier_ice_spine = ____exports.modifier_ice_spine
|
||||
modifier_ice_spine.name = "modifier_ice_spine"
|
||||
modifier_ice_spine.____file_path = "scripts/vscripts/items/default_items/item_ice_spine.lua"
|
||||
__TS__ClassExtends(modifier_ice_spine, BaseModifier)
|
||||
function modifier_ice_spine.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_ice_spine.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_ice_spine.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE, MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE, MODIFIER_PROPERTY_HEAL_AMPLIFY_PERCENTAGE_SOURCE, MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT}
|
||||
end
|
||||
function modifier_ice_spine.prototype.GetModifierSpellAmplify_Percentage(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("spell_amplify")
|
||||
end
|
||||
function modifier_ice_spine.prototype.GetModifierHealAmplify_PercentageSource(self)
|
||||
return self:GetAbility():GetSpecialValueFor("heal_amplify")
|
||||
end
|
||||
function modifier_ice_spine.prototype.GetModifierMoveSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("movespeed_const")
|
||||
end
|
||||
function modifier_ice_spine.prototype.GetModifierIncomingDamage_Percentage(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("incoming_dmg_pct")
|
||||
end
|
||||
modifier_ice_spine = __TS__Decorate(
|
||||
modifier_ice_spine,
|
||||
modifier_ice_spine,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_ice_spine"}
|
||||
)
|
||||
____exports.modifier_ice_spine = modifier_ice_spine
|
||||
return ____exports
|
||||
@@ -0,0 +1,70 @@
|
||||
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 ____vampirism = require("utils.vampirism")
|
||||
local addPhysicalVampirism = ____vampirism.addPhysicalVampirism
|
||||
local reducePhysicalVampirism = ____vampirism.reducePhysicalVampirism
|
||||
____exports.item_lifesteal_custom = __TS__Class()
|
||||
local item_lifesteal_custom = ____exports.item_lifesteal_custom
|
||||
item_lifesteal_custom.name = "item_lifesteal_custom"
|
||||
item_lifesteal_custom.____file_path = "scripts/vscripts/items/default_items/item_lifesteal_custom.lua"
|
||||
__TS__ClassExtends(item_lifesteal_custom, BaseAbility)
|
||||
function item_lifesteal_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_lifesteal_custom"
|
||||
end
|
||||
item_lifesteal_custom = __TS__Decorate(
|
||||
item_lifesteal_custom,
|
||||
item_lifesteal_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_lifesteal_custom"}
|
||||
)
|
||||
____exports.item_lifesteal_custom = item_lifesteal_custom
|
||||
____exports.modifier_item_lifesteal_custom = __TS__Class()
|
||||
local modifier_item_lifesteal_custom = ____exports.modifier_item_lifesteal_custom
|
||||
modifier_item_lifesteal_custom.name = "modifier_item_lifesteal_custom"
|
||||
modifier_item_lifesteal_custom.____file_path = "scripts/vscripts/items/default_items/item_lifesteal_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_lifesteal_custom, BaseModifier)
|
||||
function modifier_item_lifesteal_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_lifesteal_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_lifesteal_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_lifesteal_custom.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
local lifesteal = self:GetAbility():GetSpecialValueFor("lifesteal")
|
||||
if lifesteal > 0 then
|
||||
addPhysicalVampirism(nil, hero, lifesteal)
|
||||
end
|
||||
end
|
||||
function modifier_item_lifesteal_custom.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
local lifesteal = self:GetAbility():GetSpecialValueFor("lifesteal")
|
||||
if lifesteal > 0 then
|
||||
reducePhysicalVampirism(nil, hero, lifesteal)
|
||||
end
|
||||
end
|
||||
modifier_item_lifesteal_custom = __TS__Decorate(
|
||||
modifier_item_lifesteal_custom,
|
||||
modifier_item_lifesteal_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_lifesteal_custom"}
|
||||
)
|
||||
____exports.modifier_item_lifesteal_custom = modifier_item_lifesteal_custom
|
||||
return ____exports
|
||||
@@ -0,0 +1,223 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_magic_rapier = __TS__Class()
|
||||
local item_magic_rapier = ____exports.item_magic_rapier
|
||||
item_magic_rapier.name = "item_magic_rapier"
|
||||
item_magic_rapier.____file_path = "scripts/vscripts/items/default_items/item_magic_rapier.lua"
|
||||
__TS__ClassExtends(item_magic_rapier, BaseItem)
|
||||
function item_magic_rapier.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_magic_rapier"
|
||||
end
|
||||
item_magic_rapier = __TS__Decorate(
|
||||
item_magic_rapier,
|
||||
item_magic_rapier,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_magic_rapier"}
|
||||
)
|
||||
____exports.item_magic_rapier = item_magic_rapier
|
||||
____exports.modifier_magic_rapier = __TS__Class()
|
||||
local modifier_magic_rapier = ____exports.modifier_magic_rapier
|
||||
modifier_magic_rapier.name = "modifier_magic_rapier"
|
||||
modifier_magic_rapier.____file_path = "scripts/vscripts/items/default_items/item_magic_rapier.lua"
|
||||
__TS__ClassExtends(modifier_magic_rapier, BaseModifier)
|
||||
function modifier_magic_rapier.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.Lock = false
|
||||
end
|
||||
function modifier_magic_rapier.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_magic_rapier.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_magic_rapier.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_magic_rapier.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE,
|
||||
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_MANA_BONUS,
|
||||
MODIFIER_PROPERTY_FORCE_MAX_MANA,
|
||||
MODIFIER_EVENT_ON_TAKEDAMAGE
|
||||
}
|
||||
end
|
||||
function modifier_magic_rapier.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_intellect")
|
||||
end
|
||||
function modifier_magic_rapier.prototype.GetModifierSpellAmplify_Percentage(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_spell_amplify")
|
||||
end
|
||||
function modifier_magic_rapier.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_strength")
|
||||
end
|
||||
function modifier_magic_rapier.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_agility")
|
||||
end
|
||||
function modifier_magic_rapier.prototype.GetModifierConstantManaRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana_regen")
|
||||
end
|
||||
function modifier_magic_rapier.prototype.GetModifierManaBonus(self)
|
||||
if not IsServer() then
|
||||
return 0
|
||||
end
|
||||
if self.Lock then
|
||||
return 0
|
||||
end
|
||||
self.Lock = true
|
||||
local mana = self:GetParent():GetMaxMana()
|
||||
self.Lock = false
|
||||
local bonus = self:GetAbility():GetSpecialValueFor("bonus_mana_pct") * mana / 100
|
||||
return bonus
|
||||
end
|
||||
function modifier_magic_rapier.prototype.OnTakeDamage(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetParent()
|
||||
local rapierAbility = self:GetAbility()
|
||||
if not caster:IsRealHero() or not rapierAbility then
|
||||
return
|
||||
end
|
||||
local target = event.unit
|
||||
if not target then
|
||||
return
|
||||
end
|
||||
if target:GetTeamNumber() == caster:GetTeamNumber() then
|
||||
return
|
||||
end
|
||||
if event.attacker ~= caster then
|
||||
return
|
||||
end
|
||||
if not event.inflictor then
|
||||
return
|
||||
end
|
||||
if event.inflictor == rapierAbility then
|
||||
return
|
||||
end
|
||||
if event.damage <= 0 then
|
||||
return
|
||||
end
|
||||
if event.damage <= 300 then
|
||||
return
|
||||
end
|
||||
local bonusDamage = caster:GetMana() * (rapierAbility:GetSpecialValueFor("damage_per_cast_hand") / 100) + rapierAbility:GetSpecialValueFor("damage_per_cast")
|
||||
local spellAmpFrac = math.max(
|
||||
0,
|
||||
caster:GetSpellAmplification(false)
|
||||
)
|
||||
local damageToApply = bonusDamage / math.max(0.000001, 1 + spellAmpFrac)
|
||||
SendOverheadEventMessage(
|
||||
nil,
|
||||
OVERHEAD_ALERT_BONUS_SPELL_DAMAGE,
|
||||
target,
|
||||
math.floor(bonusDamage),
|
||||
nil
|
||||
)
|
||||
rapierAbility:UseResources(true, false, false, true)
|
||||
ApplyDamage({
|
||||
victim = target,
|
||||
attacker = caster,
|
||||
damage = damageToApply,
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NO_SPELL_AMPLIFICATION,
|
||||
ability = nil
|
||||
})
|
||||
target:AddNewModifier(
|
||||
caster,
|
||||
rapierAbility,
|
||||
"modifier_magic_rapier_debuff",
|
||||
{duration = rapierAbility:GetSpecialValueFor("slow_duration")}
|
||||
)
|
||||
local particle = ParticleManager:CreateParticle("particles/items_fx/phylactery_target.vpcf", PATTACH_ABSORIGIN_FOLLOW, target)
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
particle,
|
||||
0,
|
||||
target,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
target:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
ParticleManager:ReleaseParticleIndex(particle)
|
||||
local particle_2 = ParticleManager:CreateParticle("particles/items_fx/phylactery.vpcf", PATTACH_ABSORIGIN_FOLLOW, caster)
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
particle_2,
|
||||
0,
|
||||
caster,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
caster:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
particle_2,
|
||||
1,
|
||||
target,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
target:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
ParticleManager:ReleaseParticleIndex(particle_2)
|
||||
target:EmitSound("Item.Phylactery.Target")
|
||||
end
|
||||
modifier_magic_rapier = __TS__Decorate(
|
||||
modifier_magic_rapier,
|
||||
modifier_magic_rapier,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_magic_rapier"}
|
||||
)
|
||||
____exports.modifier_magic_rapier = modifier_magic_rapier
|
||||
____exports.modifier_magic_rapier_debuff = __TS__Class()
|
||||
local modifier_magic_rapier_debuff = ____exports.modifier_magic_rapier_debuff
|
||||
modifier_magic_rapier_debuff.name = "modifier_magic_rapier_debuff"
|
||||
modifier_magic_rapier_debuff.____file_path = "scripts/vscripts/items/default_items/item_magic_rapier.lua"
|
||||
__TS__ClassExtends(modifier_magic_rapier_debuff, BaseModifier)
|
||||
function modifier_magic_rapier_debuff.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS}
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.CheckState(self)
|
||||
local state = {[MODIFIER_STATE_PASSIVES_DISABLED] = true}
|
||||
return state
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return -self:GetAbility():GetSpecialValueFor("slow_pct")
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.GetModifierMagicalResistanceBonus(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("magical_resist_reduction")
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.GetTexture(self)
|
||||
return "default_items/magicpier"
|
||||
end
|
||||
modifier_magic_rapier_debuff = __TS__Decorate(
|
||||
modifier_magic_rapier_debuff,
|
||||
modifier_magic_rapier_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_magic_rapier_debuff"}
|
||||
)
|
||||
____exports.modifier_magic_rapier_debuff = modifier_magic_rapier_debuff
|
||||
return ____exports
|
||||
@@ -0,0 +1,93 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_magic_stone = __TS__Class()
|
||||
local item_magic_stone = ____exports.item_magic_stone
|
||||
item_magic_stone.name = "item_magic_stone"
|
||||
item_magic_stone.____file_path = "scripts/vscripts/items/default_items/item_magic_stone.lua"
|
||||
__TS__ClassExtends(item_magic_stone, BaseItem)
|
||||
function item_magic_stone.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_magic_stone"
|
||||
end
|
||||
item_magic_stone = __TS__Decorate(
|
||||
item_magic_stone,
|
||||
item_magic_stone,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_magic_stone"}
|
||||
)
|
||||
____exports.item_magic_stone = item_magic_stone
|
||||
____exports.modifier_magic_stone = __TS__Class()
|
||||
local modifier_magic_stone = ____exports.modifier_magic_stone
|
||||
modifier_magic_stone.name = "modifier_magic_stone"
|
||||
modifier_magic_stone.____file_path = "scripts/vscripts/items/default_items/item_magic_stone.lua"
|
||||
__TS__ClassExtends(modifier_magic_stone, BaseModifier)
|
||||
function modifier_magic_stone.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.Lock = false
|
||||
end
|
||||
function modifier_magic_stone.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_magic_stone.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_magic_stone.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_magic_stone.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_magic_stone.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE,
|
||||
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_MANA_BONUS,
|
||||
MODIFIER_PROPERTY_FORCE_MAX_MANA
|
||||
}
|
||||
end
|
||||
function modifier_magic_stone.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_intellect")
|
||||
end
|
||||
function modifier_magic_stone.prototype.GetModifierSpellAmplify_Percentage(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_spell_amplify")
|
||||
end
|
||||
function modifier_magic_stone.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_strength")
|
||||
end
|
||||
function modifier_magic_stone.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_agility")
|
||||
end
|
||||
function modifier_magic_stone.prototype.GetModifierConstantManaRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana_regen")
|
||||
end
|
||||
function modifier_magic_stone.prototype.GetModifierManaBonus(self)
|
||||
if not IsServer() then
|
||||
return 0
|
||||
end
|
||||
if self.Lock then
|
||||
return 0
|
||||
end
|
||||
self.Lock = true
|
||||
local mana = self:GetParent():GetMaxMana()
|
||||
self.Lock = false
|
||||
local bonus = self:GetAbility():GetSpecialValueFor("bonus_mana_pct") * mana / 100
|
||||
return bonus
|
||||
end
|
||||
modifier_magic_stone = __TS__Decorate(
|
||||
modifier_magic_stone,
|
||||
modifier_magic_stone,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_magic_stone"}
|
||||
)
|
||||
____exports.modifier_magic_stone = modifier_magic_stone
|
||||
return ____exports
|
||||
@@ -0,0 +1,148 @@
|
||||
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 ____ability_stacking_spell_crit = require("abilities.modifiers.ability_stacking_spell_crit")
|
||||
local modifier_stacking_spell_crit = ____ability_stacking_spell_crit.modifier_stacking_spell_crit
|
||||
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
|
||||
local BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____vampirism = require("utils.vampirism")
|
||||
local addMagicalVampirism = ____vampirism.addMagicalVampirism
|
||||
local reduceMagicalVampirism = ____vampirism.reduceMagicalVampirism
|
||||
____exports.item_magical_crit = __TS__Class()
|
||||
local item_magical_crit = ____exports.item_magical_crit
|
||||
item_magical_crit.name = "item_magical_crit"
|
||||
item_magical_crit.____file_path = "scripts/vscripts/items/default_items/item_magical_crit.lua"
|
||||
__TS__ClassExtends(item_magical_crit, BaseItem)
|
||||
function item_magical_crit.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_magical_crit"
|
||||
end
|
||||
item_magical_crit = __TS__Decorate(
|
||||
item_magical_crit,
|
||||
item_magical_crit,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_magical_crit"}
|
||||
)
|
||||
____exports.item_magical_crit = item_magical_crit
|
||||
____exports.modifier_item_magical_crit = __TS__Class()
|
||||
local modifier_item_magical_crit = ____exports.modifier_item_magical_crit
|
||||
modifier_item_magical_crit.name = "modifier_item_magical_crit"
|
||||
modifier_item_magical_crit.____file_path = "scripts/vscripts/items/default_items/item_magical_crit.lua"
|
||||
__TS__ClassExtends(modifier_item_magical_crit, BaseModifier)
|
||||
function modifier_item_magical_crit.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.manaLock = false
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE,
|
||||
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_MANA_BONUS,
|
||||
MODIFIER_PROPERTY_FORCE_MAX_MANA
|
||||
}
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.getValue(self, name)
|
||||
local ____opt_0 = self:GetAbility()
|
||||
return ____opt_0 and ____opt_0:GetSpecialValueFor(name) or 0
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.GetModifierSpellAmplify_Percentage(self)
|
||||
return self:getValue("bonus_spell_amplify")
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self:getValue("bonus_intellect")
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:getValue("bonus_strength")
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:getValue("bonus_agility")
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.GetModifierConstantManaRegen(self)
|
||||
return self:getValue("bonus_mana_regen")
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.GetModifierManaBonus(self)
|
||||
if not IsServer() then
|
||||
return 0
|
||||
end
|
||||
if self.manaLock then
|
||||
return 0
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if not parent:IsHero() then
|
||||
return 0
|
||||
end
|
||||
self.manaLock = true
|
||||
local maxMana = parent:GetMaxMana()
|
||||
self.manaLock = false
|
||||
return self:getValue("bonus_mana_pct") * maxMana / 100
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return
|
||||
end
|
||||
local vamp = self:getValue("magical_vampirism")
|
||||
if vamp > 0 and parent:IsRealHero() then
|
||||
addMagicalVampirism(nil, parent, vamp)
|
||||
end
|
||||
local stackingSpellCrit = modifier_stacking_spell_crit:GetForUnit(parent)
|
||||
if stackingSpellCrit then
|
||||
stackingSpellCrit:AddCustomCrit(
|
||||
self:getValue("spell_crit_chance"),
|
||||
self:getValue("spell_crit_mult"),
|
||||
"item_magical_crit",
|
||||
ability
|
||||
)
|
||||
end
|
||||
end
|
||||
function modifier_item_magical_crit.prototype.OnDestroy(self)
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if not parent or not IsValidEntity(parent) then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if ability and parent:IsRealHero() then
|
||||
local vamp = ability:GetSpecialValueFor("magical_vampirism")
|
||||
if vamp > 0 then
|
||||
reduceMagicalVampirism(nil, parent, vamp)
|
||||
end
|
||||
end
|
||||
local stackingSpellCrit = modifier_stacking_spell_crit:GetForUnit(parent)
|
||||
if stackingSpellCrit and ability then
|
||||
stackingSpellCrit:RemoveCrit("item_magical_crit", ability)
|
||||
end
|
||||
end
|
||||
modifier_item_magical_crit = __TS__Decorate(
|
||||
modifier_item_magical_crit,
|
||||
modifier_item_magical_crit,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_magical_crit"}
|
||||
)
|
||||
____exports.modifier_item_magical_crit = modifier_item_magical_crit
|
||||
return ____exports
|
||||
@@ -0,0 +1,223 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_magical_divine_rapier = __TS__Class()
|
||||
local item_magical_divine_rapier = ____exports.item_magical_divine_rapier
|
||||
item_magical_divine_rapier.name = "item_magical_divine_rapier"
|
||||
item_magical_divine_rapier.____file_path = "scripts/vscripts/items/default_items/item_magical_divine_rapier.lua"
|
||||
__TS__ClassExtends(item_magical_divine_rapier, BaseItem)
|
||||
function item_magical_divine_rapier.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_magical_divine_rapier"
|
||||
end
|
||||
item_magical_divine_rapier = __TS__Decorate(
|
||||
item_magical_divine_rapier,
|
||||
item_magical_divine_rapier,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_magical_divine_rapier"}
|
||||
)
|
||||
____exports.item_magical_divine_rapier = item_magical_divine_rapier
|
||||
____exports.modifier_magical_divine_rapier = __TS__Class()
|
||||
local modifier_magical_divine_rapier = ____exports.modifier_magical_divine_rapier
|
||||
modifier_magical_divine_rapier.name = "modifier_magical_divine_rapier"
|
||||
modifier_magical_divine_rapier.____file_path = "scripts/vscripts/items/default_items/item_magical_divine_rapier.lua"
|
||||
__TS__ClassExtends(modifier_magical_divine_rapier, BaseModifier)
|
||||
function modifier_magical_divine_rapier.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.Lock = false
|
||||
end
|
||||
function modifier_magical_divine_rapier.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_magical_divine_rapier.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_magical_divine_rapier.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_magical_divine_rapier.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE,
|
||||
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_MANA_BONUS,
|
||||
MODIFIER_PROPERTY_FORCE_MAX_MANA,
|
||||
MODIFIER_EVENT_ON_TAKEDAMAGE
|
||||
}
|
||||
end
|
||||
function modifier_magical_divine_rapier.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_intellect")
|
||||
end
|
||||
function modifier_magical_divine_rapier.prototype.GetModifierSpellAmplify_Percentage(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_spell_amplify")
|
||||
end
|
||||
function modifier_magical_divine_rapier.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_strength")
|
||||
end
|
||||
function modifier_magical_divine_rapier.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_agility")
|
||||
end
|
||||
function modifier_magical_divine_rapier.prototype.GetModifierConstantManaRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana_regen")
|
||||
end
|
||||
function modifier_magical_divine_rapier.prototype.GetModifierManaBonus(self)
|
||||
if not IsServer() then
|
||||
return 0
|
||||
end
|
||||
if self.Lock then
|
||||
return 0
|
||||
end
|
||||
self.Lock = true
|
||||
local mana = self:GetParent():GetMaxMana()
|
||||
self.Lock = false
|
||||
local bonus = self:GetAbility():GetSpecialValueFor("bonus_mana_pct") * mana / 100
|
||||
return bonus
|
||||
end
|
||||
function modifier_magical_divine_rapier.prototype.OnTakeDamage(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetParent()
|
||||
local rapierAbility = self:GetAbility()
|
||||
if not caster:IsRealHero() or not rapierAbility then
|
||||
return
|
||||
end
|
||||
local target = event.unit
|
||||
if not target then
|
||||
return
|
||||
end
|
||||
if target:GetTeamNumber() == caster:GetTeamNumber() then
|
||||
return
|
||||
end
|
||||
if event.attacker ~= caster then
|
||||
return
|
||||
end
|
||||
if not event.inflictor then
|
||||
return
|
||||
end
|
||||
if event.inflictor == rapierAbility then
|
||||
return
|
||||
end
|
||||
if event.damage <= 0 then
|
||||
return
|
||||
end
|
||||
if event.damage <= 300 then
|
||||
return
|
||||
end
|
||||
local bonusDamage = caster:GetMana() * (rapierAbility:GetSpecialValueFor("damage_per_cast_hand") / 100) + rapierAbility:GetSpecialValueFor("damage_per_cast")
|
||||
local spellAmpFrac = math.max(
|
||||
0,
|
||||
caster:GetSpellAmplification(false)
|
||||
)
|
||||
local damageToApply = bonusDamage / math.max(0.000001, 1 + spellAmpFrac)
|
||||
SendOverheadEventMessage(
|
||||
nil,
|
||||
OVERHEAD_ALERT_BONUS_SPELL_DAMAGE,
|
||||
target,
|
||||
math.floor(bonusDamage),
|
||||
nil
|
||||
)
|
||||
rapierAbility:UseResources(true, false, false, true)
|
||||
ApplyDamage({
|
||||
victim = target,
|
||||
attacker = caster,
|
||||
damage = damageToApply,
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NO_SPELL_AMPLIFICATION,
|
||||
ability = nil
|
||||
})
|
||||
target:AddNewModifier(
|
||||
caster,
|
||||
rapierAbility,
|
||||
"modifier_magic_rapier_debuff",
|
||||
{duration = rapierAbility:GetSpecialValueFor("slow_duration")}
|
||||
)
|
||||
local particle = ParticleManager:CreateParticle("particles/items_fx/phylactery_target.vpcf", PATTACH_ABSORIGIN_FOLLOW, target)
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
particle,
|
||||
0,
|
||||
target,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
target:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
ParticleManager:ReleaseParticleIndex(particle)
|
||||
local particle_2 = ParticleManager:CreateParticle("particles/items_fx/phylactery.vpcf", PATTACH_ABSORIGIN_FOLLOW, caster)
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
particle_2,
|
||||
0,
|
||||
caster,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
caster:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
particle_2,
|
||||
1,
|
||||
target,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
target:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
ParticleManager:ReleaseParticleIndex(particle_2)
|
||||
target:EmitSound("Item.Phylactery.Target")
|
||||
end
|
||||
modifier_magical_divine_rapier = __TS__Decorate(
|
||||
modifier_magical_divine_rapier,
|
||||
modifier_magical_divine_rapier,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_magical_divine_rapier"}
|
||||
)
|
||||
____exports.modifier_magical_divine_rapier = modifier_magical_divine_rapier
|
||||
____exports.modifier_magic_rapier_debuff = __TS__Class()
|
||||
local modifier_magic_rapier_debuff = ____exports.modifier_magic_rapier_debuff
|
||||
modifier_magic_rapier_debuff.name = "modifier_magic_rapier_debuff"
|
||||
modifier_magic_rapier_debuff.____file_path = "scripts/vscripts/items/default_items/item_magical_divine_rapier.lua"
|
||||
__TS__ClassExtends(modifier_magic_rapier_debuff, BaseModifier)
|
||||
function modifier_magic_rapier_debuff.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS}
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.CheckState(self)
|
||||
local state = {[MODIFIER_STATE_PASSIVES_DISABLED] = true}
|
||||
return state
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return -self:GetAbility():GetSpecialValueFor("slow_pct")
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.GetModifierMagicalResistanceBonus(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("magical_resist_reduction")
|
||||
end
|
||||
function modifier_magic_rapier_debuff.prototype.GetTexture(self)
|
||||
return "default_items/magicpier"
|
||||
end
|
||||
modifier_magic_rapier_debuff = __TS__Decorate(
|
||||
modifier_magic_rapier_debuff,
|
||||
modifier_magic_rapier_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_magic_rapier_debuff"}
|
||||
)
|
||||
____exports.modifier_magic_rapier_debuff = modifier_magic_rapier_debuff
|
||||
return ____exports
|
||||
@@ -0,0 +1,61 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
____exports.item_magical_quiver = __TS__Class()
|
||||
local item_magical_quiver = ____exports.item_magical_quiver
|
||||
item_magical_quiver.name = "item_magical_quiver"
|
||||
item_magical_quiver.____file_path = "scripts/vscripts/items/default_items/item_magical_quiver.lua"
|
||||
__TS__ClassExtends(item_magical_quiver, BaseItem)
|
||||
function item_magical_quiver.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_magical_quiver"
|
||||
end
|
||||
item_magical_quiver = __TS__Decorate(
|
||||
item_magical_quiver,
|
||||
item_magical_quiver,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_magical_quiver"}
|
||||
)
|
||||
____exports.item_magical_quiver = item_magical_quiver
|
||||
____exports.modifier_item_magical_quiver = __TS__Class()
|
||||
local modifier_item_magical_quiver = ____exports.modifier_item_magical_quiver
|
||||
modifier_item_magical_quiver.name = "modifier_item_magical_quiver"
|
||||
modifier_item_magical_quiver.____file_path = "scripts/vscripts/items/default_items/item_magical_quiver.lua"
|
||||
__TS__ClassExtends(modifier_item_magical_quiver, BaseModifier)
|
||||
function modifier_item_magical_quiver.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_magical_quiver.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_magical_quiver.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_magical_quiver.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
end
|
||||
function modifier_item_magical_quiver.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_MAGICAL}
|
||||
end
|
||||
function modifier_item_magical_quiver.prototype.GetModifierProcAttack_BonusDamage_Magical(self, event)
|
||||
if self:GetParent():IsIllusion() or not self:GetParent():IsRangedAttacker() then
|
||||
return 0
|
||||
end
|
||||
return self:GetAbility():GetSpecialValueFor("proc_damage_magical")
|
||||
end
|
||||
modifier_item_magical_quiver = __TS__Decorate(
|
||||
modifier_item_magical_quiver,
|
||||
modifier_item_magical_quiver,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_magical_quiver"}
|
||||
)
|
||||
____exports.modifier_item_magical_quiver = modifier_item_magical_quiver
|
||||
return ____exports
|
||||
@@ -0,0 +1,135 @@
|
||||
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 ____vampirism = require("utils.vampirism")
|
||||
local addPhysicalVampirism = ____vampirism.addPhysicalVampirism
|
||||
local reducePhysicalVampirism = ____vampirism.reducePhysicalVampirism
|
||||
____exports.item_mask_of_madness_custom = __TS__Class()
|
||||
local item_mask_of_madness_custom = ____exports.item_mask_of_madness_custom
|
||||
item_mask_of_madness_custom.name = "item_mask_of_madness_custom"
|
||||
item_mask_of_madness_custom.____file_path = "scripts/vscripts/items/default_items/item_mask_of_madness_custom.lua"
|
||||
__TS__ClassExtends(item_mask_of_madness_custom, BaseAbility)
|
||||
function item_mask_of_madness_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_mask_of_madness_custom"
|
||||
end
|
||||
function item_mask_of_madness_custom.prototype.OnSpellStart(self)
|
||||
self:GetCaster():AddNewModifier(
|
||||
self:GetCaster(),
|
||||
self,
|
||||
"modifier_item_mask_of_madness_custom_buff",
|
||||
{duration = self:GetSpecialValueFor("duration")}
|
||||
)
|
||||
end
|
||||
item_mask_of_madness_custom = __TS__Decorate(
|
||||
item_mask_of_madness_custom,
|
||||
item_mask_of_madness_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_mask_of_madness_custom"}
|
||||
)
|
||||
____exports.item_mask_of_madness_custom = item_mask_of_madness_custom
|
||||
____exports.modifier_item_mask_of_madness_custom = __TS__Class()
|
||||
local modifier_item_mask_of_madness_custom = ____exports.modifier_item_mask_of_madness_custom
|
||||
modifier_item_mask_of_madness_custom.name = "modifier_item_mask_of_madness_custom"
|
||||
modifier_item_mask_of_madness_custom.____file_path = "scripts/vscripts/items/default_items/item_mask_of_madness_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_mask_of_madness_custom, BaseModifier)
|
||||
function modifier_item_mask_of_madness_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE}
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
local lifesteal = self:GetAbility():GetSpecialValueFor("lifesteal")
|
||||
if lifesteal > 0 then
|
||||
addPhysicalVampirism(nil, hero, lifesteal)
|
||||
end
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
local lifesteal = self:GetAbility():GetSpecialValueFor("lifesteal")
|
||||
if lifesteal > 0 then
|
||||
reducePhysicalVampirism(nil, hero, lifesteal)
|
||||
end
|
||||
end
|
||||
modifier_item_mask_of_madness_custom = __TS__Decorate(
|
||||
modifier_item_mask_of_madness_custom,
|
||||
modifier_item_mask_of_madness_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_mask_of_madness_custom"}
|
||||
)
|
||||
____exports.modifier_item_mask_of_madness_custom = modifier_item_mask_of_madness_custom
|
||||
____exports.modifier_item_mask_of_madness_custom_buff = __TS__Class()
|
||||
local modifier_item_mask_of_madness_custom_buff = ____exports.modifier_item_mask_of_madness_custom_buff
|
||||
modifier_item_mask_of_madness_custom_buff.name = "modifier_item_mask_of_madness_custom_buff"
|
||||
modifier_item_mask_of_madness_custom_buff.____file_path = "scripts/vscripts/items/default_items/item_mask_of_madness_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_mask_of_madness_custom_buff, BaseModifier)
|
||||
function modifier_item_mask_of_madness_custom_buff.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.bonus_damage = 0
|
||||
self.bonus_attackspeed_active = 0
|
||||
self.armor_reduction_active = 0
|
||||
self.move_speed_active = 0
|
||||
self.duration = 0
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom_buff.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom_buff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom_buff.prototype.OnCreated(self)
|
||||
self.bonus_damage = self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
self.bonus_attackspeed_active = self:GetAbility():GetSpecialValueFor("bonus_attackspeed_active")
|
||||
self.armor_reduction_active = self:GetAbility():GetSpecialValueFor("armor_reduction_active")
|
||||
self.move_speed_active = self:GetAbility():GetSpecialValueFor("move_speed_active")
|
||||
self.duration = self:GetAbility():GetSpecialValueFor("duration")
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom_buff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom_buff.prototype.CheckState(self)
|
||||
return {[MODIFIER_STATE_SILENCED] = true}
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom_buff.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self.bonus_damage
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom_buff.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self.bonus_attackspeed_active
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom_buff.prototype.GetModifierPhysicalArmorBonus(self)
|
||||
return self.armor_reduction_active
|
||||
end
|
||||
function modifier_item_mask_of_madness_custom_buff.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return self.move_speed_active
|
||||
end
|
||||
modifier_item_mask_of_madness_custom_buff = __TS__Decorate(
|
||||
modifier_item_mask_of_madness_custom_buff,
|
||||
modifier_item_mask_of_madness_custom_buff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_mask_of_madness_custom_buff"}
|
||||
)
|
||||
____exports.modifier_item_mask_of_madness_custom_buff = modifier_item_mask_of_madness_custom_buff
|
||||
return ____exports
|
||||
@@ -0,0 +1,122 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_mega_fury = __TS__Class()
|
||||
local item_mega_fury = ____exports.item_mega_fury
|
||||
item_mega_fury.name = "item_mega_fury"
|
||||
item_mega_fury.____file_path = "scripts/vscripts/items/default_items/item_mega_fury.lua"
|
||||
__TS__ClassExtends(item_mega_fury, BaseItem)
|
||||
function item_mega_fury.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_mega_fury"
|
||||
end
|
||||
function item_mega_fury.prototype.GetAOERadius(self)
|
||||
return self:GetSpecialValueFor("tree")
|
||||
end
|
||||
function item_mega_fury.prototype.OnSpellStart(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local point = self:GetCursorPosition()
|
||||
local trees = GridNav:GetAllTreesAroundPoint(
|
||||
point,
|
||||
self:GetSpecialValueFor("tree"),
|
||||
true
|
||||
)
|
||||
if trees and #trees > 0 then
|
||||
self:CutTree(caster, point)
|
||||
end
|
||||
end
|
||||
function item_mega_fury.prototype.CutTree(self, caster, position)
|
||||
GridNav:DestroyTreesAroundPoint(
|
||||
position,
|
||||
self:GetSpecialValueFor("tree"),
|
||||
true
|
||||
)
|
||||
end
|
||||
item_mega_fury = __TS__Decorate(
|
||||
item_mega_fury,
|
||||
item_mega_fury,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_mega_fury"}
|
||||
)
|
||||
____exports.item_mega_fury = item_mega_fury
|
||||
____exports.modifier_mega_fury = __TS__Class()
|
||||
local modifier_mega_fury = ____exports.modifier_mega_fury
|
||||
modifier_mega_fury.name = "modifier_mega_fury"
|
||||
modifier_mega_fury.____file_path = "scripts/vscripts/items/default_items/item_mega_fury.lua"
|
||||
__TS__ClassExtends(modifier_mega_fury, BaseModifier)
|
||||
function modifier_mega_fury.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_mega_fury.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_mega_fury.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_mega_fury.prototype.CheckState(self)
|
||||
return {[MODIFIER_STATE_CANNOT_MISS] = true}
|
||||
end
|
||||
function modifier_mega_fury.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_mega_fury.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_EVENT_ON_ATTACK_LANDED, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, MODIFIER_PROPERTY_ATTACK_RANGE_BONUS}
|
||||
end
|
||||
function modifier_mega_fury.prototype.OnAttackLanded(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if self:GetParent():IsRangedAttacker() then
|
||||
return
|
||||
end
|
||||
local parent = event.attacker
|
||||
if parent ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return
|
||||
end
|
||||
local target = event.target
|
||||
local attackDamage = parent:GetAverageTrueAttackDamage(target)
|
||||
local cleaveDamage = attackDamage * (self:GetAbility():GetSpecialValueFor("cleave_damage") / 100)
|
||||
DoCleaveAttack(
|
||||
parent,
|
||||
target,
|
||||
ability,
|
||||
cleaveDamage,
|
||||
self:GetAbility():GetSpecialValueFor("cleave_starting_width"),
|
||||
self:GetAbility():GetSpecialValueFor("cleave_ending_width"),
|
||||
self:GetAbility():GetSpecialValueFor("cleave_distance"),
|
||||
"particles/items_fx/battlefury_cleave.vpcf"
|
||||
)
|
||||
end
|
||||
function modifier_mega_fury.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_mega_fury.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("attack_speed")
|
||||
end
|
||||
function modifier_mega_fury.prototype.GetModifierAttackRangeBonus(self)
|
||||
if self:GetParent():IsRangedAttacker() then
|
||||
return 0
|
||||
end
|
||||
return self:GetAbility():GetSpecialValueFor("attack_range")
|
||||
end
|
||||
modifier_mega_fury = __TS__Decorate(
|
||||
modifier_mega_fury,
|
||||
modifier_mega_fury,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_mega_fury"}
|
||||
)
|
||||
____exports.modifier_mega_fury = modifier_mega_fury
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
____exports.item_mega_treads = __TS__Class()
|
||||
local item_mega_treads = ____exports.item_mega_treads
|
||||
item_mega_treads.name = "item_mega_treads"
|
||||
item_mega_treads.____file_path = "scripts/vscripts/items/default_items/item_mega_treads.lua"
|
||||
__TS__ClassExtends(item_mega_treads, BaseItem)
|
||||
function item_mega_treads.prototype.OnSpellStart(self)
|
||||
local caster = self:GetCaster()
|
||||
local modifier = caster:FindModifierByName("modifier_item_mega_treads")
|
||||
if not modifier then
|
||||
return
|
||||
end
|
||||
modifier:SetStackCount((modifier:GetStackCount() + 1) % 3)
|
||||
end
|
||||
function item_mega_treads.prototype.GetAbilityTextureName(self)
|
||||
local iconItem = {strength = "default_items/item_mega_treads_0", agility = "default_items/item_mega_treads_1", intellect = "default_items/item_mega_treads_2"}
|
||||
return iconItem[self.activeStat] or "default_items/item_mega_treads_0"
|
||||
end
|
||||
function item_mega_treads.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_mega_treads"
|
||||
end
|
||||
item_mega_treads = __TS__Decorate(
|
||||
item_mega_treads,
|
||||
item_mega_treads,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_mega_treads"}
|
||||
)
|
||||
____exports.item_mega_treads = item_mega_treads
|
||||
____exports.modifier_item_mega_treads = __TS__Class()
|
||||
local modifier_item_mega_treads = ____exports.modifier_item_mega_treads
|
||||
modifier_item_mega_treads.name = "modifier_item_mega_treads"
|
||||
modifier_item_mega_treads.____file_path = "scripts/vscripts/items/default_items/item_mega_treads.lua"
|
||||
__TS__ClassExtends(modifier_item_mega_treads, BaseModifier)
|
||||
function modifier_item_mega_treads.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.ability = self:GetAbility()
|
||||
self.bonusActiveStat = 0
|
||||
self.bonusMovementSpeed = 0
|
||||
self.bonusOtherStat = 0
|
||||
self.bonusAttackSpeed = 0
|
||||
self.bonusMagicalResistance = 0
|
||||
self.bonusAgilityBaseDamagePct = 0
|
||||
self.bonusIntellectSpellAmp = 0
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.IsPurgeException(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.OnStackCountChanged(self, oldCount)
|
||||
local stackCount = self:GetStackCount()
|
||||
local stats = {[0] = "strength", [1] = "intellect", [2] = "agility"}
|
||||
self.activeStat = stats[stackCount] or "agility"
|
||||
self.ability.activeStat = stats[stackCount] or "agility"
|
||||
if IsServer() then
|
||||
local parent = self:GetParent()
|
||||
parent:CalculateStatBonus(true)
|
||||
self.ability:SetSecondaryCharges(stackCount)
|
||||
end
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.OnCreated(self)
|
||||
self.bonusActiveStat = self.ability:GetSpecialValueFor("bonus_stat")
|
||||
self.bonusOtherStat = self.ability:GetSpecialValueFor("bonus_other_stat")
|
||||
self.bonusMovementSpeed = self.ability:GetSpecialValueFor("bonus_movement_speed")
|
||||
self.bonusAttackSpeed = self.ability:GetSpecialValueFor("bonus_attackspeed")
|
||||
self.bonusMagicalResistance = self.ability:GetSpecialValueFor("bonus_magical_resistance")
|
||||
self.bonusIntellectSpellAmp = self.ability:GetSpecialValueFor("spell_amplify")
|
||||
local stats = {[0] = "strength", [1] = "intellect", [2] = "agility"}
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
Timers:CreateTimer(
|
||||
0.03,
|
||||
function()
|
||||
self:SetStackCount(self.ability:GetSecondaryCharges())
|
||||
end
|
||||
)
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
|
||||
MODIFIER_PROPERTY_MOVESPEED_BONUS_UNIQUE,
|
||||
MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS,
|
||||
MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE,
|
||||
MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT
|
||||
}
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.GetModifierMoveSpeedBonus_Special_Boots(self)
|
||||
return self.bonusMovementSpeed
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.GetModifierSpellAmplify_Percentage(self)
|
||||
return self.activeStat == "intellect" and self.bonusIntellectSpellAmp or 0
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.GetModifierMagicalResistanceBonus(self)
|
||||
return self.activeStat == "strength" and self.bonusMagicalResistance or 0
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self.activeStat == "agility" and self.bonusAttackSpeed or 0
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self.activeStat == "strength" and self.bonusActiveStat or self.bonusOtherStat
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self.activeStat == "agility" and self.bonusActiveStat or self.bonusOtherStat
|
||||
end
|
||||
function modifier_item_mega_treads.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self.activeStat == "intellect" and self.bonusActiveStat or self.bonusOtherStat
|
||||
end
|
||||
modifier_item_mega_treads = __TS__Decorate(
|
||||
modifier_item_mega_treads,
|
||||
modifier_item_mega_treads,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_mega_treads"}
|
||||
)
|
||||
____exports.modifier_item_mega_treads = modifier_item_mega_treads
|
||||
return ____exports
|
||||
@@ -0,0 +1,110 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_mini_bfury = __TS__Class()
|
||||
local item_mini_bfury = ____exports.item_mini_bfury
|
||||
item_mini_bfury.name = "item_mini_bfury"
|
||||
item_mini_bfury.____file_path = "scripts/vscripts/items/default_items/item_mini_bfury.lua"
|
||||
__TS__ClassExtends(item_mini_bfury, BaseItem)
|
||||
function item_mini_bfury.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_mini_bfury"
|
||||
end
|
||||
function item_mini_bfury.prototype.GetAOERadius(self)
|
||||
return self:GetSpecialValueFor("tree")
|
||||
end
|
||||
function item_mini_bfury.prototype.OnSpellStart(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local point = self:GetCursorPosition()
|
||||
local trees = GridNav:GetAllTreesAroundPoint(
|
||||
point,
|
||||
self:GetSpecialValueFor("tree"),
|
||||
true
|
||||
)
|
||||
if trees and #trees > 0 then
|
||||
self:CutTree(caster, point)
|
||||
end
|
||||
end
|
||||
function item_mini_bfury.prototype.CutTree(self, caster, position)
|
||||
GridNav:DestroyTreesAroundPoint(
|
||||
position,
|
||||
self:GetSpecialValueFor("tree"),
|
||||
true
|
||||
)
|
||||
end
|
||||
item_mini_bfury = __TS__Decorate(
|
||||
item_mini_bfury,
|
||||
item_mini_bfury,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_mini_bfury"}
|
||||
)
|
||||
____exports.item_mini_bfury = item_mini_bfury
|
||||
____exports.modifier_mini_bfury = __TS__Class()
|
||||
local modifier_mini_bfury = ____exports.modifier_mini_bfury
|
||||
modifier_mini_bfury.name = "modifier_mini_bfury"
|
||||
modifier_mini_bfury.____file_path = "scripts/vscripts/items/default_items/item_mini_bfury.lua"
|
||||
__TS__ClassExtends(modifier_mini_bfury, BaseModifier)
|
||||
function modifier_mini_bfury.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_mini_bfury.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_mini_bfury.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_mini_bfury.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_mini_bfury.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_EVENT_ON_ATTACK_LANDED}
|
||||
end
|
||||
function modifier_mini_bfury.prototype.OnAttackLanded(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if self:GetParent():IsRangedAttacker() then
|
||||
return
|
||||
end
|
||||
local parent = event.attacker
|
||||
if parent ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return
|
||||
end
|
||||
local target = event.target
|
||||
local attackDamage = parent:GetAverageTrueAttackDamage(target)
|
||||
local cleaveDamage = attackDamage * (self:GetAbility():GetSpecialValueFor("cleave_damage") / 100)
|
||||
DoCleaveAttack(
|
||||
parent,
|
||||
target,
|
||||
ability,
|
||||
cleaveDamage,
|
||||
self:GetAbility():GetSpecialValueFor("cleave_starting_width"),
|
||||
self:GetAbility():GetSpecialValueFor("cleave_ending_width"),
|
||||
self:GetAbility():GetSpecialValueFor("cleave_distance"),
|
||||
"particles/items_fx/battlefury_cleave.vpcf"
|
||||
)
|
||||
end
|
||||
function modifier_mini_bfury.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
modifier_mini_bfury = __TS__Decorate(
|
||||
modifier_mini_bfury,
|
||||
modifier_mini_bfury,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_mini_bfury"}
|
||||
)
|
||||
____exports.modifier_mini_bfury = modifier_mini_bfury
|
||||
return ____exports
|
||||
@@ -0,0 +1,337 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
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 MJOLNIR_ACTIVE_INCOMING_SOURCE = "modifier_item_mjolnir_active"
|
||||
____exports.item_mjolnir_custom = __TS__Class()
|
||||
local item_mjolnir_custom = ____exports.item_mjolnir_custom
|
||||
item_mjolnir_custom.name = "item_mjolnir_custom"
|
||||
item_mjolnir_custom.____file_path = "scripts/vscripts/items/default_items/item_mjolnir_custom.lua"
|
||||
__TS__ClassExtends(item_mjolnir_custom, BaseItem)
|
||||
function item_mjolnir_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_mjolnir_custom"
|
||||
end
|
||||
function item_mjolnir_custom.prototype.OnSpellStart(self)
|
||||
local target = self:GetCursorTarget()
|
||||
if not target then
|
||||
return
|
||||
end
|
||||
target:EmitSound("DOTA_Item.Mjollnir.Activate")
|
||||
target:AddNewModifier(
|
||||
self:GetCaster(),
|
||||
self,
|
||||
"modifier_item_mjolnir_active",
|
||||
{duration = self:GetSpecialValueFor("duration")}
|
||||
)
|
||||
end
|
||||
item_mjolnir_custom = __TS__Decorate(
|
||||
item_mjolnir_custom,
|
||||
item_mjolnir_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_mjolnir_custom"}
|
||||
)
|
||||
____exports.item_mjolnir_custom = item_mjolnir_custom
|
||||
____exports.modifier_item_mjolnir_active = __TS__Class()
|
||||
local modifier_item_mjolnir_active = ____exports.modifier_item_mjolnir_active
|
||||
modifier_item_mjolnir_active.name = "modifier_item_mjolnir_active"
|
||||
modifier_item_mjolnir_active.____file_path = "scripts/vscripts/items/default_items/item_mjolnir_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_mjolnir_active, BaseModifier)
|
||||
function modifier_item_mjolnir_active.prototype.GetEffectName(self)
|
||||
return "particles/econ/events/ti6/mjollnir_shield_ti6.vpcf"
|
||||
end
|
||||
function modifier_item_mjolnir_active.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
function modifier_item_mjolnir_active.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_mjolnir_active.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
setIncomingDamageReductionSource(
|
||||
nil,
|
||||
self:GetParent(),
|
||||
MJOLNIR_ACTIVE_INCOMING_SOURCE,
|
||||
function()
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
return math.max(
|
||||
0,
|
||||
ability:GetSpecialValueFor("incoming_pct")
|
||||
)
|
||||
end
|
||||
)
|
||||
end
|
||||
function modifier_item_mjolnir_active.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
removeIncomingDamageReductionSource(
|
||||
nil,
|
||||
self:GetParent(),
|
||||
MJOLNIR_ACTIVE_INCOMING_SOURCE
|
||||
)
|
||||
end
|
||||
function modifier_item_mjolnir_active.prototype.GetModifierDamageOutgoing_Percentage(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("outgoing_pct")
|
||||
end
|
||||
function modifier_item_mjolnir_active.prototype.GetTexture(self)
|
||||
return "item_mjollnir"
|
||||
end
|
||||
modifier_item_mjolnir_active = __TS__Decorate(
|
||||
modifier_item_mjolnir_active,
|
||||
modifier_item_mjolnir_active,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_mjolnir_active"}
|
||||
)
|
||||
____exports.modifier_item_mjolnir_active = modifier_item_mjolnir_active
|
||||
____exports.modifier_item_mjolnir_custom = __TS__Class()
|
||||
local modifier_item_mjolnir_custom = ____exports.modifier_item_mjolnir_custom
|
||||
modifier_item_mjolnir_custom.name = "modifier_item_mjolnir_custom"
|
||||
modifier_item_mjolnir_custom.____file_path = "scripts/vscripts/items/default_items/item_mjolnir_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_mjolnir_custom, BaseModifier)
|
||||
function modifier_item_mjolnir_custom.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.bonus_damage = 0
|
||||
self.bonus_attack_speed = 0
|
||||
self.chain_chance = 0
|
||||
self.chain_cooldown = 0
|
||||
self.bChainCooldown = false
|
||||
end
|
||||
function modifier_item_mjolnir_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_mjolnir_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_mjolnir_custom.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_mjolnir_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_mjolnir_custom.prototype.OnCreated(self, params)
|
||||
if IsServer() then
|
||||
if not self:GetAbility() then
|
||||
self:Destroy()
|
||||
return
|
||||
end
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if ability then
|
||||
self.bonus_damage = ability:GetSpecialValueFor("bonus_damage")
|
||||
self.bonus_attack_speed = ability:GetSpecialValueFor("bonus_attack_speed")
|
||||
self.chain_chance = ability:GetSpecialValueFor("chain_chance")
|
||||
self.chain_cooldown = ability:GetSpecialValueFor("chain_cooldown")
|
||||
else
|
||||
self.bonus_damage = 0
|
||||
self.bonus_attack_speed = 0
|
||||
self.chain_chance = 0
|
||||
self.chain_cooldown = 0
|
||||
end
|
||||
self.bChainCooldown = false
|
||||
end
|
||||
function modifier_item_mjolnir_custom.prototype.OnIntervalThink(self)
|
||||
self.bChainCooldown = false
|
||||
self:StartIntervalThink(-1)
|
||||
end
|
||||
function modifier_item_mjolnir_custom.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, MODIFIER_EVENT_ON_ATTACK_LANDED, MODIFIER_EVENT_ON_ORDER}
|
||||
end
|
||||
function modifier_item_mjolnir_custom.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self.bonus_damage
|
||||
end
|
||||
function modifier_item_mjolnir_custom.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self.bonus_attack_speed
|
||||
end
|
||||
function modifier_item_mjolnir_custom.prototype.OnAttackLanded(self, event)
|
||||
if IsServer() and event.attacker == self:GetParent() and self:GetParent():IsAlive() and not self.bChainCooldown and not self:GetParent():IsIllusion() and not event.target:IsMagicImmune() and not event.target:IsBuilding() and not event.target:IsOther() and self:GetParent():GetTeamNumber() ~= event.target:GetTeamNumber() and RollPseudoRandomPercentage(
|
||||
self.chain_chance,
|
||||
4,
|
||||
self:GetParent()
|
||||
) then
|
||||
self:GetParent():EmitSound("Item.Maelstrom.Chain_Lightning")
|
||||
self:GetParent():AddNewModifier(
|
||||
self:GetCaster(),
|
||||
self:GetAbility(),
|
||||
"modifier_chain_lightning",
|
||||
{starting_unit_entindex = event.target:entindex()}
|
||||
)
|
||||
self.bChainCooldown = true
|
||||
self:StartIntervalThink(self.chain_cooldown)
|
||||
end
|
||||
end
|
||||
modifier_item_mjolnir_custom = __TS__Decorate(
|
||||
modifier_item_mjolnir_custom,
|
||||
modifier_item_mjolnir_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_mjolnir_custom"}
|
||||
)
|
||||
____exports.modifier_item_mjolnir_custom = modifier_item_mjolnir_custom
|
||||
____exports.modifier_chain_lightning = __TS__Class()
|
||||
local modifier_chain_lightning = ____exports.modifier_chain_lightning
|
||||
modifier_chain_lightning.name = "modifier_chain_lightning"
|
||||
modifier_chain_lightning.____file_path = "scripts/vscripts/items/default_items/item_mjolnir_custom.lua"
|
||||
__TS__ClassExtends(modifier_chain_lightning, BaseModifier)
|
||||
function modifier_chain_lightning.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.bonus_damage = 0
|
||||
self.chain_damage = 0
|
||||
self.chain_damage_self = 0
|
||||
self.chain_strikes = 0
|
||||
self.chain_radius = 0
|
||||
self.chain_delay = 0
|
||||
self.units_affected = {}
|
||||
self.unit_counter = 0
|
||||
self.zapped = false
|
||||
end
|
||||
function modifier_chain_lightning.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_chain_lightning.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_chain_lightning.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_chain_lightning.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_chain_lightning.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_chain_lightning.prototype.OnCreated(self, params)
|
||||
if IsServer() then
|
||||
if not self:GetAbility() then
|
||||
self:Destroy()
|
||||
return
|
||||
end
|
||||
end
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if ability then
|
||||
self.bonus_damage = ability:GetSpecialValueFor("bonus_damage")
|
||||
self.chain_damage = ability:GetSpecialValueFor("chain_damage")
|
||||
self.chain_damage_self = ability:GetSpecialValueFor("chain_damage_self")
|
||||
self.chain_strikes = ability:GetSpecialValueFor("chain_strikes")
|
||||
self.chain_radius = ability:GetSpecialValueFor("chain_radius")
|
||||
self.chain_delay = ability:GetSpecialValueFor("chain_delay")
|
||||
end
|
||||
self.starting_unit_entindex = params.starting_unit_entindex
|
||||
if self.starting_unit_entindex then
|
||||
local unit = EntIndexToHScript(self.starting_unit_entindex)
|
||||
if unit and unit:IsBaseNPC() then
|
||||
self.current_unit = unit
|
||||
else
|
||||
self:Destroy()
|
||||
return
|
||||
end
|
||||
else
|
||||
self:Destroy()
|
||||
return
|
||||
end
|
||||
self.units_affected = {}
|
||||
self.unit_counter = 0
|
||||
self:OnIntervalThink()
|
||||
self:StartIntervalThink(self.chain_delay)
|
||||
end
|
||||
function modifier_chain_lightning.prototype.OnIntervalThink(self)
|
||||
self.zapped = false
|
||||
local caster = self:GetCaster()
|
||||
if not self.current_unit or not caster then
|
||||
return
|
||||
end
|
||||
local enemies = FindUnitsInRadius(
|
||||
caster:GetTeamNumber(),
|
||||
self.current_unit:GetAbsOrigin(),
|
||||
nil,
|
||||
self.chain_radius,
|
||||
DOTA_UNIT_TARGET_TEAM_ENEMY,
|
||||
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
|
||||
DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE + DOTA_UNIT_TARGET_FLAG_NO_INVIS,
|
||||
FIND_CLOSEST,
|
||||
false
|
||||
)
|
||||
for ____, enemy in ipairs(enemies) do
|
||||
if not self.units_affected[enemy:entindex()] then
|
||||
enemy:EmitSound("Item.Maelstrom.Chain_Lightning.Jump")
|
||||
local zap_particle = ParticleManager:CreateParticle("particles/items_fx/chain_lightning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self.current_unit)
|
||||
if self.unit_counter == 0 then
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
zap_particle,
|
||||
0,
|
||||
self:GetParent(),
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
self:GetParent():GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
else
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
zap_particle,
|
||||
0,
|
||||
self.current_unit,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
self.current_unit:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
end
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
zap_particle,
|
||||
1,
|
||||
enemy,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
enemy:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
ParticleManager:SetParticleControl(
|
||||
zap_particle,
|
||||
2,
|
||||
Vector(1, 1, 1)
|
||||
)
|
||||
ParticleManager:ReleaseParticleIndex(zap_particle)
|
||||
self.unit_counter = self.unit_counter + 1
|
||||
self.current_unit = enemy
|
||||
self.units_affected[self.current_unit:entindex()] = true
|
||||
self.zapped = true
|
||||
local damage = caster:GetAverageTrueAttackDamage(caster) * (self.chain_damage_self / 100) + self.chain_damage
|
||||
ApplyDamage({
|
||||
victim = enemy,
|
||||
damage = damage,
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NONE,
|
||||
attacker = caster,
|
||||
ability = self:GetAbility()
|
||||
})
|
||||
break
|
||||
end
|
||||
end
|
||||
if self.unit_counter >= self.chain_strikes and self.chain_strikes > 0 or not self.zapped then
|
||||
self:StartIntervalThink(-1)
|
||||
self:Destroy()
|
||||
end
|
||||
end
|
||||
modifier_chain_lightning = __TS__Decorate(
|
||||
modifier_chain_lightning,
|
||||
modifier_chain_lightning,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_chain_lightning"}
|
||||
)
|
||||
____exports.modifier_chain_lightning = modifier_chain_lightning
|
||||
return ____exports
|
||||
@@ -0,0 +1,107 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local ____modifier_general_fired = require("abilities.modifiers.modifier_general_fired")
|
||||
local modifier_general_fired = ____modifier_general_fired.modifier_general_fired
|
||||
____exports.item_orb_of_fire = __TS__Class()
|
||||
local item_orb_of_fire = ____exports.item_orb_of_fire
|
||||
item_orb_of_fire.name = "item_orb_of_fire"
|
||||
item_orb_of_fire.____file_path = "scripts/vscripts/items/default_items/item_orb_of_fire copy.lua"
|
||||
__TS__ClassExtends(item_orb_of_fire, BaseItem)
|
||||
function item_orb_of_fire.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_orb_of_fire"
|
||||
end
|
||||
function item_orb_of_fire.prototype.GetAOERadius(self)
|
||||
return self:GetSpecialValueFor("radius")
|
||||
end
|
||||
item_orb_of_fire = __TS__Decorate(
|
||||
item_orb_of_fire,
|
||||
item_orb_of_fire,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_orb_of_fire"}
|
||||
)
|
||||
____exports.item_orb_of_fire = item_orb_of_fire
|
||||
____exports.modifier_item_orb_of_fire = __TS__Class()
|
||||
local modifier_item_orb_of_fire = ____exports.modifier_item_orb_of_fire
|
||||
modifier_item_orb_of_fire.name = "modifier_item_orb_of_fire"
|
||||
modifier_item_orb_of_fire.____file_path = "scripts/vscripts/items/default_items/item_orb_of_fire copy.lua"
|
||||
__TS__ClassExtends(modifier_item_orb_of_fire, BaseModifier)
|
||||
function modifier_item_orb_of_fire.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_orb_of_fire.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_orb_of_fire.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_orb_of_fire.prototype.OnCreated(self, params)
|
||||
self:StartIntervalThink(3)
|
||||
end
|
||||
function modifier_item_orb_of_fire.prototype.GetTexture(self)
|
||||
return "default_items/orb_of_fire"
|
||||
end
|
||||
function modifier_item_orb_of_fire.prototype.OnIntervalThink(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if not self:GetParent():IsAlive() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local radius = self:GetAbility():GetSpecialValueFor("radius")
|
||||
local damage = self:GetAbility():GetSpecialValueFor("damage")
|
||||
local enemies = FindUnitsInRadius(
|
||||
caster:GetTeamNumber(),
|
||||
caster:GetAbsOrigin(),
|
||||
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 damage_table = {
|
||||
victim = enemy,
|
||||
attacker = caster,
|
||||
damage = damage,
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
ability = self:GetAbility(),
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NO_SPELL_AMPLIFICATION
|
||||
}
|
||||
local modifier = enemy:AddNewModifier(
|
||||
self:GetCaster(),
|
||||
self:GetAbility(),
|
||||
modifier_general_fired.name,
|
||||
{}
|
||||
)
|
||||
if modifier then
|
||||
local stacksPerLevel = self:GetAbility():GetSpecialValueFor("fire_stack")
|
||||
do
|
||||
local i = 0
|
||||
while i < stacksPerLevel do
|
||||
modifier:IncrementStackCount()
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
ApplyDamage(damage_table)
|
||||
end
|
||||
end
|
||||
modifier_item_orb_of_fire = __TS__Decorate(
|
||||
modifier_item_orb_of_fire,
|
||||
modifier_item_orb_of_fire,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_orb_of_fire"}
|
||||
)
|
||||
____exports.modifier_item_orb_of_fire = modifier_item_orb_of_fire
|
||||
return ____exports
|
||||
@@ -0,0 +1,107 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local ____modifier_general_fired = require("abilities.modifiers.modifier_general_fired")
|
||||
local modifier_general_fired = ____modifier_general_fired.modifier_general_fired
|
||||
____exports.item_orb_of_fire = __TS__Class()
|
||||
local item_orb_of_fire = ____exports.item_orb_of_fire
|
||||
item_orb_of_fire.name = "item_orb_of_fire"
|
||||
item_orb_of_fire.____file_path = "scripts/vscripts/items/default_items/item_orb_of_fire.lua"
|
||||
__TS__ClassExtends(item_orb_of_fire, BaseItem)
|
||||
function item_orb_of_fire.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_orb_of_fire"
|
||||
end
|
||||
function item_orb_of_fire.prototype.GetAOERadius(self)
|
||||
return self:GetSpecialValueFor("radius")
|
||||
end
|
||||
item_orb_of_fire = __TS__Decorate(
|
||||
item_orb_of_fire,
|
||||
item_orb_of_fire,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_orb_of_fire"}
|
||||
)
|
||||
____exports.item_orb_of_fire = item_orb_of_fire
|
||||
____exports.modifier_item_orb_of_fire = __TS__Class()
|
||||
local modifier_item_orb_of_fire = ____exports.modifier_item_orb_of_fire
|
||||
modifier_item_orb_of_fire.name = "modifier_item_orb_of_fire"
|
||||
modifier_item_orb_of_fire.____file_path = "scripts/vscripts/items/default_items/item_orb_of_fire.lua"
|
||||
__TS__ClassExtends(modifier_item_orb_of_fire, BaseModifier)
|
||||
function modifier_item_orb_of_fire.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_orb_of_fire.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_orb_of_fire.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_orb_of_fire.prototype.OnCreated(self, params)
|
||||
self:StartIntervalThink(3)
|
||||
end
|
||||
function modifier_item_orb_of_fire.prototype.GetTexture(self)
|
||||
return "default_items/orb_of_fire"
|
||||
end
|
||||
function modifier_item_orb_of_fire.prototype.OnIntervalThink(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if not self:GetParent():IsAlive() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local radius = self:GetAbility():GetSpecialValueFor("radius")
|
||||
local damage = self:GetAbility():GetSpecialValueFor("damage")
|
||||
local enemies = FindUnitsInRadius(
|
||||
caster:GetTeamNumber(),
|
||||
caster:GetAbsOrigin(),
|
||||
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 damage_table = {
|
||||
victim = enemy,
|
||||
attacker = caster,
|
||||
damage = damage,
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
ability = self:GetAbility(),
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NO_SPELL_AMPLIFICATION
|
||||
}
|
||||
local modifier = enemy:AddNewModifier(
|
||||
self:GetCaster(),
|
||||
self:GetAbility(),
|
||||
modifier_general_fired.name,
|
||||
{}
|
||||
)
|
||||
if modifier then
|
||||
local stacksPerLevel = self:GetAbility():GetSpecialValueFor("fire_stack")
|
||||
do
|
||||
local i = 0
|
||||
while i < stacksPerLevel do
|
||||
modifier:IncrementStackCount()
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
ApplyDamage(damage_table)
|
||||
end
|
||||
end
|
||||
modifier_item_orb_of_fire = __TS__Decorate(
|
||||
modifier_item_orb_of_fire,
|
||||
modifier_item_orb_of_fire,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_orb_of_fire"}
|
||||
)
|
||||
____exports.modifier_item_orb_of_fire = modifier_item_orb_of_fire
|
||||
return ____exports
|
||||
@@ -0,0 +1,75 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____luck = require("utils.luck")
|
||||
local rollLuckChance = ____luck.rollLuckChance
|
||||
--- Бедный щит: броня и шанс заблокировать физический урон от атак; шанс для героев с Luck.
|
||||
____exports.item_poor_shield = __TS__Class()
|
||||
local item_poor_shield = ____exports.item_poor_shield
|
||||
item_poor_shield.name = "item_poor_shield"
|
||||
item_poor_shield.____file_path = "scripts/vscripts/items/default_items/item_poor_shield.lua"
|
||||
__TS__ClassExtends(item_poor_shield, BaseItem)
|
||||
function item_poor_shield.prototype.GetIntrinsicModifierName(self)
|
||||
return ____exports.modifier_item_poor_shield.name
|
||||
end
|
||||
item_poor_shield = __TS__Decorate(
|
||||
item_poor_shield,
|
||||
item_poor_shield,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_poor_shield"}
|
||||
)
|
||||
____exports.item_poor_shield = item_poor_shield
|
||||
____exports.modifier_item_poor_shield = __TS__Class()
|
||||
local modifier_item_poor_shield = ____exports.modifier_item_poor_shield
|
||||
modifier_item_poor_shield.name = "modifier_item_poor_shield"
|
||||
modifier_item_poor_shield.____file_path = "scripts/vscripts/items/default_items/item_poor_shield.lua"
|
||||
__TS__ClassExtends(modifier_item_poor_shield, BaseModifier)
|
||||
function modifier_item_poor_shield.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_poor_shield.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_poor_shield.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PHYSICAL_CONSTANT_BLOCK, MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS}
|
||||
end
|
||||
function modifier_item_poor_shield.prototype.GetModifierPhysicalArmorBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_physical_armor")
|
||||
end
|
||||
function modifier_item_poor_shield.prototype.GetModifierPhysical_ConstantBlock(self)
|
||||
if not IsServer() then
|
||||
return 0
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
local chancePct = ability:GetSpecialValueFor("damage_block_chance")
|
||||
local parent = self:GetParent()
|
||||
local ____parent_IsRealHero_result_0
|
||||
if parent:IsRealHero() then
|
||||
____parent_IsRealHero_result_0 = rollLuckChance(nil, parent, chancePct / 100)
|
||||
else
|
||||
____parent_IsRealHero_result_0 = RollPercentage(chancePct)
|
||||
end
|
||||
local blocked = ____parent_IsRealHero_result_0
|
||||
if blocked then
|
||||
return self:GetCaster():IsRangedAttacker() and ability:GetSpecialValueFor("damage_block") * 0.5 or ability:GetSpecialValueFor("damage_block")
|
||||
end
|
||||
return 0
|
||||
end
|
||||
modifier_item_poor_shield = __TS__Decorate(
|
||||
modifier_item_poor_shield,
|
||||
modifier_item_poor_shield,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_poor_shield"}
|
||||
)
|
||||
____exports.modifier_item_poor_shield = modifier_item_poor_shield
|
||||
return ____exports
|
||||
@@ -0,0 +1,155 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local ____modifier_general_fired = require("abilities.modifiers.modifier_general_fired")
|
||||
local modifier_general_fired = ____modifier_general_fired.modifier_general_fired
|
||||
local RADIANCE_PARTICLE = "particles/items2_fx/radiance_owner.vpcf"
|
||||
--- Суммарный регген HP/сек владельца (с предметами и баффами).
|
||||
local function getOwnerHealthRegenPerSecond(self, unit)
|
||||
local u = unit
|
||||
if u.GetHealthRegen ~= nil and type(u.GetHealthRegen) == "function" then
|
||||
return math.max(
|
||||
0,
|
||||
u:GetHealthRegen()
|
||||
)
|
||||
end
|
||||
return math.max(
|
||||
0,
|
||||
unit:GetBaseHealthRegen()
|
||||
)
|
||||
end
|
||||
____exports.item_radiance_custom = __TS__Class()
|
||||
local item_radiance_custom = ____exports.item_radiance_custom
|
||||
item_radiance_custom.name = "item_radiance_custom"
|
||||
item_radiance_custom.____file_path = "scripts/vscripts/items/default_items/item_radiance_custom.lua"
|
||||
__TS__ClassExtends(item_radiance_custom, BaseItem)
|
||||
function item_radiance_custom.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", RADIANCE_PARTICLE, context)
|
||||
end
|
||||
function item_radiance_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return ____exports.modifier_item_radiance_custom.name
|
||||
end
|
||||
function item_radiance_custom.prototype.GetAOERadius(self)
|
||||
return self:GetSpecialValueFor("radius")
|
||||
end
|
||||
item_radiance_custom = __TS__Decorate(
|
||||
item_radiance_custom,
|
||||
item_radiance_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_radiance_custom"}
|
||||
)
|
||||
____exports.item_radiance_custom = item_radiance_custom
|
||||
____exports.modifier_item_radiance_custom = __TS__Class()
|
||||
local modifier_item_radiance_custom = ____exports.modifier_item_radiance_custom
|
||||
modifier_item_radiance_custom.name = "modifier_item_radiance_custom"
|
||||
modifier_item_radiance_custom.____file_path = "scripts/vscripts/items/default_items/item_radiance_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_radiance_custom, BaseModifier)
|
||||
function modifier_item_radiance_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_radiance_custom.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_radiance_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_radiance_custom.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_radiance_custom.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_PROPERTY_EVASION_CONSTANT}
|
||||
end
|
||||
function modifier_item_radiance_custom.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_item_radiance_custom.prototype.GetModifierEvasion_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("evasion")
|
||||
end
|
||||
function modifier_item_radiance_custom.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local tickInterval = self:GetAbility():GetSpecialValueFor("tick_interval")
|
||||
self:StartIntervalThink(tickInterval)
|
||||
self.particleId = ParticleManager:CreateParticle(
|
||||
RADIANCE_PARTICLE,
|
||||
PATTACH_ABSORIGIN_FOLLOW,
|
||||
self:GetParent()
|
||||
)
|
||||
ParticleManager:SetParticleShouldCheckFoW(self.particleId, false)
|
||||
end
|
||||
function modifier_item_radiance_custom.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if self.particleId ~= nil then
|
||||
ParticleManager:DestroyParticle(self.particleId, false)
|
||||
ParticleManager:ReleaseParticleIndex(self.particleId)
|
||||
self.particleId = nil
|
||||
end
|
||||
end
|
||||
function modifier_item_radiance_custom.prototype.OnIntervalThink(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if not self:GetParent():IsAlive() then
|
||||
return
|
||||
end
|
||||
local ____opt_0 = self:GetCaster()
|
||||
if ____opt_0 and ____opt_0:IsIllusion() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
local caster = self:GetCaster()
|
||||
local radius = ability:GetSpecialValueFor("radius")
|
||||
local tickInterval = ability:GetSpecialValueFor("tick_interval")
|
||||
local healthRegen = getOwnerHealthRegenPerSecond(nil, caster)
|
||||
local damage = (ability:GetSpecialValueFor("damage") + caster:GetMaxHealth() * (ability:GetSpecialValueFor("health_damage_pct") / 100) + healthRegen * ability:GetSpecialValueFor("health_regen_damage")) * tickInterval
|
||||
local enemies = FindUnitsInRadius(
|
||||
caster:GetTeamNumber(),
|
||||
caster:GetAbsOrigin(),
|
||||
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
|
||||
)
|
||||
local stacksPerTick = ability:GetSpecialValueFor("fire_stack")
|
||||
for ____, enemy in ipairs(enemies) do
|
||||
local burnModifier = enemy:AddNewModifier(caster, ability, modifier_general_fired.name, {})
|
||||
if burnModifier then
|
||||
do
|
||||
local i = 0
|
||||
while i < stacksPerTick do
|
||||
burnModifier:IncrementStackCount()
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
ApplyDamage({
|
||||
victim = enemy,
|
||||
attacker = caster,
|
||||
damage = damage,
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
ability = ability,
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NO_SPELL_AMPLIFICATION
|
||||
})
|
||||
end
|
||||
end
|
||||
modifier_item_radiance_custom = __TS__Decorate(
|
||||
modifier_item_radiance_custom,
|
||||
modifier_item_radiance_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_radiance_custom"}
|
||||
)
|
||||
____exports.modifier_item_radiance_custom = modifier_item_radiance_custom
|
||||
return ____exports
|
||||
@@ -0,0 +1,76 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_rapier_custom = __TS__Class()
|
||||
local item_rapier_custom = ____exports.item_rapier_custom
|
||||
item_rapier_custom.name = "item_rapier_custom"
|
||||
item_rapier_custom.____file_path = "scripts/vscripts/items/default_items/item_rapier_custom.lua"
|
||||
__TS__ClassExtends(item_rapier_custom, BaseItem)
|
||||
function item_rapier_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_rapier_custom"
|
||||
end
|
||||
item_rapier_custom = __TS__Decorate(
|
||||
item_rapier_custom,
|
||||
item_rapier_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_rapier_custom"}
|
||||
)
|
||||
____exports.item_rapier_custom = item_rapier_custom
|
||||
____exports.modifier_rapier_custom = __TS__Class()
|
||||
local modifier_rapier_custom = ____exports.modifier_rapier_custom
|
||||
modifier_rapier_custom.name = "modifier_rapier_custom"
|
||||
modifier_rapier_custom.____file_path = "scripts/vscripts/items/default_items/item_rapier_custom.lua"
|
||||
__TS__ClassExtends(modifier_rapier_custom, BaseModifier)
|
||||
function modifier_rapier_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_rapier_custom.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_rapier_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_rapier_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_rapier_custom.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_PURE, MODIFIER_EVENT_ON_ATTACK_LANDED}
|
||||
end
|
||||
function modifier_rapier_custom.prototype.OnAttackLanded(self, event)
|
||||
if self:GetParent() == event.attacker then
|
||||
local damage = self:GetAbility():GetSpecialValueFor("proc_damage") / 100 * self:GetParent():GetAverageTrueAttackDamage(event.target)
|
||||
SendOverheadEventMessage(
|
||||
nil,
|
||||
OVERHEAD_ALERT_DAMAGE,
|
||||
event.target,
|
||||
damage,
|
||||
nil
|
||||
)
|
||||
local particle = ParticleManager:CreateParticle("models/heroes/phantom_assassin_persona/debut/particles/pa_debutdash/pa_debutdash_fragments.vpcf", PATTACH_CUSTOMORIGIN, nil)
|
||||
ParticleManager:SetParticleControl(
|
||||
particle,
|
||||
0,
|
||||
event.target:GetAbsOrigin()
|
||||
)
|
||||
ParticleManager:ReleaseParticleIndex(particle)
|
||||
ApplyDamage({victim = event.target, attacker = event.attacker, damage = damage, damage_type = DAMAGE_TYPE_PURE})
|
||||
end
|
||||
end
|
||||
function modifier_rapier_custom.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
modifier_rapier_custom = __TS__Decorate(
|
||||
modifier_rapier_custom,
|
||||
modifier_rapier_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_rapier_custom"}
|
||||
)
|
||||
____exports.modifier_rapier_custom = modifier_rapier_custom
|
||||
return ____exports
|
||||
@@ -0,0 +1,159 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____vampirism = require("utils.vampirism")
|
||||
local addPhysicalVampirism = ____vampirism.addPhysicalVampirism
|
||||
local precacheVampirismParticle = ____vampirism.precacheVampirismParticle
|
||||
local reducePhysicalVampirism = ____vampirism.reducePhysicalVampirism
|
||||
local SATANIC_BUFF_PARTICLE = "particles/items2_fx/satanic_buff.vpcf"
|
||||
____exports.item_satanic_custom = __TS__Class()
|
||||
local item_satanic_custom = ____exports.item_satanic_custom
|
||||
item_satanic_custom.name = "item_satanic_custom"
|
||||
item_satanic_custom.____file_path = "scripts/vscripts/items/default_items/item_satanic_custom.lua"
|
||||
__TS__ClassExtends(item_satanic_custom, BaseItem)
|
||||
function item_satanic_custom.prototype.Precache(self, context)
|
||||
precacheVampirismParticle(nil, context)
|
||||
PrecacheResource("particle", SATANIC_BUFF_PARTICLE, context)
|
||||
PrecacheResource("soundfile", "soundevents/game_sounds_items.vsndevts", context)
|
||||
end
|
||||
function item_satanic_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return ____exports.modifier_item_satanic_custom.name
|
||||
end
|
||||
function item_satanic_custom.prototype.OnSpellStart(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local healthCost = self:GetSpecialValueFor("health_cost")
|
||||
if healthCost > 0 then
|
||||
caster:SetHealth(math.max(
|
||||
1,
|
||||
caster:GetHealth() - healthCost
|
||||
))
|
||||
end
|
||||
caster:EmitSound("DOTA_Item.Satanic.Activate")
|
||||
caster:AddNewModifier(
|
||||
caster,
|
||||
self,
|
||||
____exports.modifier_item_satanic_custom_unholy.name,
|
||||
{duration = self:GetSpecialValueFor("unholy_duration")}
|
||||
)
|
||||
end
|
||||
item_satanic_custom = __TS__Decorate(
|
||||
item_satanic_custom,
|
||||
item_satanic_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_satanic_custom"}
|
||||
)
|
||||
____exports.item_satanic_custom = item_satanic_custom
|
||||
____exports.modifier_item_satanic_custom = __TS__Class()
|
||||
local modifier_item_satanic_custom = ____exports.modifier_item_satanic_custom
|
||||
modifier_item_satanic_custom.name = "modifier_item_satanic_custom"
|
||||
modifier_item_satanic_custom.____file_path = "scripts/vscripts/items/default_items/item_satanic_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_satanic_custom, BaseModifier)
|
||||
function modifier_item_satanic_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_satanic_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_satanic_custom.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_satanic_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_satanic_custom.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_PROPERTY_STATS_STRENGTH_BONUS}
|
||||
end
|
||||
function modifier_item_satanic_custom.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_item_satanic_custom.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_strength")
|
||||
end
|
||||
function modifier_item_satanic_custom.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
local lifesteal = self:GetAbility():GetSpecialValueFor("lifesteal")
|
||||
if lifesteal > 0 then
|
||||
addPhysicalVampirism(nil, hero, lifesteal)
|
||||
end
|
||||
end
|
||||
function modifier_item_satanic_custom.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
local lifesteal = self:GetAbility():GetSpecialValueFor("lifesteal")
|
||||
if lifesteal > 0 then
|
||||
reducePhysicalVampirism(nil, hero, lifesteal)
|
||||
end
|
||||
end
|
||||
modifier_item_satanic_custom = __TS__Decorate(
|
||||
modifier_item_satanic_custom,
|
||||
modifier_item_satanic_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_satanic_custom"}
|
||||
)
|
||||
____exports.modifier_item_satanic_custom = modifier_item_satanic_custom
|
||||
____exports.modifier_item_satanic_custom_unholy = __TS__Class()
|
||||
local modifier_item_satanic_custom_unholy = ____exports.modifier_item_satanic_custom_unholy
|
||||
modifier_item_satanic_custom_unholy.name = "modifier_item_satanic_custom_unholy"
|
||||
modifier_item_satanic_custom_unholy.____file_path = "scripts/vscripts/items/default_items/item_satanic_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_satanic_custom_unholy, BaseModifier)
|
||||
function modifier_item_satanic_custom_unholy.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_satanic_custom_unholy.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_satanic_custom_unholy.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_satanic_custom_unholy.prototype.GetTexture(self)
|
||||
return "item_satanic"
|
||||
end
|
||||
function modifier_item_satanic_custom_unholy.prototype.GetEffectName(self)
|
||||
return SATANIC_BUFF_PARTICLE
|
||||
end
|
||||
function modifier_item_satanic_custom_unholy.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
function modifier_item_satanic_custom_unholy.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
local bonus = self:GetAbility():GetSpecialValueFor("unholy_lifesteal")
|
||||
if bonus > 0 then
|
||||
addPhysicalVampirism(nil, hero, bonus)
|
||||
end
|
||||
end
|
||||
function modifier_item_satanic_custom_unholy.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
local bonus = self:GetAbility():GetSpecialValueFor("unholy_lifesteal")
|
||||
if bonus > 0 then
|
||||
reducePhysicalVampirism(nil, hero, bonus)
|
||||
end
|
||||
end
|
||||
modifier_item_satanic_custom_unholy = __TS__Decorate(
|
||||
modifier_item_satanic_custom_unholy,
|
||||
modifier_item_satanic_custom_unholy,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_satanic_custom_unholy"}
|
||||
)
|
||||
____exports.modifier_item_satanic_custom_unholy = modifier_item_satanic_custom_unholy
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____modifier_stats_multiplier = require("modifiers.modifier_stats_multiplier")
|
||||
local removeStatsMultiplierSource = ____modifier_stats_multiplier.removeStatsMultiplierSource
|
||||
local setStatsMultiplierSource = ____modifier_stats_multiplier.setStatsMultiplierSource
|
||||
local SKADI_CUSTOM_SOURCE_PREFIX = "item_skadi_custom"
|
||||
____exports.item_skadi_custom = __TS__Class()
|
||||
local item_skadi_custom = ____exports.item_skadi_custom
|
||||
item_skadi_custom.name = "item_skadi_custom"
|
||||
item_skadi_custom.____file_path = "scripts/vscripts/items/default_items/item_skadi_custom.lua"
|
||||
__TS__ClassExtends(item_skadi_custom, BaseItem)
|
||||
function item_skadi_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_skadi_custom"
|
||||
end
|
||||
item_skadi_custom = __TS__Decorate(
|
||||
item_skadi_custom,
|
||||
item_skadi_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_skadi_custom"}
|
||||
)
|
||||
____exports.item_skadi_custom = item_skadi_custom
|
||||
____exports.modifier_item_skadi_custom = __TS__Class()
|
||||
local modifier_item_skadi_custom = ____exports.modifier_item_skadi_custom
|
||||
modifier_item_skadi_custom.name = "modifier_item_skadi_custom"
|
||||
modifier_item_skadi_custom.____file_path = "scripts/vscripts/items/default_items/item_skadi_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_skadi_custom, BaseModifier)
|
||||
function modifier_item_skadi_custom.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.statsSourceId = ""
|
||||
end
|
||||
function modifier_item_skadi_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_skadi_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_skadi_custom.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_skadi_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_skadi_custom.prototype.OnCreated(self)
|
||||
local hero = self:GetParent()
|
||||
if not (hero and hero:IsRealHero()) then
|
||||
return
|
||||
end
|
||||
self.statsSourceId = (SKADI_CUSTOM_SOURCE_PREFIX .. "_") .. tostring(hero:entindex())
|
||||
local ability = self:GetAbility()
|
||||
setStatsMultiplierSource(
|
||||
nil,
|
||||
hero,
|
||||
self.statsSourceId,
|
||||
function()
|
||||
if not hero or not IsValidEntity(hero) or not hero:IsRealHero() then
|
||||
return 0
|
||||
end
|
||||
return ability and ability:GetSpecialValueFor("all_stats_pct") or 0
|
||||
end,
|
||||
"all_stats_pct"
|
||||
)
|
||||
end
|
||||
function modifier_item_skadi_custom.prototype.OnDestroy(self)
|
||||
if self.statsSourceId == "" then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
if hero and IsValidEntity(hero) then
|
||||
removeStatsMultiplierSource(nil, hero, self.statsSourceId)
|
||||
end
|
||||
self.statsSourceId = ""
|
||||
end
|
||||
function modifier_item_skadi_custom.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, MODIFIER_PROPERTY_STATS_AGILITY_BONUS, MODIFIER_PROPERTY_STATS_INTELLECT_BONUS}
|
||||
end
|
||||
function modifier_item_skadi_custom.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_all_stats")
|
||||
end
|
||||
function modifier_item_skadi_custom.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_all_stats")
|
||||
end
|
||||
function modifier_item_skadi_custom.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_all_stats")
|
||||
end
|
||||
function modifier_item_skadi_custom.prototype.OnAttackLanded(self, event)
|
||||
if event.attacker ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
if not event.target or event.target:IsBuilding() or event.target:IsOther() then
|
||||
return
|
||||
end
|
||||
if event.target ~= nil then
|
||||
local ____self_8 = event.target
|
||||
local ____self_8_AddNewModifier_9 = ____self_8.AddNewModifier
|
||||
local ____temp_6 = self:GetParent()
|
||||
local ____temp_7 = self:GetAbility()
|
||||
local ____opt_4 = self:GetAbility()
|
||||
____self_8_AddNewModifier_9(
|
||||
____self_8,
|
||||
____temp_6,
|
||||
____temp_7,
|
||||
"modifier_item_skadi_custom_debuff",
|
||||
{duration = ____opt_4 and ____opt_4:GetSpecialValueFor("debuff_duration")}
|
||||
)
|
||||
end
|
||||
end
|
||||
modifier_item_skadi_custom = __TS__Decorate(
|
||||
modifier_item_skadi_custom,
|
||||
modifier_item_skadi_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_skadi_custom"}
|
||||
)
|
||||
____exports.modifier_item_skadi_custom = modifier_item_skadi_custom
|
||||
____exports.modifier_item_skadi_custom_debuff = __TS__Class()
|
||||
local modifier_item_skadi_custom_debuff = ____exports.modifier_item_skadi_custom_debuff
|
||||
modifier_item_skadi_custom_debuff.name = "modifier_item_skadi_custom_debuff"
|
||||
modifier_item_skadi_custom_debuff.____file_path = "scripts/vscripts/items/default_items/item_skadi_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_skadi_custom_debuff, BaseModifier)
|
||||
function modifier_item_skadi_custom_debuff.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_skadi_custom_debuff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_skadi_custom_debuff.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_skadi_custom_debuff.prototype.GetModifierProjectileName(self)
|
||||
return "particles/items2_fx/skadi_projectile.vpcf"
|
||||
end
|
||||
function modifier_item_skadi_custom_debuff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_HEALTH_REGEN_PERCENTAGE, MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_skadi_custom_debuff.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("movespeed_reduction")
|
||||
end
|
||||
function modifier_item_skadi_custom_debuff.prototype.GetModifierHealthRegenPercentage(self)
|
||||
return 1 + (self:GetAbility():GetSpecialValueFor("health_reduction") - 100) * 0.01
|
||||
end
|
||||
function modifier_item_skadi_custom_debuff.prototype.GetModifierPhysicalArmorBonus(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("armor_reduction")
|
||||
end
|
||||
modifier_item_skadi_custom_debuff = __TS__Decorate(
|
||||
modifier_item_skadi_custom_debuff,
|
||||
modifier_item_skadi_custom_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_skadi_custom_debuff"}
|
||||
)
|
||||
____exports.modifier_item_skadi_custom_debuff = modifier_item_skadi_custom_debuff
|
||||
return ____exports
|
||||
@@ -0,0 +1,196 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_soul_devourer_staff = __TS__Class()
|
||||
local item_soul_devourer_staff = ____exports.item_soul_devourer_staff
|
||||
item_soul_devourer_staff.name = "item_soul_devourer_staff"
|
||||
item_soul_devourer_staff.____file_path = "scripts/vscripts/items/default_items/item_soul_devourer_staff.lua"
|
||||
__TS__ClassExtends(item_soul_devourer_staff, BaseItem)
|
||||
function item_soul_devourer_staff.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_soul_devourer_staff"
|
||||
end
|
||||
item_soul_devourer_staff = __TS__Decorate(
|
||||
item_soul_devourer_staff,
|
||||
item_soul_devourer_staff,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_soul_devourer_staff"}
|
||||
)
|
||||
____exports.item_soul_devourer_staff = item_soul_devourer_staff
|
||||
____exports.modifier_soul_devourer_staff = __TS__Class()
|
||||
local modifier_soul_devourer_staff = ____exports.modifier_soul_devourer_staff
|
||||
modifier_soul_devourer_staff.name = "modifier_soul_devourer_staff"
|
||||
modifier_soul_devourer_staff.____file_path = "scripts/vscripts/items/default_items/item_soul_devourer_staff.lua"
|
||||
__TS__ClassExtends(modifier_soul_devourer_staff, BaseModifier)
|
||||
function modifier_soul_devourer_staff.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_soul_devourer_staff.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_soul_devourer_staff.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_soul_devourer_staff.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_soul_devourer_staff.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
|
||||
MODIFIER_PROPERTY_CAST_RANGE_BONUS,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_MANACOST_PERCENTAGE_STACKING,
|
||||
MODIFIER_EVENT_ON_DEATH,
|
||||
MODIFIER_PROPERTY_MANA_BONUS
|
||||
}
|
||||
end
|
||||
function modifier_soul_devourer_staff.prototype.OnDeath(self, event)
|
||||
if event.attacker ~= self:GetCaster() then
|
||||
return
|
||||
end
|
||||
local mana = self:GetCaster():GetMaxMana() * self:GetAbility():GetSpecialValueFor("kill_mana")
|
||||
self:GetCaster():GiveMana(mana)
|
||||
SendOverheadEventMessage(
|
||||
nil,
|
||||
OVERHEAD_ALERT_MANA_ADD,
|
||||
self:GetCaster(),
|
||||
mana,
|
||||
self:GetCaster():GetPlayerOwner()
|
||||
)
|
||||
local caster = self:GetCaster()
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return
|
||||
end
|
||||
local blessing = caster:FindModifierByName("modifier_soul_devourer_staff_buff")
|
||||
if not blessing then
|
||||
blessing = caster:AddNewModifier(
|
||||
self:GetParent(),
|
||||
ability,
|
||||
"modifier_soul_devourer_staff_buff",
|
||||
{}
|
||||
)
|
||||
end
|
||||
if blessing ~= nil then
|
||||
blessing:IncrementStackCount()
|
||||
end
|
||||
end
|
||||
function modifier_soul_devourer_staff.prototype.GetModifierPercentageManacostStacking(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_manacost_reduction")
|
||||
end
|
||||
function modifier_soul_devourer_staff.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_intellect")
|
||||
end
|
||||
function modifier_soul_devourer_staff.prototype.GetModifierCastRangeBonus(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_cast_range")
|
||||
end
|
||||
function modifier_soul_devourer_staff.prototype.GetModifierConstantManaRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana_regen")
|
||||
end
|
||||
function modifier_soul_devourer_staff.prototype.GetModifierManaBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana_special")
|
||||
end
|
||||
modifier_soul_devourer_staff = __TS__Decorate(
|
||||
modifier_soul_devourer_staff,
|
||||
modifier_soul_devourer_staff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_soul_devourer_staff"}
|
||||
)
|
||||
____exports.modifier_soul_devourer_staff = modifier_soul_devourer_staff
|
||||
____exports.modifier_soul_devourer_staff_buff = __TS__Class()
|
||||
local modifier_soul_devourer_staff_buff = ____exports.modifier_soul_devourer_staff_buff
|
||||
modifier_soul_devourer_staff_buff.name = "modifier_soul_devourer_staff_buff"
|
||||
modifier_soul_devourer_staff_buff.____file_path = "scripts/vscripts/items/default_items/item_soul_devourer_staff.lua"
|
||||
__TS__ClassExtends(modifier_soul_devourer_staff_buff, BaseModifier)
|
||||
function modifier_soul_devourer_staff_buff.prototype.IsHidden(self)
|
||||
if self:GetCaster():HasModifier("modifier_soul_devourer_staff") then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
function modifier_soul_devourer_staff_buff.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_soul_devourer_staff_buff.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_soul_devourer_staff_buff.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_soul_devourer_staff_buff.prototype.GetTexture(self)
|
||||
return "default_items/soul_devourer_staff"
|
||||
end
|
||||
function modifier_soul_devourer_staff_buff.prototype.refreshStackGrowthHudDuration(self, ability)
|
||||
local interval = ability:GetSpecialValueFor("stack_growth_interval") > 0 and ability:GetSpecialValueFor("stack_growth_interval") or 60
|
||||
local baseDur = ability:GetSpecialValueFor("stack_growth_duration")
|
||||
if baseDur <= 0 then
|
||||
baseDur = interval + 0.5
|
||||
elseif baseDur <= interval then
|
||||
baseDur = interval + 0.5
|
||||
end
|
||||
self:SetDuration(baseDur + 0.2, true)
|
||||
end
|
||||
function modifier_soul_devourer_staff_buff.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return
|
||||
end
|
||||
local interval = ability:GetSpecialValueFor("stack_growth_interval") > 0 and ability:GetSpecialValueFor("stack_growth_interval") or 60
|
||||
self:StartIntervalThink(interval)
|
||||
self:refreshStackGrowthHudDuration(ability)
|
||||
end
|
||||
function modifier_soul_devourer_staff_buff.prototype.OnIntervalThink(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if not parent or not parent:IsAlive() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local ability = self:GetAbility()
|
||||
if not caster or not ability then
|
||||
return
|
||||
end
|
||||
if not caster:HasModifier("modifier_soul_devourer_staff") then
|
||||
return
|
||||
end
|
||||
local stacks = self:GetStackCount()
|
||||
if stacks <= 0 then
|
||||
return
|
||||
end
|
||||
local pct = ability:GetSpecialValueFor("stack_growth_percent")
|
||||
local growthPct = pct > 0 and pct or 20
|
||||
local mult = 1 + growthPct / 100
|
||||
local newStacks = math.ceil(stacks * mult)
|
||||
if newStacks > stacks then
|
||||
self:SetStackCount(newStacks)
|
||||
end
|
||||
self:refreshStackGrowthHudDuration(ability)
|
||||
end
|
||||
function modifier_soul_devourer_staff_buff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_MANA_BONUS}
|
||||
end
|
||||
function modifier_soul_devourer_staff_buff.prototype.GetModifierManaBonus(self)
|
||||
if self:GetCaster():HasModifier("modifier_soul_devourer_staff") then
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana") * self:GetStackCount()
|
||||
end
|
||||
return 0
|
||||
end
|
||||
modifier_soul_devourer_staff_buff = __TS__Decorate(
|
||||
modifier_soul_devourer_staff_buff,
|
||||
modifier_soul_devourer_staff_buff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_soul_devourer_staff_buff"}
|
||||
)
|
||||
____exports.modifier_soul_devourer_staff_buff = modifier_soul_devourer_staff_buff
|
||||
return ____exports
|
||||
@@ -0,0 +1,166 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_storm = __TS__Class()
|
||||
local item_storm = ____exports.item_storm
|
||||
item_storm.name = "item_storm"
|
||||
item_storm.____file_path = "scripts/vscripts/items/default_items/item_storm.lua"
|
||||
__TS__ClassExtends(item_storm, BaseItem)
|
||||
function item_storm.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_storm"
|
||||
end
|
||||
item_storm = __TS__Decorate(
|
||||
item_storm,
|
||||
item_storm,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_storm"}
|
||||
)
|
||||
____exports.item_storm = item_storm
|
||||
____exports.modifier_storm = __TS__Class()
|
||||
local modifier_storm = ____exports.modifier_storm
|
||||
modifier_storm.name = "modifier_storm"
|
||||
modifier_storm.____file_path = "scripts/vscripts/items/default_items/item_storm.lua"
|
||||
__TS__ClassExtends(modifier_storm, BaseModifier)
|
||||
function modifier_storm.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_storm.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_storm.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_storm.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_EVENT_ON_ATTACK_LANDED}
|
||||
end
|
||||
function modifier_storm.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_storm.prototype.OnAttackLanded(self, event)
|
||||
if event.attacker ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
if RandomInt(1, 100) > self:GetAbility():GetSpecialValueFor("chance") then
|
||||
return
|
||||
end
|
||||
local ____opt_0 = self:GetAbility()
|
||||
if (____opt_0 and ____opt_0:IsCooldownReady()) == false then
|
||||
return
|
||||
end
|
||||
self:GetAbility():GetSpecialValueFor("bolt_damage")
|
||||
event.target:AddNewModifier(
|
||||
self:GetParent(),
|
||||
self:GetAbility(),
|
||||
"modifier_storm_dps",
|
||||
{
|
||||
duration = 0.26,
|
||||
attacker_entindex = self:GetCaster():entindex()
|
||||
}
|
||||
)
|
||||
self:GetAbility():StartCooldown(self:GetAbility():GetSpecialValueFor("ability_cooldown"))
|
||||
end
|
||||
modifier_storm = __TS__Decorate(
|
||||
modifier_storm,
|
||||
modifier_storm,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_storm"}
|
||||
)
|
||||
____exports.modifier_storm = modifier_storm
|
||||
____exports.modifier_storm_dps = __TS__Class()
|
||||
local modifier_storm_dps = ____exports.modifier_storm_dps
|
||||
modifier_storm_dps.name = "modifier_storm_dps"
|
||||
modifier_storm_dps.____file_path = "scripts/vscripts/items/default_items/item_storm.lua"
|
||||
__TS__ClassExtends(modifier_storm_dps, BaseModifier)
|
||||
function modifier_storm_dps.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_storm_dps.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_storm_dps.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_storm_dps.prototype.OnCreated(self, params)
|
||||
self:SetStackCount(3)
|
||||
self:StartIntervalThink(0.25)
|
||||
end
|
||||
function modifier_storm_dps.prototype.OnIntervalThink(self)
|
||||
if self:GetStackCount() == 0 then
|
||||
return
|
||||
end
|
||||
self:SetDuration(0.26, true)
|
||||
self:SetStackCount(self:GetStackCount() - 1)
|
||||
local victim = self:GetParent()
|
||||
local attacker = self:GetCaster()
|
||||
local particle = ParticleManager:CreateParticle("particles/items_fx/chain_lightning.vpcf", PATTACH_ABSORIGIN_FOLLOW, victim)
|
||||
if attacker then
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
particle,
|
||||
0,
|
||||
attacker,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
attacker:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
else
|
||||
ParticleManager:SetParticleControl(
|
||||
particle,
|
||||
0,
|
||||
victim:GetAbsOrigin()
|
||||
)
|
||||
end
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
particle,
|
||||
1,
|
||||
victim,
|
||||
PATTACH_POINT_FOLLOW,
|
||||
"attach_hitloc",
|
||||
victim:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
ParticleManager:SetParticleControl(
|
||||
particle,
|
||||
2,
|
||||
Vector(1, 1, 1)
|
||||
)
|
||||
ParticleManager:ReleaseParticleIndex(particle)
|
||||
local ability = self:GetAbility()
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
if ability ~= nil and victim ~= nil and attacker ~= nil then
|
||||
ApplyDamage({
|
||||
victim = victim,
|
||||
attacker = attacker,
|
||||
damage = ability:GetSpecialValueFor("bolt_damage"),
|
||||
damage_type = DAMAGE_TYPE_MAGICAL,
|
||||
damage_flags = DOTA_DAMAGE_FLAG_NONE,
|
||||
ability = ability
|
||||
})
|
||||
end
|
||||
self:GetParent():AddNewModifier(
|
||||
self:GetParent(),
|
||||
self:GetAbility(),
|
||||
"modifier_stunned",
|
||||
{duration = self:GetAbility():GetSpecialValueFor("stun")}
|
||||
)
|
||||
end
|
||||
function modifier_storm_dps.prototype.GetTexture(self)
|
||||
return "default_items/storm"
|
||||
end
|
||||
modifier_storm_dps = __TS__Decorate(
|
||||
modifier_storm_dps,
|
||||
modifier_storm_dps,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_storm_dps"}
|
||||
)
|
||||
____exports.modifier_storm_dps = modifier_storm_dps
|
||||
return ____exports
|
||||
@@ -0,0 +1,211 @@
|
||||
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__Decorate = ____lualib.__TS__Decorate
|
||||
local ____exports = {}
|
||||
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
|
||||
local BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____WaveManager = require("WaveManager")
|
||||
local WaveManager = ____WaveManager.WaveManager
|
||||
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local ____crystal_currency = require("crystal_currency")
|
||||
local CrystalCurrency = ____crystal_currency.CrystalCurrency
|
||||
local ____dps_tracker = require("abilities.modifiers.dps_tracker")
|
||||
local dps_tracker = ____dps_tracker.dps_tracker
|
||||
____exports.item_test = __TS__Class()
|
||||
local item_test = ____exports.item_test
|
||||
item_test.name = "item_test"
|
||||
item_test.____file_path = "scripts/vscripts/items/default_items/item_test.lua"
|
||||
__TS__ClassExtends(item_test, BaseItem)
|
||||
function item_test.prototype.OnSpellStart(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local winnerTeam = caster:GetTeamNumber()
|
||||
local readyCheckStarted = WaveManager:getInstance():StartCutsceneReadyCheck("camera_start_ending")
|
||||
if not readyCheckStarted then
|
||||
local mgr = GameRules.CutsceneManager
|
||||
if mgr and not mgr:isCutsceneActive() then
|
||||
mgr:startScene("camera_start_ending", {force = true})
|
||||
GameRules:SendCustomMessage("<font color='#f6d28b'>[item_test] Фолбэк: катсцена запущена напрямую</font>", 0, 0)
|
||||
else
|
||||
GameRules:SendCustomMessage("<font color='#ff7070'>[item_test] Не удалось запустить катсцену</font>", 0, 0)
|
||||
end
|
||||
else
|
||||
GameRules:SendCustomMessage("<font color='#8be39f'>[item_test] Открыт ready-check катсцены</font>", 0, 0)
|
||||
end
|
||||
self:GetCaster():AddAbility(dps_tracker.name)
|
||||
self:GetCaster():AddNewModifier(
|
||||
self:GetCaster(),
|
||||
self,
|
||||
"modifier_effects_effect",
|
||||
{}
|
||||
)
|
||||
local cursorTarget = self:GetCursorTarget()
|
||||
print("[item_test] Cursor target: " .. (cursorTarget and cursorTarget:GetName() or "none"))
|
||||
local owner = self:GetCaster()
|
||||
local modifiers = owner:FindAllModifiers()
|
||||
local modifierNames = __TS__ArrayMap(
|
||||
modifiers,
|
||||
function(____, mod) return mod:GetName() end
|
||||
)
|
||||
print("[item_test] Modifiers on owner: " .. table.concat(modifierNames, ", "))
|
||||
CrystalCurrency:getInstance():addCrystals(
|
||||
self:GetCaster():GetPlayerID(),
|
||||
100
|
||||
)
|
||||
addLuck(
|
||||
nil,
|
||||
self:GetCaster(),
|
||||
10
|
||||
)
|
||||
addCritMult(
|
||||
nil,
|
||||
self:GetCaster(),
|
||||
30
|
||||
)
|
||||
if self:GetCaster():HasModifier("modifier_test_inf") then
|
||||
self:GetCaster():RemoveModifierByName("modifier_test_inf")
|
||||
else
|
||||
self:GetCaster():AddNewModifier(
|
||||
self:GetCaster(),
|
||||
self,
|
||||
"modifier_test_inf",
|
||||
{}
|
||||
)
|
||||
end
|
||||
end
|
||||
item_test = __TS__Decorate(
|
||||
item_test,
|
||||
item_test,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_test"}
|
||||
)
|
||||
____exports.item_test = item_test
|
||||
____exports.modifier_test = __TS__Class()
|
||||
local modifier_test = ____exports.modifier_test
|
||||
modifier_test.name = "modifier_test"
|
||||
modifier_test.____file_path = "scripts/vscripts/items/default_items/item_test.lua"
|
||||
__TS__ClassExtends(modifier_test, BaseModifier)
|
||||
function modifier_test.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_test.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_test.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_test.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_test.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local stackingCritMod = self:GetParent():FindModifierByName("modifier_stacking_crit")
|
||||
if stackingCritMod then
|
||||
local ability = self:GetAbility()
|
||||
stackingCritMod:AddCustomCrit(0, 500, "item_test", ability)
|
||||
end
|
||||
end
|
||||
function modifier_test.prototype.OnDestroy(self)
|
||||
if IsClient() then
|
||||
return
|
||||
end
|
||||
local parent = self:GetParent()
|
||||
if not parent or not IsValidEntity(parent) then
|
||||
return
|
||||
end
|
||||
local stackingCritModifier = parent:FindModifierByName("modifier_stacking_crit")
|
||||
if not stackingCritModifier then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
stackingCritModifier:RemoveCrit("item_test", ability)
|
||||
end
|
||||
function modifier_test.prototype.GetStatusEffectName(self)
|
||||
return "particles/status_fx/status_effect_abaddon_borrowed_time.vpcf"
|
||||
end
|
||||
function modifier_test.prototype.GetEffectName(self)
|
||||
return "particles/units/heroes/hero_abaddon/abaddon_borrowed_time.vpcf"
|
||||
end
|
||||
function modifier_test.prototype.StatusEffectPriority(self)
|
||||
return 10
|
||||
end
|
||||
modifier_test = __TS__Decorate(
|
||||
modifier_test,
|
||||
modifier_test,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_test"}
|
||||
)
|
||||
____exports.modifier_test = modifier_test
|
||||
____exports.modifier_test_inf = __TS__Class()
|
||||
local modifier_test_inf = ____exports.modifier_test_inf
|
||||
modifier_test_inf.name = "modifier_test_inf"
|
||||
modifier_test_inf.____file_path = "scripts/vscripts/items/default_items/item_test.lua"
|
||||
__TS__ClassExtends(modifier_test_inf, BaseModifier)
|
||||
function modifier_test_inf.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.bonusStrength = 1000000
|
||||
self.bonusAgility = 1000000
|
||||
self.bonusIntelligence = 1000000
|
||||
end
|
||||
function modifier_test_inf.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, MODIFIER_PROPERTY_STATS_AGILITY_BONUS, MODIFIER_PROPERTY_STATS_INTELLECT_BONUS}
|
||||
end
|
||||
function modifier_test_inf.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self.bonusStrength
|
||||
end
|
||||
function modifier_test_inf.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self.bonusAgility
|
||||
end
|
||||
function modifier_test_inf.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self.bonusIntelligence
|
||||
end
|
||||
modifier_test_inf = __TS__Decorate(
|
||||
modifier_test_inf,
|
||||
modifier_test_inf,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_test_inf"}
|
||||
)
|
||||
____exports.modifier_test_inf = modifier_test_inf
|
||||
____exports.modifier_test_agi = __TS__Class()
|
||||
local modifier_test_agi = ____exports.modifier_test_agi
|
||||
modifier_test_agi.name = "modifier_test_agi"
|
||||
modifier_test_agi.____file_path = "scripts/vscripts/items/default_items/item_test.lua"
|
||||
__TS__ClassExtends(modifier_test_agi, BaseModifier)
|
||||
function modifier_test_agi.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.AgiPct = 1000
|
||||
self.Lock = false
|
||||
end
|
||||
function modifier_test_agi.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_STATS_AGILITY_BONUS}
|
||||
end
|
||||
function modifier_test_agi.prototype.GetModifierBonusStats_Agility(self)
|
||||
if not IsServer() then
|
||||
return 0
|
||||
end
|
||||
if self.Lock then
|
||||
return 0
|
||||
end
|
||||
self.Lock = true
|
||||
local agi = self:GetParent():GetAgility()
|
||||
self.Lock = false
|
||||
local bonus = self.AgiPct * agi / 100
|
||||
return bonus
|
||||
end
|
||||
modifier_test_agi = __TS__Decorate(
|
||||
modifier_test_agi,
|
||||
modifier_test_agi,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_test_agi"}
|
||||
)
|
||||
____exports.modifier_test_agi = modifier_test_agi
|
||||
return ____exports
|
||||
@@ -0,0 +1,106 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____modifier_stats_multiplier = require("modifiers.modifier_stats_multiplier")
|
||||
local removeStatsMultiplierSource = ____modifier_stats_multiplier.removeStatsMultiplierSource
|
||||
local setStatsMultiplierSource = ____modifier_stats_multiplier.setStatsMultiplierSource
|
||||
local ULTIMATE_CROWN_SOURCE_PREFIX = "item_ultimate_crown"
|
||||
____exports.item_ultimate_crown = __TS__Class()
|
||||
local item_ultimate_crown = ____exports.item_ultimate_crown
|
||||
item_ultimate_crown.name = "item_ultimate_crown"
|
||||
item_ultimate_crown.____file_path = "scripts/vscripts/items/default_items/item_ultimate_crown.lua"
|
||||
__TS__ClassExtends(item_ultimate_crown, BaseItem)
|
||||
function item_ultimate_crown.prototype.GetIntrinsicModifierName(self)
|
||||
return ____exports.modifier_item_ultimate_crown.name
|
||||
end
|
||||
item_ultimate_crown = __TS__Decorate(
|
||||
item_ultimate_crown,
|
||||
item_ultimate_crown,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_ultimate_crown"}
|
||||
)
|
||||
____exports.item_ultimate_crown = item_ultimate_crown
|
||||
____exports.modifier_item_ultimate_crown = __TS__Class()
|
||||
local modifier_item_ultimate_crown = ____exports.modifier_item_ultimate_crown
|
||||
modifier_item_ultimate_crown.name = "modifier_item_ultimate_crown"
|
||||
modifier_item_ultimate_crown.____file_path = "scripts/vscripts/items/default_items/item_ultimate_crown.lua"
|
||||
__TS__ClassExtends(modifier_item_ultimate_crown, BaseModifier)
|
||||
function modifier_item_ultimate_crown.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.statsSourceId = ""
|
||||
end
|
||||
function modifier_item_ultimate_crown.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_ultimate_crown.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_ultimate_crown.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_ultimate_crown.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_ultimate_crown.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
if not (hero and hero:IsRealHero()) then
|
||||
return
|
||||
end
|
||||
self.statsSourceId = (ULTIMATE_CROWN_SOURCE_PREFIX .. "_") .. tostring(hero:entindex())
|
||||
local ability = self:GetAbility()
|
||||
setStatsMultiplierSource(
|
||||
nil,
|
||||
hero,
|
||||
self.statsSourceId,
|
||||
function()
|
||||
if not hero or not IsValidEntity(hero) or not hero:IsRealHero() then
|
||||
return 0
|
||||
end
|
||||
return ability and ability:GetSpecialValueFor("all_stats_pct") or 0
|
||||
end,
|
||||
"all_stats_pct"
|
||||
)
|
||||
end
|
||||
function modifier_item_ultimate_crown.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if self.statsSourceId == "" then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
if hero and IsValidEntity(hero) then
|
||||
removeStatsMultiplierSource(nil, hero, self.statsSourceId)
|
||||
end
|
||||
self.statsSourceId = ""
|
||||
end
|
||||
function modifier_item_ultimate_crown.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, MODIFIER_PROPERTY_STATS_AGILITY_BONUS, MODIFIER_PROPERTY_STATS_INTELLECT_BONUS}
|
||||
end
|
||||
function modifier_item_ultimate_crown.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_all_stats")
|
||||
end
|
||||
function modifier_item_ultimate_crown.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_all_stats")
|
||||
end
|
||||
function modifier_item_ultimate_crown.prototype.GetModifierBonusStats_Intellect(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_all_stats")
|
||||
end
|
||||
modifier_item_ultimate_crown = __TS__Decorate(
|
||||
modifier_item_ultimate_crown,
|
||||
modifier_item_ultimate_crown,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_ultimate_crown"}
|
||||
)
|
||||
____exports.modifier_item_ultimate_crown = modifier_item_ultimate_crown
|
||||
return ____exports
|
||||
@@ -0,0 +1,160 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____vampirism = require("utils.vampirism")
|
||||
local addPhysicalVampirism = ____vampirism.addPhysicalVampirism
|
||||
local reducePhysicalVampirism = ____vampirism.reducePhysicalVampirism
|
||||
____exports.item_vampire_claw = __TS__Class()
|
||||
local item_vampire_claw = ____exports.item_vampire_claw
|
||||
item_vampire_claw.name = "item_vampire_claw"
|
||||
item_vampire_claw.____file_path = "scripts/vscripts/items/default_items/item_vampire_claw.lua"
|
||||
__TS__ClassExtends(item_vampire_claw, BaseItem)
|
||||
function item_vampire_claw.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_vampire_claw"
|
||||
end
|
||||
function item_vampire_claw.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", "particles/econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodbath_eztzhok.vpcf", context)
|
||||
end
|
||||
function item_vampire_claw.prototype.GetAbilityTextureName(self)
|
||||
local charges = self:GetCurrentCharges()
|
||||
if charges < 7 then
|
||||
return "default_items/vampire_claw/vampire_claw_1"
|
||||
elseif charges < 14 then
|
||||
return "default_items/vampire_claw/vampire_claw_2"
|
||||
elseif charges < 21 then
|
||||
return "default_items/vampire_claw/vampire_claw_3"
|
||||
else
|
||||
return "default_items/vampire_claw/vampire_claw_4"
|
||||
end
|
||||
end
|
||||
function item_vampire_claw.prototype.OnSpellStart(self)
|
||||
local charges = self:GetCurrentCharges()
|
||||
if charges <= 0 then
|
||||
return
|
||||
end
|
||||
local caster = self:GetCaster()
|
||||
local healing = charges * self:GetSpecialValueFor("heal_per_charge")
|
||||
caster:Heal(healing, self)
|
||||
self:SetCurrentCharges(0)
|
||||
SendOverheadEventMessage(
|
||||
nil,
|
||||
OVERHEAD_ALERT_HEAL,
|
||||
caster,
|
||||
healing,
|
||||
caster:GetPlayerOwner()
|
||||
)
|
||||
local particle = ParticleManager:CreateParticle("particles/econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodbath_eztzhok.vpcf", PATTACH_ABSORIGIN_FOLLOW, caster)
|
||||
ParticleManager:SetParticleControlEnt(
|
||||
particle,
|
||||
1,
|
||||
caster,
|
||||
PATTACH_ABSORIGIN_FOLLOW,
|
||||
"",
|
||||
caster:GetAbsOrigin(),
|
||||
true
|
||||
)
|
||||
EmitSoundOn("hero_bloodseeker.bloodRite.silence", caster)
|
||||
end
|
||||
item_vampire_claw = __TS__Decorate(
|
||||
item_vampire_claw,
|
||||
item_vampire_claw,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_vampire_claw"}
|
||||
)
|
||||
____exports.item_vampire_claw = item_vampire_claw
|
||||
____exports.modifier_item_vampire_claw = __TS__Class()
|
||||
local modifier_item_vampire_claw = ____exports.modifier_item_vampire_claw
|
||||
modifier_item_vampire_claw.name = "modifier_item_vampire_claw"
|
||||
modifier_item_vampire_claw.____file_path = "scripts/vscripts/items/default_items/item_vampire_claw.lua"
|
||||
__TS__ClassExtends(modifier_item_vampire_claw, BaseModifier)
|
||||
function modifier_item_vampire_claw.prototype.____constructor(self, ...)
|
||||
BaseModifier.prototype.____constructor(self, ...)
|
||||
self.bonusStr = 0
|
||||
self.bonusDamage = 0
|
||||
self.chargesPerBossAttack = 0
|
||||
self.chargesPerCreepAttack = 0
|
||||
self.maxCharges = 0
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.IsPurgeException(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.RemoveOnDeath(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.IsDebuff(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, MODIFIER_EVENT_ON_TAKEDAMAGE}
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.OnCreated(self, params)
|
||||
self:OnRefresh()
|
||||
local hero = self:GetParent()
|
||||
local vampirism = self:GetAbility():GetSpecialValueFor("vampirism")
|
||||
if vampirism > 0 then
|
||||
addPhysicalVampirism(nil, hero, vampirism)
|
||||
end
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.OnRefresh(self, params)
|
||||
local ability = self:GetAbility()
|
||||
if not ability or ability:IsNull() then
|
||||
return
|
||||
end
|
||||
self.bonusStr = ability:GetSpecialValueFor("bonus_str")
|
||||
self.bonusDamage = ability:GetSpecialValueFor("bonus_damage")
|
||||
self.chargesPerBossAttack = ability:GetSpecialValueFor("charges_for_attack_boss")
|
||||
self.chargesPerCreepAttack = ability:GetSpecialValueFor("charges_for_attack_creep")
|
||||
self.maxCharges = ability:GetSpecialValueFor("max_charges")
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
local vampirism = self:GetAbility():GetSpecialValueFor("vampirism")
|
||||
if vampirism > 0 then
|
||||
reducePhysicalVampirism(nil, hero, vampirism)
|
||||
end
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.GetModifierBonusStats_Strength(self)
|
||||
return self.bonusStr
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self.bonusDamage
|
||||
end
|
||||
function modifier_item_vampire_claw.prototype.OnTakeDamage(self, event)
|
||||
if event.attacker ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return
|
||||
end
|
||||
local currentCharges = ability:GetCurrentCharges()
|
||||
local bonusChargesPerAttack = self.chargesPerCreepAttack
|
||||
ability:SetCurrentCharges(math.min(currentCharges + bonusChargesPerAttack, self.maxCharges))
|
||||
end
|
||||
modifier_item_vampire_claw = __TS__Decorate(
|
||||
modifier_item_vampire_claw,
|
||||
modifier_item_vampire_claw,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_vampire_claw"}
|
||||
)
|
||||
____exports.modifier_item_vampire_claw = modifier_item_vampire_claw
|
||||
return ____exports
|
||||
@@ -0,0 +1,70 @@
|
||||
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 ____vampirism = require("utils.vampirism")
|
||||
local addMagicalVampirism = ____vampirism.addMagicalVampirism
|
||||
local reduceMagicalVampirism = ____vampirism.reduceMagicalVampirism
|
||||
____exports.item_voodoo_mask_custom = __TS__Class()
|
||||
local item_voodoo_mask_custom = ____exports.item_voodoo_mask_custom
|
||||
item_voodoo_mask_custom.name = "item_voodoo_mask_custom"
|
||||
item_voodoo_mask_custom.____file_path = "scripts/vscripts/items/default_items/item_voodoo_mask_custom.lua"
|
||||
__TS__ClassExtends(item_voodoo_mask_custom, BaseAbility)
|
||||
function item_voodoo_mask_custom.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_voodoo_mask_custom"
|
||||
end
|
||||
item_voodoo_mask_custom = __TS__Decorate(
|
||||
item_voodoo_mask_custom,
|
||||
item_voodoo_mask_custom,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_voodoo_mask_custom"}
|
||||
)
|
||||
____exports.item_voodoo_mask_custom = item_voodoo_mask_custom
|
||||
____exports.modifier_item_voodoo_mask_custom = __TS__Class()
|
||||
local modifier_item_voodoo_mask_custom = ____exports.modifier_item_voodoo_mask_custom
|
||||
modifier_item_voodoo_mask_custom.name = "modifier_item_voodoo_mask_custom"
|
||||
modifier_item_voodoo_mask_custom.____file_path = "scripts/vscripts/items/default_items/item_voodoo_mask_custom.lua"
|
||||
__TS__ClassExtends(modifier_item_voodoo_mask_custom, BaseModifier)
|
||||
function modifier_item_voodoo_mask_custom.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_voodoo_mask_custom.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_voodoo_mask_custom.prototype.GetAttributes(self)
|
||||
return MODIFIER_ATTRIBUTE_MULTIPLE
|
||||
end
|
||||
function modifier_item_voodoo_mask_custom.prototype.OnCreated(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
local lifesteal = self:GetAbility():GetSpecialValueFor("lifesteal")
|
||||
if lifesteal > 0 then
|
||||
addMagicalVampirism(nil, hero, lifesteal)
|
||||
end
|
||||
end
|
||||
function modifier_item_voodoo_mask_custom.prototype.OnDestroy(self)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
local hero = self:GetParent()
|
||||
local lifesteal = self:GetAbility():GetSpecialValueFor("lifesteal")
|
||||
if lifesteal > 0 then
|
||||
reduceMagicalVampirism(nil, hero, lifesteal)
|
||||
end
|
||||
end
|
||||
modifier_item_voodoo_mask_custom = __TS__Decorate(
|
||||
modifier_item_voodoo_mask_custom,
|
||||
modifier_item_voodoo_mask_custom,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_voodoo_mask_custom"}
|
||||
)
|
||||
____exports.modifier_item_voodoo_mask_custom = modifier_item_voodoo_mask_custom
|
||||
return ____exports
|
||||
@@ -0,0 +1,83 @@
|
||||
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 BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
local ____luck = require("utils.luck")
|
||||
local rollLuckChance = ____luck.rollLuckChance
|
||||
local MELEE_STRENGTH_BLOCK_PCT = 50
|
||||
--- Щит воина: запас здоровья, реген, шанс заблокировать физический урон от атак; шанс для героев с Luck.
|
||||
____exports.item_warrior_shield = __TS__Class()
|
||||
local item_warrior_shield = ____exports.item_warrior_shield
|
||||
item_warrior_shield.name = "item_warrior_shield"
|
||||
item_warrior_shield.____file_path = "scripts/vscripts/items/default_items/item_warrior_shield.lua"
|
||||
__TS__ClassExtends(item_warrior_shield, BaseItem)
|
||||
function item_warrior_shield.prototype.GetIntrinsicModifierName(self)
|
||||
return ____exports.modifier_item_warrior_shield.name
|
||||
end
|
||||
item_warrior_shield = __TS__Decorate(
|
||||
item_warrior_shield,
|
||||
item_warrior_shield,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_warrior_shield"}
|
||||
)
|
||||
____exports.item_warrior_shield = item_warrior_shield
|
||||
____exports.modifier_item_warrior_shield = __TS__Class()
|
||||
local modifier_item_warrior_shield = ____exports.modifier_item_warrior_shield
|
||||
modifier_item_warrior_shield.name = "modifier_item_warrior_shield"
|
||||
modifier_item_warrior_shield.____file_path = "scripts/vscripts/items/default_items/item_warrior_shield.lua"
|
||||
__TS__ClassExtends(modifier_item_warrior_shield, BaseModifier)
|
||||
function modifier_item_warrior_shield.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_warrior_shield.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_warrior_shield.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PHYSICAL_CONSTANT_BLOCK, MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT, MODIFIER_PROPERTY_HEALTH_BONUS}
|
||||
end
|
||||
function modifier_item_warrior_shield.prototype.GetModifierHealthBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_health")
|
||||
end
|
||||
function modifier_item_warrior_shield.prototype.GetModifierConstantHealthRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_health_regen")
|
||||
end
|
||||
function modifier_item_warrior_shield.prototype.GetModifierPhysical_ConstantBlock(self)
|
||||
if not IsServer() then
|
||||
return 0
|
||||
end
|
||||
local ability = self:GetAbility()
|
||||
if not ability then
|
||||
return 0
|
||||
end
|
||||
local chancePct = ability:GetSpecialValueFor("damage_block_chance")
|
||||
local parent = self:GetParent()
|
||||
local ____parent_IsRealHero_result_0
|
||||
if parent:IsRealHero() then
|
||||
____parent_IsRealHero_result_0 = rollLuckChance(nil, parent, chancePct / 100)
|
||||
else
|
||||
____parent_IsRealHero_result_0 = RollPercentage(chancePct)
|
||||
end
|
||||
local blocked = ____parent_IsRealHero_result_0
|
||||
if blocked then
|
||||
local baseBlock = parent:IsRangedAttacker() and ability:GetSpecialValueFor("damage_block") * 0.5 or ability:GetSpecialValueFor("damage_block")
|
||||
if not parent:IsRealHero() or parent:IsRangedAttacker() then
|
||||
return baseBlock
|
||||
end
|
||||
return baseBlock + parent:GetStrength() * (MELEE_STRENGTH_BLOCK_PCT / 100)
|
||||
end
|
||||
return 0
|
||||
end
|
||||
modifier_item_warrior_shield = __TS__Decorate(
|
||||
modifier_item_warrior_shield,
|
||||
modifier_item_warrior_shield,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_warrior_shield"}
|
||||
)
|
||||
____exports.modifier_item_warrior_shield = modifier_item_warrior_shield
|
||||
return ____exports
|
||||
@@ -0,0 +1,202 @@
|
||||
local ____lualib = require("lualib_bundle")
|
||||
local __TS__Class = ____lualib.__TS__Class
|
||||
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
|
||||
local __TS__Decorate = ____lualib.__TS__Decorate
|
||||
local __TS__StringStartsWith = ____lualib.__TS__StringStartsWith
|
||||
local __TS__StringIncludes = ____lualib.__TS__StringIncludes
|
||||
local ____exports = {}
|
||||
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
|
||||
local BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
--- Холодный дебафф Corrosion (как Cold Attack у Skadi).
|
||||
local ZOMBIE_SLAYER_SKADI_DEBUFF_PARTICLE = "particles/generic_gameplay/generic_slowed_cold.vpcf"
|
||||
____exports.item_zombie_slayer = __TS__Class()
|
||||
local item_zombie_slayer = ____exports.item_zombie_slayer
|
||||
item_zombie_slayer.name = "item_zombie_slayer"
|
||||
item_zombie_slayer.____file_path = "scripts/vscripts/items/default_items/item_zombie_slayer copy.lua"
|
||||
__TS__ClassExtends(item_zombie_slayer, BaseItem)
|
||||
function item_zombie_slayer.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", "particles/units/heroes/hero_skeletonking/wraith_king_curse_debuff_slash.vpcf", context)
|
||||
PrecacheResource("particle", "particles/items2_fx/mage_slayer_debuff.vpcf", context)
|
||||
PrecacheResource("particle", ZOMBIE_SLAYER_SKADI_DEBUFF_PARTICLE, context)
|
||||
end
|
||||
function item_zombie_slayer.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_zombie_slayer"
|
||||
end
|
||||
item_zombie_slayer = __TS__Decorate(
|
||||
item_zombie_slayer,
|
||||
item_zombie_slayer,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_zombie_slayer"}
|
||||
)
|
||||
____exports.item_zombie_slayer = item_zombie_slayer
|
||||
____exports.modifier_item_zombie_slayer = __TS__Class()
|
||||
local modifier_item_zombie_slayer = ____exports.modifier_item_zombie_slayer
|
||||
modifier_item_zombie_slayer.name = "modifier_item_zombie_slayer"
|
||||
modifier_item_zombie_slayer.____file_path = "scripts/vscripts/items/default_items/item_zombie_slayer copy.lua"
|
||||
__TS__ClassExtends(modifier_item_zombie_slayer, BaseModifier)
|
||||
function modifier_item_zombie_slayer.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_HEALTH_BONUS,
|
||||
MODIFIER_EVENT_ON_ATTACK_LANDED
|
||||
}
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.GetModifierHealthBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_health")
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.GetModifierConstantManaRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana_regen")
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_agility")
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.OnAttackLanded(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if event.attacker ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
if not event.target or event.target:IsBuilding() or event.target:IsOther() then
|
||||
return
|
||||
end
|
||||
if event.target ~= nil then
|
||||
local ____self_4 = event.target
|
||||
local ____self_4_AddNewModifier_5 = ____self_4.AddNewModifier
|
||||
local ____temp_2 = self:GetParent()
|
||||
local ____temp_3 = self:GetAbility()
|
||||
local ____opt_0 = self:GetAbility()
|
||||
____self_4_AddNewModifier_5(
|
||||
____self_4,
|
||||
____temp_2,
|
||||
____temp_3,
|
||||
"modifier_item_zombie_slayer_debuff_2",
|
||||
{duration = ____opt_0 and ____opt_0:GetSpecialValueFor("debuff_duration")}
|
||||
)
|
||||
local ____this_7
|
||||
____this_7 = event.target
|
||||
local ____opt_6 = ____this_7.GetUnitName
|
||||
local targetName = ____opt_6 and ____opt_6(____this_7) or ""
|
||||
if __TS__StringStartsWith(targetName, "npc_wave") and not __TS__StringIncludes(
|
||||
string.lower(targetName),
|
||||
"boss"
|
||||
) then
|
||||
ParticleManager:CreateParticle("particles/units/heroes/hero_skeletonking/wraith_king_curse_debuff_slash.vpcf", PATTACH_ABSORIGIN_FOLLOW, event.target)
|
||||
local ____self_12 = event.target
|
||||
local ____self_12_AddNewModifier_13 = ____self_12.AddNewModifier
|
||||
local ____temp_10 = self:GetParent()
|
||||
local ____temp_11 = self:GetAbility()
|
||||
local ____opt_8 = self:GetAbility()
|
||||
____self_12_AddNewModifier_13(
|
||||
____self_12,
|
||||
____temp_10,
|
||||
____temp_11,
|
||||
"modifier_item_zombie_slayer_debuff",
|
||||
{duration = ____opt_8 and ____opt_8:GetSpecialValueFor("debuff_duration")}
|
||||
)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
modifier_item_zombie_slayer = __TS__Decorate(
|
||||
modifier_item_zombie_slayer,
|
||||
modifier_item_zombie_slayer,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_zombie_slayer"}
|
||||
)
|
||||
____exports.modifier_item_zombie_slayer = modifier_item_zombie_slayer
|
||||
____exports.modifier_item_zombie_slayer_debuff = __TS__Class()
|
||||
local modifier_item_zombie_slayer_debuff = ____exports.modifier_item_zombie_slayer_debuff
|
||||
modifier_item_zombie_slayer_debuff.name = "modifier_item_zombie_slayer_debuff"
|
||||
modifier_item_zombie_slayer_debuff.____file_path = "scripts/vscripts/items/default_items/item_zombie_slayer copy.lua"
|
||||
__TS__ClassExtends(modifier_item_zombie_slayer_debuff, BaseModifier)
|
||||
function modifier_item_zombie_slayer_debuff.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.GetEffectName(self)
|
||||
return "particles/items2_fx/mage_slayer_debuff.vpcf"
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.GetModifierIncomingDamage_Percentage(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("incress_damage")
|
||||
end
|
||||
modifier_item_zombie_slayer_debuff = __TS__Decorate(
|
||||
modifier_item_zombie_slayer_debuff,
|
||||
modifier_item_zombie_slayer_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_zombie_slayer_debuff"}
|
||||
)
|
||||
____exports.modifier_item_zombie_slayer_debuff = modifier_item_zombie_slayer_debuff
|
||||
--- Corrosion: броня / реген / скорость / атакспид — визуал и логика как у Cold Attack (Skadi).
|
||||
____exports.modifier_item_zombie_slayer_debuff_2 = __TS__Class()
|
||||
local modifier_item_zombie_slayer_debuff_2 = ____exports.modifier_item_zombie_slayer_debuff_2
|
||||
modifier_item_zombie_slayer_debuff_2.name = "modifier_item_zombie_slayer_debuff_2"
|
||||
modifier_item_zombie_slayer_debuff_2.____file_path = "scripts/vscripts/items/default_items/item_zombie_slayer copy.lua"
|
||||
__TS__ClassExtends(modifier_item_zombie_slayer_debuff_2, BaseModifier)
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.IsHidden(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_HEALTH_REGEN_PERCENTAGE, MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT}
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("movespeed_reduction")
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetModifierAttackSpeedBonus_Constant(self)
|
||||
return self:GetAbility():GetSpecialValueFor("attackspeed_reduction")
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetModifierHealthRegenPercentage(self)
|
||||
local healReductionPct = self:GetAbility():GetSpecialValueFor("health_reduction")
|
||||
return 1 + healReductionPct * 0.01
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetModifierPhysicalArmorBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("armor_reduction")
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetEffectName(self)
|
||||
return ZOMBIE_SLAYER_SKADI_DEBUFF_PARTICLE
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetTexture(self)
|
||||
return "item_skadi"
|
||||
end
|
||||
modifier_item_zombie_slayer_debuff_2 = __TS__Decorate(
|
||||
modifier_item_zombie_slayer_debuff_2,
|
||||
modifier_item_zombie_slayer_debuff_2,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_zombie_slayer_debuff_2"}
|
||||
)
|
||||
____exports.modifier_item_zombie_slayer_debuff_2 = modifier_item_zombie_slayer_debuff_2
|
||||
return ____exports
|
||||
@@ -0,0 +1,192 @@
|
||||
local ____lualib = require("lualib_bundle")
|
||||
local __TS__Class = ____lualib.__TS__Class
|
||||
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
|
||||
local __TS__Decorate = ____lualib.__TS__Decorate
|
||||
local __TS__StringStartsWith = ____lualib.__TS__StringStartsWith
|
||||
local __TS__StringIncludes = ____lualib.__TS__StringIncludes
|
||||
local ____exports = {}
|
||||
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
|
||||
local BaseItem = ____dota_ts_adapter.BaseItem
|
||||
local BaseModifier = ____dota_ts_adapter.BaseModifier
|
||||
local registerAbility = ____dota_ts_adapter.registerAbility
|
||||
local registerModifier = ____dota_ts_adapter.registerModifier
|
||||
____exports.item_zombie_slayer = __TS__Class()
|
||||
local item_zombie_slayer = ____exports.item_zombie_slayer
|
||||
item_zombie_slayer.name = "item_zombie_slayer"
|
||||
item_zombie_slayer.____file_path = "scripts/vscripts/items/default_items/item_zombie_slayer.lua"
|
||||
__TS__ClassExtends(item_zombie_slayer, BaseItem)
|
||||
function item_zombie_slayer.prototype.Precache(self, context)
|
||||
PrecacheResource("particle", "particles/units/heroes/hero_skeletonking/wraith_king_curse_debuff_slash.vpcf", context)
|
||||
PrecacheResource("particle", "particles/items2_fx/mage_slayer_debuff.vpcf", context)
|
||||
PrecacheResource("particle", "particles/units/heroes/hero_dark_willow/dark_willow_wisp_spell_debuff.vpcf", context)
|
||||
end
|
||||
function item_zombie_slayer.prototype.GetIntrinsicModifierName(self)
|
||||
return "modifier_item_zombie_slayer"
|
||||
end
|
||||
item_zombie_slayer = __TS__Decorate(
|
||||
item_zombie_slayer,
|
||||
item_zombie_slayer,
|
||||
{registerAbility(nil)},
|
||||
{kind = "class", name = "item_zombie_slayer"}
|
||||
)
|
||||
____exports.item_zombie_slayer = item_zombie_slayer
|
||||
____exports.modifier_item_zombie_slayer = __TS__Class()
|
||||
local modifier_item_zombie_slayer = ____exports.modifier_item_zombie_slayer
|
||||
modifier_item_zombie_slayer.name = "modifier_item_zombie_slayer"
|
||||
modifier_item_zombie_slayer.____file_path = "scripts/vscripts/items/default_items/item_zombie_slayer.lua"
|
||||
__TS__ClassExtends(modifier_item_zombie_slayer, BaseModifier)
|
||||
function modifier_item_zombie_slayer.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.IsPurgable(self)
|
||||
return false
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.DeclareFunctions(self)
|
||||
return {
|
||||
MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
|
||||
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
||||
MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
|
||||
MODIFIER_PROPERTY_HEALTH_BONUS,
|
||||
MODIFIER_EVENT_ON_ATTACK_LANDED
|
||||
}
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.GetModifierHealthBonus(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_health")
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.GetModifierConstantManaRegen(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_mana_regen")
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.GetModifierPreAttack_BonusDamage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_damage")
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.GetModifierBonusStats_Agility(self)
|
||||
return self:GetAbility():GetSpecialValueFor("bonus_agility")
|
||||
end
|
||||
function modifier_item_zombie_slayer.prototype.OnAttackLanded(self, event)
|
||||
if not IsServer() then
|
||||
return
|
||||
end
|
||||
if event.attacker ~= self:GetParent() then
|
||||
return
|
||||
end
|
||||
if not event.target or event.target:IsBuilding() or event.target:IsOther() then
|
||||
return
|
||||
end
|
||||
if event.target ~= nil then
|
||||
local ____self_4 = event.target
|
||||
local ____self_4_AddNewModifier_5 = ____self_4.AddNewModifier
|
||||
local ____temp_2 = self:GetParent()
|
||||
local ____temp_3 = self:GetAbility()
|
||||
local ____opt_0 = self:GetAbility()
|
||||
____self_4_AddNewModifier_5(
|
||||
____self_4,
|
||||
____temp_2,
|
||||
____temp_3,
|
||||
"modifier_item_zombie_slayer_debuff_2",
|
||||
{duration = ____opt_0 and ____opt_0:GetSpecialValueFor("debuff_duration")}
|
||||
)
|
||||
local ____this_7
|
||||
____this_7 = event.target
|
||||
local ____opt_6 = ____this_7.GetUnitName
|
||||
local targetName = ____opt_6 and ____opt_6(____this_7) or ""
|
||||
if __TS__StringStartsWith(targetName, "npc_wave") and not __TS__StringIncludes(
|
||||
string.lower(targetName),
|
||||
"boss"
|
||||
) then
|
||||
ParticleManager:CreateParticle("particles/units/heroes/hero_skeletonking/wraith_king_curse_debuff_slash.vpcf", PATTACH_ABSORIGIN_FOLLOW, event.target)
|
||||
local ____self_12 = event.target
|
||||
local ____self_12_AddNewModifier_13 = ____self_12.AddNewModifier
|
||||
local ____temp_10 = self:GetParent()
|
||||
local ____temp_11 = self:GetAbility()
|
||||
local ____opt_8 = self:GetAbility()
|
||||
____self_12_AddNewModifier_13(
|
||||
____self_12,
|
||||
____temp_10,
|
||||
____temp_11,
|
||||
"modifier_item_zombie_slayer_debuff",
|
||||
{duration = ____opt_8 and ____opt_8:GetSpecialValueFor("debuff_duration")}
|
||||
)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
modifier_item_zombie_slayer = __TS__Decorate(
|
||||
modifier_item_zombie_slayer,
|
||||
modifier_item_zombie_slayer,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_zombie_slayer"}
|
||||
)
|
||||
____exports.modifier_item_zombie_slayer = modifier_item_zombie_slayer
|
||||
____exports.modifier_item_zombie_slayer_debuff = __TS__Class()
|
||||
local modifier_item_zombie_slayer_debuff = ____exports.modifier_item_zombie_slayer_debuff
|
||||
modifier_item_zombie_slayer_debuff.name = "modifier_item_zombie_slayer_debuff"
|
||||
modifier_item_zombie_slayer_debuff.____file_path = "scripts/vscripts/items/default_items/item_zombie_slayer.lua"
|
||||
__TS__ClassExtends(modifier_item_zombie_slayer_debuff, BaseModifier)
|
||||
function modifier_item_zombie_slayer_debuff.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.GetEffectName(self)
|
||||
return "particles/items2_fx/mage_slayer_debuff.vpcf"
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_ABSORIGIN_FOLLOW
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff.prototype.GetModifierIncomingDamage_Percentage(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("incress_damage")
|
||||
end
|
||||
modifier_item_zombie_slayer_debuff = __TS__Decorate(
|
||||
modifier_item_zombie_slayer_debuff,
|
||||
modifier_item_zombie_slayer_debuff,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_zombie_slayer_debuff"}
|
||||
)
|
||||
____exports.modifier_item_zombie_slayer_debuff = modifier_item_zombie_slayer_debuff
|
||||
____exports.modifier_item_zombie_slayer_debuff_2 = __TS__Class()
|
||||
local modifier_item_zombie_slayer_debuff_2 = ____exports.modifier_item_zombie_slayer_debuff_2
|
||||
modifier_item_zombie_slayer_debuff_2.name = "modifier_item_zombie_slayer_debuff_2"
|
||||
modifier_item_zombie_slayer_debuff_2.____file_path = "scripts/vscripts/items/default_items/item_zombie_slayer.lua"
|
||||
__TS__ClassExtends(modifier_item_zombie_slayer_debuff_2, BaseModifier)
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.IsDebuff(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.IsPurgable(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.IsHidden(self)
|
||||
return true
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetEffectName(self)
|
||||
return "particles/units/heroes/hero_dark_willow/dark_willow_wisp_spell_debuff.vpcf"
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetEffectAttachType(self)
|
||||
return PATTACH_OVERHEAD_FOLLOW
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.DeclareFunctions(self)
|
||||
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_HEALTH_REGEN_PERCENTAGE, MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE}
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetModifierMoveSpeedBonus_Percentage(self)
|
||||
return self:GetAbility():GetSpecialValueFor("movespeed_reduction")
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetModifierHealthRegenPercentage(self)
|
||||
return 1 + (self:GetAbility():GetSpecialValueFor("health_reduction") - 100) * 0.01
|
||||
end
|
||||
function modifier_item_zombie_slayer_debuff_2.prototype.GetModifierPhysicalArmorBonus(self, event)
|
||||
return self:GetAbility():GetSpecialValueFor("armor_reduction")
|
||||
end
|
||||
modifier_item_zombie_slayer_debuff_2 = __TS__Decorate(
|
||||
modifier_item_zombie_slayer_debuff_2,
|
||||
modifier_item_zombie_slayer_debuff_2,
|
||||
{registerModifier(nil)},
|
||||
{kind = "class", name = "modifier_item_zombie_slayer_debuff_2"}
|
||||
)
|
||||
____exports.modifier_item_zombie_slayer_debuff_2 = modifier_item_zombie_slayer_debuff_2
|
||||
return ____exports
|
||||
Reference in New Issue
Block a user