CreateLinearProjectile

Instagib

Пользователь
29 Авг 2014
18
0
В общем, есть абилка
Код:
"bomb_toss"
	{
		"BaseClass"						"ability_datadriven"
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE"	
		"AbilityTextureName"			"alchemist_unstable_concoction_throw"
		"MaxLevel"						"1"
		
		"AbilityCastPoint"				"0.5"
		"AbilityCastRange"				"GLOBAL"
		"AbilityCooldown"				"0.0"
		"AbilityManaCost"				"0"

		"AbilitySpecial"
  	{
  		"01"
  		{
  			"var_type"			"FIELD_INTEGER"
  			"distance"			"600"
  		}
  	}
		
		"OnSpellStart"
		{
			"RunScript"
			{
				"ScriptFile"	"scripts/vscripts/abilities.lua"	
				"Function"		"CreateBombProjectile"
				"Target"		"POINT"
				"Distance"		"%distance"
				"EffectName"	"particles/units/heroes/hero_batrider/batrider_flamebreak.vpcf"
			}
			
			"RunScript"
			{
				"ScriptFile"	"scripts/vscripts/abilities.lua"
				"Function"		"RemoveBomb"
			}
		}

		"OnProjectileFinish"
		{
			"RunScript"
			{
				"ScriptFile"	"scripts/vscripts/abilities.lua"
				"Function"		"DropBomb"
				"Target"		"POINT"
			}
		}

		"OnProjectileHitUnit"
		{
			"DeleteOnHit"        "1"
			"RunScript"
			{
				"ScriptFile"	"scripts/vscripts/abilities.lua"
				"Function"		"BombHit"
				"Target"    "TARGET"
			}
		}
	}
, которая при событии OnSpellStart вызывает функцию, в которой создается снаряд с помощью CreateLinearProjectile().
Код:
function CreateBombProjectile( keys )
	local caster = keys.caster
	local point = keys.target_points[1]:Length2D()
	local str = caster:GetStrength()
	local distance = keys.Distance + str*50
	local length = point - caster:GetAbsOrigin():Length2D()

	if (length > distance) then
		length = distance
	end

	local info = 
	{
		Ability = keys.ability,
  	EffectName = keys.EffectName,
  	vSpawnOrigin = caster:GetAbsOrigin(),
  	fDistance = length,
  	fStartRadius = 64,
  	fEndRadius = 64,
  	Source = caster,
  	bHasFrontalCone = false,
  	bReplaceExisting = false,
  	iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_BOTH,
  	iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_INVULNERABLE,
  	iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BUILDING,
  	fExpireTime = GameRules:GetGameTime() + 10.0,
		bDeleteOnHit = true,
		vVelocity = caster:GetForwardVector() * 1000,
		bProvidesVision = true,
		iVisionRadius = 400,
		iVisionTeamNumber = DOTA_TEAM_GOODGUYS + DOTA_TEAM_BADGUYS
	}

	ProjectileManager:CreateLinearProjectile(info)
end
Я так понимаю, чтобы отслеживались события OnProjectileFinish и OnProjectileHitUnit, нужно в поле Ability передать абилку, в которой эти события описаны? Вот без этой строчки Ability = keys.ability есть только анимация. С ней же не работает ничего. Никак не могу разобраться в чем проблема. Может есть способ эти события в луа отлавливать? Помогите плз.
 
Последнее редактирование модератором:

Instagib

Пользователь
29 Авг 2014
18
0
[quote author=doter.ua link=topic=51.msg237#msg237 date=1410000422]
Instagib, Я projectile еще не использовал, посмотри примеры у других, мб поможет.
https://github.com/search?utf8=✓&q=CreateLinearProjectile+extension:lua
[/quote]
В том то и дело, что я там уже смотрел, и толком ничего не нашел, чтобы помогло =\ Везде есть эта строчка, а у меня не работает. Параметры то, передаваемые в функцию одинаковые. Значит что-то с самой абилкой не так, а что никак не пойму. Это провал ):
 

Instagib

Пользователь
29 Авг 2014
18
0
Короче дело в векторах.Сделал такvSpawnOrigin = Vector(0, 0, 393) (393 потому что хг), и он начал летать из центра карты. Осталось это пофиксить.
 

Instagib

Пользователь
29 Авг 2014
18
0
Почему-то projectile не хотел спавниться на месте кастера. Сместил точку спавнаvSpawnOrigin = caster:GetOrigin() + caster:GetForwardVector() * 100 и все заработало :)
 
Реклама: