Предыдущая часть:Спойлер: "Третья часть"Абилки (Ability) (на основе существующих)1) Создание скилов можно разделить на две категории:Первый тип создается довольно просто (об этом и пойдет речь этой части) Второй тип мутный и не понятный. Ходят слухи про парня который познал дзень создания абилок, но на следующий день он сошел с ума и застрелился. 2) Перед работой нужно приготовить следующее:
- На основе существующих
- Полностью новые (основа - базовый класс)
Да да npc_heroes_custom. Нужно же как-то затестить наши абилки. В созданный нами нпс_абилити_кастом запишите: "DOTAAbilities" { "Version" "1" //Сюда будем кодить. } С героями похожая штука: "DOTAHeroes" { //Сюда будем кодить. } Кто хочет, посмотрите примеры в холдауте Примерная схема работы: 3) Первые два файла - это файлы из доты, от туда мы будем брать абилки и героев (как пример)
- Файл npc_abilities.txt (из файла pak01_dir.vpk)
- Файл npc_heroes.txt (там же)
- Создать свои npc_abilities_custom.txt и npc_heroes_custom.txt
- Закинуть наши custom файлы в папку scripts/npc/
- Изменить название абилки. (дописать в конце что-то типа _new) но это чуть позже
Итак пример:
- Находим нужную абилку (юзайте поиск по документу, зависит от редактора)
- Копируем ее, вставляем целиком в наш кастомный файл.
- Обязательно нужно добавить "BaseClass" и "AbilityTextureName"
- Изменить название например вместо "lina_dragon_slave" напишите "lina_dragon_slave_new" (новое название будем использовать при редактировании героя)
Это кусок из стандартного нпс_абилити. Можно стереть id или назначить свой, но уникальный(без повторов). Можете поменять данные (там все интуитивно понятно) Например: "AbilityManaCost" "25" Фрагмент будет выглядеть приблизительно такСпойлер: "Пример"//================================================================================================================= // Ability: Lina Dragon Slave //================================================================================================================= "lina_dragon_slave" { // General //------------------------------------------------------------------------------------------------------------- "ID" "5040" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_POINT" "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" "FightRecapLevel" "1" // Casting //------------------------------------------------------------------------------------------------------------- "AbilityCastRange" "800" "AbilityCastPoint" "0.45 0.45 0.45 0.45" // Time //------------------------------------------------------------------------------------------------------------- "AbilityCooldown" "8.5 8.5 8.5 8.5" "AbilityDuration" "0.6875 0.6875 0.6875 0.6875" // Damage. //------------------------------------------------------------------------------------------------------------- "AbilityDamage" "100 170 230 280" // Cost //------------------------------------------------------------------------------------------------------------- "AbilityManaCost" "90 105 125 140" // Special //------------------------------------------------------------------------------------------------------------- "AbilitySpecial" { "01" { "var_type" "FIELD_INTEGER" "dragon_slave_speed" "1200" } "02" { "var_type" "FIELD_INTEGER" "dragon_slave_width_initial" "275" } "03" { "var_type" "FIELD_INTEGER" "dragon_slave_width_end" "200" } "04" { "var_type" "FIELD_INTEGER" "dragon_slave_distance" "1075" } } }4) Так же нужно прекэшировать файлы для анимации, патиклы (particle) Делается это в функции function Precache( context ) end И не нужно нигде писать вызов функции типа Precache(context) система магическим образом все сделает сама. Есть два вызова прекэширования (точнее я знаю только 2) PrecacheResource( "particle_folder", "particles/units/heroes/hero_dragon_knight", context) PrecacheUnitByNameSync("npc_dota_hero_templar_assassin", context) Первый требует наличия файла с анимацией в myAddon/particles/units/heroes/ по идее эти файлы создаются вами. Если же нужно использовать анимацию, которая уже есть в доте(стандартную кароче), то используют второй способ, в котором нужн опередать имя героя, чья магия требует анимации (В нашем примере это Лина npc_dota_hero_lina). Вот и все. 5) Теперь добавим нашу абилку к герою. Откроем наш файл хирос_кастом В случае с гироями мы можем менять существующих (так написано в примере из холдаута) как создавать отдельных героев я не знаю, да в принципе перезаписывая существующих можно реализовать большинство своих идей (как ни как героев около сотни).Спойлер: "Код"// Ability: Lina Dragon Slave //================================================================================================================= "lina_dragon_slave_new" { // General //------------------------------------------------------------------------------------------------------------- "BaseClass" "lina_dragon_slave" "AbilityTextureName" "lina_dragon_slave" "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_POINT" "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" "FightRecapLevel" "1" // Casting //------------------------------------------------------------------------------------------------------------- "AbilityCastRange" "800" "AbilityCastPoint" "0.45 0.45 0.45 0.45" // Time //------------------------------------------------------------------------------------------------------------- "AbilityCooldown" "8.5 8.5 8.5 8.5" "AbilityDuration" "0.6875 0.6875 0.6875 0.6875" // Damage. //------------------------------------------------------------------------------------------------------------- "AbilityDamage" "100 170 230 280" // Cost //------------------------------------------------------------------------------------------------------------- "AbilityManaCost" "25" // Special //------------------------------------------------------------------------------------------------------------- "AbilitySpecial" { "01" { "var_type" "FIELD_INTEGER" "dragon_slave_speed" "1200" } "02" { "var_type" "FIELD_INTEGER" "dragon_slave_width_initial" "275" } "03" { "var_type" "FIELD_INTEGER" "dragon_slave_width_end" "200" } "04" { "var_type" "FIELD_INTEGER" "dragon_slave_distance" "1075" } } }Итак нужно написать название подопытного героя "npc_dota_hero_pudge_template" { "override_hero" "npc_dota_hero_pudge" "MovementSpeed" "500" // Speed. "Ability3" "lina_dragon_slave_new" } (на видео изменены все абилки, но для примера хватит и одной) Главное здесь это "override_hero" "npc_dota_hero_pudge" Обратите внимание, что я указал именно НОВОЕ название абилки с приставкой _new в конце (это делается для того, чтобы дота отличала обычную абилку от нашей, да и вообще две абилки с одинаковым именем ничего хорошего не принесут) Кстати можно написать и любую стандартную абилку, тоже будет работать, но не забудьте прекэшировать её. Здесь мы указываем название героя, которого хотим изменить. НЕ обязательно копировать все описание героя из файла npc_heroes.txt Копируйте только те свойства которые хотите поменять. Этот герой уже описан в оригинальных файлах, и если вы не напишите "MovementSpeed" "500", это не будет означать, что у пуджа не будет скорости вообще, просто она будет такой, как в оригинальном файле. Для примера скину кусок кода с пуджом из оригинала, там можно посмотреть на свойства которые можно изменить.Спойлер: "Пример из холдаута"// Dota Heroes File // NOTE: This is not for creating new heroes, this is for taking a currently existing hero as a template and overriding// the specified key-value combinations. Use override_hero <hero_to_override> for this."DOTAHeroes" { бла бла бла тут я все удалил. }Там много всякой инфы про ботов про билд... не знаю будет ли работать если что-то там поменять(я просто скопировал весь блок кода про пуджа)Спойлер: "Пудж ориджинал"//================================================================================================================= // HERO: Pudge //================================================================================================================= "npc_dota_hero_pudge" { // General //------------------------------------------------------------------------------------------------------------- "Model" "models/heroes/pudge/pudge.mdl" // Model. "Portrait" "vgui/hud/heroportraits/portrait_pudge" // Small image for hero selection "IdleExpression" "scenes/pudge/pudge_exp_idle_01.vcd" // custom facial animation idle "SoundSet" "Hero_Pudge" // Name of sound set. "PickSound" "pudge_pud_spawn_10" "BanSound" "pudge_pud_anger_01" "IdleSoundLoop" "Hero_Pudge.IdleLoop" "Enabled" "1" "HeroUnlockOrder" "3" "Role" "Durable,Disabler" "Rolelevels" "3,1" "Team" "Bad" "HeroID" "14" // unique ID number for this hero. Do not change this once established or it will invalidate collected stats. "ModelScale" "0.98" "LoadoutScale" ".92" "HeroGlowColor" "178 128 114" "CMEnabled" "1" "url" "Pudge" "LastHitChallengeRival" "npc_dota_hero_skeleton_king" "HeroSelectSoundEffect" ")weapons/hero/pudge/dismember_swing2.wav" // Abilities //------------------------------------------------------------------------------------------------------------- "Ability1" "pudge_meat_hook" // Ability 1 "Ability2" "pudge_rot" // Ability 2 "Ability3" "pudge_flesh_heap" // Ability 3 "Ability4" "pudge_dismember" // Ability 4 // Armor //------------------------------------------------------------------------------------------------------------- "ArmorPhysical" "-1" // Physical protection. // Attack //------------------------------------------------------------------------------------------------------------- "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" "AttackDamageMin" "27" // Damage range min. "AttackDamageMax" "33" // Damage range max. "AttackRate" "1.7" // Speed of attack. "AttackAnimationPoint" "0.5" // Normalized time in animation cycle to attack. "AttackAcquisitionRange" "600" // Range within a target can be acquired. "AttackRange" "128" // Range within a target can be attacked. "ProjectileModel" "" // Particle system model for projectile. "ProjectileSpeed" "0" // Speed of projectile. // Attributes //------------------------------------------------------------------------------------------------------------- "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" "AttributeBaseStrength" "25" // Base strength "AttributeStrengthGain" "3.2" // Strength bonus per level. "AttributeBaseIntelligence" "14" // Base intelligence "AttributeIntelligenceGain" "1.5" // Intelligence bonus per level. "AttributeBaseAgility" "14" // Base agility "AttributeAgilityGain" "1.5" // Agility bonus per level. // Movement //------------------------------------------------------------------------------------------------------------- "MovementSpeed" "285" // Speed. "MovementTurnRate" "0.5" // Turning rate. // Bounds //------------------------------------------------------------------------------------------------------------- "BoundsHullName" "DOTA_HULL_SIZE_HERO" "HealthBarOffset" "180" "ParticleFile" "particles/units/heroes/hero_pudge.pcf" "GameSoundsFile" "scripts/game_sounds_heroes/game_sounds_pudge.txt" "VoiceFile" "scripts/voscripts/game_sounds_vo_pudge.txt" "VoiceBackgroundSound" "Pudge.Background" // Additional data needed to render the out of game portrait "RenderablePortrait" { "Particles" { "pudge_ambient_chain" { "0" { "type" "follow_attachment" "location" "attach_weapon_chain_lf" } "1" { "type" "follow_attachment" "location" "attach_arm_chain_lf" } } "pudge_ambient_chain" { "0" { "type" "follow_attachment" "location" "attach_weapon_chain_rt" } "1" { "type" "follow_attachment" "location" "attach_arm_chain_rt" } } "pudge_ambient_flies" { "0" { "type" "follow_origin" "location" "attach_hitloc" //Note : shouldn't need this } } "pudge_loadout" { "0" { "type" "follow_origin" "location" "attach_hitloc" } "1" { "type" "follow_origin" "position" "200 1 200" } } } } // Hero Selection "AbilityPreview" { "resource" "resource/UI/Heroes/default.res" "movie" "media/heroes/default" "resource" "resource/UI/Heroes/default.res" "resource" "resource/UI/Heroes/default.res" "resource" "resource/UI/Heroes/default.res" "resource" "resource/UI/Heroes/default.res" } // Items "ItemSlots" { "0" { "SlotIndex" "0" "SlotName" "weapon" "SlotText" "#LoadoutSlot_Weapon" "TextureWidth" "256" "TextureHeight" "256" "MaxPolygonsLOD0" "350" "MaxPolygonsLOD1" "350" } "1" { "SlotIndex" "1" "SlotName" "head" "SlotText" "#LoadoutSlot_Head" "TextureWidth" "256" "TextureHeight" "256" "MaxPolygonsLOD0" "550" "MaxPolygonsLOD1" "300" } "2" { "SlotIndex" "2" "SlotName" "offhand_weapon" "SlotText" "#LoadoutSlot_offhand_weapon" "TextureWidth" "256" "TextureHeight" "256" "MaxPolygonsLOD0" "350" "MaxPolygonsLOD1" "350" } "3" { "SlotIndex" "3" "SlotName" "arms" "SlotText" "#LoadoutSlot_arms" "TextureWidth" "256" "TextureHeight" "128" "MaxPolygonsLOD0" "200" "MaxPolygonsLOD1" "150" } "4" { "SlotIndex" "4" "SlotName" "shoulder" "SlotText" "#LoadoutSlot_shoulder" "TextureWidth" "256" "TextureHeight" "256" "MaxPolygonsLOD0" "800" "MaxPolygonsLOD1" "400" } "5" { "SlotIndex" "5" "SlotName" "back" "SlotText" "#LoadoutSlot_back" "TextureWidth" "256" "TextureHeight" "256" "MaxPolygonsLOD0" "700" "MaxPolygonsLOD1" "400" } "6" { "SlotIndex" "6" "SlotName" "taunt" "SlotText" "#LoadoutSlot_Taunt" } "7" { "SlotIndex" "7" "SlotName" "belt" "SlotText" "#LoadoutSlot_Belt" "TextureWidth" "256" "TextureHeight" "128" "MaxPolygonsLOD0" "600" "MaxPolygonsLOD1" "400" } } "Bot" { "Loadout" { "item_gauntlets" "ITEM_CORE" "item_circlet" "ITEM_CORE" "item_flask" "ITEM_CONSUMABLE | ITEM_SELLABLE" "item_bottle" "ITEM_CORE" "item_boots" "ITEM_CORE" "item_recipe_bracer" "ITEM_CORE" "item_bracer" "ITEM_DERIVED | ITEM_SELLABLE" "item_magic_stick" "ITEM_CORE" "item_branches" "ITEM_EXTENSION" "item_branches" "ITEM_EXTENSION" "item_branches" "ITEM_EXTENSION" "item_recipe_magic_wand" "ITEM_EXTENSION" "item_magic_wand" "ITEM_DERIVED | ITEM_SELLABLE" "item_ring_of_regen" "ITEM_EXTENSION" "item_ring_of_protection" "ITEM_EXTENSION" "item_tranquil_boots" "ITEM_DERIVED" "item_cloak" "ITEM_EXTENSION" "item_ring_of_health" "ITEM_EXTENSION" "item_ring_of_regen" "ITEM_EXTENSION" "item_ring_of_regen" "ITEM_EXTENSION" "item_hood_of_defiance" "ITEM_DERIVED" "item_blink" "ITEM_EXTENSION" "item_branches" "ITEM_EXTENSION" "item_ring_of_regen" "ITEM_EXTENSION" "item_recipe_headdress" "ITEM_EXTENSION" "item_headdress" "ITEM_DERIVED" "item_recipe_pipe" "ITEM_EXTENSION" "item_pipe" "ITEM_DERIVED" "item_reaver" "ITEM_LUXURY" "item_vitality_booster" "ITEM_LUXURY" "item_recipe_heart" "ITEM_LUXURY" "item_heart" "ITEM_DERIVED" "item_platemail" "ITEM_LUXURY" "item_mystic_staff" "ITEM_LUXURY" "item_recipe_shivas_guard" "ITEM_LUXURY" "item_shivas_guard" "ITEM_DERIVED" "item_point_booster" "ITEM_LUXURY" "item_ogre_axe" "ITEM_LUXURY" "item_blade_of_alacrity" "ITEM_LUXURY" "item_staff_of_wizardry" "ITEM_LUXURY" "item_ultimate_scepter" "ITEM_DERIVED" } "Build" { "1" "pudge_rot" "2" "pudge_meat_hook" "3" "pudge_meat_hook" "4" "pudge_rot" "5" "pudge_meat_hook" "6" "pudge_dismember" "7" "pudge_meat_hook" "8" "pudge_rot" "9" "pudge_rot" "10" "pudge_flesh_heap" "11" "pudge_dismember" "12" "pudge_flesh_heap" "13" "pudge_flesh_heap" "14" "pudge_flesh_heap" "15" "attribute_bonus" "16" "pudge_dismember" "17" "attribute_bonus" "18" "attribute_bonus" "19" "attribute_bonus" "20" "attribute_bonus" "21" "attribute_bonus" "22" "attribute_bonus" "23" "attribute_bonus" "24" "attribute_bonus" "25" "attribute_bonus" } "HeroType" "DOTA_BOT_GANKER | DOTA_BOT_TANK" "LaningInfo" { "SoloDesire" "2" "RequiresBabysit" "0" "ProvidesBabysit" "1" "SurvivalRating" "2" "RequiresFarm" "2" "ProvidesSetup" "2" "RequiresSetup" "1" } } }Спойлер: "ФУЛЛ КОД_абилити"// Dota Heroes File "DOTAAbilities" { "Version" "1" // Ability: Lina Dragon Slave //================================================================================================================= "lina_dragon_slave_new" { // General //------------------------------------------------------------------------------------------------------------- "BaseClass" "lina_dragon_slave" "AbilityTextureName" "lina_dragon_slave" "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_POINT" "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" "FightRecapLevel" "1" // Casting //------------------------------------------------------------------------------------------------------------- "AbilityCastRange" "800" "AbilityCastPoint" "0.45 0.45 0.45 0.45" // Time //------------------------------------------------------------------------------------------------------------- "AbilityCooldown" "8.5 8.5 8.5 8.5" "AbilityDuration" "0.6875 0.6875 0.6875 0.6875" // Damage. //------------------------------------------------------------------------------------------------------------- "AbilityDamage" "100 170 230 280" // Cost //------------------------------------------------------------------------------------------------------------- "AbilityManaCost" "25" // Special //------------------------------------------------------------------------------------------------------------- "AbilitySpecial" { "01" { "var_type" "FIELD_INTEGER" "dragon_slave_speed" "1200" } "02" { "var_type" "FIELD_INTEGER" "dragon_slave_width_initial" "275" } "03" { "var_type" "FIELD_INTEGER" "dragon_slave_width_end" "200" } "04" { "var_type" "FIELD_INTEGER" "dragon_slave_distance" "1075" } } } }Пару замечаний:Спойлер: "ФУЛЛ код Героев"// Dota Heroes File // NOTE: This is not for creating new heroes, this is for taking a currently existing hero as a template and overriding // the specified key-value combinations. Use override_hero for this. "DOTAHeroes" { "npc_dota_hero_pudge_template" { "override_hero" "npc_dota_hero_pudge" "MovementSpeed" "500" // Speed. "Ability3" "lina_dragon_slave_new" } }Если кто-то шарит в создании своих собственных абилок, тех что от класса "ability_datadriven" то я буду рад ,если он поделится этой инфой, я в этом способе почти не шарю, если покопаться может быть и слеплю что-нибудь из примеров, но это совсем не те знания, чтобы написать гайд.
- Если нужно убрать скил просто напишите "Ability1" "rubick_empty1" это что-то типа заглушки, так же можно doom_empty1, invoker_empty1, ну вы поняли принцип.
- Если вы не сделаете прекэширование скилы будут работать нормально, просто вы их не увидете. например задувка дракона (брез фаер) будет отнимать хп у врага, н овы не увидете сам огонь.
Всю карту компилят в том случае, если были изменения в карте. т.к. скрипты никак не относятся к карте, можно убирать все галочкиImmortal0110 сказал(а):↑Извини, что не по тебе, но как ты сделал, что у тебя игра за несколько секунд загрузилась? Мне приходится ждать от 10 до 20 минут.Нажмите, чтобы раскрыть...
Просто закинь в конец скрипта: function Precache( context ) PrecacheUnitByNameSync("npc_dota_hero_lina", context) endImmortal0110 сказал(а):↑Не понимаю про анимацию. Куда это нужно писать: "function Precache( context ) end"? Объясни что и куда записывать, если не сложно.Нажмите, чтобы раскрыть...
Xionic React сказал(а):↑похожая проблема , только не могу найти где это. Можно подробнее где эта фигня?Нажмите, чтобы раскрыть...Спустя 3 года и тут появился я который отвечаю на твой вопрос вот путь
\Steam\steamapps\common\dota 2 beta\game\dota_addons\название_аддона\scripts\vscriptsи в этой пути есть один файл addon_game_mode.lua это и есть
Тема закрыта
-
ЗаголовокОтветов ПросмотровПоследнее сообщение
-
Сообщений: 30 24 Apr 2024 в 22:45
Сообщений:30
Просмотров:38
-
Сообщений:5
Просмотров:5
-
Сообщений:1
Просмотров:3
-
чзх 24 Apr 2024 в 22:35Сообщений: 8 24 Apr 2024 в 22:35
Сообщений:8
Просмотров:9
-
Сообщений:6
Просмотров:7