кастомные юниты

MahouShoujo

Продвинутый
3 Ноя 2016
251
23
> Для стандартных прекеш не нужен
Моделей? Нужен. Самостоятельная подгрузка моделей без прекеша нестабильна, часто не срабатывает.

Для партиклов прекеш можно не использовать кроме тех случаев когда внутри партиклов референсятся такие ресурсы как материалы (например при использовании Render projected texture).
 

EYEOFLIE

Активный
28 Янв 2018
137
4
> Для стандартных прекеш не нужен
Моделей? Нужен. Самостоятельная подгрузка моделей без прекеша нестабильна, часто не срабатывает.

Для партиклов прекеш можно не использовать кроме тех случаев когда внутри партиклов референсятся такие ресурсы как материалы (например при использовании Render projected texture).
Не по теме наверное, но может ты знаешь, для того что бы у скилла работал аганим, надо писать функцию для аганима или хватит просто указать HasScepterUp и аганимные параметры, просто у меня с прописаными параметрами не работает аганим, вот и грешу на луа
 

Илья

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

Стандартным предметам? Нужно либо предмет переписывать, либо через фильтры. То что ты в кв пропишешь какие-то переменные предмету, что по дефолту не поддерживает аганим - ничего не даст. Нужно предмету описать работу с переменными.
 

EYEOFLIE

Активный
28 Янв 2018
137
4
Стандартным предметам? Нужно либо предмет переписывать, либо через фильтры. То что ты в кв пропишешь какие-то переменные предмету, что по дефолту не поддерживает аганим - ничего не даст. Нужно предмету описать работу с переменными.
Но можно же дописать функцию смены кулдауна, длительности и урона в самом скилле, который будет триггериться наличием предмета в инвентаре? (Именно в скрипте скилла)
 

EYEOFLIE

Активный
28 Янв 2018
137
4
Стандартным предметам? Нужно либо предмет переписывать, либо через фильтры. То что ты в кв пропишешь какие-то переменные предмету, что по дефолту не поддерживает аганим - ничего не даст. Нужно предмету описать работу с переменными.
Реализовал добавлением функции в скрипт, сорр
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Реализовал добавлением функции в скрипт, сорр
Я не так тебя понял.

В самописную абилку да, можно прописать взаимодействие с аганимом. А в дефолтную нет, если изначально она не ориентировалась на это.
 

EYEOFLIE

Активный
28 Янв 2018
137
4
Я не так тебя понял.

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

Илья

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

Во первых: гитхаб - это хранилище хранилищ. Это гиты, размещенные в интернете. Но ты употребляешь это слово, явно связывая его с каким-то конкретным репозиторием. Вопрос, каким?

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

В третьих: что ты понимаешь под "библиотекой"? Чтобы писать скрипты для своего мода не нужны никакие библиотеки. Если ты копируешь чужой код, то там могут быть какие-то там зависимости, но называть эти зависимости библиотеками язык не поворачивается. Единственные два скрипта, которые мне попадались на глаза и подходили под определение библиотеки - это timers и barebones от bmd. Первая действительно полезна для всех, вторая - не программистам.

В четвертых: что за сайт доты ты имеешь в виду? Что за "как в примере на сайте доты"?

Скинь ссылку на пример, скинь свой код, скинь логи с ошибками. Если хочешь помощи, научись оформлять вопросы. Тут есть хорошие примеры.
 

EYEOFLIE

Активный
28 Янв 2018
137
4
И вот, допустим я хочу НезерСвап венги себе, вот kv скрипт:
"vengefulspirit_nether_swap_lua"
{
"BaseClass" "ability_lua"
"ScriptFile" "heroes/vengefulspirit_nether_swap.lua"
"AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_CUSTOM"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_CUSTOM"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"FightRecapLevel" "2"

"precache"
{
"particle" "particles/units/heroes/hero_vengeful/vengeful_nether_swap.vpcf"
"particle" "particles/units/heroes/hero_vengeful/vengeful_nether_swap_target.vpcf"
"soundfile" "Hero_VengefulSpirit.NetherSwap"
}

"HasScepterUpgrade" "1"

// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "100 700 700"
"AbilityCastPoint" "0.3 0.3 0.3"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"

// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "45.0"

// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "100 150 200"

// Special
//-------------------------------------------------------------------------------------------------------------
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_INTEGER"
"tooltip_range" "700 950 1200"
}
"02"
{
"var_type" "FIELD_FLOAT"
"nether_swap_cooldown_scepter" "10"
}
}
}


Вот lua скрипт, взятый отсюда https://developer.valvesoftware.com/wiki/Dota_2_Workshop_Tools/Lua_Abilities_and_Modifiers
vengefulspirit_nether_swap_lua = class({})

--------------------------------------------------------------------------------

function vengefulspirit_nether_swap_lua:GetAOERadius()
return self:GetSpecialValueFor( "radius" )
end

--------------------------------------------------------------------------------

function vengefulspirit_nether_swap_lua:CastFilterResultTarget( hTarget )
if self:GetCaster() == hTarget then
return UF_FAIL_CUSTOM
end

if ( hTarget:IsCreep() and ( not self:GetCaster():HasScepter() ) ) or hTarget:IsAncient() then
return UF_FAIL_CUSTOM
end

local nResult = UnitFilter( hTarget, DOTA_UNIT_TARGET_TEAM_BOTH, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, self:GetCaster():GetTeamNumber() )
if nResult ~= UF_SUCCESS then
return nResult
end

return UF_SUCCESS
end

--------------------------------------------------------------------------------

function vengefulspirit_nether_swap_lua:GetCustomCastErrorTarget( hTarget )
if self:GetCaster() == hTarget then
return "#dota_hud_error_cant_cast_on_self"
end

if hTarget:IsAncient() then
return "#dota_hud_error_cant_cast_on_ancient"
end

if hTarget:IsCreep() and ( not self:GetCaster():HasScepter() ) then
return "#dota_hud_error_cant_cast_on_creep"
end

return ""
end

--------------------------------------------------------------------------------

function vengefulspirit_nether_swap_lua:GetCooldown( nLevel )
if self:GetCaster():HasScepter() then
return self:GetSpecialValueFor( "nether_swap_cooldown_scepter" )
end

return self.BaseClass.GetCooldown( self, nLevel )
end

--------------------------------------------------------------------------------

function vengefulspirit_nether_swap_lua:OnSpellStart()
local hCaster = self:GetCaster()
local hTarget = self:GetCursorTarget()

if hCaster == nil or hTarget == nil or hTarget:TriggerSpellAbsorb( this ) then
return
end

local vPos1 = hCaster:GetOrigin()
local vPos2 = hTarget:GetOrigin()

GridNav:DestroyTreesAroundPoint( vPos1, 300, false )
GridNav:DestroyTreesAroundPoint( vPos2, 300, false )

hCaster:SetOrigin( vPos2 )
hTarget:SetOrigin( vPos1 )

FindClearSpaceForUnit( hCaster, vPos2, true )
FindClearSpaceForUnit( hTarget, vPos1, true )

hTarget:Interrupt()

local nCasterFX = ParticleManager:CreateParticle( "particles/units/heroes/hero_vengeful/vengeful_nether_swap.vpcf", PATTACH_ABSORIGIN_FOLLOW, hCaster )
ParticleManager:SetParticleControlEnt( nCasterFX, 1, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), false )
ParticleManager:ReleaseParticleIndex( nCasterFX )

local nTargetFX = ParticleManager:CreateParticle( "particles/units/heroes/hero_vengeful/vengeful_nether_swap_target.vpcf", PATTACH_ABSORIGIN_FOLLOW, hTarget )
ParticleManager:SetParticleControlEnt( nTargetFX, 1, hCaster, PATTACH_ABSORIGIN_FOLLOW, nil, hCaster:GetOrigin(), false )
ParticleManager:ReleaseParticleIndex( nTargetFX )

EmitSoundOn( "Hero_VengefulSpirit.NetherSwap", hCaster )
EmitSoundOn( "Hero_VengefulSpirit.NetherSwap", hTarget )

hCaster:StartGesture( ACT_DOTA_CHANNEL_END_ABILITY_4 )
end

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

Да это работает, но не могу понять зачем в коде нужна эта функция:

function vengefulspirit_nether_swap_lua:GetAOERadius()
return self:GetSpecialValueFor( "radius" )
end

если она ни на что не влияет, т.к даже если получит значение и вернет, ничего не происходит.

Из-за вот такой непонятки фиг поймёшь в чем конкретно проблема в коде.

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

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,149
196
www.dotabuff.com
Проект
Roshan defense
Можешь подсказать почему если я пишу абилку только на языке луа, как в примере на сайте доты, она не работает, но если писать датадрайвеном с подключением луа, по старинке как в файлах гитхаба, работает, мне библиотек не хватает?, каких именно, т.к не написано что за библиотеки требуются на сайте доты.....
Посмотри скилы из дота имбы , там абсолютно все абилки на луа написаны.
Вот это уровень !
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Да это работает, но не могу понять зачем в коде нужна эта функция:

function vengefulspirit_nether_swap_lua:GetAOERadius()
return self:GetSpecialValueFor( "radius" )
end

если она ни на что не влияет, т.к даже если получит значение и вернет, ничего не происходит.

Когда к абилке обращаются за радиусом, то отрабатывает эта функция. В примере кода просто не делают проверку на него. Возможно, этого и не нужно, достаточно лишь указать в кв файле это специальное значение "radius", а в коде прописать к нему обращение, и тогда умение автоматически будет делать проверку доступности цели (ну это логично, ибо когда к умению будут обращаться всякие там фильтры/объекты и т.п. за радиусом, они обратятся именно к GetAOERadius). Я этого не проверял, ибо обычно попросту в kv указываю радиус и не переопределяю данный метод класса.

Ну и цель примера была не в этом. Здесь тебе кроме всего прочего демонстрируют, как взаимодействовать с блоком abilitySpecial.
 

EYEOFLIE

Активный
28 Янв 2018
137
4
Посмотри скилы из дота имбы , там абсолютно все абилки на луа написаны.
Вот это уровень !
Смотрел, собственно и прифигел, каким образом функция вызывает саму себя, некоторые параметры понятны интуитивно, а вот например если нету указания модификатора в котором выполняется действие например стана, или просто команды стана нету в коде, но при этом скилл станит... это жостко
 

Илья

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

Где-то ты что-то недоглядел.
 
Реклама: