AUTOCAST-ATTACK-SPELL

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Модель самодельного тайдбрингера работает у меня через пассивку и при этом скилл срабатывает всегда, как только может (в откате проблем нет, с таймером разобраться помогли), а нужно, чтоб он срабатывал только, если скилл включен на автокаст или использовал, а не при каждой возможной атаке даже с выключенным автокастом:
Код:
	//=================================================================================================================
	// Kunkka: Tidebringer
	//=================================================================================================================
	"kunkka_tidebringer"
	{
		// General
		//-------------------------------------------------------------------------------------------------------------
		"ID"					"5032"														// unique ID number for this ability. Do not change this once established or it will invalidate collected stats.		
		"BaseClass"				"ability_datadriven"
		"AbilityBehavior"			"DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST | DOTA_ABILITY_BEHAVIOR_ATTACK"
		"AbilityUnitDamageType"			"DAMAGE_TYPE_PHYSICAL"	
		"AbilityUnitTargetTeam"			"DOTA_UNIT_TARGET_TEAM_ENEMY"
		"AbilityUnitTargetType"			"DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
		"AbilityUnitTargetFlags"		"DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
		"SpellImmunityType"				"SPELL_IMMUNITY_ENEMIES_YES"

		// Time		
		//-------------------------------------------------------------------------------------------------------------
		"AbilityCooldown"				"20.0 15.0 10.0 5.0"
		"AbilityCastRange"				"128"
		"AbilityCastPoint"				"0.0 0.0 0.0 0.0"

		// Special
		//-------------------------------------------------------------------------------------------------------------
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"					"FIELD_INTEGER"
				"radius"					"1500 2000 2500 3000"
			}
			"02"
			{
				"var_type"					"FIELD_INTEGER"
				"damage_bonus"				"25 30 35 40"
			}
			"03"
			{
				"var_type"					"FIELD_INTEGER"
				"cleave_damage"				"100"
			}
		}
	"Modifiers"
	{
		"precache"
		{
			"soundfile"					"soundevents/game_sounds_heroes/game_sounds_kunkka.vsndevts"
			"particle"					"particles/units/heroes/hero_kunkka/kunkka_weapon_tidebringer.vpcf"
			"particle"					"particles/units/heroes/hero_kunkka/kunkka_spell_tidebringer.vpcf"
		}
	
		"modifier_tidebringer_splash_datadriven"
		{
			"Passive"					"1"
			"IsHidden"					"1"
			"IsPurgable"				"0"
			
			"OnCreated"
			{
				"FireEffect"
				{
					"Target"			"CASTER"
					"EffectName"		"Hero_Kunkaa.Tidebringer"
				}
			
				"AttachEffect"
				{
					"Target"			"CASTER"
					"EffectName"		"particles/units/heroes/hero_kunkka/kunkka_weapon_tidebringer.vpcf"
					"EffectAttachType"	"start_at_customorigin"
					"ControlPointEntities"
					{
						"CASTER"		"attach_sword"
						"CASTER"		"attach_sword"
						"CASTER"		"attach_sword"
					}
				}
			}
			
			"OnAttackLanded"
			{
				"FireSound"
				{
					"Target"			"TARGET"
					"EffectName"		"Hero_Kunkka.Tidebringer.Attack"
				}
			
				"ActOnTargets"
				{
					"Target"
					{
						"Center"		"TARGET"
						"Teams"			"DOTA_UNIT_TARGET_TEAM_ENEMY"
					}
					
					"Action"
					{
						"FireSound"
						{
							"Target"			"TARGET"
							"EffectName"		"Hero_Kunkka.TidebringerDamage"
						}
					
						"CleaveAttack"
						{
							"CleavePercent"		"100"
							"CleaveRadius"		"%radius"
							"CleaveEffect"		"particles/units/heroes/hero_kunkka/kunkka_spell_tidebringer.vpcf"
						}
						
						"RunScript"
						{
							"ScriptFile"		"heroes/hero_kunkka/tidebringer.lua"
							"Function"			"tidebringer_set_cooldown"
						}
					}
				}
			}
			
			"Properties"
			{
				"MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE"		"%damage_bonus"
			}
		}
	}
	}
+ Где приписать к коду скрипт, который будет вычислять ApplyDamage через скрипт?
 
Последнее редактирование модератором:
Так а чего бы тебе не взять оригинальный, который итак автокастом сделан?

Собственный надо будет через lua реализовывать, если хочешь автокаст.
 
Илья, Этот полностью скопирован от Пиззалола и не работает, как положено, лол
 
[quote author=EnDronist link=topic=975.msg5064#msg5064 date=1466825616]
Илья, Этот полностью скопирован от Пиззалола
[/quote]
Когда ты так говоришь в мире грустит один фримен.
Без луа и двух бутылок рома не выйдет.
Собственно, там есть
bool ability:GetAutoCastState()
 
CryDeS, Я так понял, пора учиться писать абилитисы на lua?
 
[quote author=EnDronist link=topic=975.msg5066#msg5066 date=1466826429]
CryDeS, Я так понял, пора учиться писать абилитисы на lua?
[/quote]
В идеале да. Но мне самому лень их писать полностью на луа, так что велосипедыыы.
Так же можно перед атакой проверять есть ли автокаст, если нету снимать модификатор сплеша, если есть автокаст то добавлять.
 
[quote author=CryDeS link=topic=975.msg5067#msg5067 date=1466832148]
В идеале да. Но мне самому лень их писать полностью на луа, так что велосипедыыы.
Так же можно перед атакой проверять есть ли автокаст, если нету снимать модификатор сплеша, если есть автокаст то добавлять.
[/quote]
Вот именно, что может найти, включен ли автокаст?
 
Тебе же Cry скинул : ))

bool ability:GetAutoCastState() - true, если автокаст, иначе false.

Я недавно реализовывал ульт акса в автокаст - переписал полностью ульт (довольно просто оказалось) и реализовал так же автокаст.

Скажу сразу, что будет проблема с активацией абилки при автокасте: сколько я не искал, так и не нашел что-либо в духе OnToogle для автокаста (какго-то встроенного активатора), поэтому можно либо накладывать на кастера в момент прокачки абилки модификатор, что будет каждую секунду (или чаще) проверять GetAutoCastState() и в случае true активировать OnSpellStart. Либо можно там же в момент прокачки абилки создавать таймер, что так же будет проверять кастующего.

Это не будет велосипедом, потому что так и должен в теории реализовываться автокаст. И я очень был удивлен, когда не нашел заранее реализованного механизма для таких абилок. Ток функции проверки и смен состояния.
 
Тебе же Cry скинул : ))

bool ability:GetAutoCastState() - true, если автокаст, иначе false.

Я недавно реализовывал ульт акса в автокаст - переписал полностью ульт (довольно просто оказалось) и реализовал так же автокаст.

Скажу сразу, что будет проблема с активацией абилки при автокасте: сколько я не искал, так и не нашел что-либо в духе OnToogle для автокаста (какго-то встроенного активатора), поэтому можно либо накладывать на кастера в момент прокачки абилки модификатор, что будет каждую секунду (или чаще) проверять GetAutoCastState() и в случае true активировать OnSpellStart. Либо можно там же в момент прокачки абилки создавать таймер, что так же будет проверять кастующего.

Это не будет велосипедом, потому что так и должен в теории реализовываться автокаст. И я очень был удивлен, когда не нашел заранее реализованного механизма для таких абилок. Ток функции проверки и смен состояния.
Есть же
Код:
IsToggle
 
Последнее редактирование модератором:
Я не про это.

Когда работаешь с абилкой типа toogle (переключатель) кодеру предоставляют возможность переопределить функцию OnToogle, которая срабатывает по включению им этой самой абилки.

В случае с autocast, такой функции нет (что-нибудь в духе OnAutocastStart), есть лишь OnSpellStart (когда именно кастуем, но не переключаем) и геттеры, что позволяют определить текущий флаг абилки GetAutoCastState().

Поэтому механизм отлова момента включения автокаста приходится реализовывать самому.
 
Я не про это.

Когда работаешь с абилкой типа toogle (переключатель) кодеру предоставляют возможность переопределить функцию OnToogle, которая срабатывает по включению им этой самой абилки.

В случае с autocast, такой функции нет (что-нибудь в духе OnAutocastStart), есть лишь OnSpellStart (когда именно кастуем, но не переключаем) и геттеры, что позволяют определить текущий флаг абилки GetAutoCastState().

Поэтому механизм отлова момента включения автокаста приходится реализовывать самому.
Лол, если вы не знали, то это делается обычным модификатором, в такой абилке есть только поле класса и GetInstrictModifierName

В нем уже функция OnAttackLanded

У меня есть воссозданный тайдбрингер
 
Последнее редактирование модератором:
Лол, если вы не знали, то это делается обычным модификатором, в такой абилке есть только поле класса и GetInstrictModifierName

В нем уже функция OnAttackLanded

У меня есть воссозданный тайдбрингер
Покажи пример использования GetInstrictModifierName пжл, я не одупляю чот.
 
Последнее редактирование модератором:
[quote author=Adam Smith link=topic=975.msg5076#msg5076 date=1466871108]
Код:
function item_blink_staff:GetIntrinsicModifierName()
	return "item_blink_staff_passive_modifier"
end
[/quote]
благодарю
 
Последнее редактирование модератором:
Лол, если вы не знали, то это делается обычным модификатором, в такой абилке есть только поле класса и GetInstrictModifierName

В нем уже функция OnAttackLanded

У меня есть воссозданный тайдбрингер

Не очень понял, хочешь сказать, что на кастующего автоматом накладывается какой-то модификатор? Было бы неплохо увидеть пример.
 
Последнее редактирование модератором:
Не очень понял, хочешь сказать, что на кастующего автоматом накладывается какой-то модификатор? Было бы неплохо увидеть пример.
Да ничего не накладывается!
Он пассивный и всегда работает)Прост проверяет в OnAttackLanded IsToggle ли абилка или нет
 
Последнее редактирование модератором:
Ты имеешь в виду, что создаем lua абилку, её функционал реализуем через модификатор datadriven, а в lua скрипте переопределяем GetIntrinsicModifierName(), возвращая имя нашего datadriven модификатора?
 
Ты имеешь в виду, что создаем lua абилку, её функционал реализуем через модификатор datadriven, а в lua скрипте переопределяем GetIntrinsicModifierName(), возвращая имя нашего datadriven модификатора?
Зачем нам датадрайвен?
 
Последнее редактирование модератором:
Так если ты говоришь, что

То где мы реализуем её функционал?
Код:
LinkLuaModifier ("modifier_item_heart_2", "items/item_heart_2.lua", LUA_MODIFIER_MOTION_NONE)
----Поле или класс абилки
if item_heart_2 == nil then
  item_heart_2 = class({})
end

function item_heart_2:GetIntrinsicModifierName ()
  return "modifier_item_heart_2"
end
----поле абилки закончилось, началось поле модификатора тараски
if modifier_item_heart_2 == nil then
  modifier_item_heart_2 = class ( {})
end

function modifier_item_heart_2:IsHidden ()
  return true --we want item's passive abilities to be hidden most of the times
end

function modifier_item_heart_2:DeclareFunctions () --we want to use these functions in this item
  local funcs = {
    MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
    MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
    MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
    MODIFIER_PROPERTY_MANA_REGEN_CONSTANT,
    MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT,
    MODIFIER_EVENT_ON_TAKEDAMAGE
  }

  return funcs
end

function modifier_item_heart_2:GetModifierBonusStats_Strength (params)
  local hAbility = self:GetAbility ()
  return hAbility:GetSpecialValueFor ("bonus_all_stats")
end

function modifier_item_heart_2:GetModifierBonusStats_Intellect (params)
  local hAbility = self:GetAbility ()
  return hAbility:GetSpecialValueFor ("bonus_all_stats")
end
function modifier_item_heart_2:GetModifierBonusStats_Agility (params)
  local hAbility = self:GetAbility ()
  return hAbility:GetSpecialValueFor ("bonus_all_stats")
end

function modifier_item_heart_2:GetModifierConstantHealthRegen (params)
  local hAbility = self:GetAbility ()
  local hCaster = self:GetParent ()
  if hAbility:IsCooldownReady () then
    return hCaster:GetMaxHealth () * (hAbility:GetSpecialValueFor ("health_regen_percent_per_second") / 100)
  else
    return 5
  end
end

function modifier_item_heart_2:GetModifierConstantManaRegen (params)
  local hAbility = self:GetAbility ()
  local hCaster = self:GetParent ()
  return hCaster:GetMaxMana () * (hAbility:GetSpecialValueFor ("mana_reget_percent_per_second") / 100)
end

function modifier_item_heart_2:OnTakeDamage (params)
  if IsServer () then
    if params.unit == self:GetParent() then
      local hAbility = self:GetAbility ()
      local hCaster = self:GetParent ()
      local attacker = params.attacker
      if attacker:IsHero () then
        if attacker == self:GetParent() then
          print(attacker:GetUnitName())
        else
          hAbility:StartCooldown (hAbility:GetSpecialValueFor ("cooldown"))
        end
      end
    end
  end
end

function modifier_item_heart_2:GetAttributes ()
  return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE + MODIFIER_ATTRIBUTE_MULTIPLE
end
 
Последнее редактирование модератором:
Реклама: