Простые вопросы #3

LAPKI

Продвинутый
26 Окт 2018
254
55
По мере возможностей знакомлюсь, про рейкаст просто спросил из любопытства, ибо большая часть других апи понятна, а это что-то не совсем.

А вообще проблемно что-то найти по скриптингу совсем с нуля. Я вот не знаю ни С, ни луа. Понятно, что для кастомок мне абсолютно не нужен первый, а второй нужен постольку-поскольку - всё на стандартных дотовских апи построено. Но практически нигде подробно, с примерами, доступным языком не рассказано, как именно использовать эти апи (типа почему у них вложенность иной раз по 3-4 уровня, когда точки а когда двоеточия использовать, можно ли свалить в одну функцию много разных апи и будут ли они там нормально работать и тд). Короче, тяжеловато идет...
ну C тут знать и не надо, си это процедурный язык программирования, который даже в исходниках доты не используется в чистом виде (ну или по большей части не используется) и он очень сложен для освоения без знаний базы программирования и практики на других языках.
" Если кто-то путается где ставить точку, а где двоеточие, правило следующее: если обращаемся к свойству — ставим точку (object.name), если к методу — ставим двоеточие (object:getName()). "
(c) https://habr.com/ru/post/259265/
По простому. У тебя есть машина:
у неё есть колёса, руль, корпус и т.п. - это свойства
она может ехать, остановиться, взорваться - это методы
фактически свойства - это любой параметр характеризующий непосредственно сущность, а методы - действия, которые эта сущность может совершать (в луа методы = функции)
 

LAPKI

Продвинутый
26 Окт 2018
254
55
Так выглядит функция.
Код:
function Activate()
     GameRules.GameMode = GameMode()
     GameRules.GameMode:InitGameMode()
     GameRules:SetUseUniversalShopMode(true)
     GameRules:SetGoldTickTime(0.25)
     GameRules:SetGoldPerTick(1)
     GameRules:GetGameModeEntity():SetUseDefaultDOTARuneSpawnLogic(true)
     GameRules:SetShowcaseTime(1)
     GameRules:SetRuneSpawnTime(1)
     GameRules:SetStartingGold(1000)
     CDOTABaseGameMode:SetCustomHeroMaxLevel(100)
     CDOTABaseGameMode:SetFixedRespawnTime(15)
     CDOTABaseGameMode:SetTowerBackdoorProtectionEnabled(true)
end
Ни один из этих параметров не работает, только руны нормально спавнятся. ЧЯДНТ?
у тебя activate где-нибудь вызывается?
 

l30P0H

Пользователь
9 Июл 2020
25
0
у тебя activate где-нибудь вызывается?
Мне казалось, что её не надо вызывать, она сама выполняется. Причем сейчас потестил более внимательно - как минимум время возрождения работает, но только на первую смерть. Так понимаю, конкретно этот фукционал надо в отдельную функцию и на лиссенер вешать, чтобы перезапускалось после каждой смерти.

UPD. А не, не работает ничего... Кроме шоукейса. Его и вправду нет. Но тут хз, это из-за функции или ещё почему.
Пишут:
Activate , создает основу пользовательской игры и вызывает функцию инициализации.
После того как выполнится Precache и Activate, первая функция, которая выполнится в файле lua — GameMode: InitGameMode ().
Выполнится. То есть сама, автоматически.
 
Последнее редактирование:

l30P0H

Пользователь
9 Июл 2020
25
0
Lua:
function Activate()
     GameRules.GameMode = GameMode()
     GameRules.GameMode:InitGameMode()
     GameRules:SetUseUniversalShopMode(true)
     GameRules:SetGoldTickTime(0.25)
     GameRules:SetGoldPerTick(1)
     GameRules:SetShowcaseTime(1)
     GameRules:SetRuneSpawnTime(1)
     GameRules:SetStartingGold(1000)
     CDOTABaseGameMode:SetCustomHeroMaxLevel(100)
     CDOTABaseGameMode:SetFixedRespawnTime(1)
     CDOTABaseGameMode:SetTowerBackdoorProtectionEnabled(true)
end

ListenToGameEvent('dota_player_killed', Dynamic_Wrap(GameMode, 'OnPlayerKilled'), self)

function OnPlayerKilled()
    CDOTABaseGameMode:SetFixedRespawnTime(1)
end
Так сейчас выглядит единственный скрипт кастомки. Он плюс-минус не работает. Чего-то я не понимаю... :confused:
 

LAPKI

Продвинутый
26 Окт 2018
254
55
Мне казалось, что её не надо вызывать, она сама выполняется. Причем сейчас потестил более внимательно - как минимум время возрождения работает, но только на первую смерть. Так понимаю, конкретно этот фукционал надо в отдельную функцию и на лиссенер вешать, чтобы перезапускалось после каждой смерти.

UPD. А не, не работает ничего... Кроме шоукейса. Его и вправду нет. Но тут хз, это из-за функции или ещё почему.
Пишут:
Activate , создает основу пользовательской игры и вызывает функцию инициализации.
После того как выполнится Precache и Activate, первая функция, которая выполнится в файле lua — GameMode: InitGameMode ().
Выполнится. То есть сама, автоматически.
Ну я кастомки не пишу, так что я вполне могу быть не прав и activate выполняется сама. Чтобы проверить работает или нет - выведи сообщение в консоль прямо в функции. Если выведет - функция отрабатывает, нет - нет
 

Memory

Новичок
14 Июн 2020
4
1
Проект
Dota but
Здравствуйте, вопрос простой, но сам до решения допетрить не могу... Нужно сделать вард вд направленным не прерываемым скиллом (как томба). Я попытался это реализовать, поставил в AbilityBehavior DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING - ничего не изменилось
//=================================================================================================================
// Witch Doctor: Death Ward
//=================================================================================================================
"witch_doctor_death_ward"
{
// General
//-------------------------------------------------------------------------------------------------------------
"ID" "5141" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats.
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING"
"AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE"
"AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NO_INVIS | DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE | DOTA_UNIT_TARGET_FLAG_NOT_ATTACK_IMMUNE | DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES | DOTA_UNIT_TARGET_FLAG_CREEP_HERO"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"FightRecapLevel" "2"
"AbilitySound" "Hero_WitchDoctor.Death_WardBuild"

"HasScepterUpgrade" "1"

// Casting
//-------------------------------------------------------------------------------------------------------------
"AbilityCastRange" "600"
"AbilityCastPoint" "0.35 0.35 0.35"
"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4"
"AbilityChannelAnimation" "ACT_DOTA_CHANNEL_ABILITY_4"

// Time
//-------------------------------------------------------------------------------------------------------------
"AbilityCooldown" "90"
"AbilityChannelTime" "100 230 500"

// Cost
//-------------------------------------------------------------------------------------------------------------
"AbilityManaCost" "200 200 200"

// Special
//-------------------------------------------------------------------------------------------------------------
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_INTEGER"
"damage" "30 50 90"
"LinkedSpecialBonus" "special_bonus_unique_witch_doctor_5"
"CalculateSpellDamageTooltip" "0"
}
"02"
{
"var_type" "FIELD_INTEGER"
"attack_range_tooltip" "500 600 700"
"LinkedSpecialBonus" "special_bonus_unique_witch_doctor_1"
}
"03"
{
"var_type" "FIELD_INTEGER"
"bounce_radius" "300"
"RequiresScepter" "1"
}
}
}
Можете тыкнуть, что нужно поменять и на что, буду благодарен, всем спасибо.
 

VortDyn

Пользователь
26 Ноя 2018
13
4
Как сделать так, чтобы при применении скилла на персонаже менять предметы, которые на него одеты (менять модельку, скин)
 

ION

Пользователь
10 Ноя 2019
54
3
Проект
Memethrow 2.0 dota 2
Драсьте, сделал талант на кд способности, и с описания пропал квадратик с текущими значениями перезарядки.
1.png
ДД :
C++:
          "AbilityCooldown"                "%cooldown"
        
          "AbilityManaCost"                "90"

          // Time Cast
          //-------------------------------------------------------------------------------------------------------------------

          "AbilityCastRange"                "500"
          "AbilityCastPoint"                "0"
          "AbilityCastAnimation"            "ACT_DOTA_IDLE"

          // Special
          //-------------------------------------------------------------------------------------------------------------------
          "AbilitySpecial"
          {
              "01"
              {
                  "var_type"            "FIELD_FLOAT"
                  "scream_duration"     "1.5 2 2.5 3"
              }
              "02"
              {
                  "var_type"            "FIELD_INTEGER"
                  "scream_damage"        "100 150 200 250"
              }
              "03"
              {
                  "var_type"        "FIELD_INTEGER"
                  "scream_radius"    "500"
              }
            "04"
            {
                "var_type"                    "FIELD_FLOAT"
                "cooldown"                    "15 13 11 9"
            }
            "05"
            {
                "var_type"                    "FIELD_FLOAT"
                "cooldown_talent"            "14 12 10 8"
            }
          }
Lua :
Lua:
function my_ability:GetCooldown()

        local caster = self:GetCaster()
        local cooldown = self:GetSpecialValueFor("cooldown")
        local cooldown_talent = self:GetSpecialValueFor("cooldown_talent")
        local talent = caster:FindAbilityByName("special_bonus_unique_mirana_1")
        
        if talent:GetLevel() == 1 then
            return cooldown_talent
            else return cooldown
        end
end
Пробовал в дд менять ключи, - максимум отображало на стадии пика. Пытался менять формулы в луа, что бы оно отнимало значения - нет разницы, я так понимаю оно выводит ключ перезардки с дд, а так как я меняю кд через луа то ничего и не показует. Что делать?
 

ZLOY

Администратор
Команда форума
27 Июн 2016
780
121
Вот пример правильного использования метода
Код:
function archmage_shooting_star:GetCooldown(iLevel)
    if self:GetCaster():HasScepter() then
        return self:GetLevelSpecialValueFor( "cooldown_scepter" , iLevel)
    end

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

CrySidingWorld

Друзья CG
31 Май 2019
306
33
Вот пример правильного использования метода
Код:
function archmage_shooting_star:GetCooldown(iLevel)
    if self:GetCaster():HasScepter() then
        return self:GetLevelSpecialValueFor( "cooldown_scepter" , iLevel)
    end

    return self.BaseClass.GetCooldown( self, iLevel )
end
Ты немного не так сказал у него талант
 

l30P0H

Пользователь
9 Июл 2020
25
0
Блин, еще немного - и брошу нафиг это дело. Вообще не могу понять, в чем косяк. Я сейчас взял чужую кастомку, простейшую (Dota 2 But Attacking Casts Decay), залил её заместо своей - а она все равно не работает! :mad:
 

VortDyn

Пользователь
26 Ноя 2018
13
4
Блин, еще немного - и брошу нафиг это дело. Вообще не могу понять, в чем косяк. Я сейчас взял чужую кастомку, простейшую (Dota 2 But Attacking Casts Decay), залил её заместо своей - а она все равно не работает! :mad:
1596200741382.png
 
  • Нравится
Реакции: l30P0H и xDes

VortDyn

Пользователь
26 Ноя 2018
13
4
Как сделать скилл, который будет сразу вкачан? Есть какая-то переменная или через скрипты писать?
 

VortDyn

Пользователь
26 Ноя 2018
13
4
При помощи события "OnHeroInGame" из ядра barebones(для кастомок)
сделал задуманное


Lua:
local innate_abilities = {
    "ability_sven_unique",
    "innate_ability2"
}

-- Создает цикл, ищет способность из списка "innate_abilities", делает им уровень 1
for i = 1, #innate_abilities do
    local current_ability = hero:FindAbilityByName(innate_abilities[i])
    if current_ability then
        current_ability:SetLevel(1)
    end
end
 

l30P0H

Пользователь
9 Июл 2020
25
0
Это всё, конечно, весело, но я хз, что делать... Тупо ничего не работает и всё тут.
 

CrySidingWorld

Друзья CG
31 Май 2019
306
33
  • Нравится
Реакции: Zachary Greenburg
Реклама: