Улучшение строений и юнитов

invoker1337

Новичок
16 Июл 2018
5
0
Проект
custom maps
Как сделать улучшение строений и юнитов?
Например я хочу сделать казарму которую можно будет улучшать
Пример на картинке
А с этих казарм будут выходить крипы так же будут улучшаться с прокачкой казарм1.png
 
Создать юнита (казарму) создать функцию ручное событие на лвлап, в ней менять модель или размер, так же задавать свойство для юнита, в зависимости от свойства юнита спавнить соответствующих юнитов других. Тут нужно понимать как работает дота на луа, тогда все легко.
 
Есть кто дело это и может объяснить более углубленно
 
Есть кто дело это и может объяснить более углубленно
Мб быстро уничтожать казарму после чего сразу спавнить на этом месте новую с другим уровнем,а юнитов спавнить при условиях уровня казармы,особо обьяснить не смогу,так как не шарился по данной теме.
 
Я могу объяснить, но может еще видео запилить? может курс гайд устроить по механике? проспонсируете - легко :D
Домой приду - напишу все как сделать, подожди
 
Но начинать естественно буду тогда с основ, а не сразу то, что тебе нужно, насчет этого уже распишу сегодня чуть позже
P.S. мои основы это уже далеко не то, что умеет каждый сейчас ;):cool:
 
Если кратко: можно реализовать самым разным способом, на примере покажу такую механику: 1 казарма, у нее 2 скилла: 1-ый спавнит юнита лвла казармы, 2-ой апгрейдит казарму, у казармы и у юнитов максимальный лвл, который сами задаем, стандартно 25, юниты будут различаться по стандартным статам.
Создаем юнитов и казарму: npc_units_custom.txt
Код:
"monster"   
    {
        // General
        //----------------------------------------------------------------
        "Model"                        "models/creeps/neutral_creeps/n_creep_gnoll/n_creep_gnoll_frost.vmdl"    // Model.
        "BaseClass"                    "npc_dota_creature"
        "Level"                        "1"
        "ModelScale"                 ".7"

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

        // Attack
        //----------------------------------------------------------------
        "AttackCapabilities"        "DOTA_UNIT_CAP_MELEE_ATTACK"
        "AttackDamageMin"            "2"        // Damage range min.
        "AttackDamageMax"            "3"        // Damage range max.
        "AttackRate"                "1"        // Speed of attack.
        "AttackAnimationPoint"        "0.5"        // Normalized time in animation cycle to attack.
        "AttackAcquisitionRange"    "400"        // Range within a target can be acquired.
        "AttackRange"                "100"        // Range within a target can be attacked.         

        // Bounty
        //----------------------------------------------------------------
        "BountyXP"                    "1"        // Experience earn.
        "BountyGoldMin"                "2"        // Gold earned min.
        "BountyGoldMax"                "4"        // Gold earned max.

        // Movement
        //----------------------------------------------------------------
        "MovementCapabilities"        "DOTA_UNIT_CAP_MOVE_GROUND"
        "MovementSpeed"                "150"        // Speed.           

        // Status
        //----------------------------------------------------------------
        "StatusHealth"                "60"        // Base health.
        "StatusHealthRegen"            "1"            // Health regeneration rate.
        "StatusMana"                "0"            // Base mana.
        "StatusManaRegen"            "0.0"        // Mana regeneration rate.         
        
        // Vision
        //----------------------------------------------------------------
        "VisionDaytimeRange"        "500"        // Range of vision during day light.
        "VisionNighttimeRange"        "300"        // 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_DEFAULT"

        // Creature Data
        //----------------------------------------------------------------
        "Creature"
        {
            //Level Up
            "HPGain"                    "10"
            "DamageGain"                "2"
            "ArmorGain"                    "0.5"
            "MagicResistGain"            "0"
            "MoveSpeedGain"                "1"
            "BountyGain"                "1"
            "XPGain"                    "2"
        }
    }
Код:
"barrack"   
    {
        // General
        //----------------------------------------------------------------
        "Model"                        "models/props_structures/radiant_melee_barracks001.vmdl"    // Model.
        "BaseClass"                    "npc_dota_creature"
        "Level"                        "1"
        "ModelScale"                 ".6"

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

        // Attack
        //----------------------------------------------------------------
        "AttackCapabilities"        "DOTA_UNIT_CAP_NO_ATTACK"
        "AttackDamageMin"            "0"        // Damage range min.
        "AttackDamageMax"            "0"        // Damage range max.
        "AttackRate"                "1"        // Speed of attack.
        "AttackAnimationPoint"        "0.5"        // Normalized time in animation cycle to attack.
        "AttackAcquisitionRange"    "400"        // Range within a target can be acquired.
        "AttackRange"                "100"        // Range within a target can be attacked.         

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

        // Movement
        //----------------------------------------------------------------
        "MovementCapabilities"        "DOTA_UNIT_CAP_MOVE_NONE"
        "MovementSpeed"                "0"        // Speed.           

        // Status
        //----------------------------------------------------------------
        "StatusHealth"                "500"        // Base health.
        "StatusHealthRegen"            "0"            // Health regeneration rate.
        "StatusMana"                "0"            // Base mana.
        "StatusManaRegen"            "0.0"        // Mana regeneration rate.         
        
        // Vision
        //----------------------------------------------------------------
        "VisionDaytimeRange"        "1000"        // Range of vision during day light.
        "VisionNighttimeRange"        "1000"        // 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_DEFAULT"

        // Creature Data
        //----------------------------------------------------------------
        "Creature"
        {
            //Level Up
            "HPGain"                    "250"
            "DamageGain"                "0"
            "ArmorGain"                    "0"
            "MagicResistGain"            "0"
            "MoveSpeedGain"                "0"
            "BountyGain"                "0"
            "XPGain"                    "0"
        }
    }
Успех!

Далее ловим ушастых
Lua:
ListenToGameEvent( "npc_spawned", Dynamic_Wrap( Game, "OnNPCSpawned" ), self )

Словили - чекаем на первый спавн нашего героя:
Lua:
local Unit = EntIndexToHScript( event.entindex )
if Unit:IsRealHero() and Unit:GetPlayerID == 0 and Unit.FirstSpawn == nil then
    Unit.FirstSpawn = true;
    local Barrack = CreateUnitByName(
        "barrack",
        Vector(0, 0, 128),
        true,
        Unit,
        Unit,
        DOTA_TEAM_BADGUYS
    )
    Barrack:SetOwner(Unit)
    Barrack:SetControllableByPlayer(Unit:GetPlayerID(), false)
end

Создали, Ура!

Так же нужны скиллы.
npc_abilities_custom.txt
Код:
"spawn_mob"
    {
        // General
        //-------------------------------------------------------------------------------------------------------------
        "BaseClass"                        "ability_lua"
        "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
        "ScriptFile"                          "ability_spawn_mob"
        
        // Casting
        //-------------------------------------------------------------------------------------------------------------
        "AbilityCastRange"                "0"
        "AbilityCastPoint"                "0"

        // Time       
        //-------------------------------------------------------------------------------------------------------------
        "AbilityCooldown"                "5"

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

        // Special
        //-------------------------------------------------------------------------------------------------------------
        "AbilitySpecial"
        {
        }
    }
Код:
"self_upgrade"
    {
        // General
        //-------------------------------------------------------------------------------------------------------------
        "BaseClass"                        "ability_lua"
        "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
        "ScriptFile"                          "ability_self_upgrader"
        
        // Casting
        //-------------------------------------------------------------------------------------------------------------
        "AbilityCastRange"                "0"
        "AbilityCastPoint"                "0"

        // Time       
        //-------------------------------------------------------------------------------------------------------------
        "AbilityCooldown"                "100"

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

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

Lua:
spawn_mob = class({})

function spawn_mob:OnSpellStart()
    local Monster = CreateUnitByName(
        "monster",
        self:GetOrigin(),
        true,
        self:GetCaster():GetOwner(),
        self:GetCaster():GetOwner(),
        self:GetCaster():GetTeamNumber()
    )
    Monster:SetControllableByPlayer(self:GetCaster():GetPlayerID(), false)
    Monster:SetOwner(self:GetCaster())
    Monster:SetLevel(self:GetCaster():GetLevel())
end

Lua:
self_upgrader = class({})

function self_upgrader:OnSpellStart()
    self:GetCaster():SetLevel(self:GetCaster():GetLevel() + 1)
end

Вуаля, вставляем все работает, живем, пока молодые...
 
  • Нравится
Реакции: invoker1337 и vulkantsk
Если нужны видео уроки по тому, как писать кастомки более углубленно, чем вот так поверхностно, используя только встроенные функции, пишите, лайкайте, будет хоть 5-10 голосов - сделаю
 
  • Нравится
Реакции: bleff и Chernobl
Если нужны видео уроки по тому, как писать кастомки более углубленно, чем вот так поверхностно, используя только встроенные функции, пишите, лайкайте, будет хоть 5-10 голосов - сделаю
У тебя абилки активные,вопрос,как ты их будешь заставлять юзаться самим? Или с помощью SetOwner() и SetControllableByPlayer()? Это же бараки,они сами должны данные действия выполнять.
 
Если нужны видео уроки по тому, как писать кастомки более углубленно, чем вот так поверхностно, используя только встроенные функции, пишите, лайкайте, будет хоть 5-10 голосов - сделаю
Разве юниты или бараки считаются RealHero()?
 
У тебя абилки активные,вопрос,как ты их будешь заставлять юзаться самим? Или с помощью SetOwner() и SetControllableByPlayer()? Это же бараки,они сами должны данные действия выполнять.
Согласен , было бы неплохо таймер или синкер прикрепить , чтобы барак мобов спавнил через определенный интервал времени !
 
Я сказал сразу, что делаю так, через скиллы, а способов много, да, я забыл увеличение барака, но это тоже не сложно сделать.
 
Реклама: