AUTOCAST-ATTACK-SPELL

Значит, в примере:

Есть lua item и есть lua modifier. В скрипте вещи подключаем модификатор, а в модификаторе реализуем постоянное действие. Спасибо, понял.

Но вопрос то стоял про умения, или я что-то перепутал?

Например, есть ульт акса. Он должен уметь кастоваться без автокаста (принудительно) и с помощью автокаста. Такое же уже нельзя таким методом реализовать. Или в скрипт абилки можно дописывать реализацию в виде OnSpellStart?
 
Значит, в примере:

Есть lua item и есть lua modifier. В скрипте вещи подключаем модификатор, а в модификаторе реализуем постоянное действие. Спасибо, понял.

Но вопрос то стоял про умения, или я что-то перепутал?

Например, есть ульт акса. Он должен уметь кастоваться без автокаста (принудительно) и с помощью автокаста. Такое же уже нельзя таким методом реализовать. Или в скрипт абилки можно дописывать реализацию в виде OnSpellStart?
Можно. Находим нужную функцию в модификаторе а далее
Код:
hAbility:OnSpellStart()
 
Последнее редактирование модератором:
Ну то есть в самом модификаторе описываем функцию OnSpellStart() ?
 
Вооот, я про это и спрашиваю. Выходит, в поле (файле) абилки уже не только поле класса и GetInstrictModifierName, но и OnSpellStart?
 
Вооот, я про это и спрашиваю. Выходит, в поле (файле) абилки уже не только поле класса и GetInstrictModifierName, но и OnSpellStart?
Пишу где хочу, законом не заперщено)
Использование аргументов из модификатора на 95% безопаснее
ахаха
 
Последнее редактирование модератором:
Интересный способ, спасибо.

Но по сути это тоже самое, что и у меня:

Код:
"axe_culling_blade_custom"
	{
		// General
		//--------------------------------------------------------------------------------------------------------

		"BaseClass"						"ability_lua"
		"AbilityTextureName"			"axe_culling_blade"
		"ScriptFile"					"abilities/axe_culling_blade_custom.lua"
		"AbilityType"					"DOTA_ABILITY_TYPE_BASIC"		
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST"
		"SpellImmunityType"				"SPELL_IMMUNITY_ENEMIES_NO"
		"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"
		"AbilityUnitDamageType"			"DAMAGE_TYPE_MAGICAL"	
		"FightRecapLevel"				"2"

		// Casting
		//--------------------------------------------------------------------------------------------------------
		"AbilityCastRange"				"150"
		"AbilityCastPoint"				"0.3"

		// Time		
		//--------------------------------------------------------------------------------------------------------
		"AbilityCooldown"				"15 10 5 0"
	
		// Cost
		//--------------------------------------------------------------------------------------------------------
		"AbilityManaCost"				"10"

		"AbilitySpecial"
		{
			"01"
			{
				"var_type"					"FIELD_INTEGER"
				"kill_threshold"			"250 325 400"
			}
			"02"
			{
				"var_type"					"FIELD_INTEGER"
				"damage"					"150 250 300"
			}
			"03"
			{
				"var_type"					"FIELD_FLOAT"
				"speed_duration"			"3"
			}
			"04"
			{
				"var_type"					"FIELD_INTEGER"
				"speed_aoe"					"900"
			}
			"05"
			{
				"var_type"					"FIELD_INTEGER"
				"kill_threshold_scepter"	"300 500 700"
			}
			"06"
			{
				"var_type"					"FIELD_FLOAT"
				"speed_duration_scepter"	"10"
			}
		}

	}

Код:
axe_culling_blade_custom = class({})

LinkLuaModifier("modifier_autocast_culling_blade", "modifiers/modifier_autocast_culling_blade.lua", LUA_MODIFIER_MOTION_NONE )

function axe_culling_blade_custom:GetCastAnimation() 
  return ACT_DOTA_CAST_ABILITY_4 
end

 function axe_culling_blade_custom:GetBehavior() 
   local behav = DOTA_ABILITY_BEHAVIOR_UNIT_TARGET + DOTA_ABILITY_BEHAVIOR_AUTOCAST 
   return behav
 end


function axe_culling_blade_custom:OnSpellStart()

  local caster = self:GetCaster()
  local target = self:GetCursorTarget()
  local killThreshold = self:GetSpecialValueFor("kill_threshold_scepter")
  local speedDuration = self:GetSpecialValueFor("speed_duration")

  if caster:HasItemInInventory("item_ultimate_scepter") then
    killThreshold = self:GetSpecialValueFor("kill_threshold_scepter")
    speedDuration = self:GetSpecialValueFor("speed_duration_scepter")
  end
  
  if target:GetHealth() <= killThreshold then
    EmitSoundOn("Hero_Axe.Culling_Blade_Success", self:GetCaster())
    self:KillUnit(target) 
    self:GiveBaff(caster,speedDuration)
      
  else
    EmitSoundOn("Hero_Axe.Culling_Blade_Fail", self:GetCaster())
    ApplyDamage( { victim = target, attacker = caster, damage = self:GetSpecialValueFor("damage"),
            damage_type = DAMAGE_TYPE_PURE, ability = self} )
  end
end


function axe_culling_blade_custom:KillUnit(target) 
  target:ForceKill(false)
  --ParticleManager:CreateParticle("particles/units/heroes/hero_bloodseeker/bloodseeker_bloodritual_impact.vpcf", PATTACH_ABSORIGIN, target)
  ParticleManager:CreateParticle("particles/units/heroes/hero_life_stealer/life_stealer_infest_emerge_bloody.vpcf", PATTACH_ABSORIGIN, target)
  
end


function axe_culling_blade_custom:GiveBaff(caster,speedDuration)
  local units = FindUnitsInRadius( caster:GetTeamNumber(), caster:GetAbsOrigin(), caster, self:GetSpecialValueFor("speed_aoe") ,
    DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false )
    
  for i = 1, #units do    
    if units[ i ] then
      units[ i ]:AddNewModifier(caster, self, "modifier_axe_culling_blade_boost", { duration = speedDuration}) 
      ParticleManager:CreateParticle("particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_buff_symbol.vpcf", PATTACH_ABSORIGIN, units[ i ])


    end
  end 
end


function axe_culling_blade_custom:OnUpgrade()

  local caster = self:GetCaster()
    
  if self:GetLevel() == 1 then
    GameRules:GetGameModeEntity():SetContextThink("axe_culling_blade_custom_autocast", 
      function()
        if self:GetAutoCastState() then
          caster:AddNewModifier(caster, self, "modifier_autocast_culling_blade", {})
        else
          caster:RemoveModifierByName("modifier_autocast_culling_blade")
        end
      return 1
      end,
      1)
  end

end


function axe_culling_blade_custom:IsStealable()
  return false
end

function axe_culling_blade_custom:IsHiddenWhenStolen()
	return true
end

Код:
modifier_autocast_culling_blade = class({})

function modifier_autocast_culling_blade:DeclareFunctions()
	return { MODIFIER_EVENT_ON_ATTACK_START, MODIFIER_EVENT_ON_ATTACK }
end

function modifier_autocast_culling_blade:GetTexture()
  return "axe_culling_blade"
end

function modifier_autocast_culling_blade:OnAttack( data )
	
	local caster = self:GetParent()
	local target = data.target
	
	if data.attacker == caster then
		local ability = caster:FindAbilityByName("axe_culling_blade_custom")

		if target ~= nil and target:GetTeamNumber() ~= caster:GetTeamNumber() then
			if ability:IsFullyCastable() then 
				caster:CastAbilityOnTarget(target, ability, caster:GetPlayerID())
			end
		end	
	end

end

function modifier_autocast_culling_blade:RemoveOnDeath()
	return true
end

function modifier_autocast_culling_blade:IsHidden()
	return true
end

Только мудренее и, возможно, правильнее.
 
Последнее редактирование модератором:
Реклама: