В каком смысле флаги? Флаги нужны для конкретизации цели. А атаковать ты можешь почти любую цель за исключением двух/трех состояний.Можно ли как приписывать флаги (и поведение) на модификаторы атаки (не орбы)?
Допустим, Кристалис не работает на строенияВ каком смысле флаги? Флаги нужны для конкретизации цели. А атаковать ты можешь почти любую цель за исключением двух/трех состояний.
Критические атаки(а это MODIFIER_PROPERTY_PREATTACK_CRITICALSTRIKE) не работают на строения вообще. Это не флаги)Допустим, Кристалис не работает на строения
"modifier_item_desolator_skadi_corruption"
{
"Passive" "0"
"IsHidden" "1"
"IsDebuff" "1"
"IsPurgable" "1"
"StatusEffectName" "particles/status_fx/status_effect_frost.vpcf"
"StatusEffectPriority" "10"
"Properties"
{
"MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT" "%cold_attack_speed"
"MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%cold_movement_speed"
}
"OnCreated"
{
"ApplyModifier"
{
"Target" "TARGET"
"ModifierName" "modifier_item_desolator_corruption_for_desolator_skadi"
}
"RunScript"
{
"Target" "TARGET"
"ScriptFile" "items/item_desolator_1.lua"
"Function" "modifier_item_desolator_skadi_corruption"
}
}
}
"modifier_item_desolator_corruption_for_desolator_skadi"
{
"Duration" "%corruption_duration"
"Passive" "0"
"IsHidden" "0"
"IsDebuff" "1"
"IsPurgable" "1"
"TextureName" "desolator_skadi_corruption"
"Properties"
{
"MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS" "%corruption_armor"
}
}
Можно создать свою систему орбов с блекджеком и десоляторами, и это довольно просто.Ты о моей системе орбов? У меня там своя система. Я прошу расписать эти два модификатора на lua
Ну, мне потребовалось 10 часов, чтоб эту систему придумать, и ещё 6 часов, чтоб отшлифовать полученный и пока ещё не объёмный результат до идеалаМожно создать свою систему орбов с блекджеком и десоляторами, и это довольно просто.
if modifier_item_desolator_skadi_corruption == nil then
modifier_item_desolator_skadi_corruption = class({})
end
--Определение что и как в модификаторе должно отображаться и должен ли пуржиться(как в датадрайвен)
function modifier_item_desolator_skadi_corruption:IsHidden()
return false
end
function modifier_item_desolator_skadi_corruption:IsDebuff()
return true
end
function modifier_item_desolator_skadi_corruption:IsPurgable()
return true
end
function modifier_item_desolator_skadi_corruption:GetTexture()
return "desolator_skadi_corruption"
end
--получаем значения из абилитиспешл датадрайвена
function modifier_item_desolator_skadi_corruption:OnCreated( kv )
self.cold_as = self:GetAbility():GetSpecialValueFor("cold_attack_speed")
self.cold_ms = self:GetAbility():GetSpecialValueFor("cold_movement_speed")
self.minus_arm = self:GetAbility():GetSpecialValueFor("corruption_armor")
end
function modifier_item_desolator_skadi_corruption:OnRefresh( kv )
self.cold_as = self:GetAbility():GetSpecialValueFor("cold_attack_speed")
self.cold_ms = self:GetAbility():GetSpecialValueFor("cold_movement_speed")
self.minus_arm = self:GetAbility():GetSpecialValueFor("corruption_armor")
end
--получили.
--снизу определяем, кидается ли модификатор на неуязвимых к магии. Еще в аттрибутах можно указать, будет ли модификатор стакаться, спадать при смерти и все такое.
function modifier_item_desolator_skadi_corruption:GetAttributes ()
return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE
end
--определяем функции модификатора, как в датадрайвене, но тут значения пишутся не напротив, а в отдельных функциях.
function modifier_item_desolator_skadi_corruption:DeclareFunctions()
local funcs = {
MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE,
MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS
}
return funcs
end
--определяем значения функций модификатора
function modifier_item_desolator_skadi_corruption:GetModifierMoveSpeedBonus_Percentage()
return self.cold_ms
end
function modifier_item_desolator_skadi_corruption:GetModifierPhysicalArmorBonus()
return self.minus_arm
end
function modifier_item_desolator_skadi_corruption:GetModifierAttackSpeedBonus_Constant()
return self.cold_as
end
function modifier_bh_crush:OnAttackLanded( params )
if IsServer() then
if params.attacker == self:GetParent() and ( not self:GetParent():IsIllusion() ) then
if self:GetParent():PassivesDisabled() then
return 0
end
local target = params.target
local damageTable = {
victim = params.target,
attacker = params.attacker,
damage = self.damage,
damage_type = DAMAGE_TYPE_PHYSICAL,
}
if target:IsMagicImmune() then
return 0
else
if self:GetAbility():IsCooldownReady() then
if target ~= nil and target:GetTeamNumber() ~= self:GetParent():GetTeamNumber() and target:HasModifier("modifier_markenemy") then
ApplyDamage(damageTable)
target:AddNewModifier(params.attacker,self,"modifier_crush_bush",{duration = self.bash})
self:GetAbility():StartCooldown(self.cooldown)
end
end
end
end
end
return 0
end
Создаешь отдельный файл библиотеку с двумя функциями внешними -Ну, мне потребовалось 10 часов, чтоб эту систему придумать, и ещё 6 часов, чтоб отшлифовать полученный и пока ещё не объёмный результат до идеала
"modifier_item_desolator_skadi_orb"
{
"IsHidden" "0"
"TextureName" "desolator_skadi_orb"
"Orb"
{
"Priority" "DOTA_ORB_PRIORITY_ITEM"
"ProjectileName" "particles/items2_fx/desolator_skadi_projectile.vpcf"
"CastAttack" "0"
}
"OnOrbFire"
{
"ApplyModifier"
{
"Target" "TARGET"
"ModifierName" "modifier_item_desolator_corruption"
}
"RunScript"
{
"ScriptFile" "items/item_desolator_1.lua"
"Function" "modifier_item_desolator_skadi_orb"
"ColdDurationMelee" "%cold_duration_melee"
"ColdDurationRanged" "%cold_duration_ranged"
}
"FireSound"
{
"EffectName" "Item_Desolator.Target"
"Target" "TARGET"
}
}
}
"modifier_item_desolator_skadi_orb"
{
"IsHidden" "0"
"TextureName" "desolator_skadi_orb"
"Orb"
{
"Priority" "DOTA_ORB_PRIORITY_ITEM"
"ProjectileName" "particles/items2_fx/desolator_skadi_projectile.vpcf"
"CastAttack" "0"
}
//Когда орб только вылетел
"OnOrbFire"
{
"RunScript"
{
"ScriptFile" "путь/item_desolator_skadi_orb.lua"
"Function" "desolator_skadi_orb_on_orb_fire"
}
"FireSound"
{
"EffectName" "Item_Desolator.Target"
"Target" "TARGET"
}
}
//Когда орб вошел во врага
"OnOrbImpact"
{
"RunScript"
{
"ScriptFile" "путь/item_desolator_skadi_orb"
"Function" "desolator_skadi_orb_on_orb_impact"
}
}
}
//тут, я думаю, ты все поймешь
"modifier_zamedlenie_ot_ranged"
{
"Duration" "%cold_duration_ranged"
"Passive" "0"
"IsHidden" "0"
"IsBuff" "0"
"IsDebuff" "1"
"IsPurgable" "1"
"TextureName" "item_desolator_skadi_orb"
"EffectName" "particles/items2_fx/твой_партикль.vpcf"
"EffectAttachType" "follow_origin"
"Properties"
{
"MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%zamedlenie_ot_ranged"
}
}
"modifier_zamedlenie_ot_melee"
{
"Duration" "%cold_duration_melee"
"Passive" "0"
"IsHidden" "0"
"IsBuff" "0"
"IsDebuff" "1"
"IsPurgable" "1"
"TextureName" "item_desolator_skadi_orb"
"EffectName" "particles/items2_fx/твой_партикль.vpcf"
"EffectAttachType" "follow_origin"
"Properties"
{
"MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%zamedlenie_ot_melee"
}
}
"modifier_minus_armor"
{
"Duration" "%minus_armor_dur"
"Passive" "0"
"IsHidden" "0"
"IsBuff" "0"
"IsDebuff" "1"
"IsPurgable" "0"
"TextureName" "item_desolator_skadi_orb"
"EffectName" "particles/items2_fx/твой_партикль.vpcf"
"EffectAttachType" "follow_origin"
"Properties"
{
"MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS" "%minus_armor"
}
}
function desolator_skadi_orb_on_orb_impact(keys)
--если цель без неуязвимости(вообще это по-идее для здания нужно, хз)
if keys.target.GetInvulnCount == nil then
--проверка на строение, я описал свое мнение ниже.
if not keys.target:IsBuilding() then
--если цель уже имеет один из модификаторов, то навесить тот модификатор, который она имеет(это сделанно для того, чтобы модификатор дальника и ближника не стакались)
if keys.target:HasModifier("modifier_zamedlenie_ot_ranged") then
keys.ability:ApplyDataDrivenModifier(keys.caster, keys.target, "modifier_zamedlenie_ot_ranged", nil)
elseif keys.target:HasModifier("modifier_zamedlenie_ot_melee") then
keys.ability:ApplyDataDrivenModifier(keys.caster, keys.target, "modifier_zamedlenie_ot_melee", nil)
--[[идет проверка на то, дальней ли атаки юнит(я об этом и говорил, здесь очень легко проверять что за юнит перед тем, как совершать какие-то действия,
например можно легко проверить, что это не строение просто написав if not keys.target:IsBuilding() then и дальше уже навешивать партиклы и делать звуки)]]
else
if keys.caster:IsRangedAttacker() then
keys.ability:ApplyDataDrivenModifier(keys.caster, keys.target, "modifier_zamedlenie_ot_ranged", nil)
else
keys.ability:ApplyDataDrivenModifier(keys.caster, keys.target, "modifier_zamedlenie_ot_melee", nil)
end
end
end
end
end
--[[Дезоль накидывается при начале атаки, а скади, уже когда атака дошла до противника, поэтому я перенес дезоль в отдельную функцию,
если твой предмет работает по-другому, то легко перенести это в верхнюю функцию]]
function desolator_skadi_orb_on_orb_fire(keys)
if keys.target.GetInvulnCount == nil then
keys.ability:ApplyDataDrivenModifier(keys.attacker, keys.target, "modifier_minus_armor", nil)
end
end