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

vulkantsk

Друзья CG
21 Июн 2017
662
62
28
17
https://steamcommunity.com/profiles/76561198307890
www.dotabuff.com
Проект
Roshan defense
Реакции
70 0 5
#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"
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/
 
Последнее редактирование модератором:

Илья

Супермодератор
Команда форума
25 Сен 2015
2,346
26
48
26
Реакции
34 0 0
#2
В целом молодец, теперь можно и этим откидываться от подобных вопросов со стороны новичков.

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

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

vulkantsk

Друзья CG
21 Июн 2017
662
62
28
17
https://steamcommunity.com/profiles/76561198307890
www.dotabuff.com
Проект
Roshan defense
Реакции
70 0 5
#3
[quote author=Илья link=topic=1587.msg10371#msg10371 date=1499118980]

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

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

Илья

Супермодератор
Команда форума
25 Сен 2015
2,346
26
48
26
Реакции
34 0 0
#4
Ты пишешь про addon_game_mode.lua от barebones, но он то не нужен. Нужен только таймер от BMD, который достаточно подключить в своем главном скрипте через require().

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

vulkantsk

Друзья CG
21 Июн 2017
662
62
28
17
https://steamcommunity.com/profiles/76561198307890
www.dotabuff.com
Проект
Roshan defense
Реакции
70 0 5
#5
Код:
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
 
Последнее редактирование модератором:
Реклама:

Илья

Супермодератор
Команда форума
25 Сен 2015
2,346
26
48
26
Реакции
34 0 0
#6
local team= caster:GetTeamNumber() - тут лишний пробел был.
Ну и vSpawnLoc вместо caster_respoint использовать.

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

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

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

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

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

vulkantsk

Друзья CG
21 Июн 2017
662
62
28
17
https://steamcommunity.com/profiles/76561198307890
www.dotabuff.com
Проект
Roshan defense
Реакции
70 0 5
#7
Хорошо , добавил в гайд.
А про методы которые ты описал ,пока мозгов не хватит.
По моему этот метод который я описал , самый доступный в плане понимания .
Если будут веские причины , то придется разбираться ,а пока и так сойдет :D
 

vulkantsk

Друзья CG
21 Июн 2017
662
62
28
17
https://steamcommunity.com/profiles/76561198307890
www.dotabuff.com
Проект
Roshan defense
Реакции
70 0 5
#8
Только не забудь упомянуть, что vSpawnLoc надо указать еще при первом спавне юнита, если игрок хочет спавн его в конкретном месте, а не там, где юнит умрет.
Здесь может быть два варианта:
1) Это если ты крипа вручную в коде создаешь, то там можно сразу ему и корди указать.
2) Если юнита спавнишь на карте через npc dota base.

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

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

Илья

Супермодератор
Команда форума
25 Сен 2015
2,346
26
48
26
Реакции
34 0 0
#9
Мне сейчас вот стало интересно , а как реализовать через 2 способ ?
Надо в ДД добавть "OnCreated" и запуск скрипта , который записывает в переменную SpawnLoc свое положение.
А при смерти обращаться к этой переменной , так чтоли ??
Именно, пассивку, что сохраняет координаты спавна.
 
Последнее редактирование модератором:

I_GRIN_I

Друзья CG
15 Мар 2016
981
42
28
19
Реакции
57 0 1
#10
vulkantsk, нахер нужны все эти абилки, если можно просто при спавне юнита все дапоминат запоминать и все респавнить при смерти
 
Реклама:

Илья

Супермодератор
Команда форума
25 Сен 2015
2,346
26
48
26
Реакции
34 0 0
#11
[quote author=I_GRIN_I link=topic=1587.msg10882#msg10882 date=1501586045]
vulkantsk, нахер нужны все эти абилки, если можно просто при спавне юнита все дапоминат запоминать и все респавнить при смерти
[/quote]

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

I_GRIN_I

Друзья CG
15 Мар 2016
981
42
28
19
Реакции
57 0 1
#12
Илья, а зачем главный файл засорять? Создал новую библиотеку, подключил, и делай, что хочешь. И игра не засоряется дополнительными ентити абилок и т.д. и не надо лишнего в кв писать
 

Илья

Супермодератор
Команда форума
25 Сен 2015
2,346
26
48
26
Реакции
34 0 0
#13
[quote author=I_GRIN_I link=topic=1587.msg10895#msg10895 date=1501611074]
Илья, а зачем главный файл засорять? Создал новую библиотеку, подключил, и делай, что хочешь. И игра не засоряется дополнительными ентити абилок и т.д. и не надо лишнего в кв писать
[/quote]

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

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

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

I_GRIN_I

Друзья CG
15 Мар 2016
981
42
28
19
Реакции
57 0 1
#14
Илья, чтобы у тебя потом эти абилки пиздили, как автор биржи мемов, спасибо
 

Илья

Супермодератор
Команда форума
25 Сен 2015
2,346
26
48
26
Реакции
34 0 0
#15
[quote author=I_GRIN_I link=topic=1587.msg10916#msg10916 date=1501629027]
Илья, чтобы у тебя потом эти абилки пиздили, как автор биржи мемов, спасибо
[/quote]

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

I_GRIN_I

Друзья CG
15 Мар 2016
981
42
28
19
Реакции
57 0 1
#16
Илья, ну я тов своих проектах его буду использовать, т.к. знаю как он работает, а другие нет
 

Илья

Супермодератор
Команда форума
25 Сен 2015
2,346
26
48
26
Реакции
34 0 0
#17
Не, смотря кто какую цель приследует.
Написать файл, библиотеку для своих нужд - вполне правильный ход.
Ну а если стараешься сделать доступный код - тот тут уже лучше использовать принцип ООП.
 

I_GRIN_I

Друзья CG
15 Мар 2016
981
42
28
19
Реакции
57 0 1
#18
Илья, а еще смотри: абилку надо будет из нескольких файлов в новый проект копировать, а библиотеку достаточно скинуть в папку с новым аддоном и подключить)
 

Илья

Супермодератор
Команда форума
25 Сен 2015
2,346
26
48
26
Реакции
34 0 0
#19
Скопировать из одного файла в другой - то же самое, что и скопировать файл из одного места в другое.
 

vulkantsk

Друзья CG
21 Июн 2017
662
62
28
17
https://steamcommunity.com/profiles/76561198307890
www.dotabuff.com
Проект
Roshan defense
Реакции
70 0 5
#20
[quote author=I_GRIN_I link=topic=1587.msg10916#msg10916 date=1501629027]
Илья, чтобы у тебя потом эти абилки пиздили, как автор биржи мемов, спасибо
[/quote]
А какой проект у тебя ??
 
Реклама:
Реклама: