Создать абилку

I_Explorer

Друзья CG
30 Июл 2016
318
16
Проект
Жизнь в тюрьме
Кому не сложно помогите сделать абилку (пассивную).
1)На крипе висит постоянный дебаф обезоруживание.
Дебаф снимается если:
1) наступил день ( дебаф возвращается когда наступает ночь)
2) крип был атакован (после 45 секунд дебаф восстанавливается)
--[[3) союзного крипа|героя в радиусе 1000 атаковали (после 45 секунд дебаф восстанавливается)
]]
Невозможно развеять: диффузами,пуржами, думом, смертью.
 
[quote author=I_Explorer link=topic=1312.msg8147#msg8147 date=1486643463]
Кому не сложно помогите сделать абилку (пассивную).
1)На крипе висит постоянный дебаф обезоруживание.
Дебаф снимается если:
1) наступил день ( дебаф возвращается когда наступает ночь)
2) крип был атакован (после 45 секунд дебаф восстанавливается)
--[[3) союзного крипа|героя в радиусе 1000 атаковали (после 45 секунд дебаф восстанавливается)
]]
Невозможно развеять: диффузами,пуржами, думом, смертью.
[/quote]
Тебе в вакансии нужно идти.
 
Код:
GameRules:IsDaytime()
MODIFIER_EVENT_ON_ATTACK_LANDED
CDOTA_BaseNPC:AddNewModifier(handle caster, handle optionalSourceAbility, string modifierName, handle modifierData)
CDOTA_BaseNPC:RemoveModifierByName(string pszScriptName)
Тебе осталось собрать это в одну кучу
 
[quote author=ZLOY link=topic=1312.msg8157#msg8157 date=1486656403]
Код:
GameRules:IsDaytime()
MODIFIER_EVENT_ON_ATTACK_LANDED
CDOTA_BaseNPC:AddNewModifier(handle caster, handle optionalSourceAbility, string modifierName, handle modifierData)
CDOTA_BaseNPC:RemoveModifierByName(string pszScriptName)
Тебе осталось собрать это в одну кучу
[/quote]
Ну чего ты людей дохода то лишаешь :DD
 
Кому не сложно помогите сделать абилку (пассивную).
1)На крипе висит постоянный дебаф обезоруживание.
Дебаф снимается если:
1) наступил день ( дебаф возвращается когда наступает ночь)
2) крип был атакован (после 45 секунд дебаф восстанавливается)
Невозможно развеять: диффузами,пуржами, думом, смертью.
Нуууу, вобщем, кидаем при спавне Баф обезаруживание
1.Таймер, иф ла ла лала время ща > началаДня &amp;&amp; время ща < ночи тада Снять модифиер
2. ла ла ла абилка, евент, и прочую хуни, одно разовый таймер на 45, и снова вешаем, ла ла ла
3. Ну бля че так сложно,
 
Последнее редактирование модератором:
Не особо понял о чем написали выше.
Попробовал сделать по-своему (заменил обезоруживание на рут), предварительно спиздив из библиотеки 2скил цм-ки, 3-ий кентавра и 3-ий баланара.
Скил вроде работает (1-ый и 2-ой пункт) но при атаке юнита он выходит из рута только на 0.1 сек (надо 45).
Что нужно поменять? Я думаю нужно прибавить к "ThinkInterval" "0.1" ещё 44.9, но буду благодарен если скажете как сделать это с помощь таймера.
Код:
"frostbite_datadriven"
{
	// General
	//-------------------------------------------------------------------------------------------------------------
	"BaseClass"				"ability_datadriven"
	"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_PASSIVE"
	"AbilityTextureName"			"crystal_maiden_frostbite"
	
	// Special
	//-------------------------------------------------------------------------------------------------------------
	"AbilitySpecial"
	{
		"01"
		{
			"var_type"			"FIELD_FLOAT"
			"creep_duration"	"360.0"
		}
		
	}
	
	// Data driven
	//-------------------------------------------------------------------------------------------------------------
	"precache"
	{
		"particle"				"particles/units/heroes/hero_crystalmaiden/maiden_frostbite_buff.vpcf"
		"particle"				"particles/units/heroes/hero_crystalmaiden/maiden_frostbite.vpcf"
	}

	"Modifiers"
	{
		"modifier_hunter_in_the_night_datadriven"
		{
			"Passive"	"1"
			"IsHidden"	"1"

			"AllowIllusionDuplicate"	"1"

			"ThinkInterval"	"0.1"
			"OnIntervalThink"
			{
				"RunScript"
				{
					"ScriptFile"	"night.lua"
					"Function"		"HunterInTheNight"
					"modifier"		"modifier_frost_bite_root_datadriven"
				}
			}
		}
		
		"modifier_return"
		{
			"Passive"	"1"
			"OnAttacked"
			{
				"RunScript"
				{
					"ScriptFile"	"day.lua"
					"Function"		"Return"
					"modifier"		"modifier_frost_bite_root_datadriven"
				}
			}	
		}

		"modifier_frost_bite_root_datadriven"
		{
			"IsPurgable"		"1"
		
			"EffectName"		"particles/units/heroes/hero_crystalmaiden/maiden_frostbite_buff.vpcf"
		
			"States"
			{
				"MODIFIER_STATE_ROOTED"		"MODIFIER_STATE_VALUE_ENABLED"
				"MODIFIER_STATE_INVISIBLE"	"MODIFIER_STATE_VALUE_DISABLED"
			}
		}
	}
}
Код:
function Return( keys )
	local caster = keys.caster
	local attacker = keys.attacker
	local ability = keys.ability
	local modifier = keys.modifier
	
	if attacker:GetTeamNumber() ~= caster:GetTeamNumber() and caster:HasModifier(modifier) then
	 caster:RemoveModifierByName(modifier) 
	 
	end

end
Код:
function HunterInTheNight( keys )
	local caster = keys.caster
	local ability = keys.ability
	local modifier = keys.modifier

if GameRules:IsDaytime() then
		ability:ApplyDataDrivenModifier(caster, caster, modifier, {})
	else
		if caster:HasModifier(modifier) then caster:RemoveModifierByName(modifier) end
end
end
p.s. сорри за говнокод
p.p.s как 3-ий пункт сделать? я думал поискать что-то похожее в ульте абаддона с аганимом, но там ничего не нашел(
 
Последнее редактирование модератором:
Молодец, что сумел-таки подумать головой и что-то сделать, хоть и неопрятное, но зато свое.

Теперь давай, разберем твою механику и ты сам найдешь ошибку (ну, недоработанную логику):

1)У тебя на крипе весит пассивный модификатор, который каждые 0,1 секунды проверяет время в игре. Если это день, то вешает "бафф" на носителя. Иначе снимает этот баф.

2)Так же у тебя на крипе висит пассивный модификатор, который при атаке этого крипа снимает этот же "баф", если он на нем висел.

Теперь объедини в голове эти два предложения. В особенности обрати внимание на первое: каждые 0,1 сек идет проверка и накидывание...


А насчет таймера: thinker - это тот же самый таймер, только в dd (data driven). Зачем тебе его в луа переносить, если ничего не поменяется?
 
Последнее редактирование модератором:
Еще интересный момент:

Скил вроде работает (1-ый и 2-ой пункт)

Дебаф снимается если:
1) наступил день ( дебаф возвращается когда наступает ночь)

if GameRules:IsDaytime() then
ability:ApplyDataDrivenModifier(caster, caster, modifier, {})
else


Ты решил все же днем накидывать?)
 
Последнее редактирование модератором:
Если установишь себе таймер (thinker) с интервалом в 45 секунд, то у тебя и будет навешиваться дебафф каждые 45 секунд.

И вот твой результат в итоге:

У крипа сработал таймер, повесился дебафф. Ты выжидаешь 40 секунд, бьешь крипа, дебафф снимается. Через 5 секунд он снова повесится, т.к. у таймера отработает счетчик и произойдет вызов функции навешивания. В итоге повторится та же ситуация, которая у тебя сейчас: с крипа после атаки снимется дебафф на пару секунд, а не на 45.
 
У тебя же вроде есть голова, посиди и осознай свою же логику,а потом задай правильный вопрос, по которому мы поймем, что ты понял и тебе уже можно давать следующие советы.

Либо просто отпишись: что тебе лень, итак покатит. Тогда и я забью.
 
В любом случае, в твоем варианте самое простое: добавить еще один модификатор, который будет вешаться на юнита на 45 сек при его атаке и блочить навешивание дебаффа: добавь проверку наличия этого модификатора здесь, как доп условие:

Код:
if GameRules:IsDaytime() then

В случае, если день и этот новый имеется, то не вешать дебафф, иначе вешай.
 
Реклама: