Как сделать юнита который будет прокачивать свой скил?

  • Автор темы Автор темы djuga228
  • Дата начала Дата начала
djuga228,
Берешь делаешь в abilities_custom.txt в нужном скилле на "OnSpellStart" вызов функции "FunctionName" из скрипта луа, в скрипте делаешь то, что тебе посоветовали, щас немного объясню строки:
Код:
  function FunctionName(keys) -- собсна, сама ф-ция
   local caster = keys.caster -- берем кастера скилла и суем в переменную
   local newunit1 = CreateUnitByName(имя_юнита + другие значения, загугли) -- [url]https://developer.valvesoftware.com/wiki/Dota_2_Workshop_Tools/Scripting/API/Global.CreateUnitByName[/url] || Короче эта строка создаст юнита и в данной функции впихнет его в переменную.
там нужно [i]( szUnitName, vLocation, bFindClearSpace, hNPCOwner, hUnitOwner, iTeamNumber ). [i]hNPCOwner, hUnitOwner можно сделать nil - тогда юнит принадлежать никому не будет. [i]bFindClearSpace делай 'true' - не даст юниту застрять при спавне.
[/i][/i][/i]UnitName - пишешь имя юнита в " ", можно использовать юнитов из npc_custom_units.txt. локацию указываешь как вектор.
   newunit1:AddAbility(название_способности) -- ":" - что-то вроде присваивания. Здесь мы добавляем юниту скилл.
   newunit1:GetAbilityByIndex(номер_способности_юнита):SetLevel(caster:GetAbilityByIndex(номер_способности_героя):GetLevel()) Берем Индекс Скилла Юнита:Меняем Уровень Скилла на тот, до которого прокачан выбранный скилл у героя.
  end
Если что не понятно - не стесняйся, спрашивай еще раз, но формулируй вопрос корректно и конкретно. А вообще - советую для начала поковырять что-то попроще, ибо заметно, что ты сразу схватился за следующую ступеньку, не пройдя прошлую ;)
 
Последнее редактирование модератором:
[quote author=Slavko link=topic=181.msg882#msg882 date=1436474476]
djuga228,
Берешь делаешь в abilities_custom.txt в нужном скилле на "OnSpellStart" вызов функции "FunctionName" из скрипта луа, в скрипте делаешь то, что тебе посоветовали, щас немного объясню строки:
Код:
  function FunctionName(keys) -- собсна, сама ф-ция
   local caster = keys.caster -- берем кастера скилла и суем в переменную
   local newunit1 = CreateUnitByName(имя_юнита + другие значения, загугли) -- [url]https://developer.valvesoftware.com/wiki/Dota_2_Workshop_Tools/Scripting/API/Global.CreateUnitByName[/url] || Короче эта строка создаст юнита и в данной функции впихнет его в переменную.
там нужно [i]( szUnitName, vLocation, bFindClearSpace, hNPCOwner, hUnitOwner, iTeamNumber ). [i]hNPCOwner, hUnitOwner можно сделать nil - тогда юнит принадлежать никому не будет. [i]bFindClearSpace делай 'true' - не даст юниту застрять при спавне.
[/i][/i][/i]UnitName - пишешь имя юнита в " ", можно использовать юнитов из npc_custom_units.txt. локацию указываешь как вектор.
   newunit1:AddAbility(название_способности) -- ":" - что-то вроде присваивания. Здесь мы добавляем юниту скилл.
   newunit1:GetAbilityByIndex(номер_способности_юнита):SetLevel(caster:GetAbilityByIndex(номер_способности_героя):GetLevel()) Берем Индекс Скилла Юнита:Меняем Уровень Скилла на тот, до которого прокачан выбранный скилл у героя.
  end
Если что не понятно - не стесняйся, спрашивай еще раз, но формулируй вопрос корректно и конкретно. А вообще - советую для начала поковырять что-то попроще, ибо заметно, что ты сразу схватился за следующую ступеньку, не пройдя прошлую ;)
[/quote]Да все верно , схватился за нее т.к очень нужно это сделать прямо сейчас, и не могли бы мы просто поговорить в скайпе, я адекватный и мне очень это надо,и еще накину шмоточек в дотке что-бы твое время зря не тратил.
 
Последнее редактирование модератором:
Короче снова не так меня поняли, теперь напишу как можно понятнее по максимуму,
Вот мой файл npc_units.txt , не npc_units_custom.txt, а просто npc_units.txt, в нем как раз уже есть нужный мне юнит, вот вам моя мина
"npc_dota_techies_land_mine"
{
// General
//----------------------------------------------------------------
"Model" "models/heroes/techies/fx_techies_remotebomb.mdl" // Model.
"BaseClass" "npc_dota_creep_neutral"
"SoundSet" "0" // Name of sound set.
"Level" "2"
"ModelScale" "1.5"
"SelectionGroup" "Techies_LandMines"
"BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion.


// Abilities
//----------------------------------------------------------------
"Ability1" "creature_acid_spray" // Ability 1
"Ability2" "" // Ability 2
"Ability3" "" // Ability 3
"Ability4" "" // Ability 4

// Armor
//----------------------------------------------------------------
"ArmorPhysical" "0" // Physical protection.

// Attack
//----------------------------------------------------------------
"AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK"
"AttackDamageMin" "0" // Damage range min.
"AttackDamageMax" "0" // Damage range max.
"AttackRate" "1.0" // Speed of attack.
"AttackAnimationPoint" "0.0" // Normalized time in animation cycle to attack.
"AttackAcquisitionRange" "0" // Range within a target can be acquired.
"AttackRange" "0" // Range within a target can be attacked.
"ProjectileModel" "" // Particle system model for projectile.
"ProjectileSpeed" "0" // Speed of projectile.

// Bounds
//----------------------------------------------------------------
"HealthBarOffset" "140"

// Bounty
//----------------------------------------------------------------
"BountyXP" "14" // Experience earn.
"BountyGoldMin" "0" // Gold earned min.
"BountyGoldMax" "0" // Gold earned max.

// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // has to be move ground because something about neutral camps
"MovementSpeed" "0" // Speed.
"MovementTurnRate" "0" // Turning rate.

// Status
//----------------------------------------------------------------
"StatusHealth" "100" // Base health.
"StatusHealthRegen" "0.0" // Health regeneration rate.

// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "64" // Range of vision during day light.
"VisionNighttimeRange" "64" // Range of vision at night time.

// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_NEUTRALS" // Team name.
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD"


// Bounds
//----------------------------------------------------------------
"HealthBarOffset" "140"

// Bounty
//----------------------------------------------------------------
"BountyXP" "14" // Experience earn.
"BountyGoldMin" "0" // Gold earned min.
"BountyGoldMax" "0" // Gold earned max.

// Movement
//----------------------------------------------------------------
"MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // has to be move ground because something about neutral camps
"MovementSpeed" "0" // Speed.
"MovementTurnRate" "0" // Turning rate.

// Status
//----------------------------------------------------------------
"StatusHealth" "100" // Base health.
"StatusHealthRegen" "0.0" // Health regeneration rate.

// Vision
//----------------------------------------------------------------
"VisionDaytimeRange" "64" // Range of vision during day light.
"VisionNighttimeRange" "64" // Range of vision at night time.

// Team
//----------------------------------------------------------------
"TeamName" "DOTA_TEAM_NEUTRALS" // Team name.
"CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC"
"CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC"
"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD"
}
то есть мы видим что там уже прописан скил , вот тока тогда зачем это newunit1:AddAbility так называемая добавка юниту способность , если она уже у него есть? И неужели обязательно нужно именно npc_units_custom.txt, если мне нужно все это проделать с обычным юнитом,(и тут я начинаю понимать что задаю очень глупый вопрос , ну и пох , продолжим)вот эти строки я должен приписать в луа?
Код:
   function 	OnSpellStart()
   local caster = self:GetCaster()
   local land_mine = CreateUnitByName("npc_dota_techies_land_mine", target_point, false, nil, nil, caster:GetTeamNumber())
   land_mine:AddAbility(creature_acid_spray)
   land_mine:GetAbilityByIndex(1):SetLevel(caster:GetAbilityByIndex(2):GetLevel())
end
Если да то их надо прописать в пустую луа где нечего нету или же надо их приписать к этому луа(Конечно код, чуть выше я поправлю ,я просто его вставил к примеру!)
--[[Author: Pizzalol
Date: 24.03.2015.
Creates the land mine and keeps track of it]]
function LandMinesPlant( keys )
local caster = keys.caster
local target_point = keys.target_points[1]
local ability = keys.ability
local ability_level = ability:GetLevel() - 1

-- Initialize the count and table
caster.land_mine_count = caster.land_mine_count or 0
caster.land_mine_table = caster.land_mine_table or {}

-- Modifiers
local modifier_land_mine = keys.modifier_land_mine
local modifier_tracker = keys.modifier_tracker
local modifier_caster = keys.modifier_caster
local modifier_land_mine_invisibility = keys.modifier_land_mine_invisibility

-- Ability variables
local activation_time = ability:GetLevelSpecialValueFor("activation_time", ability_level)
local max_mines = ability:GetLevelSpecialValueFor("max_mines", ability_level)
local fade_time = ability:GetLevelSpecialValueFor("fade_time", ability_level)

-- Create the land mine and apply the land mine modifier
local land_mine = CreateUnitByName("npc_dota_techies_land_mine", target_point, false, nil, nil, caster:GetTeamNumber())
ability:ApplyDataDrivenModifier(caster, land_mine, modifier_land_mine, {})

-- Update the count and table
caster.land_mine_count = caster.land_mine_count + 1
table.insert(caster.land_mine_table, land_mine)

-- If we exceeded the maximum number of mines then kill the oldest one
if caster.land_mine_count > max_mines then
caster.land_mine_table[1]:ForceKill(true)
end

-- Increase caster stack count of the caster modifier and add it to the caster if it doesnt exist
if not caster:HasModifier(modifier_caster) then
ability:ApplyDataDrivenModifier(caster, caster, modifier_caster, {})
end

caster:SetModifierStackCount(modifier_caster, ability, caster.land_mine_count)

-- Apply the tracker after the activation time
Timers:CreateTimer(activation_time, function()
ability:ApplyDataDrivenModifier(caster, land_mine, modifier_tracker, {})
end)

-- Apply the invisibility after the fade time
Timers:CreateTimer(fade_time, function()
ability:ApplyDataDrivenModifier(caster, land_mine, modifier_land_mine_invisibility, {})
end)
end

--[[Author: Pizzalol
Date: 24.03.2015.
Stop tracking the mine and create vision on the mine area]]
function LandMinesDeath( keys )
local caster = keys.caster
local unit = keys.unit
local ability = keys.ability
local ability_level = ability:GetLevel() - 1

-- Ability variables
local modifier_caster = keys.modifier_caster
local vision_radius = ability:GetLevelSpecialValueFor("vision_radius", ability_level)
local vision_duration = ability:GetLevelSpecialValueFor("vision_duration", ability_level)

-- Find the mine and remove it from the table
for i = 1, #caster.land_mine_table do
if caster.land_mine_table == unit then
table.remove(caster.land_mine_table, i)
caster.land_mine_count = caster.land_mine_count - 1
break
end
end

-- Create vision on the mine position
ability:CreateVisibilityNode(unit:GetAbsOrigin(), vision_radius, vision_duration)

-- Update the stack count
caster:SetModifierStackCount(modifier_caster, ability, caster.land_mine_count)
if caster.land_mine_count < 1 then
caster:RemoveModifierByNameAndCaster(modifier_caster, caster)
end
end

--[[Author: Pizzalol
Date: 24.03.2015.
Tracks if any enemy units are within the mine radius]]
function LandMinesTracker( keys )
local target = keys.target
local ability = keys.ability
local ability_level = ability:GetLevel() - 1

-- Ability variables
local trigger_radius = ability:GetLevelSpecialValueFor("small_radius", ability_level)
local explode_delay = ability:GetLevelSpecialValueFor("explode_delay", ability_level)

-- Target variables
local target_team = DOTA_UNIT_TARGET_TEAM_ENEMY
local target_types = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING
local target_flags = DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES

-- Find the valid units in the trigger radius
local units = FindUnitsInRadius(target:GetTeamNumber(), target:GetAbsOrigin(), nil, trigger_radius, target_team, target_types, target_flags, FIND_CLOSEST, false)

-- If there is a valid unit in range then explode the mine
if #units > 0 then
Timers:CreateTimer(explode_delay, function()
if target:IsAlive() then
target:ForceKill(true)
end
end)
end
end

Если к этому то тогда в какое конкретно место приписать?(Неужели не кто не может написать свой скайп в личку и нормально объяснить , я не то что-бы тупой , но просто бывает такая херня что не допераеш и все , и уж тем более не за бесплатно предлагаю,а за 50 рарочек за 10 минут времени, мне это очень нужно, даже представить не можете на сколько)
 
Последнее редактирование модератором:
[quote author=doter.ua link=topic=181.msg892#msg892 date=1436510179]
djuga228,
1) Юнитам не нужно качать абилки.
2) Почитай гайды: http://moddota.com/forums/discussion/14/datadriven-ability-breakdown-documentation
https://moddota.com/forums/discussion/224/datadriven-units
[/quote]А кто сказал что я собираюсь качать ему абилку, мне это не надо, все что мне надо это когда я прокочаю мину на 2 уровень то та абилка что в мине сама перейдет на уровень выше,то есть то же на 2
 
Все вопрос решен , спасибо MeowHellYeah , поговорили в скайпе, все четко рассказал, и получил 100 рарок.
 
Реклама: