Не получается запилить абилку

Gaben

Пользователь
7 Авг 2016
15
0
Пытался сделать абилку. При переключении в активное состояние даёт +100 к мувспиду, но сжигает ману, как скилл котла мана лик. Попытался сделать так, но не выходит. Что нужно изменить или же таким образом вообще невозможно создать абилку? Взял исходники мана лика
КВ
Код:
"mana"
{
	// General
	//-------------------------------------------------------------------------------------------------------------
	"BaseClass"				"ability_datadriven"
	"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_TOGGLE | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
	"AbilityTextureName"			"keeper_of_the_light_mana_leak"

	// Precache
	//-------------------------------------------------------------------------------------------------------------
	"precache"
	{
		"soundfile"			"soundevents/game_sounds_heroes/game_sounds_keeper_of_the_light.vsndevts"
		"particle"			"particles/units/heroes/hero_keeper_of_the_light/keeper_mana_leak.vpcf"
		"particle"			"particles/units/heroes/hero_keeper_of_the_light/keeper_mana_leak_cast.vpcf"
		
	}

	// Casting
	//-------------------------------------------------------------------------------------------------------------
	"AbilityCastPoint"				"0.0"

	// Time		
	//-------------------------------------------------------------------------------------------------------------
	"AbilityCooldown"				"0.0"

	// Cost
	//-------------------------------------------------------------------------------------------------------------
	"AbilityManaCost"				"0"		

	// Cast Range
	//-------------------------------------------------------------------------------------------------------------

	// Special
	//-------------------------------------------------------------------------------------------------------------
	"AbilitySpecial"
	{

		"01"
		{
			"var_type"					"FIELD_FLOAT"
			"mana_leak_pct"				"5.0"
		}
		"02"
		{
			"var_type"					"FIELD_FLOAT"
			"stun_duration"				"1.0"
		}

		// Extra
		"03"
		{
			"var_type"					"FIELD_FLOAT"
			"leash_range_check"			"300"
		}
		"04"
		{
			"var_type"					"FIELD_FLOAT"
			"check_interval"			"0.1"
		}
		"05"
		{
			"var_type"				"FIELD_INTEGER"
			"bonus_move_speed"		"100"
		}
	}

	"OnSpellStart"
	{
		"FireSound"
		{
			"EffectName"	"Hero_KeeperOfTheLight.ManaLeak.Cast"
			"Target" 		"CASTER"
		}

		"FireSound"
		{
			"EffectName"	"Hero_KeeperOfTheLight.ManaLeak.Target"
			"Target" 		"CASTER"
		}
		
		"FireEffect"
		{
			"EffectName"    "particles/units/heroes/hero_keeper_of_the_light/keeper_mana_leak_cast.vpcf"
			"EffectAttachType" "start_at_customorigin"
			
			"ControlPointEntities"
			{
				"CASTER"	"attach_origin"
				"TARGET"	"follow_origin"
			}
		}
		
		
		"ApplyModifier"
		{
			"ModifierName"	"modifier_mana_leak_datadriven"
			"Target" 		"CASTER"
			"Duration"		"%duration"
		}
	}

	"Modifiers"
	{
		"modifier_mana_leak_datadriven"
		{
			"Passive"			"0"
			"IsHidden"			"0"
			"IsDebuff"			"0"

			"OnCreated"
			{
				"RunScript"
				{
					"ScriptFile"	"scripts/vscripts/heroes/hero_keeper_of_the_light/mana.lua"
					"Function"		"ManaLeakInit"
					"sound"			"Hero_KeeperOfTheLight.ManaLeak.Stun"
					"modifier"		"modifier_mana_leak_datadriven"
				}
			}

			"OnUnitMoved"
			{
				"Random"
				{
					"Chance"			"10"
					"PseudoRandom" "DOTA_PSEUDO_RANDOM_JUGG_CRIT"					
					"OnSuccess"
					{
						"FireEffect"
						{
							"EffectName"    "particles/units/heroes/hero_keeper_of_the_light/keeper_mana_leak.vpcf"
							"EffectAttachType" "attach_origin"
							"Target"      "CASTER"
						}

						"FireSound"
						{
							"EffectName"	"Hero_KeeperOfTheLight.ManaLeak.Target"
							"Target" 		"CASTER"
						}						
					}
				}										
			}			
			
	
			"ThinkInterval" "%check_interval"
			"OnIntervalThink"
			{
				"RunScript"
				{
					"ScriptFile"	"scripts/vscripts/heroes/hero_keeper_of_the_light/mana.lua"
					"Function"		"ManaLeak"
					"sound"			"Hero_KeeperOfTheLight.ManaLeak.Stun"
					"modifier"		"modifier_mana_leak_datadriven"
				}
			}			
		}
	}	
}
LUA
Код:
function ManaLeakInit( keys )
	local target = keys.target
	local target_location = target:GetAbsOrigin()
	local target_mana = target:GetMana()
	local ability = keys.ability

	print(target_mana)
	-- Extra variables
	local sound = keys.sound
	local modifier = keys.modifier
	local stun_duration = ability:GetLevelSpecialValueFor("stun_duration", (ability:GetLevel() - 1))

	-- Initial mana check
	if target_mana <= 0 then
		target:RemoveModifierByName(modifier)
		target:AddNewModifier(caster, nil, "modifier_stunned", {duration = stun_duration})
		EmitSoundOn(sound, target)
	end

	-- Setting the starting position
	target.position = target_location
end

--[[Author: Pizzalol
	Date: 20.01.2015.
	Compares the new and previous position on each check
	Checks if the target moved more than the leash range, if it didnt then it drains mana
	and checks if the mana is empty, if true then it applies the stun]]
function ManaLeak( keys )
	local caster = keys.caster
	local target = keys.target
	local ability = keys.ability

	-- Variables
	local target_max_mana = target:GetMaxMana()
	local target_current_mana = target:GetMana()
	-- How much of the mana pool is reduced per 100 units
	local mana_pct_per_100 = ability:GetLevelSpecialValueFor("mana_leak_pct", (ability:GetLevel() - 1)) / 100
	-- How much of the mana pool is lost per 1 unit
	local mana_pct = mana_pct_per_100 / 100
	local stun_duration = ability:GetLevelSpecialValueFor("stun_duration", (ability:GetLevel() - 1))
	-- The limit until which we consider draining mana, if the change is greater than this then dont do anything
	local leash_range_check = ability:GetLevelSpecialValueFor("leash_range_check", (ability:GetLevel() - 1))

	-- Extra variables
	local sound = keys.sound
	local modifier = keys.modifier

	-- Calculations
	local old_position = target.position
	local new_position = target:GetAbsOrigin()
	local distance = (new_position - old_position):Length2D()
	-- Calculating the mana loss
	local mana_reduction = target_max_mana * distance * mana_pct

	-- Checks if the distance is greater than the leash, if not then it reduces mana and
	-- checks if the target still has mana, if not then it stuns the target and plays the corresponding sound
	if distance < leash_range_check and distance ~= 0 then
		target:ReduceMana(mana_reduction)
		if target_current_mana <= mana_reduction then
			target:RemoveModifierByName(modifier)
			target:AddNewModifier(caster, nil, "modifier_stunned", {duration = stun_duration})
			EmitSoundOn(sound, target)
		end
	end

	-- Saves the new position for the next check
	target.position = new_position
end
 
Последнее редактирование модератором:

00zveroboi

Активный
14 Июл 2015
103
17
Я не особо понимаю цель типа скиллов в датадривен, онли луа, но ты уверен, что твой код должен работать так как нужно, либо скажи, умеешь ли ты писать скрипты в целом? Если хочешь, могу помочь с парой моментов этого скрипта...
 

Gaben

Пользователь
7 Авг 2016
15
0
Я не особо понимаю цель типа скиллов в датадривен, онли луа, но ты уверен, что твой код должен работать так как нужно, либо скажи, умеешь ли ты писать скрипты в целом? Если хочешь, могу помочь с парой моментов этого скрипта...
Я хочу переписать скил мана лик таким образом, чтобы он накладывался на себя в виде переключения (как 1 абилка тролля или же манашилд у медузы) то есть переключаешь в активное состоянии и у тебя сжигается мана и увеличивается мувспид на 100, а когда абилка выключена, то ничего не происходит.
 
Последнее редактирование модератором:

00zveroboi

Активный
14 Июл 2015
103
17
Ты как хочешь, чтобы абилка заканчивалась, когда кончается мана?
Если, чтобы абилка станила и переключалась обратно, то вот пример:
vscripts/abilities/mana_ms.lua
Код:
mana_ms = class({})
LinkLuaModifier( "modifier_mana_ms", "abilities/mana_ms", LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_mana_ms_stun", "abilities/mana_ms", LUA_MODIFIER_MOTION_NONE )

function mana_ms:ProcsMagicStick()
	return false
end

function mana_ms:OnToggle()
	if self:GetToggleState() then self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_mana_ms", nil )
	else self:GetCaster():RemoveModifierByName( "modifier_mana_ms" ) end
end

modifier_mana_ms = class({})

function modifier_mana_ms:IsDebuff()
	return false
end

function modifier_mana_ms:OnCreated( kv )
	self.movespeed = self:GetAbility():GetSpecialValueFor( "movespeed" )
	self.mp_per = self:GetAbility():GetSpecialValueFor( "mp_per" )
	
	if IsServer() then
		self.pos = self:GetParent():GetOrigin()
		self:StartIntervalThink( 0.05 )
	end
end

function modifier_mana_ms:OnRefresh( kv )
	self.movespeed = self:GetAbility():GetSpecialValueFor( "movespeed" )
	self.mp_per = self:GetAbility():GetSpecialValueFor( "mp_per" )
end

function modifier_mana_ms:OnIntervalThink()
	if IsServer() then
		local hero = self:GetParent()
		local dist = ( self.pos - hero:GetOrigin() ):Length2D()
		local mana = hero:GetMana()
		local manacost = self.mp_per * 0.01 * hero:GetMaxMana()
		hero:SpendMana( manacost * dist * 0.01, self:GetAbility() )
		self.pos = hero:GetOrigin()
		if mana == 0 then 
			hero:AddNewModifier( hero, self:GetAbility(), "modifier_mana_ms_stun", { duration = self:GetAbility():GetSpecialValueFor( "duration" ) } )
			self:GetAbility():ToggleAbility()
		end
	end
end

function modifier_mana_ms:OnDestroy()
	if IsServer() then
		self:StartIntervalThink( -1 )
	end
end

function modifier_mana_ms:DeclareFunctions()
	return { MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE }
end

function modifier_mana_ms:GetModifierMoveSpeedBonus_Percentage( params )
	return self.movespeed
end

modifier_mana_ms_stun = class({})
function modifier_mana_ms_stun:IsDebuff()
	return true
end
function modifier_mana_ms_stun:IsStunDebuff()
	return true
end
function modifier_mana_ms_stun:GetEffectName()
	return "particles/generic_gameplay/generic_stunned.vpcf"
end
function modifier_mana_ms_stun:GetEffectAttachType()
	return PATTACH_OVERHEAD_FOLLOW
end
function modifier_mana_ms_stun:DeclareFunctions()
	return { MODIFIER_PROPERTY_OVERRIDE_ANIMATION }
end
function modifier_mana_ms_stun:GetOverrideAnimation( params )
	return ACT_DOTA_DISABLED
end
function modifier_mana_ms_stun:CheckState()
	return { [MODIFIER_STATE_STUNNED] = true }
end
npc/npc_abilities_custom.txt
Код:
	"mana_ms"
	{													
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_TOGGLE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
		"SpellImmunityType"				"SPELL_IMMUNITY_ENEMIES_YES"
		"FightRecapLevel"				"1"
		"BaseClass"						"ability_lua"
		"AbilityTextureName"			"keeper_of_the_light_mana_leak"
		"ScriptFile"					"abilities/mana_ms"
		"LevelsBetweenUpgrades"			"2"
		"RequiredLevel"					"1"
		"MaxLevel"						"4"
		"AbilityCastPoint"				"0"
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"				"FIELD_INTEGER"
				"movespeed"				"250"
			}
			"02"
			{
				"var_type"				"FIELD_INTEGER"
				"mp_per"				"5"
			}
			"03"
			{
				"var_type"				"FIELD_FLOAT"
				"duration"				"5"
			}
		}
	}
Посмотри как работает, если хочешь что-то изменить - думай уже своей головой...
 
Последнее редактирование модератором:

Gaben

Пользователь
7 Авг 2016
15
0
[quote author=00zveroboi link=topic=1663.msg11297#msg11297 date=1503103681]
Ты как хочешь, чтобы абилка заканчивалась, когда кончается мана?
Если, чтобы абилка станила и переключалась обратно, то вот пример:
vscripts/abilities/mana_ms.lua
Код:
mana_ms = class({})
LinkLuaModifier( "modifier_mana_ms", "abilities/mana_ms", LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_mana_ms_stun", "abilities/mana_ms", LUA_MODIFIER_MOTION_NONE )

function mana_ms:ProcsMagicStick()
	return false
end

function mana_ms:OnToggle()
	if self:GetToggleState() then self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_mana_ms", nil )
	else self:GetCaster():RemoveModifierByName( "modifier_mana_ms" ) end
end

modifier_mana_ms = class({})

function modifier_mana_ms:IsDebuff()
	return false
end

function modifier_mana_ms:OnCreated( kv )
	self.movespeed = self:GetAbility():GetSpecialValueFor( "movespeed" )
	self.mp_per = self:GetAbility():GetSpecialValueFor( "mp_per" )
	
	if IsServer() then
		self.pos = self:GetParent():GetOrigin()
		self:StartIntervalThink( 0.05 )
	end
end

function modifier_mana_ms:OnRefresh( kv )
	self.movespeed = self:GetAbility():GetSpecialValueFor( "movespeed" )
	self.mp_per = self:GetAbility():GetSpecialValueFor( "mp_per" )
end

function modifier_mana_ms:OnIntervalThink()
	if IsServer() then
		local hero = self:GetParent()
		local dist = ( self.pos - hero:GetOrigin() ):Length2D()
		local mana = hero:GetMana()
		local manacost = self.mp_per * 0.01 * hero:GetMaxMana()
		hero:SpendMana( manacost * dist * 0.01, self:GetAbility() )
		self.pos = hero:GetOrigin()
		if mana == 0 then 
			hero:AddNewModifier( hero, self:GetAbility(), "modifier_mana_ms_stun", { duration = self:GetAbility():GetSpecialValueFor( "duration" ) } )
			self:GetAbility():ToggleAbility()
		end
	end
end

function modifier_mana_ms:OnDestroy()
	if IsServer() then
		self:StartIntervalThink( -1 )
	end
end

function modifier_mana_ms:DeclareFunctions()
	return { MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE }
end

function modifier_mana_ms:GetModifierMoveSpeedBonus_Percentage( params )
	return self.movespeed
end

modifier_mana_ms_stun = class({})
function modifier_mana_ms_stun:IsDebuff()
	return true
end
function modifier_mana_ms_stun:IsStunDebuff()
	return true
end
function modifier_mana_ms_stun:GetEffectName()
	return "particles/generic_gameplay/generic_stunned.vpcf"
end
function modifier_mana_ms_stun:GetEffectAttachType()
	return PATTACH_OVERHEAD_FOLLOW
end
function modifier_mana_ms_stun:DeclareFunctions()
	return { MODIFIER_PROPERTY_OVERRIDE_ANIMATION }
end
function modifier_mana_ms_stun:GetOverrideAnimation( params )
	return ACT_DOTA_DISABLED
end
function modifier_mana_ms_stun:CheckState()
	return { [MODIFIER_STATE_STUNNED] = true }
end
npc/npc_abilities_custom.txt
Код:
	"mana_ms"
	{													
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_TOGGLE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
		"SpellImmunityType"				"SPELL_IMMUNITY_ENEMIES_YES"
		"FightRecapLevel"				"1"
		"BaseClass"						"ability_lua"
		"AbilityTextureName"			"keeper_of_the_light_mana_leak"
		"ScriptFile"					"abilities/mana_ms"
		"LevelsBetweenUpgrades"			"2"
		"RequiredLevel"					"1"
		"MaxLevel"						"4"
		"AbilityCastPoint"				"0"
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"				"FIELD_INTEGER"
				"movespeed"				"250"
			}
			"02"
			{
				"var_type"				"FIELD_INTEGER"
				"mp_per"				"5"
			}
			"03"
			{
				"var_type"				"FIELD_FLOAT"
				"duration"				"5"
			}
		}
	}
Посмотри как работает, если хочешь что-то изменить - думай уже своей головой...
[/quote]

Что-то не работает. При нажатии на скил появляется курсор, как будто это таргетная абилка, хотя кинуть её никуда нельзя. Я вообще мало знаком с "ability_lua", а всегда делал через "ability_datadriven", где каждая функция отвечает за отдельный модификатор, а не скрипт в целом за абилку.
 
Последнее редактирование модератором:

00zveroboi

Активный
14 Июл 2015
103
17
Что-то не работает. При нажатии на скил появляется курсор, как будто это таргетная абилка, хотя кинуть её никуда нельзя. Я вообще мало знаком с "ability_lua", а всегда делал через "ability_datadriven", где каждая функция отвечает за отдельный модификатор, а не скрипт в целом за абилку.
Ты закинь файл именно в папку addon/scripts/vscripts/abilities/, а название не меняй
 
Последнее редактирование модератором:

Gaben

Пользователь
7 Авг 2016
15
0
Последнее редактирование модератором:

00zveroboi

Активный
14 Июл 2015
103
17
Файл находится папке dota 2 beta\game\dota_addons\addon\scripts\vscripts\abilities, название файла mana_ms.lua
Если все правильно залил и ничего не менял - должно работать 100%
addon в плане папка аддона
 
Последнее редактирование модератором:

Gaben

Пользователь
7 Авг 2016
15
0
Если все правильно залил и ничего не менял - должно работать 100%
addon в плане папка аддона
Ну естественно, я же не совсем тупой, как могло бы показаться. Закинул всё правильно, но не работает. Мб какие-нибудь библиотеки нужны? С ability_lua даже иконка в худе не появляется.
 
Последнее редактирование модератором:

00zveroboi

Активный
14 Июл 2015
103
17
Ну естественно, я же не совсем тупой, как могло бы показаться. Закинул всё правильно, но не работает. Мб какие-нибудь библиотеки нужны? С ability_lua даже иконка в худе не появляется.
А в абилити кастом тоже правильно закинул, так же прописать скилл в героях или может скопировал не все? Если так, то ищи ошибку, в коде все правильно
 
Последнее редактирование модератором:
Реклама: