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

Гайд , как возродить крипов

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

Онлайн vulkantsk

  • 45
  • Мощь: 1
Для того , чтобы возрадить крипов нам потребуется крип находящийся по адресу dota_addons/ваш_мод/scripts/npc/npc_units_custom :
Спойлер
   //=================================================================================   
   // Creature: Gnoll Assassin
   //=================================================================================

   "npc_dota_creature_gnoll_assassin"   
   {
      // General
      //----------------------------------------------------------------
      "Model"                  "models/creeps/neutral_creeps/n_creep_gnoll/n_creep_gnoll_frost.vmdl"   // Model.
      "BaseClass"               "npc_dota_creature"
      "SoundSet"               "n_creep_Ranged"
      "GameSoundsFile"         "soundevents/game_sounds_creeps.vsndevts"
      "Level"                  "1"
      "ModelScale"             ".9"

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

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

      // Attack
      //----------------------------------------------------------------
      "AttackCapabilities"      "DOTA_UNIT_CAP_RANGED_ATTACK"
      "AttackDamageMin"         "30"      // Damage range min.
      "AttackDamageMax"         "36"      // Damage range max.
      "AttackRate"            "1.6"      // Speed of attack.
      "AttackAnimationPoint"      "0.4"      // Normalized time in animation cycle to attack.
      "AttackAcquisitionRange"   "800"      // Range within a target can be acquired.
      "AttackRange"            "500"      // Range within a target can be attacked.
      "ProjectileModel"         "particles/neutral_fx/gnoll_base_attack.vpcf" // Particle system model for projectile.
      "ProjectileSpeed"         "1500"      // Speed of projectile.           

      // Bounds
      //----------------------------------------------------------------
      "RingRadius"            "40"
      "HealthBarOffset"         "170"

      // Bounty
      //----------------------------------------------------------------
      "BountyXP"               "24"      // Experience earn.
      "BountyGoldMin"            "21"      // Gold earned min.
      "BountyGoldMax"            "29"      // Gold earned max.

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

      // Status
      //----------------------------------------------------------------
      "StatusHealth"            "75"      // Base health.
      "StatusHealthRegen"         "0.5"      // Health regeneration rate.
      "StatusMana"            "0"         // Base mana.
      "StatusManaRegen"         "0.0"      // Mana regeneration rate.      
      
      // Vision
      //----------------------------------------------------------------
      "VisionDaytimeRange"      "400"      // Range of vision during day light.
      "VisionNighttimeRange"      "400"      // Range of vision at night time.

      // Team
      //----------------------------------------------------------------
      "TeamName"               "DOTA_TEAM_NEUTRALS"                  // Team name.
      "CombatClassAttack"         "DOTA_COMBAT_CLASS_ATTACK_PIERCE"
      "CombatClassDefend"         "DOTA_COMBAT_CLASS_DEFEND_BASIC"
      "UnitRelationshipClass"      "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"

      // Creature Data
      //----------------------------------------------------------------
      "Creature"
      {
         //Level Up
         "HPGain"               "50"
         "DamageGain"            "2"
         "ArmorGain"               "0.25"
         "MagicResistGain"         "0.1"
         "MoveSpeedGain"            "1"
         "BountyGain"            "3"
         "XPGain"               "15"
      }
   }
[свернуть]
И абилка :  "Ability1"               "Respawn"         // Ability 1
Которую вы создадите по адресу dota_addons/ваш_мод/scripts/npc/npc_abilites_custom.txt
Спойлер
"Respawn"
{
   "BaseClass"                   "ability_datadriven"
   "AbilityTextureName"         "ability_name"
   "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE|DOTA_ABILITY_BEHAVIOR_HIDDEN"
                   
   "OnOwnerDied"                                   //Когда юнит умирает
   {
      "RunScript"                                 //Запускается скрипт
      {
         "ScriptFile"   "scripts/vscripts/units.lua"
         "Function"      "Respawn"
      }
   }
}
[свернуть]
Для работы следующего трюка потребуется базовый набор скриптов Barebones: "Addon_game_mode.lua", "timers.lua" и "Barenones.lua" , которые нужно сохранить по адресу : "dota_addons/ваш_мод/scripts/vscripts"
github.com/MNoya/.../scripts/vscripts
Без репозитория "timers.lua" функция "Timers:CreateTimer()" не будет работать !
А также потребуется файл, который нужно создать по адресу dota_addons/ваш_мод/scripts/vscripts/
"units.lua"
Если вы хотите, чтобы юнит возрождался на том же самом месте,где собственно и был убит,то надо вставить в файл :
Код
function Respawn (keys )
local caster= keys.caster                               --пробиваем IP усопшего
local caster_position = caster:GetAbsOrigin()  --Пробиваем адрес,где лежит жмурик
local name= caster:GetUnitName()                 --Пробиваем имя покойного
Timers:CreateTimer(5,function()                     --Через сколько секунд появится новый фраер(5)
local unit = CreateUnitByName(name, caster_position + RandomVector( RandomFloat( 0, 50)), true, nil, nil, DOTA_TEAM_NEUTRALS)
-- создаем нового пацыка по трем аргументам ( имя покойного ,адрес жмурика  ,true,nil,nil,Команда_нейтралов)
end)
end
Однако ,если у юнита есть точка,куда нужно вернуть бедолагу , тогда в файл надо вставить следующее:
Код
function Respawn (keys )
local caster= keys.caster                               --пробиваем IP усопшего
        local team= caster:GetTeamNumber()           --пробиваем команду терпилы
local caster_respoint = Entities:FindByName(nil,respawn_point):GetAbsOrigin()  --Пробиваем адрес дома
local name= caster:GetUnitName()                 --Пробиваем имя покойного
Timers:CreateTimer(5,function()                     --Через сколько секунд появится новый фраер(5)
local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team)
-- создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома  ,true,nil,nil,команда терпилы)
end)
end
Точку "respawn_point" можно создать в Hammer_Edditor
Entity Tool - Entity Class:"info_target" - Properties:Name"respawn_point".
Вот собсна всё .

« Последнее редактирование: 04-07-2017, 18:12:45 от vulkantsk »
Денег нет, но вы держитесь !
G ??? ??? D Gabe , W :D LL Pay :D D !

Оффлайн Илья

  • Супермодератор
  • 1912
  • Мощь: 16
Re: Гайд , как возродить крипов
« Ответ #1 : 03-07-2017, 21:56:20 »
В целом молодец, теперь можно и этим откидываться от подобных вопросов со стороны новичков.

Критиковать не буду, скажу лишь то, о чем ты явно забыл сказать в своем руководстве: расскажи людям, где брать BMD`ый таймер (ибо без него твой код не будет работать).

А если захочешь улучшить гайд, то скажи об этом и я подкину критику идей.

Онлайн vulkantsk

  • 45
  • Мощь: 1
Re: Гайд , как возродить крипов
« Ответ #2 : 04-07-2017, 07:56:15 »

А если захочешь улучшить гайд, то скажи об этом и я подкину критику идей.

Исправил ,идеи конечно подкинуть можно и нужно  :-X
Денег нет, но вы держитесь !
G ??? ??? D Gabe , W :D LL Pay :D D !

Оффлайн Илья

  • Супермодератор
  • 1912
  • Мощь: 16
Re: Гайд , как возродить крипов
« Ответ #3 : 04-07-2017, 10:06:27 »
Ты пишешь про addon_game_mode.lua от barebones, но он то не нужен. Нужен только таймер от BMD, который достаточно подключить в своем главном скрипте через require().

Ну а далее идеи:
1) Саму абилку можно целиком и полностью на lua сделать, что будет экономить место.
2) При спавне юнита  за ним можно сохранить и точку его спавна, что позволит обходится без создания специальных блоков. Если не понял, вот ключевое слово: vSpawnLoc. Обычно так называют переменную, можешь поискать на форуме инфу.
3) Команду юниту задавать следует ту же, к которой принадлежал его предшественник: GetTeamNumber() посмотри.

Онлайн vulkantsk

  • 45
  • Мощь: 1
Re: Гайд , как возродить крипов
« Ответ #4 : 04-07-2017, 11:28:36 »
Код
function Respawn (keys )
local caster= keys.caster                               --пробиваем IP усопшего
        local team= caster: GetTeamNumber()           --пробиваем команду терпилы
local caster_respoint = Entities:FindByName(nil,respawn_point):GetAbsOrigin()  --Пробиваем адрес дома
local name= caster:GetUnitName()                 --Пробиваем имя покойного
Timers:CreateTimer(5,function()                     --Через сколько секунд появится новый фраер(5)
local unit = CreateUnitByName(name, caster_respoint + RandomVector( RandomFloat( 0, 50)), true, nil, nil, team)
-- создаем нового пацыка по трем аргументам ( имя покойного ,адрес дома  ,true,nil,nil,команда терпилы)
end)
end

Правильно ?
Код
local caster= keys.caster
local vSpawnLoc = caster.vSpawnLoc
        if (vSpawnLoc == nil) then
                print ("location not found")
                vSpawnLoc = caster:GetOrigin()
        end
Денег нет, но вы держитесь !
G ??? ??? D Gabe , W :D LL Pay :D D !

Оффлайн Илья

  • Супермодератор
  • 1912
  • Мощь: 16
Re: Гайд , как возродить крипов
« Ответ #5 : 04-07-2017, 12:27:45 »
local team= caster:GetTeamNumber()   - тут лишний пробел был.
Ну и vSpawnLoc вместо caster_respoint использовать.

А так да, молодец. Можешь это как раз в гайд внести.

Только не забудь упомянуть, что vSpawnLoc надо указать еще при первом спавне юнита, если игрок хочет спавн его в конкретном месте, а не там, где юнит умрет.
Здесь может быть два варианта:
1) Это если ты крипа вручную в коде создаешь, то там можно сразу ему и корди указать.
2) Если юнита спавнишь на карте  через npc dota base.

Во втором варианте как раз выгодно реализовать эту абилку респавна полностью на lua, так как можно будет при "создании/прокачке" абилки или еще при каком похоже событии занести в юнита его точку спавна изначальную.

Ну а если делать как ты расписал, то придется либо отдельную пассивку сделать, что будет так же при "создании" запускать скрипт и в нем пробивать этот vSpawnLoc, либо попытаться все это уместить в одной  data driven абилке. Просто на мой взгляд это геморнее.

В общем, если интересно будет самому, то разберешься (а на вопросы я отвечу).
« Последнее редактирование: 04-07-2017, 12:29:40 от Илья »

Онлайн vulkantsk

  • 45
  • Мощь: 1
Re: Гайд , как возродить крипов
« Ответ #6 : 04-07-2017, 18:11:28 »
Хорошо , добавил в гайд.
А про методы которые ты описал ,пока мозгов не хватит.
По моему этот метод который я описал , самый доступный в плане понимания .
Если будут веские причины , то придется разбираться ,а пока и так сойдет  :D
Денег нет, но вы держитесь !
G ??? ??? D Gabe , W :D LL Pay :D D !