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

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

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

Оффлайн vulkantsk

  • 146
  • Мощь: 3
  • Дотер - игрушка дьявола в руках Габена
Для того , чтобы возрадить крипов нам потребуется крип находящийся по адресу 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".
Вот собсна всё .

« Последнее редактирование: 16-08-2017, 17:23:47 от vulkantsk »
Денег нет, но вы держитесь !
G ??? ??? D Gabe , W :D LL Pay :D D !

Оффлайн Илья

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

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

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

Оффлайн vulkantsk

  • 146
  • Мощь: 3
  • Дотер - игрушка дьявола в руках Габена
Re: Гайд , как возродить крипов
« Ответ #2 : 04-07-2017, 07:56:15 »

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

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

Оффлайн Илья

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

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

Оффлайн vulkantsk

  • 146
  • Мощь: 3
  • Дотер - игрушка дьявола в руках Габена
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 !

Оффлайн Илья

  • Супермодератор
  • 2080
  • Мощь: 20
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

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

Оффлайн vulkantsk

  • 146
  • Мощь: 3
  • Дотер - игрушка дьявола в руках Габена
Re: Гайд , как возродить крипов
« Ответ #7 : 31-07-2017, 20:50:28 »
Только не забудь упомянуть, что vSpawnLoc надо указать еще при первом спавне юнита, если игрок хочет спавн его в конкретном месте, а не там, где юнит умрет.
Здесь может быть два варианта:
1) Это если ты крипа вручную в коде создаешь, то там можно сразу ему и корди указать.
2) Если юнита спавнишь на карте  через npc dota base.

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

В общем, если интересно будет самому, то разберешься (а на вопросы я отвечу).
Мне сейчас вот стало интересно , а как реализовать через 2 способ ?
Надо в ДД добавть "OnCreated" и запуск скрипта , который записывает в переменную SpawnLoc свое положение.
А при смерти  обращаться к этой переменной , так чтоли  ??
Денег нет, но вы держитесь !
G ??? ??? D Gabe , W :D LL Pay :D D !

Оффлайн Илья

  • Супермодератор
  • 2080
  • Мощь: 20
Re: Гайд , как возродить крипов
« Ответ #8 : 31-07-2017, 21:52:00 »
Мне сейчас вот стало интересно , а как реализовать через 2 способ ?
Надо в ДД добавть "OnCreated" и запуск скрипта , который записывает в переменную SpawnLoc свое положение.
А при смерти  обращаться к этой переменной , так чтоли  ??

Именно, пассивку, что сохраняет координаты спавна.

Оффлайн I_GRIN_I

  • Продвинутый
  • 579
  • Мощь: 10
  • Научиться бы скриптить...
Re: Гайд , как возродить крипов
« Ответ #9 : 01-08-2017, 11:14:05 »
vulkantsk, нахер нужны все эти абилки, если можно просто при спавне юнита все дапоминат запоминать и все респавнить при смерти

Оффлайн Илья

  • Супермодератор
  • 2080
  • Мощь: 20
Re: Гайд , как возродить крипов
« Ответ #10 : 01-08-2017, 16:11:47 »
vulkantsk, нахер нужны все эти абилки, если можно просто при спавне юнита все дапоминат запоминать и все респавнить при смерти

Потому что с помощью абилок ты не засоряешь главный файл скрипта побочными алгоритмами.
Для прозрачности кода все делается, и для самодостаточности объектов (все что связано с крипами - хранится в самих крипах).

Оффлайн I_GRIN_I

  • Продвинутый
  • 579
  • Мощь: 10
  • Научиться бы скриптить...
Re: Гайд , как возродить крипов
« Ответ #11 : 01-08-2017, 18:11:14 »
Илья, а зачем главный файл засорять? Создал новую библиотеку, подключил, и делай, что хочешь. И игра не засоряется дополнительными ентити абилок и т.д. и не надо лишнего в кв писать

Оффлайн Илья

  • Супермодератор
  • 2080
  • Мощь: 20
Re: Гайд , как возродить крипов
« Ответ #12 : 01-08-2017, 19:23:25 »
Илья, а зачем главный файл засорять? Создал новую библиотеку, подключил, и делай, что хочешь. И игра не засоряется дополнительными ентити абилок и т.д. и не надо лишнего в кв писать

Если ты будешь в этой "библиотеке" работать с  событием "смерти сущности", то это не есть хорошо, так как по любым другим вопросам, касаемых смертей сущностей, придется лезть в эту же библиотеку.

Если ты в главном файле будешь во время этого же события запускать свою "библиотеку", как бы передавая в неё таблицу данных, то смысл есть, однако у тебя сразу же появляется куча существ, зависимых от этой библиотеки.

А можно всего-то сделать независимую абилку респавна, и дать её такому же независимому существу, реализовав таким образом ООП. Ну и в твоем коде станет сразу же намного легче разбираться чужому человеку (прозрачность).

Оффлайн I_GRIN_I

  • Продвинутый
  • 579
  • Мощь: 10
  • Научиться бы скриптить...
Re: Гайд , как возродить крипов
« Ответ #13 : 01-08-2017, 23:10:27 »
Илья, чтобы у тебя потом эти абилки пиздили, как автор биржи мемов, спасибо

Оффлайн Илья

  • Супермодератор
  • 2080
  • Мощь: 20
Re: Гайд , как возродить крипов
« Ответ #14 : 02-08-2017, 07:40:43 »
Илья, чтобы у тебя потом эти абилки пиздили, как автор биржи мемов, спасибо

Ну к подобному обычно и стремятся в программировании : ))
Чтобы можно было потом код спокойно использовать и  в других проектах.