Нужна помощь со скиллом-атакой

  • Автор темы Автор темы Slavko
  • Дата начала Дата начала

Slavko

Продвинутый
22 Июн 2015
224
4
В общем, есть у меня два вот таких вот скилла(второй аналогичный, но дамаг другой наносит). Оба существуют как модификатор атаки(без автокаста). Проблема в том, что при атаке первым скиллом, на кастера навешивается и модификатор с орбом второго скилла, и в итоге, если модификатор второго стоит на первом месте - происходит удар орбом второго. И вот че-то мне кажется, что я туплю на чем-то простом.

Код:
"alastar_punch_str"
{
 "BaseClass"        "ability_datadriven"
 "AbilityBehavior"     "DOTA_ABILITY_BEHAVIOR_ATTACK | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
 "AbilityUnitTargetTeam"  "DOTA_UNIT_TARGET_TEAM_ENEMY"
 "AbilityUnitTargetType"  "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
 "SpellImmunityType"     "SPELL_IMMUNITY_ENEMIES_YES"
 "AbilityTextureName"    "ghoul6"
 "AbilityCastAnimation"  "ACT_DOTA_ATTACK"
 //"AbilityCastPoint"     "0.8"
 "AbilityCastRange"    "128"
 "AbilityCooldown"     "7"
 "AbilityManaCost"     "20 30 40 50"
 "AbilitySpecial"
  {
   "01"
   {
    "var_type"      "FIELD_INTEGER"
    "coff"        "3 4 5 6"
   }
   "02"
   {
    "var_type"      "FIELD_INTEGER"
    "duration"        "1.5"
   }
  }
 "Modifiers"
 {
  "modifier_alastar_punch_str_checker"
  {
   "Passive"   "1"
   "IsHidden"   "1"
   "OnAttackStart"
   {
    "ApplyModifier"
    {
     "ModifierName"  "modifier_alastar_punch_str"
     "Target"     "CASTER"
    }
   }
  }
  "modifier_alastar_punch_str"
  {
   "Passive"  "0"
   "IsHidden" "0"
   "Orb"
   {
    "Priority"     "DOTA_ORB_PRIORITY_ABILITY"
    "ProjectileName" "particles/units/heroes/hero_disruptor/disruptor_ambient_glow.vpcf"
    "CastAttack"  "1"
   }
   "OnOrbFire"
   {
    "RunScript"
    {
     "ScriptFile"  "abilities/alastar/alastar.lua"
     "Function"   "punch_str_start"
     "coff"     "%coff"
    }
   }
  }
 }
}

UPD.
[youtube]https://www.youtube.com/watch?v=t8xYbXn3oBA&feature=youtu.be[/youtube]
 
Последнее редактирование модератором:
Вот это выложи:
Код:
     "ScriptFile"  "abilities/alastar/alastar.lua"
     "Function"   "punch_str_start"

Ну вот этот сразу висит "modifier_alastar_punch_str_checker", как только абилку вкачиваешь.

А этот навешивается по атаке "modifier_alastar_punch_str".

Однако, на сколько я помню, если выставляешь флаг пассивности

"Passive" "0"

То он тоже сразу вешается. Здесь 0 отвечает лишь за его тип (т.е. висит пассивно, либо активируется в какое-то время ).

Убери эту строчку, может этого и достаточно будет. А так все ждут код функции : )
 
Последнее редактирование модератором:
Ничего особоенного, дамаг с эффектами
Код:
function punch_str_start(keys)
 local caster = keys.caster
 local ability = keys.ability
 local target = keys.target
 local damage = caster:GetStrength() * keys.coff
 local damage_table = {
     victim = target,
     attacker = caster,
     damage = damage,
     damage_type = DAMAGE_TYPE_MAGICAL
    }
 ApplyDamage(damage_table)
 ability:StartCooldown(ability:GetCooldown(ability:GetLevel()))
 caster:RemoveModifierByName("modifier_alastar_punch_str")
 target:EmitSound("Hero_Nightstalker.Void")
 local particle = ParticleManager:CreateParticle("particles/heroes/alastar/nyx_assassin_mana_burn_flash_red.vpcf", PATTACH_POINT, target)
 ParticleManager:SetParticleControl(particle, 0, target:GetAbsOrigin() + Vector(0, 0, 0))
end
 
Последнее редактирование модератором:
Вот тебе почти такой же пример модификатора из одного моего старого мода:

Код:
"Modifiers"
{
	"modifier_cripple"
	{
		"Passive"	"1"		
		"IsHidden" "0"
		"TextureName"	"cripple"
		"IsDebuff"   		"0"
			
		"OnAttack"
			{	
			"Random"
					{
					"Chance"	"15"
					"OnSuccess"
						{
						"ApplyModifier"
							{
							"Target"	"TARGET"
							"ModifierName"	"modifier_bleeding"
							}

						}

					}
					
				}
	}	
	
	
	"modifier_bleeding"
		{	
		"IsHidden" "0"
		"TextureName"	"bleeding"
		"IsDebuff"   		"1"
		"ThinkInterval" 		"3"	
		"OnIntervalThink"
			{	 
			"RunScript"
				{
				"ScriptFile"		"ai.lua"
				"Function"		"BleedingDamage"
				"Target"		"TARGET"
				}	
			}
		}	
}

Как видишь, у второго я не указываю флаг Passive, и он вешается только в момент удара на цель.
 
Последнее редактирование модератором:
Ну да, в коде вроде ничего примечательного нет.
А эта строчка обязательна? Вроде бы в кулдаун абилка сама уйдет итак:
Код:
 ability:StartCooldown(ability:GetCooldown(ability:GetLevel()))

И зачем тебе каждый раз вешать и удалять этот орб-модификатор? Почему просто один раз не повесить?
 
Илья, посмотри видос, у меня тоже это так работает. Но ты пойми, что скилла два. И при любовь ударе навешиваются оба модификатора: и с первого скилла, и со второго, т.к. чекер начала удара всегда включен. Было бы хорошо, если бы можно было отследить начало каста этих скиллов, и при нём навешивать модификатор с орбом, ноOnAbilityPhaseStart тупо не работает.
 
Постой, постой. Две абилки? А чего ты оба модификатора в одну пихнул и скинул только одну?
 
Илья написал(а):
И зачем тебе каждый раз вешать и удалять этот орб-модификатор? Почему просто один раз не повесить?
смотри. к примеру, вешаем этот модификатор при спавне героя. сначала повесится, к примеру, модификатор от первого скилла, потом - от второго.. И при юзе второго скилла модификатор с орбом будет срабатывать от первого.
 
Последнее редактирование модератором:
А, вижу, с просоня плохо читаю:
В общем, есть у меня два вот таких вот скилла(второй аналогичный, но дамаг другой наносит).

А скинь все же второй тоже.
 
Илья, ну вот две сразу
Код:
"alastar_punch_str"
{
 "BaseClass"        "ability_datadriven"
 "AbilityBehavior"     "DOTA_ABILITY_BEHAVIOR_ATTACK | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
 "AbilityUnitTargetTeam"  "DOTA_UNIT_TARGET_TEAM_ENEMY"
 "AbilityUnitTargetType"  "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
 "SpellImmunityType"     "SPELL_IMMUNITY_ENEMIES_YES"
 "AbilityTextureName"    "ghoul6"
 "AbilityCastAnimation"  "ACT_DOTA_ATTACK"
 //"AbilityCastPoint"     "0.8"
 "AbilityCastRange"    "128"
 "AbilityCooldown"     "7"
 "AbilityManaCost"     "20 30 40 50"
 "AbilitySpecial"
  {
   "01"
   {
    "var_type"      "FIELD_INTEGER"
    "coff"        "3 4 5 6"
   }
   "02"
   {
    "var_type"      "FIELD_INTEGER"
    "duration"        "1.5"
   }
  }
 "Modifiers"
 {
  "modifier_alastar_punch_str_checker"
  {
   "Passive"   "1"
   "IsHidden"   "1"
   "OnAttackStart"
   {
    "ApplyModifier"
    {
     "ModifierName"  "modifier_alastar_punch_str"
     "Target"     "CASTER"
    }
   }
  }
  "modifier_alastar_punch_str"
  {
   "IsHidden" "0"
   "Orb"
   {
    "Priority"     "DOTA_ORB_PRIORITY_ABILITY"
    "ProjectileName" "particles/units/heroes/hero_disruptor/disruptor_ambient_glow.vpcf"
    "CastAttack"  "1"
   }
   "OnOrbFire"
   {
    "RunScript"
    {
     "ScriptFile"  "abilities/alastar/alastar.lua"
     "Function"   "punch_str_start"
     "coff"     "%coff"
    }
    "ApplyModifier"
    {
     "ModifierName" "modifier_alastar_punch_str_debuff"
     "Target"    "TARGET"
    }
   }
  }
 }
}
// ==================================================================================================================================================
// ==================================================================================================================================================
"alastar_punch_agi"
{
 "BaseClass"        "ability_datadriven"
 "AbilityBehavior"     "DOTA_ABILITY_BEHAVIOR_ATTACK | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST"
 "AbilityUnitTargetTeam"  "DOTA_UNIT_TARGET_TEAM_ENEMY"
 "AbilityUnitTargetType"  "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
 "SpellImmunityType"     "SPELL_IMMUNITY_ENEMIES_YES"
 "AbilityTextureName"    "ghoul4"
 "AbilityCastAnimation"  "ACT_DOTA_ATTACK"
 //"AbilityCastPoint"     "0.8"
 "AbilityCastRange"    "128"
 "AbilityCooldown"     "8 7 6 5"
 "AbilityManaCost"     "20 30 40 50"
 "AbilitySpecial"
  {
   "01"
   {
    "var_type"      "FIELD_INTEGER"
    "coff"        "2 4 6 8"
   }
   "02"
   {
    "var_type"      "FIELD_INTEGER"
    "duration"        "1.5"
   }
  }
 "Modifiers"
 {
  "modifier_alastar_punch_agi_checker"
  {
   "Passive"   "1"
   "IsHidden"   "1"
   "OnAttackStart"
   {
    "ApplyModifier"
    {
     "ModifierName"  "modifier_alastar_punch_agi"
     "Target"     "CASTER"
    }
   }
  }
  "modifier_alastar_punch_agi"
  {
   "Passive"  "0"
   "IsHidden" "0"
   "Orb"
   {
    "Priority"     "DOTA_ORB_PRIORITY_ABILITY"
    "ProjectileName" "particles/units/heroes/hero_disruptor/disruptor_ambient_glow.vpcf"
    "CastAttack"  "1"
   }
   "OnOrbFire"
   {
    "RunScript"
    {
     "ScriptFile"  "abilities/alastar/alastar.lua"
     "Function"   "punch_agi_start"
     "coff"     "%coff"
    }
   }
  }
 }
}
 
Последнее редактирование модератором:
на дебаффы не смотри, я просто повырезал их сейчас чтоб не нагромождалось.
 
И код тоже скинь на всякий.


А зачем тебе вообще это в виде модификаторов реализовывать? Почему не реализовать как обычную таргетовскую абилку? У тебя же модификаторы в пустую используются как раз из-за того, что существуют они только в момент удара.
 
Илья, мне нужно чтобы они были модификаторами атаки
код второго
Код:
function punch_agi_start(keys)
 local caster = keys.caster
 local ability = keys.ability
 local target = keys.target
 local damage = caster:GetAgility() * keys.coff
 local damage_table = {
     victim = target,
     attacker = caster,
     damage = damage,
     damage_type = DAMAGE_TYPE_MAGICAL
    }
 ApplyDamage(damage_table)
 ability:StartCooldown(ability:GetCooldown(ability:GetLevel()))
 caster:RemoveModifierByName("modifier_alastar_punch_agi")
 target:EmitSound("Hero_Nightstalker.Void")
 local particle = ParticleManager:CreateParticle("particles/heroes/alastar/nyx_assassin_mana_burn_flash_green.vpcf", PATTACH_POINT, target)
 ParticleManager:SetParticleControl(particle, 0, target:GetAbsOrigin() + Vector(0, 0, 0))
 ability:ApplyDataDrivenModifier(caster, caster, "modifier_alastar_punch_agi_buff", {})
end
 
Последнее редактирование модератором:
Делай тогда не OnAttackStart, а OnSpellStart.

У тебя висят два модификатора, как только качаешь обе абилки.
И обе реагируют не на каст абилки, а на удар. Вот у тебя и вешается по удару оба модификатора: и от первой абилки и от второй.
 
Хотя как ты в модификаторе используешь OnSpellStart - никак, ведь это команда для абилки :-X

Тебе надо переписать логику. Сделать это таргетовскими абилками и там вешать бафы/дебафы.
 
Илья, OnSpellStart вообще не отслеживается, я проверял. Видимо он не совместим сDOTA_ABILITY_BEHAVIOR_ATTACK
 
OnSpellStart - не для модификаторов, его просто в теле абилки пишешь, например, после special.


А так тебе надо подумать над логикой: у тебя сейчас две таргет абилки реализованы, по сути, как пассивки.

Почему как пассивки? Потому что ты вешаешь на своего персонажа модификаторы усиления, что срабатывают именно на удар, а не на каст. Ты, как бы, ничего и не кастуешь на цель.

Это даже больше похоже на toogle, нежели на пасивку.
 
Я вообще не понимаю, почему вторая абилка запукает при касте орб первой только потому, что он левее в списке модификаторов находится.
 
И почему у меня не работают

  • [li]OnAbilityStart
    [/li]

  • [li]OnSpellStart[/li]
При том, что абилкиDOTA_ABILITY_BEHAVIOR_UNIT_TARGET
 
OnAbilityStart - я не знаю, что это такое.
OnSpellStart - у тебя нигде его и нету.

Вот тебе проверенные примеры.


А вешаются у тебя оба модификатора я уже сказал, почему:

У тебя modifier_alastar_punch_str_checker и modifier_alastar_punch_agi_checker висят одновременно. Как только обе качаешь. А они в свою очередь активируют не по касту, а по атаке свои подмодификаторы. Вот у тебя и вешаются вне зависимости от нажатия на абилку эти модификаторы по атаке.
 
Реклама: