OnProjectileHit | Не вызывается функция

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Не вызывается функция OnProjectileHit, пишу в луа, вот фрагмент кода где делается проджектайл
Код:
			local projectile_speed = 0
				if caster:GetAttacksPerSecond() < 5 then
					projectile_speed = 1200
				else
					projectile_speed = 400
				end

				for _, unit in pairs(Entities:FindAllInSphere(target:GetAbsOrigin(), self.cleave_radius)) do
					if unit ~= target and unit:GetTeamNumber() ~= caster:GetTeamNumber() then 
						info = {
						Target = unit,
						Source = caster,
						Ability = ability,	
						EffectName = "particles/echotic_sabre_perform.vpcf",
					  iMoveSpeed = projectile_speed,
						vSourceLoc= caster:GetAbsOrigin(),        -- Optional (HOW)
						bDrawsOnMinimap = false,             -- Optional
					  bDodgeable = true,                -- Optional
					  bIsAttack = false,                -- Optional
					  bVisibleToEnemies = true,             -- Optional
					  bReplaceExisting = false,             -- Optional
					  flExpireTime = GameRules:GetGameTime() + 10,   -- Optional but recommended
						bProvidesVision = true,              -- Optional
						iVisionRadius = 5,               -- Optional
						iVisionTeamNumber = caster:GetTeamNumber()}

						ProjectileManager:CreateTrackingProjectile(info)
						print("Projectile Started")
						else return
					end
				end
Код OnProjectileHit
Код:
function modifier_demonic_axe_passive:OnProjectileHit(hTarget, vLocation)
	print("Projectile got target")
	local caster = self:GetCaster()
	local int = StatsFinder:GetIntellect(keys, caster) / 12 * 0.01
	local damage_hero = damage * self.cleave_prc * 0.7
	damage_hero = damage_hero + damage_hero * int

	ApplyDamage({victim = target, attacker = caster, damage = damage_hero, damage_type = DAMAGE_TYPE_PHYSICAL})
end
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
А где ты вообще верхний кусок кода пишешь?

Можешь глянуть в одном из моих модов похожую вещь.
 

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Илья, в ивент OnAttackLanded. Точнее у меня даже проджектайл не запускается.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
А ты можешь расшифровать нормально, что и как у тебя должно происходить?

Каждая OnProjectileHit() функция принадлежит определенному Projectle от абилки, либо от вещи. У меня в примере абилка со снарядом. А у тебя что?
 

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Илья, У меня оно делает проджектайл если около цели есть другие враги (что то типа сплеша для ренжевиков) и они не невоспреимчивы к магии.
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
FindUnitsInRadius попробуй юзать вместо этого монстра, который ищет любые ентити, а не только юнитов.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
[quote author=Danis link=topic=1122.msg6523#msg6523 date=1476212537]
Илья, У меня оно делает проджектайл если около цели есть другие враги (что то типа сплеша для ренжевиков) и они не невоспреимчивы к магии.
[/quote]

Что "оно"? Вещь? Абилка?
 
Последнее редактирование модератором:

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
ZLOY, Попробую
Илья, Предмет
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Так а почему у тебя тогда

modifier_demonic_axe_passive:OnProjectileHit()

Если должно быть:

my_item_name:OnProjectileHit()

И сам снаряд должен создаваться в коде вещи, где-нить в my_item_name:OnSpellStart().

Смотри пример, что я тебе скинул!
 

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Илья, У меня нету OnSpellStart у меня в OnAttackLanded написано это.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Ты, я смотрю, ничего не понял.

OnProjectileHit() - функция API из Workshopa.

Смотришь такой: ага, эта функция встречается два раза: в блоке "CDOTA_Ability_Lua" и в блоке "CDOTA_Item_Lua". Значит только там её и можно использовать.

Соответственно, у тебя есть два варианта взаимодействия с ней: в абилке или в вещи.

Как выглядит код в обоих вариантах?

Абилка: my_ability:function_my_ability()
Вещь: my_item:function_my_item()

Ты "переопределяешь" функции, программируешь поведение этих функций. И OnProjectileHit() - одна из этих функций, которую ты переопределяешь. Постоянным остается лишь событие, которое они отлавливают.
А событие это - запустить функцию OnProjectileHit(), когда созданный вещью или абилкой (в зависимости от твоего варианта) снаряд наносит кому-то хит - удар, т.е. столкновение происходит.

Не важно, внутри какой очередной переопределяемой функции вещи/абилки ты создаешь снаряд, при столкновении снаряда с чем-то будет запускаться функция OnProjectileHit() этой вещи/абилки, либо ничего не будет происходить, если ты её не переопределил.

Тот пример, что я тебе скинул - это всего лишь пример, естественно, что у тебя не будет то же самое. У тебя OnAttackLanded, у меня было OnSpellStart - это .... одно и то же с точки зрения программирования.
Чтобы создавать новое, ты суть должен понять, а не искать готовое решение, потому что у нового - нет готового решения!
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Тебе надо сделать:

Код:
my_item_name:my_function_for_create_projectile()
....
Create.....Projectile(table infoTable)
....
end

my_item_name:OnProjectileHit(handle hTarget, Vector vLocation)
	la-la-la 
	bababah(hTarget) 
	CreateApocalipsisOnPosition(vLocation)
	la-la-la
end
 

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Илья, я так понял ты имеешь в виду что нужно в коде самого предмета, не модификатора сделать эту функцию и вызывать ее от куда нужно?
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Переопределяется она естественно в коде предмета. А вызывается она сама, не ты её вызываешь.
 

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Илья, Не, я про то что в коде предмета нужно функцию вызова проджектайла делать, а не в коде модификатора?
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=Danis link=topic=1122.msg6548#msg6548 date=1476285508]
Илья, Не, я про то что в коде предмета нужно функцию вызова проджектайла делать, а не в коде модификатора?
[/quote]
Да, она вызывается из кода предмета, а не модификатора.
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Создавать проджектайл можно где угодно. Но вот ивент должен быть прикреплен к абилке, которая указана при создании проджектайла
 

Илья

Друзья CG
25 Сен 2015
2,348
41
ZLOY верно говорит. А абилка бывает двух типов: самодостаточный спелл или спелл вещи.
 
Реклама: