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

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
Для того , чтобы возрадить крипов нам потребуется крип находящийся по адресу 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"
https://github.com/MNoya/barebones/tree/source2/game/dota_addons/barebones/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".
Вот собсна всё .

Дополнительный гайд по теме https://customgames.ru/forum/threads/Дополнение-Гайд-как-возродить-крипов.1440/
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
В целом молодец, теперь можно и этим откидываться от подобных вопросов со стороны новичков.

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

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

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
[quote author=Илья link=topic=1587.msg10371#msg10371 date=1499118980]

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

Исправил ,идеи конечно подкинуть можно и нужно :-X
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Ты пишешь про addon_game_mode.lua от barebones, но он то не нужен. Нужен только таймер от BMD, который достаточно подключить в своем главном скрипте через require().

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

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
Код:
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
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
local team= caster:GetTeamNumber() - тут лишний пробел был.
Ну и vSpawnLoc вместо caster_respoint использовать.

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

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

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

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

В общем, если интересно будет самому, то разберешься (а на вопросы я отвечу).
 
Последнее редактирование модератором:

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
Хорошо , добавил в гайд.
А про методы которые ты описал ,пока мозгов не хватит.
По моему этот метод который я описал , самый доступный в плане понимания .
Если будут веские причины , то придется разбираться ,а пока и так сойдет :D
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
Только не забудь упомянуть, что vSpawnLoc надо указать еще при первом спавне юнита, если игрок хочет спавн его в конкретном месте, а не там, где юнит умрет.
Здесь может быть два варианта:
1) Это если ты крипа вручную в коде создаешь, то там можно сразу ему и корди указать.
2) Если юнита спавнишь на карте через npc dota base.

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

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

Илья

Друзья CG
25 Сен 2015
2,348
41
Мне сейчас вот стало интересно , а как реализовать через 2 способ ?
Надо в ДД добавть "OnCreated" и запуск скрипта , который записывает в переменную SpawnLoc свое положение.
А при смерти обращаться к этой переменной , так чтоли ??

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

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
vulkantsk, нахер нужны все эти абилки, если можно просто при спавне юнита все дапоминат запоминать и все респавнить при смерти
 

Илья

Друзья CG
25 Сен 2015
2,348
41
[quote author=I_GRIN_I link=topic=1587.msg10882#msg10882 date=1501586045]
vulkantsk, нахер нужны все эти абилки, если можно просто при спавне юнита все дапоминат запоминать и все респавнить при смерти
[/quote]

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

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Илья, а зачем главный файл засорять? Создал новую библиотеку, подключил, и делай, что хочешь. И игра не засоряется дополнительными ентити абилок и т.д. и не надо лишнего в кв писать
 

Илья

Друзья CG
25 Сен 2015
2,348
41
[quote author=I_GRIN_I link=topic=1587.msg10895#msg10895 date=1501611074]
Илья, а зачем главный файл засорять? Создал новую библиотеку, подключил, и делай, что хочешь. И игра не засоряется дополнительными ентити абилок и т.д. и не надо лишнего в кв писать
[/quote]

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

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

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

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Илья, чтобы у тебя потом эти абилки пиздили, как автор биржи мемов, спасибо
 

Илья

Друзья CG
25 Сен 2015
2,348
41
[quote author=I_GRIN_I link=topic=1587.msg10916#msg10916 date=1501629027]
Илья, чтобы у тебя потом эти абилки пиздили, как автор биржи мемов, спасибо
[/quote]

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

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Илья, ну я тов своих проектах его буду использовать, т.к. знаю как он работает, а другие нет
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Не, смотря кто какую цель приследует.
Написать файл, библиотеку для своих нужд - вполне правильный ход.
Ну а если стараешься сделать доступный код - тот тут уже лучше использовать принцип ООП.
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Илья, а еще смотри: абилку надо будет из нескольких файлов в новый проект копировать, а библиотеку достаточно скинуть в папку с новым аддоном и подключить)
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Скопировать из одного файла в другой - то же самое, что и скопировать файл из одного места в другое.
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
[quote author=I_GRIN_I link=topic=1587.msg10916#msg10916 date=1501629027]
Илья, чтобы у тебя потом эти абилки пиздили, как автор биржи мемов, спасибо
[/quote]
А какой проект у тебя ??
 
Реклама: