CustomGames.ru - Dota 2 пользовательские игры

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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Gaben

  • 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
[свернуть]
« Последнее редактирование: 19-08-2017, 06:53:48 от Gaben »

Оффлайн 00zveroboi

  • 50
  • Мощь: 0
Re: Не получается запилить абилку
« Ответ #1 : 17-08-2017, 02:26:22 »
Я не особо понимаю цель типа скиллов в датадривен, онли луа, но ты уверен, что твой код должен работать так как нужно, либо скажи, умеешь ли ты писать скрипты в целом? Если хочешь, могу помочь с парой моментов этого скрипта...
« Последнее редактирование: 17-08-2017, 02:29:58 от 00zveroboi »

Оффлайн Gaben

  • 15
  • Мощь: 0
Re: Не получается запилить абилку
« Ответ #2 : 17-08-2017, 17:03:46 »
Я не особо понимаю цель типа скиллов в датадривен, онли луа, но ты уверен, что твой код должен работать так как нужно, либо скажи, умеешь ли ты писать скрипты в целом? Если хочешь, могу помочь с парой моментов этого скрипта...
Я хочу переписать скил мана лик таким образом, чтобы он накладывался на себя в виде переключения (как 1 абилка тролля или же манашилд у медузы) то есть переключаешь в активное состоянии и у тебя сжигается мана и увеличивается мувспид на 100, а когда абилка выключена, то ничего не происходит.

Оффлайн MahouShoujo

  • Продвинутый
  • 204
  • Мощь: 4
Re: Не получается запилить абилку
« Ответ #3 : 18-08-2017, 17:03:51 »
Ну дебажь и смотри что конкретно не работает.

Оффлайн 00zveroboi

  • 50
  • Мощь: 0
Re: Не получается запилить абилку
« Ответ #4 : 19-08-2017, 00:48:01 »
Ты как хочешь, чтобы абилка заканчивалась, когда кончается мана?
Если, чтобы абилка станила и переключалась обратно, то вот пример:
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"
}
}
}
[свернуть]
Посмотри как работает, если хочешь что-то изменить - думай уже своей головой...
« Последнее редактирование: 19-08-2017, 03:14:58 от 00zveroboi »

Оффлайн Gaben

  • 15
  • Мощь: 0
Re: Не получается запилить абилку
« Ответ #5 : 19-08-2017, 07:24:03 »
Ты как хочешь, чтобы абилка заканчивалась, когда кончается мана?
Если, чтобы абилка станила и переключалась обратно, то вот пример:
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"
}
}
}
[свернуть]
Посмотри как работает, если хочешь что-то изменить - думай уже своей головой...

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

Оффлайн I_GRIN_I

  • Продвинутый
  • 636
  • Мощь: 11
  • Научиться бы скриптить...
Re: Не получается запилить абилку
« Ответ #6 : 19-08-2017, 10:08:44 »
Gaben, ты путь к скрипту неправильно написал

Оффлайн 00zveroboi

  • 50
  • Мощь: 0
Re: Не получается запилить абилку
« Ответ #7 : 19-08-2017, 14:21:24 »
Что-то не работает. При нажатии на скил появляется курсор, как будто это таргетная абилка, хотя кинуть её никуда нельзя. Я вообще мало знаком с "ability_lua", а всегда делал через "ability_datadriven", где каждая функция отвечает за отдельный модификатор, а не скрипт в целом за абилку.
Ты закинь файл именно в папку addon/scripts/vscripts/abilities/, а название не меняй
« Последнее редактирование: 19-08-2017, 14:24:55 от 00zveroboi »

Оффлайн Gaben

  • 15
  • Мощь: 0
Re: Не получается запилить абилку
« Ответ #8 : 19-08-2017, 14:39:22 »
Ты закинь файл именно в папку addon/scripts/vscripts/abilities/, а название не меняй
Файл находится папке dota 2 beta\game\dota_addons\addon\scripts\vscripts\abilities, название файла mana_ms.lua


Оффлайн 00zveroboi

  • 50
  • Мощь: 0
Re: Не получается запилить абилку
« Ответ #9 : 19-08-2017, 14:42:40 »
Файл находится папке dota 2 beta\game\dota_addons\addon\scripts\vscripts\abilities, название файла mana_ms.lua


Если все правильно залил и ничего не менял - должно работать 100%
addon в плане папка аддона

Оффлайн Gaben

  • 15
  • Мощь: 0
Re: Не получается запилить абилку
« Ответ #10 : 19-08-2017, 14:56:16 »
Если все правильно залил и ничего не менял - должно работать 100%
addon в плане папка аддона
Ну естественно, я же не совсем тупой, как могло бы показаться. Закинул всё правильно, но не работает. Мб какие-нибудь библиотеки нужны? С ability_lua даже иконка в худе не появляется.

Оффлайн 00zveroboi

  • 50
  • Мощь: 0
Re: Не получается запилить абилку
« Ответ #11 : 19-08-2017, 15:14:53 »
Ну естественно, я же не совсем тупой, как могло бы показаться. Закинул всё правильно, но не работает. Мб какие-нибудь библиотеки нужны? С ability_lua даже иконка в худе не появляется.
А в абилити кастом тоже правильно закинул, так же прописать скилл в героях или может скопировал не все? Если так, то ищи ошибку, в коде все правильно