[Готовый скрипт] Пронзающая стрела мираны

00zveroboi

Активный
14 Июл 2015
103
17
npc_ability_custom.txt
Код:
"mirana_piercing_arrow"
	{
		// General
		//-------------------------------------------------------------------------------------------------------------
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
		"AbilityUnitTargetTeam"			"DOTA_UNIT_TARGET_TEAM_ENEMY"
		"AbilityUnitTargetType"			"DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
		"AbilityUnitDamageType"			"DAMAGE_TYPE_MAGICAL"	
		"SpellImmunityType"				"SPELL_IMMUNITY_ENEMIES_NO"
		"FightRecapLevel"				"1"
		"BaseClass"						"ability_lua"
		"AbilityTextureName"			"mirana_arrow"
		"ScriptFile"					"abilities/mirana_piercing_arrow"
		"LevelsBetweenUpgrades"			"2"
		"RequiredLevel"					"1"
		"MaxLevel"						"4"
		

		// Casting
		//-------------------------------------------------------------------------------------------------------------
		"AbilityCastRange"				"3000"
		"AbilityCastPoint"				"0.5"

		// Time		
		//-------------------------------------------------------------------------------------------------------------
		"AbilityCooldown"				"17"
		"AbilityDuration"				"3.11"

		// Cost
		//-------------------------------------------------------------------------------------------------------------
		"AbilityManaCost"				"100"

		// Special
		//-------------------------------------------------------------------------------------------------------------
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"			"FIELD_INTEGER"
				"range"				"3000"
			}
			"02"
			{
				"var_type"			"FIELD_INTEGER"
				"speed"				"857"
			}
			
			"03"
			{
				"var_type"			"FIELD_INTEGER"
				"radius"			"115"
			}
			"04"
			{
				"var_type"			"FIELD_INTEGER"
				"add_damage"		"140"
			}
			"05"
			{
				"var_type"			"FIELD_INTEGER"
				"damage"			"50 140 230 320"
			}
			"06"
			{
				"var_type"			"FIELD_FLOAT"
				"min_duration"		"0.01"
			}
			"07"
			{
				"var_type"			"FIELD_FLOAT"
				"duration"			"5"
			}
			"08"
			{
				"var_type"			"FIELD_INTEGER"
				"maxup"				"1500"
			}
		}
	}
addon_russian
Код:
"DOTA_Tooltip_ability_mirana_piercing_arrow"				"Пронзающая стрела"
		"DOTA_Tooltip_ability_mirana_piercing_arrow_Description"	"Пронзающая стрела"
		"DOTA_Tooltip_ability_mirana_piercing_arrow_maxup"			"Макс. увел. урона/стана:"
		"DOTA_Tooltip_ability_mirana_piercing_arrow_damage"			"Урон:"
		"DOTA_Tooltip_ability_mirana_piercing_arrow_add_damage"		"Макс. доп. урон:"
		"DOTA_Tooltip_ability_mirana_piercing_arrow_min_duration"	"Мин. стан:"
		"DOTA_Tooltip_ability_mirana_piercing_arrow_duration"		"Макс. стан:"
в функцию Precache
Код:
PrecacheResource( "particle_folder", "particles/units/heroes/hero_mirana", context )
PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_mirana.vsndevts", context )
vscripts/abilities/mirana_piercing_arrow.lua
Код:
mirana_piercing_arrow = class({})
LinkLuaModifier( "modifier_mirana_piercing_arrow", "abilities/mirana_piercing_arrow", LUA_MODIFIER_MOTION_NONE )

function mirana_piercing_arrow:OnSpellStart()
	self.range = self:GetSpecialValueFor( "range" )
	self.speed = self:GetSpecialValueFor( "speed" )
	self.radius = self:GetSpecialValueFor( "radius" )
	self.damage = self:GetSpecialValueFor( "damage" ) 
	self.adddmg = self:GetSpecialValueFor( "add_damage" ) 
	self.duration = self:GetSpecialValueFor( "duration" )
	self.mindur = self:GetSpecialValueFor( "min_duration" )
	self.maxup = self:GetSpecialValueFor( "maxup" )

	EmitSoundOn( "Hero_Mirana.ArrowCast", self:GetCaster() )

	local point = self:GetCursorPosition()
	local direction = point - self:GetCaster():GetOrigin()
	direction.z = 0.0
	direction = direction:Normalized()
	self.heropos = self:GetCaster():GetOrigin()
	
	local info = {
		EffectName = "particles/units/heroes/hero_mirana/mirana_spell_arrow.vpcf",
		Ability = self,
		vSpawnOrigin = self:GetCaster():GetOrigin(), 
		fStartRadius = self.radius,
		fEndRadius = self.radius,
		vVelocity = direction * self.speed,
		fDistance = self.range,
		Source = self:GetCaster(),
		iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY,
		iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
	}
	ProjectileManager:CreateLinearProjectile( info )
	local info1 = {
		EffectName = "particles/units/heroes/hero_mirana/mirana_spell_arrow_trail.vpcf",
		Ability = self,
		vSpawnOrigin = self:GetCaster():GetOrigin(), 
		fStartRadius = 0,
		fEndRadius = 0,
		vVelocity = direction * self.speed,
		fDistance = self.range,
		Source = self:GetCaster(),
		iUnitTargetTeam = nil,
		iUnitTargetType = nil,
	}
	ProjectileManager:CreateLinearProjectile( info1 )
	local info2 = {
		EffectName = "particles/units/heroes/hero_mirana/mirana_spell_arrow_fx.vpcf",
		Ability = self,
		vSpawnOrigin = self:GetCaster():GetOrigin(), 
		fStartRadius = 0,
		fEndRadius = 0,
		vVelocity = direction * self.speed,
		fDistance = self.range,
		Source = self:GetCaster(),
		iUnitTargetTeam = nil,
		iUnitTargetType = nil,
	}
	ProjectileManager:CreateLinearProjectile( info2 )
	EmitSoundOn( "Hero_Mirana.Arrow", self:GetCaster() )
end

function mirana_piercing_arrow:OnProjectileHit( target, location )
	if target ~= nil and not target:IsMagicImmune() and not target:IsInvulnerable() then
		local dist = #(location - self.heropos) / self.maxup
		if dist > 1 then dist = 1 end
		if not target:IsHero() and not target:IsAncient() then
			target:ForceKill( false )
		else
			local damage = {
				victim = target,
				attacker = self:GetCaster(),
				damage = self.damage + self.adddmg * dist,
				damage_type = DAMAGE_TYPE_MAGICAL,
				ability = self
			}
			ApplyDamage( damage )
		end
		target:AddNewModifier( self:GetCaster(), self, "modifier_mirana_piercing_arrow", { duration = ( self.duration - self.mindur ) * dist + self.mindur } )
		EmitSoundOn( "Hero_Mirana.ArrowImpact", target )
		
		local direction = location - self:GetCaster():GetOrigin()
		direction.z = 0.0
		direction = direction:Normalized()
	end
	return false
end



modifier_mirana_piercing_arrow = class({})

function modifier_mirana_piercing_arrow:IsHidden() 
	return false
end

function modifier_mirana_piercing_arrow:IsPurgable()
	return true
end

function modifier_mirana_piercing_arrow:IsDebuff()
	return true
end

function modifier_mirana_piercing_arrow:IsStunDebuff()
	return true
end

function modifier_mirana_piercing_arrow:GetEffectName()
	return "particles/generic_gameplay/generic_stunned.vpcf"
end

function modifier_mirana_piercing_arrow:CheckState()
	return { [MODIFIER_STATE_STUNNED] = true }
end

function modifier_mirana_piercing_arrow:GetEffectAttachType()
	return PATTACH_OVERHEAD_FOLLOW
end

function modifier_mirana_piercing_arrow:DeclareFunctions()
	return { MODIFIER_PROPERTY_OVERRIDE_ANIMATION }
end

function modifier_mirana_piercing_arrow:GetOverrideAnimation( params )
	return ACT_DOTA_DISABLED
end
 
Последнее редактирование модератором:
Re: Пронзающая стрела мираны

Это вопрос или что?
 
Re: Пронзающая стрела мираны

[quote author=TopKun link=topic=1659.msg11245#msg11245 date=1502910388]
Так есть же специальный топик для этого, не?
[/quote]
Этот раздел форума представляет скрипты, так почему же скрипт должен находиться в другом месте?)
 
Этот раздел форума представляет скрипты, так почему же скрипт должен находиться в другом месте?)
Ну здесь обычно вопросы по коду задают, а вот в наработках кидают уже готовые скрипты
 
Последнее редактирование модератором:
Реклама: