Одновременный каст одного и того же заклинания от разных юнитов.

  • Автор темы Автор темы Epselot
  • Дата начала Дата начала
[quote author=CryDeS link=topic=1258.msg7683#msg7683 date=1484848165]
Ну запиши в ability. Абилка то у двух разных героев разная.
[/quote]

Можно по подробнее, "запиши в ability" слишком кратко что бы понять хоть что то. Мне нужно анимацию привязать к модификатору, насколько понимаю. Но как подобное делается, найти не смог.
 
Последнее редактирование модератором:
Epselot, типо пусть у тебя анимация будет создаваться не в модификаторе, а в самой абилке
 
[quote author=Epselot link=topic=1258.msg7695#msg7695 date=1484874596]
Можно по подробнее, "запиши в ability" слишком кратко что бы понять хоть что то. Мне нужно анимацию привязать к модификатору, насколько понимаю. Но как подобное делается, найти не смог.
[/quote]
Покажи где ты анимацию делаешь, и как. На быстрый взор не заметил в теме ._.
 
Последнее редактирование модератором:
Покажи где ты анимацию делаешь, и как. На быстрый взор не заметил в теме ._.

Да всё просто создание и уничтожение объекта вызывают начало и окончание анимации.

Код:
Код:
				"OnCreated"
				{
					"RunScript"
					{
						"ScriptFile"		"hero/hero_pugna2.lua"
						"Function"			"LifeDrainAllyStart"

						"particle_drain"	"particles/units/heroes/hero_pugna/pugna_life_give.vpcf"
						"sound_loop"		"Imba.PugnaLifeDrainLoop"
					}
				}

				"OnDestroy"
				{
					"RunScript"
					{
						"ScriptFile"		"hero/hero_pugna2.lua"
						"Function"			"LifeDrainAllyEnd"

						"sound_loop"		"Imba.PugnaLifeDrainLoop"
						"sound_target"		"Hero_Pugna.LifeDrain.Target"
					}

function LifeDrainAllyEnd( keys )
	local caster = keys.caster
	local target = keys.target
	local sound_loop = keys.sound_loop
	local sound_target = keys.sound_target

	-- End the particle
	ParticleManager:DestroyParticle(target.life_give_particle, false)
	ParticleManager:ReleaseParticleIndex(target.life_give_particle)
	target.life_give_particle = nil

	-- Stop the looping sound
	target:StopSound(sound_target)
	target:StopSound(sound_loop)
end

function LifeDrainAllyStart( keys )
	local caster = keys.caster
	local target = keys.target
	local particle_drain = keys.particle_drain
	local sound_loop = keys.sound_loop

	-- Stop any ongoing looping sound on the target
	target:StopSound(sound_loop)
	target:EmitSound(sound_loop)

	-- End any pre-existing particle
	if target.life_give_particle then
		ParticleManager:DestroyParticle(target.life_give_particle, false)
		ParticleManager:ReleaseParticleIndex(target.life_give_particle)
	end
	
	-- Play ally particle
	target.life_give_particle = ParticleManager:CreateParticle(particle_drain, PATTACH_ABSORIGIN, caster)
	ParticleManager:SetParticleControlEnt(target.life_give_particle, 0, caster, PATTACH_POINT_FOLLOW, "attach_hitloc", caster:GetAbsOrigin(), true)
	ParticleManager:SetParticleControlEnt(target.life_give_particle, 1, target, PATTACH_POINT_FOLLOW, "attach_hitloc", target:GetAbsOrigin(), true)
end
 
Последнее редактирование модератором:
[quote author=Epselot link=topic=1258.msg7706#msg7706 date=1484931513]
Да всё просто создание и уничтожение объекта вызывают начало и окончание анимации.

Код:
Код:
				"OnCreated"
				{
					"RunScript"
					{
						"ScriptFile"		"hero/hero_pugna2.lua"
						"Function"			"LifeDrainAllyStart"

						"particle_drain"	"particles/units/heroes/hero_pugna/pugna_life_give.vpcf"
						"sound_loop"		"Imba.PugnaLifeDrainLoop"
					}
				}

				"OnDestroy"
				{
					"RunScript"
					{
						"ScriptFile"		"hero/hero_pugna2.lua"
						"Function"			"LifeDrainAllyEnd"

						"sound_loop"		"Imba.PugnaLifeDrainLoop"
						"sound_target"		"Hero_Pugna.LifeDrain.Target"
					}

function LifeDrainAllyEnd( keys )
	local caster = keys.caster
	local target = keys.target
	local sound_loop = keys.sound_loop
	local sound_target = keys.sound_target

	-- End the particle
	ParticleManager:DestroyParticle(target.life_give_particle, false)
	ParticleManager:ReleaseParticleIndex(target.life_give_particle)
	target.life_give_particle = nil

	-- Stop the looping sound
	target:StopSound(sound_target)
	target:StopSound(sound_loop)
end

function LifeDrainAllyStart( keys )
	local caster = keys.caster
	local target = keys.target
	local particle_drain = keys.particle_drain
	local sound_loop = keys.sound_loop

	-- Stop any ongoing looping sound on the target
	target:StopSound(sound_loop)
	target:EmitSound(sound_loop)

	-- End any pre-existing particle
	if target.life_give_particle then
		ParticleManager:DestroyParticle(target.life_give_particle, false)
		ParticleManager:ReleaseParticleIndex(target.life_give_particle)
	end
	
	-- Play ally particle
	target.life_give_particle = ParticleManager:CreateParticle(particle_drain, PATTACH_ABSORIGIN, caster)
	ParticleManager:SetParticleControlEnt(target.life_give_particle, 0, caster, PATTACH_POINT_FOLLOW, "attach_hitloc", caster:GetAbsOrigin(), true)
	ParticleManager:SetParticleControlEnt(target.life_give_particle, 1, target, PATTACH_POINT_FOLLOW, "attach_hitloc", target:GetAbsOrigin(), true)
end
[/quote]
А где анимация то? Я вижу только партиклы.
 
Последнее редактирование модератором:
А где анимация то? Я вижу только партиклы.

А у тут вроде бы больше ничего и нет. Это же ульт пугны, тут наверное только партиклы и нужны.

Весь код:
Код:
function LifeDrainCancelUpgrade( keys )
	local caster = keys.caster
	local ability_cancel = caster:FindAbilityByName(keys.ability_cancel)

	-- Upgrade the Life Drain Cancel ability (Обновление Похищение жизни Отменить способность)
	if ability_cancel then
		ability_cancel:SetLevel(1)
	end
end

--[[
modifier_enemy = class({})

function modifier_enemy:GetAttributes()
  return MODIFIER_ATTRIBUTE_MULTIPLE
end

function modifier_enemy:IsHidden()
  return false
end
]]--

function LifeDrain( keys )
	local caster = keys.caster
	local target = keys.target
	local ability = keys.ability
	local ability_level = ability:GetLevel() - 1
	local sound_cast = keys.sound_cast
	local sound_target = keys.sound_target
	local modifier_enemy = keys.modifier_enemy
	local modifier_ally = keys.modifier_ally

	-- Parameters
	local duration = ability:GetLevelSpecialValueFor("duration", ability_level)
	
	-- Play cast sounds
	caster:EmitSound(sound_cast)
	target:EmitSound(sound_target)

	ability:ApplyDataDrivenModifier(caster, target, modifier_ally, {})
--[[]]--
end

function LifeDrainAllyStart( keys )
	local caster = keys.caster
	local target = keys.target
	local particle_drain = keys.particle_drain
	local sound_loop = keys.sound_loop

	-- Stop any ongoing looping sound on the target
	target:StopSound(sound_loop)
	target:EmitSound(sound_loop)

	-- End any pre-existing particle
	if target.life_give_particle then
		ParticleManager:DestroyParticle(target.life_give_particle, false)
		ParticleManager:ReleaseParticleIndex(target.life_give_particle)
	end
	
	-- Play ally particle
	target.life_give_particle = ParticleManager:CreateParticle(particle_drain, PATTACH_ABSORIGIN, caster)
	ParticleManager:SetParticleControlEnt(target.life_give_particle, 0, caster, PATTACH_POINT_FOLLOW, "attach_hitloc", caster:GetAbsOrigin(), true)
	ParticleManager:SetParticleControlEnt(target.life_give_particle, 1, target, PATTACH_POINT_FOLLOW, "attach_hitloc", target:GetAbsOrigin(), true)
end

function LifeDrainTickAlly( keys )
	local caster = keys.caster
	local target = keys.target
	local ability = keys.ability
	local ability_level = ability:GetLevel() - 1
	local modifier_ally = keys.modifier_ally

	-- Parameters
	local break_range = ability:GetLevelSpecialValueFor("break_range", ability_level)
	local tick_rate = ability:GetLevelSpecialValueFor("tick_rate", ability_level)
	
	local caster_max_mana = caster:GetMaxMana()
	local target_max_mana = target:GetMaxMana()
	local caster_current_mana = caster:GetMana()
	local target_current_mana = target:GetMana()
	
	if target_max_mana ~= target_current_mana and caster_current_mana >= 5 then
	caster:ReduceMana(5)
	target:GiveMana(5)
	end
	
	-- Update particle color
	ParticleManager:SetParticleControl(target.life_give_particle, 11, Vector(1, 0, 0))

	-- Check link break conditions
	local should_break = false

	-- Break the link if the caster is stunned or silenced or dead
	if caster:IsStunned() or caster:IsSilenced() or not caster:IsAlive() then
		should_break = true
	end

	-- Break the link if this target is out of the world or no longer visible
	if target:IsOutOfGame() then
		should_break = true
	end	
	
	-- Calculate distance from this target to the caster
	local target_loc = target:GetAbsOrigin()
	local caster_loc = caster:GetAbsOrigin()
	local distance = (target_loc - caster_loc):Length2D()

	-- Break the link if the distance is too large
	if distance > break_range then
		should_break = true
	end

	-- If any of the break conditions is true, break the link
	if should_break then
		target:RemoveModifierByName(modifier_ally)
	end
end

function LifeDrainCancel( keys )
	local caster = keys.caster
	local ability = keys.ability
	local ability_level = ability:GetLevel() - 1
	local modifier_ally = keys.modifier_ally
	
	-- Parameters
	local search_range = ability:GetLevelSpecialValueFor("search_range", ability_level)

	-- Find all currently tethered allies (Найти все в настоящее время на привязи союзников)
	local allies = FindUnitsInRadius(caster:GetTeamNumber(), caster:GetAbsOrigin(), nil, search_range, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_INVULNERABLE + DOTA_UNIT_TARGET_FLAG_OUT_OF_WORLD, FIND_ANY_ORDER, false)
	
	-- Iterate through valid allies, removing the life drain modifier
	for _,ally in pairs(allies) do
		ally:RemoveModifierByNameAndCaster(modifier_ally, caster)
	end
end

function LifeDrainAllyEnd( keys )
	local caster = keys.caster
	local target = keys.target
	local sound_loop = keys.sound_loop
	local sound_target = keys.sound_target

	-- End the particle
	ParticleManager:DestroyParticle(target.life_give_particle, false)
	ParticleManager:ReleaseParticleIndex(target.life_give_particle)
	target.life_give_particle = nil

	-- Stop the looping sound
	target:StopSound(sound_target)
	target:StopSound(sound_loop)
end

Способность:
Код:
	"imba_pugna_life_drain"
	{
		//| General
		//|-------------------------------------------------------------------------------------------------------------
		"BaseClass"							"ability_datadriven"
		"AbilityBehavior"					"DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
		"AbilityUnitTargetTeam"				"DOTA_UNIT_TARGET_TEAM_BOTH"
		"AbilityUnitTargetType"				"DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
		"AbilityUnitTargetFlags"			"DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES | DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE | DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS"
		"SpellImmunityType"					"SPELL_IMMUNITY_ENEMIES_YES"
		"AbilityUnitDamageType"				"DAMAGE_TYPE_MAGICAL"	
		"FightRecapLevel"					"1"
		"AbilityTextureName"				"pugna_life_drain"

		//| Casting
		//|-------------------------------------------------------------------------------------------------------------
		"AbilityCastRange"					"900"
		"AbilityCastPoint"					"0.2"
		"CastFilterRejectCaster"			"1"
		
		//| Time		
		//|-------------------------------------------------------------------------------------------------------------
		"AbilityCooldown"					"1.0"

		//| Cost
		//|-------------------------------------------------------------------------------------------------------------
		"AbilityManaCost"					"50"
		
		//| Precache
		//|-------------------------------------------------------------------------------------------------------------
		"precache"
		{
			"particle"						"particles/units/heroes/hero_pugna/pugna_life_drain.vpcf"
			"particle"						"particles/units/heroes/hero_pugna/pugna_life_give.vpcf"
			"soundfile"						"soundevents/game_sounds_heroes/game_sounds_pugna.vsndevts"
		}

		//| Special
		//|-------------------------------------------------------------------------------------------------------------
		"AbilitySpecial"
		{ //+	
			"01"
			{
				"var_type"					"FIELD_INTEGER"
				"health_drain"				"5 10 15"
			}
			"02"
			{
				"var_type"					"FIELD_INTEGER"
				"health_drain_scepter"		"6" //|вырезано
			}
			"03"
			{
				"var_type"					"FIELD_INTEGER"
				"break_range"				"1000 1100 1200"
			}
			"04"
			{
				"var_type"					"FIELD_INTEGER"
				"duration"					"10" //|вырезано
			}
			"05"
			{
				"var_type"					"FIELD_FLOAT"
				"tick_rate"					"1.0"
			}
		} //-

		"OnUpgrade"
		{
			"RunScript"
			{
				"ScriptFile"				"hero/hero_pugna.lua"
				"Function"					"LifeDrainCancelUpgrade"

				"ability_cancel"			"imba_pugna_life_drain_end"
			}
		}

		"OnSpellStart"
		{
			"RunScript"
			{
				"ScriptFile"				"hero/hero_pugna.lua"
				"Function"					"LifeDrain"

				"sound_cast"				"Hero_Pugna.LifeDrain.Cast"
				"sound_target"				"Imba.PugnaLifeDrainTarget"
				"modifier_ally"				"modifier_imba_life_drain_ally"
			}
		}

		"Modifiers"
		{
			"modifier_imba_life_drain_ally"
			{
				"Attributes"    		"MODIFIER_ATTRIBUTE_MULTIPLE"
				"Passive"					"0"
				"IsBuff"					"1"
				"IsHidden"					"1"
				"IsPurgable"				"0"

				//|"Duration"					"%duration"

				"ThinkInterval"				"%tick_rate"

				"OnIntervalThink"
				{
					"RunScript"
					{
						"ScriptFile"		"hero/hero_pugna.lua"
						"Function"			"LifeDrainTickAlly"

						"modifier_ally"		"modifier_imba_life_drain_ally"
					}
				}

				"OnCreated"
				{
					"RunScript"
					{
						"ScriptFile"		"hero/hero_pugna.lua"
						"Function"			"LifeDrainAllyStart"

						"particle_drain"	"particles/units/heroes/hero_pugna/pugna_life_give.vpcf"
						"sound_loop"		"Imba.PugnaLifeDrainLoop"
					}
				}

				"OnDestroy"
				{
					"RunScript"
					{
						"ScriptFile"		"hero/hero_pugna.lua"
						"Function"			"LifeDrainAllyEnd"

						"sound_loop"		"Imba.PugnaLifeDrainLoop"
						"sound_target"		"Hero_Pugna.LifeDrain.Target"
					}
				}
			}
		}
	}
 
Последнее редактирование модератором:
[quote author=I_GRIN_I link=topic=1258.msg7697#msg7697 date=1484875238]
Epselot, типо пусть у тебя анимация будет создаваться не в модификаторе, а в самой абилке
[/quote]

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

К слову заклинание выполняется до отмены или уничтожения кастера или таргета.
 
Так
Код:
target.life_give_particle
замени на так
Код:
ability.life_give_particle
 
Последнее редактирование модератором:
[quote author=CryDeS link=topic=1258.msg7710#msg7710 date=1484953413]
Так
Код:
target.life_give_particle
замени на так
Код:
ability.life_give_particle
[/quote]

Не работает, ох было бы всё так просто...
 
Тогда такой вопрос, можно ли обращаться к анимации через не просто кастер или таргет, а через их совокупность?
 
Тогда такой вопрос, можно ли обращаться к анимации через не просто кастер или таргет, а через их совокупность?
ХВАТИТ НАЗЫВАТЬ ПАРТИКЛЫ АНИМАЦИЕЙ, БЕСИШЬ :D
И это сработало бы, видимо ты где то ошибся. Скинь как сделал с ability.
И можно, например сделав так:
Код:
target[caster] = {}
target[caster].particle = <>
 
Последнее редактирование модератором:
[quote author=CryDeS link=topic=1258.msg7726#msg7726 date=1485009667]
ХВАТИТ НАЗЫВАТЬ ПАРТИКЛЫ АНИМАЦИЕЙ, БЕСИШЬ :D
И это сработало бы, видимо ты где то ошибся. Скинь как сделал с ability.
И можно, например сделав так:
Код:
target[caster] = {}
target[caster].particle = <>
[/quote]

Просто заменил target.life_give_particle на ability.life_give_particle через замену в поиске:

Код:
function LifeDrainAllyStart( keys )
local caster = keys.caster
local target = keys.target
local particle_drain = keys.particle_drain
local sound_loop = keys.sound_loop

-- Stop any ongoing looping sound on the target
target:StopSound(sound_loop)
target:EmitSound(sound_loop)

-- End any pre-existing particle
if ability.life_give_particle then
ParticleManager:DestroyParticle(ability.life_give_particle, false)
ParticleManager:ReleaseParticleIndex(ability.life_give_particle)
end

-- Play ally particle
ability.life_give_particle = ParticleManager:CreateParticle(particle_drain, PATTACH_ABSORIGIN, caster)
ParticleManager:SetParticleControlEnt(ability.life_give_particle, 0, caster, PATTACH_POINT_FOLLOW, "attach_hitloc", caster:GetAbsOrigin(), true)
ParticleManager:SetParticleControlEnt(ability.life_give_particle, 1, target, PATTACH_POINT_FOLLOW, "attach_hitloc", target:GetAbsOrigin(), true)
end

function LifeDrainAllyEnd( keys )
local caster = keys.caster
local target = keys.target
local sound_loop = keys.sound_loop
local sound_target = keys.sound_target

-- End the particle
ParticleManager:DestroyParticle(ability.life_give_particle, false)
ParticleManager:ReleaseParticleIndex(ability.life_give_particle)
ability.life_give_particle = nil

-- Stop the looping sound
target:StopSound(sound_target)
target:StopSound(sound_loop)
end

Также пробовал заменять во всём коде. И частично ещё экспериментировал, но на меня падало куча ошибок и совсем ничего не работало.
Если ты пробовал и у тебя получилось, скинь код. Может меня нужно не везде?
 
Последнее редактирование модератором:
Просто заменил target.life_give_particle на ability.life_give_particle через замену в поиске:
Также пробовал заменять во всём коде. И частично ещё экспериментировал, но на меня падало куча ошибок и совсем ничего не работало.
Если ты пробовал и у тебя получилось, скинь код. Может меня нужно не везде?
Ты кое что забыл ;D
Код:
local ability = keys.ability
 
Последнее редактирование модератором:
[quote author=CryDeS link=topic=1258.msg7752#msg7752 date=1485099340]
Ты кое что забыл ;D
Код:
local ability = keys.ability
[/quote]

Да действительно работает. Большое спасибо CryDeS. И всем кто старался что то подсказать. (это просто главная фишка моей карты, без неё не как)
 
Реклама: