Флаги на модификаторах атаки

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Можно ли как приписывать флаги (и поведение) на модификаторы атаки (не орбы)?
 
Можно ли как приписывать флаги (и поведение) на модификаторы атаки (не орбы)?
В каком смысле флаги? Флаги нужны для конкретизации цели. А атаковать ты можешь почти любую цель за исключением двух/трех состояний.
 
Последнее редактирование модератором:
В каком смысле флаги? Флаги нужны для конкретизации цели. А атаковать ты можешь почти любую цель за исключением двух/трех состояний.
Допустим, Кристалис не работает на строения
 
Последнее редактирование модератором:
[quote author=CryDeS link=topic=1011.msg5524#msg5524 date=1469806563]
Критические атаки(а это MODIFIER_PROPERTY_PREATTACK_CRITICALSTRIKE) не работают на строения вообще. Это не флаги)
[/quote]
А, отлично, значит мой ремейк Coup de Grace по таворам вызывает только лишь эффект кровяки. Попробую исправить
 
EnDronist, у тебя крит написан не на луа, правильно?
 
[quote author=I_GRIN_I link=topic=1011.msg5581#msg5581 date=1469970307]
EnDronist, у тебя крит написан не на луа, правильно?
[/quote]
На люа из спеллов ничего никогда ещё не писал
 
EnDronist, ну вот зря, на луа очень легко проверять, что за цель и настраивать условия
 
I_GRIN_I, Тогда научи меня писать на люа модификаторы. Допустим, вот такие:
Код:
     "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"
      }
     }
 
Последнее редактирование модератором:
[quote author=Илья link=topic=1011.msg5632#msg5632 date=1470484398]
Просто лазий по гитхабу. Вот тебе мои примеры.
[/quote]
А орбы?
 
EnDronist, создаешь модификатор свой, который не делает ничего, а просто висит в хайдене и если этот модификатор висит на герое, то остальные модификаторы просто не будут накидываться, код для твоего датадрайвена попробую написать, я пока его даже не смотрел, сейчас времени нет.
 
[quote author=I_GRIN_I link=topic=1011.msg5634#msg5634 date=1470487660]
EnDronist, создаешь модификатор свой, который не делает ничего, а просто висит в хайдене и если этот модификатор висит на герое, то остальные модификаторы просто не будут накидываться, код для твоего датадрайвена попробую написать, я пока его даже не смотрел, сейчас времени нет.
[/quote]
Ты о моих орбах? У меня там своя система. Я прошу расписать эти два модификатора на lua
 
Ты о моей системе орбов? У меня там своя система. Я прошу расписать эти два модификатора на lua
Можно создать свою систему орбов с блекджеком и десоляторами, и это довольно просто.
 
Последнее редактирование модератором:
Можно создать свою систему орбов с блекджеком и десоляторами, и это довольно просто.
Ну, мне потребовалось 10 часов, чтоб эту систему придумать, и ещё 6 часов, чтоб отшлифовать полученный и пока ещё не объёмный результат до идеала
 
Последнее редактирование модератором:
EnDronist, прошу
Код:
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

Это потребовало у меня минут 10 времени

Партиклы надо накидывать в скрипте. Я с партиклами не очень дружу, так что извиняй.

Еще партиклы можно и в таких функциях накидывать(почти как в датадрайвене):

Код:
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 часов, чтоб отшлифовать полученный и пока ещё не объёмный результат до идеала
Создаешь отдельный файл библиотеку с двумя функциями внешними -
bool RegisterOrbModifier(sModifierName)
и
nil ApplyOrbModifier(sModifierName, tModifierData, hCaster, hTarget)
Потому из луа скила вызываешь при создании регистрацию модификатора по имени, а потом накладываешь через ApplyOrbModifier, все.
Ну конечно можно навешать тысячу и одну доп функцию вроде
bool IsModifierOrb(sModifierName)

[quote author=I_GRIN_I link=topic=1011.msg5640#msg5640 date=1470490866]
EnDronist, прошу
Это потребовало у меня минут 10 времени

Партиклы надо накидывать в скрипте. Я с партиклами не очень дружу, так что извиняй.

Еще партиклы можно и в таких функциях накидывать(почти как в датадрайвене):

[/quote]
Это же не орб-модифаер, не?)
 
Последнее редактирование модератором:
CryDeS, так он сам сказал, что у него какаета своя система, да и он кидал модификаторы без орба
 
[quote author=I_GRIN_I link=topic=1011.msg5644#msg5644 date=1470491641]
CryDeS, так он сам сказал, что у него какаета своя система, да и он кидал модификаторы без орба
[/quote]
А, чёт протупил)
Вот орб, а то, что выше, мне тоже пригодится, сяп
Код:
			"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"
					}
				}
			}
Жду ответа к утру ::)
 
Последнее редактирование модератором:
EnDronist, если тебе прям нужен датадрайвенский орб, то делается это просто: наполовину в датадрайвене, наполовину в луа.
Вот измененный датадрайвен:
Код:
"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
 
Последнее редактирование модератором:
Реклама: