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

  • Автор темы Автор темы ZLOY
  • Дата начала Дата начала
Есть ли возможность запускать аддон на разных языках?
он всегда запускается на разных языках. (по умолчанию это язык на котором стим запускается)
но можно и принудительно указать язык запуска другой :
*:\Steam\steamapps\common\dota 2 beta\game\bin\win64\dota2cfg.exe" -addon test -novid -language english -toconsole
 
  • Нравится
Реакции: vulkantsk и fabio_longo

Салют всем!


Столкнулся давно с этой проблемой, пытался решить как-то, не смог.
Вкратце, есть самые обычные кастомные крипы.
Всего существует 4 пачки кастомных крипов.
Все волны у меня записаны через переменную.​


Начинается Функция:​


Идет с горном первая пачка крипов она умирает об тавр.
=>Спавнится вторая пачка крипов она умирает об тавр.
=>Спавнится третья пачка крипов она умирает об тавр.
=>Спавнится четвертая пачка крипов она умирает об тавр.​


Потом стоит повтор этой функции​


Идет первая пачка крипов она умирает об тавр.​

=>Спавнится вторая пачка крипов она умирает об тавр, НО НЕ СПАВНИТСЯ ТРЕТИЯ ПАЧКА КРИПОВ, А СПАВНИТСЯ ТОГДА КОГДА УМИРАЕТ ЛЮБОЙ ДРУГОЙ КРИП НА КАРТЕ, БУДЬ ЭТО НЕЙТРАЛ ИЛИ ВРАЖЕСКИЙ КРИП..​

=>Спавнится третья пачка крипов она умирает об тавр.​

=>Спавнится четвертая пачка крипов она умирает об тавр.​


Идет повтор этой функции​

Идет первая пачка крипов она умирает об тавр.​

=>Спавнится вторая пачка крипов она умирает об тавр, НО НЕ СПАВНИТСЯ ТРЕТИЯ ПАЧКА КРИПОВ, А СПАВНИТСЯ ТОГДА КОГДА УМИРАЕТ ЛЮБОЙ ДРУГОЙ КРИП НА КАРТЕ, БУДЬ ЭТО НЕЙТРАЛ ИЛИ ВРАЖЕСКИЙ КРИП..​

=>Спавнится третья пачка крипов она умирает об тавр.​

=>Спавнится четвертая пачка крипов она умирает об тавр.

То есть, проблема именно в повторе функции во второй пачке и я не понимаю как это решить. (Крипы все гудгайс, все крипы нормальные и прописаны в npc_untits_custom и не повторяются в одном месте)
Сколько просил помочь, игнорили в дискорде.
Кот вот:​

Lua:
CREEP = 0 -- Переменная

function GameMode:OnGameInProgress() -- Спавнер первого крипа

  local waypoint = Entities:FindByName( nil, "wp_1") -- Куда идут крипы
  local point = Entities:FindByName( nil, "spawner"):GetAbsOrigin() -- спавнер крипов
  local unit1 = CreateUnitByName("npc_dota_creep_goodguys_melee1", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS) -- 1 крип
  local unit2 = CreateUnitByName("npc_dota_creep_goodguys_melee2", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS) -- 2 крип
  local unit3 = CreateUnitByName("npc_dota_creep_goodguys_melee3", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS) -- 3 крип
  local unit4 = CreateUnitByName("npc_dota_creep_goodguys_ranged1", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS) -- 4 крип
  unit1:SetInitialGoalEntity( waypoint ) -- Куда идет 1 крип
  unit2:SetInitialGoalEntity( waypoint ) -- Куда идет 2 крип
  unit3:SetInitialGoalEntity( waypoint ) -- Куда идет 3 крип
  unit4:SetInitialGoalEntity( waypoint ) -- Куда идет 4 крип

end

function GameMode:OnEntityKilled(keys)
local waypoint = Entities:FindByName( nil, "wp_1")
local killedUnit = EntIndexToHScript( keys.entindex_killed )
local point = Entities:FindByName( nil, "spawner"):GetAbsOrigin()

    if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee1" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee2" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee3" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_ranged1" then
    CREEP = CREEP + 1
  end

  if CREEP == 4 or CREEP == 36 then
      local unit5 = CreateUnitByName("npc_dota_creep_goodguys_melee4", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit6 = CreateUnitByName("npc_dota_creep_goodguys_melee5", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit7 = CreateUnitByName("npc_dota_creep_goodguys_ranged2", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit8 = CreateUnitByName("npc_dota_creep_goodguys_flagbearer1", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      unit5:SetInitialGoalEntity( waypoint )
    unit6:SetInitialGoalEntity( waypoint )
    unit7:SetInitialGoalEntity( waypoint )
    unit8:SetInitialGoalEntity( waypoint )

    CREEP = 4
    
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee4" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee5" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_ranged2" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_flagbearer1" then
    CREEP = CREEP + 1
  end

  if CREEP == 9 then
      local unit9 = CreateUnitByName("npc_dota_creep_goodguys_melee6", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit10 = CreateUnitByName("npc_dota_creep_goodguys_melee7", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit11 = CreateUnitByName("npc_dota_creep_goodguys_ranged3", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit12 = CreateUnitByName("npc_dota_creep_goodguys_melee8", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit13 = CreateUnitByName("npc_dota_goodguys_siege1", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      unit9:SetInitialGoalEntity( waypoint )
    unit10:SetInitialGoalEntity( waypoint )
    unit11:SetInitialGoalEntity( waypoint )
    unit12:SetInitialGoalEntity( waypoint )
    unit13:SetInitialGoalEntity( waypoint )

    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee6" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee7" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_ranged3" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee8" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_goodguys_siege1" then
    CREEP = CREEP + 1
  end

  if CREEP == 15 then
      local unit14 = CreateUnitByName("npc_dota_creep_goodguys_melee9", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit15 = CreateUnitByName("npc_dota_creep_goodguys_melee10", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit16 = CreateUnitByName("npc_dota_creep_goodguys_ranged4", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit17 = CreateUnitByName("npc_dota_creep_goodguys_flagbearer2", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit18 = CreateUnitByName("npc_dota_goodguys_siege2", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      unit14:SetInitialGoalEntity( waypoint )
    unit15:SetInitialGoalEntity( waypoint )
    unit16:SetInitialGoalEntity( waypoint )
    unit17:SetInitialGoalEntity( waypoint )
    unit18:SetInitialGoalEntity( waypoint )

    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee9" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee10" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_ranged4" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_flagbearer2" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_goodguys_siege2" then
    CREEP = CREEP + 1
  end

  if CREEP == 21 then

      local unit19 = CreateUnitByName("npc_dota_creep_goodguys_melee11", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit20 = CreateUnitByName("npc_dota_creep_goodguys_melee12", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit21 = CreateUnitByName("npc_dota_creep_goodguys_melee13", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      local unit22 = CreateUnitByName("npc_dota_creep_goodguys_ranged5", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS)
      unit19:SetInitialGoalEntity( waypoint )
      unit20:SetInitialGoalEntity( waypoint )
      unit21:SetInitialGoalEntity( waypoint )
      unit22:SetInitialGoalEntity( waypoint )

      CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee11" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee12" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_melee13" then
    CREEP = CREEP + 1
  end

  if killedUnit:GetUnitName() == "npc_dota_creep_goodguys_ranged5" then
    CREEP = CREEP + 1
  end

  if CREEP == 26 then
      CREEP = CREEP + 10
  end

end
 

Салют всем!

Столкнулся давно с этой проблемой, пытался решить как-то, не смог.​

Попробуй погулить циклы.
Или например выдавать при спауне юниту аттрибут принадлежности к пачке?

Вот примеры (на коленке):

local point = Entities:FindByName( nil, "spawner"):GetAbsOrigin()
for i = 1, 3 do -- тут цикл
local pointRandomizer = point + RandomVector( RandomFloat( 0, 200 ) // тут можно зарандомить крипу тёплое местечко перед тем как спаунить (ну ты понял)
local unitName= "npc_dota_creep_goodguys_melee"..i //-- конкатенация исходя из значения i, то есть имякрипа1 имякрипа2 имякрипа3 (ну ты понял)
local Melee = CreateUnitByName( unitName, pointRandomizer, true, nil, nil, DOTA_TEAM_GOODGUYS )
Melee.FirstPachka = true // при смерти просто проверь if killedUnit.FirstPachka == true then (ну ты понял)
end

Это поможет срезать длину кода и проще будет найти ошибку.
Скорее всего, она связана с тем что если у тебя переменная CREEP равна 36 то чуть ниже ты переписываешь её CREEP = 4. Но это не точно.
 
Последнее редактирование:
Здрасте.

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

Вложения

  • Снимок экрана (7).png
    Снимок экрана (7).png
    254.8 KB · Просмотры: 11
  • Снимок экрана (8).png
    Снимок экрана (8).png
    163 KB · Просмотры: 11
Здрасте.

Короче говоря, у меня есть необходимость залезть внутрь произвольного модификатора, чтобы чекнуть его значения... Если попытаться объяснить понятнее, то нужно узнать, регенерирует ли модификатор хп в процентах. И да, с абилками, написанными на луа, проблем никаких нет. Проблемы начинаются с датаскриптом, ибо возвращает он не таблицы, а юзердату, с которой я хз что делать.
только переопределить функцию модификатора и там произвести нужные замеры, последовательность:
Код:
1 замер ХП до
2 применить модификатор
3 замер ХП после
4 посчитать в нужном виде итог работы модификатора.
почему переопределять, потому это максимальные гарантии близких последовательностей выполнения функций.
userdata это не объекты луа в обычном виде, если угодно проводники между доступным нам lua api и всем остальным функционалом движка.
 
только переопределить функцию модификатора и там произвести нужные замеры, последовательность:
Код:
1 замер ХП до
2 применить модификатор
3 замер ХП после
4 посчитать в нужном виде итог работы модификатора.
почему переопределять, потому это максимальные гарантии близких последовательностей выполнения функций.
userdata это не объекты луа в обычном виде, если угодно проводники между доступным нам lua api и всем остальным функционалом движка.
Спасибо за фидбек, но я уже всё реализовал через костыль. Банально сделал список нужных абилок и ключей, отвечающих за нужный мне параметр.
 
У меня кастомка для одного игрока. Как сделать так, чтобы слотов в лобби было 1? Не максимальное количество игроков на карте, а именно слоты в лобби, чтобы если игрок нажал "Играть", его не закидывало в лобби, а сразу выскочило сообщение "Принять игру", как это сделано в трейнинг полигоне
 
У меня кастомка для одного игрока. Как сделать так, чтобы слотов в лобби было 1? Не максимальное количество игроков на карте, а именно слоты в лобби, чтобы если игрок нажал "Играть", его не закидывало в лобби, а сразу выскочило сообщение "Принять игру", как это сделано в трейнинг полигоне
GameRules:SetCustomGameTeamMaxPlayers(DOTA_TEAM_GOODGUYS, 1)
и AddonInfo тоже 1
 
  • Нравится
Реакции: fabio_longo
GameRules:SetCustomGameTeamMaxPlayers(DOTA_TEAM_GOODGUYS, 1)
и AddonInfo тоже 1
странно, но это не работает. Попробовал даже добавить DOTA_TEAM_BADGUYS, 0, всё равно, в лобби слотов ровно 10. мой addoninfo:
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
"AddonInfo"
{
"PenaltiesEnabled" "0"
"CheckAFKPlayers" "0"
"TeamCount" "10"
"maps" "chen"
"IsPlayable" "1"
"chen"
{
"MinPlayers" "1"
"MaxPlayers" "1"
}
}
 
странно, но это не работает. Попробовал даже добавить DOTA_TEAM_BADGUYS, 0, всё равно, в лобби слотов ровно 10. мой addoninfo:
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
"AddonInfo"
{
"PenaltiesEnabled" "0"
"CheckAFKPlayers" "0"
"TeamCount" "10"
"maps" "chen"
"IsPlayable" "1"
"chen"
{
"MinPlayers" "1"
"MaxPlayers" "1"
}
}
Мне кажется аддон инфо у тебя неправильно написан, чекни мой.
Я не помню, есть ли стандартно функция: function CAddonTemplateGameMode:InitGameMode() в addon_game_mode.lua
Без неё не работает GameRules:SetCustomGameTeamMaxPlayers
 

Вложения

  • 5.png
    5.png
    6.1 KB · Просмотры: 17
  • Нравится
Реакции: fabio_longo
Мне кажется аддон инфо у тебя неправильно написан, чекни мой.
Я не помню, есть ли стандартно функция: function CAddonTemplateGameMode:InitGameMode() в addon_game_mode.lua
Без неё не работает GameRules:SetCustomGameTeamMaxPlayers
Спасибо! Залил обнову, жду одобрение модерации, сообщу об результате
 
Мне кажется аддон инфо у тебя неправильно написан, чекни мой.
Я не помню, есть ли стандартно функция: function CAddonTemplateGameMode:InitGameMode() в addon_game_mode.lua
Без неё не работает GameRules:SetCustomGameTeamMaxPlayers
Странно, переделал по твоему примеру - всё так же, слотов в лобби 10. Видел похожую проблему на форуме, но на неё так же ответ не дали
 
Странно, переделал по твоему примеру - всё так же, слотов в лобби 10. Видел похожую проблему на форуме, но на неё так же ответ не дали
Лол, зашёл в Dota 2 tools где идёт выбор аддонов, выбрал свой, нажал на шестерёнку, зашёл в настройки, а там стоит maxplayers - 10)) Пока не знаю точно, но возможно именно эта штука мешалась
P.S. В общем, эта настройка как-то пересоздаёт addoninfo так, что всё работает. А до этого, какие бы я вариации настройки не находил, ничего не работало
 
Последнее редактирование:
Здрасте. Надо запилить встроенный в кастомку гайд, но очень впадлу делать всё с нуля. Мб у кого-то есть готовое решение? На гитхаб там ссылочка с проектом-шаблоном для создания подобных штук...
 
Реклама: