[Гайд] Создаем карту с раундами и волнами мобов

xDes

Продвинутый
8 Ноя 2018
232
34
Проект
Boss Survival Adventure
DOTAUnits, (*example_unit_2*), (*Creature*),
говорит же об ошибке внутри npc_units_custom.txt
 

LAPKI

Продвинутый
26 Окт 2018
271
61
KeyValues Error: RecursiveLoadFromBuffer: got EOF instead of keyname in file scripts/npc/npc_units_custom.txt
DOTAUnits, (*example_unit_2*), (*Creature*),

Такую ошибку выдает хаммер. Мб с этим связано. Полный тхт файл в конце не прикреплен, кстати, как это обещано в гайде. Но я и со стандартным гноллом пробовал, который автоматом идет при создании, ничерта не спавнится.

Да, сделал со стандартным гнолом, 0 результата.

Lua:
function GameMode:OnGameInProgress()
  print("[BAREBONES] The game has officially begun")

  Timers:CreateTimer(30, function() -- Start this timer 30 game-time seconds later
    --print("This function is called 30 seconds after the game begins, and every 30 seconds thereafter")
    return 30.0 -- Rerun this timer every 30 game-time seconds
  end)
local point = Entities:FindByName( nil, "spawnerino"):GetAbsOrigin() -- Записываем в переменную 'point' координаты нашего спавнера 'spawnerino'
local waypoint = Entities:FindByName( nil, "way1") -- Записываем в переменную 'waypoint' координаты первого бокса way1.
local return_time = 10 -- Записываем в переменную значение '10'
Timers:CreateTimer(15, function() -- Создаем таймер, который запустится через 15 секунд после начала матча и запустит следующую функцию.
GAME_ROUND = GAME_ROUND + 1 -- Значение GAME_ROUND увеличивается на 1.
if GAME_ROUND == MAX_ROUNDS -- Если GAME_ROUND равно MAX_ROUNDS, переменная return_time получит нулевое значение.
return_time = nil
end
Say(nil,"Wave №" .. GAME_ROUND, false) -- Выводим в чат сообщение 'Wave №', в конце к которому добавится значение GAME_ROUND.
for i=1, ROUND_UNITS do -- Произведет нижние действия столько раз, сколько указано в ROUND_UNITS. То есть в нашем случае создаст 2 юнита.
local unit = CreateUnitByName( "npc_dota_creature_gnoll_assassin", point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS ) -- Создаем юнита 'example_unit_', в конце к названию добавится 1,2,3,4 или 5, в зависимости от раунда, и в итоге получатся наши example_unit_1, example_unit_2 и т.д.. Юнит появится в векторе point + RandomVector( RandomFloat( 0, 200 ) ) - point - наша переменная, а рандомный вектор добавляется для того, чтобы мобы не появлялись в одной точке и не застревали. Мобы будут за силы света.
unit:SetInitialGoalEntity( waypoint ) -- Посылаем мобов на наш way1, координаты которого мы записали в переменную 'waypoint'
end
return return_time -- Возвращаем таймеру время, через которое он должен снова сработать. Когда пройдет последний раунд таймер получит значение 'nil' и выключится.
end)
end


После публикации - игра не прогружаетсяв доцке, лобби создается, но сервер сбрасывает, когда нажимаешь начать игру.
Ошибка - ожидалось значение ключа атрибута вместо конца файла npc_units_custom.txt, т. Е там где-то скобки пропустили
 

Nikstoun

Новичок
8 Сен 2019
6
0
Возможно не полностью та тема, но все же. Есть несколько вопросов:
1) Одна из волн ходит медленно. Здесь уже писали об этом и говорилось, что они бегут быстрее как на кого-нибудь сагрятся, но это не совсем балансно
2) (Возможно не в тему) Как по простому подогнать модель под крипов? Дело в том, что единственный пункт контроля модели - "ModelScale", то есть ничего больше в самом редакторе изменить нельзя. У меня вот например крипы бегут боком. Понятно что дело только в экспортируемой модели, ее тупа нужно ставить под другим углом, но вот чтобы это все на деле проверить нужно потратить кучу времени. Повернуть в одну сторону, затем в другую, и так до того момента пока они не встанут как надо, а между этими поворотами следует нудный этап импорта в model editor. Может есть способ проще?
3) (Возможно не в тему) Как сделать строения(колодцы, бараки) с поддержкой анимации модели? Если с колодцами +- понятно, задать тип юнита, то вот с бараками как быть? Как задать зависимость этих вот юнитов=бараков с появлением супер и мега крипов?
4) (Возможно не в тему) Как при типе передвижения DOTA_UNIT_CAP_MOVE_GROUND запретить юниту передвигаться? То есть нужна возможность поворота, но не передвижения. При значении MovementSpeed 0 и -1 движение остается

Скорее всего вопросы нубские, не исключаю, просто поиск по темам невероятно затруднен всяким мусором, либо банально устаревшей инфой
 
Последнее редактирование:

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Возможно не полностью та тема, но все же. Есть несколько вопросов:
1) Одна из волн ходит медленно. Здесь уже писали об этом и говорилось, что они бегут быстрее как на кого-нибудь сагрятся, но вот у меня они, повторяюсь, совсем пассивные
2) (Возможно не в тему) Как по простому подогнать модель под крипов? Дело в том, что единственный пункт контроля модели - "ModelScale", то есть ничего больше в самом редакторе изменить нельзя. У меня вот например крипы бегут боком. Понятно что дело только в экспортируемой модели, ее тупа нужно ставить под другим углом, но вот чтобы это все на деле проверить нужно потратить кучу времени. Повернуть в одну сторону, затем в другую, и так до того момента пока они не встанут как надо, а между этими поворотами следует нудный этап импорта в model editor. Может есть способ проще?
3) (Возможно не в тему) Как сделать строения(колодцы, бараки) с поддержкой анимации модели? Если с колодцами +- понятно, задать тип юнита, то вот с бараками как быть? Как задать зависимость этих вот юнитов=бараков с появлением супер и мега крипов?

Скорее всего вопросы нубские, не исключаю, просто поиск по темам невероятно затруднен всяким мусором, либо банально устаревшей инфой
1 - увеличь радиус агра у крипов
2 - запомни front координату и всегда поворачивай модель по ней, в чем проблема?
3 - какая анимация тебе требуется?
 

Nikstoun

Новичок
8 Сен 2019
6
0
1 - увеличь радиус агра у крипов
2 - запомни front координату и всегда поворачивай модель по ней, в чем проблема?
3 - какая анимация тебе требуется?
1) Не думаю что это правильно повлияет на баланс. Как-то глупо будет, если крипы будут через пол карты агриться. Половина сути доты теряется.
2) Это лишь одна из возможных проблем, суть вопроса в том, есть ли возможность редачить положение модели в пространстве в редакторе моделей?
3) Любая. Суть в том, что сам тип строений не поддерживает анимацию, по крайней мере без каких-либо волшебных кнопочек. Дак вот, есть ли они?
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
1) Не думаю что это правильно повлияет на баланс. Как-то глупо будет, если крипы будут через пол карты агриться. Половина сути доты теряется.
2) Это лишь одна из возможных проблем, суть вопроса в том, есть ли возможность редачить положение модели в пространстве в редакторе моделей?
3) Любая. Суть в том, что сам тип строений не поддерживает анимацию, по крайней мере без каких-либо волшебных кнопочек. Дак вот, есть ли они?
4 - зарутить
1 - никак тогда лол, как они будут агриться без радиуса агра?
2 - скорее всего нет, он не для этого, это не 3д редактор.
3 - разве AddGesture не работает?
 

FunStrike

Пользователь
8 Окт 2019
28
8
Как вариант тем у кого крипы медленно движутся. Проверьте свои path_corner, там он ведь может скорость перезаписывать.

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

Hex

Пользователь
8 Авг 2019
12
1
Проект
Dugeon rpg
Сделал все по этому гайду , но ничего не происходит, в консоле ошибка :
Script load error for script
@C:\Program Files (x86)\Steam\steamapps\common\dota 2 beta\game\dota_addons\dugeon_rpg\scripts\vscripts\addon_game_mode.lua:
...a_addons\dugeon_rpg\scripts\vscripts\addon_game_mode.lua:17: <name> or '...' expected near '"npc_defender_knight_village"'
LoadAndCompileScriptFile: Failed to compile script file "scripts/vscripts/addon_game_mode.lua"
 

DDSuper

Друзья CG
31 Май 2019
405
57
Сделал все по этому гайду , но ничего не происходит, в консоле ошибка :
Script load error for script
@C:\Program Files (x86)\Steam\steamapps\common\dota 2 beta\game\dota_addons\dugeon_rpg\scripts\vscripts\addon_game_mode.lua:
...a_addons\dugeon_rpg\scripts\vscripts\addon_game_mode.lua:17: <name> or '...' expected near '"npc_defender_knight_village"'
LoadAndCompileScriptFile: Failed to compile script file "scripts/vscripts/addon_game_mode.lua"
На 17 строке поищи ошибку. Тебе же тыкает на 17 строке ошибка
 

Hex

Пользователь
8 Авг 2019
12
1
Проект
Dugeon rpg
Сделал все как в данном гайде, ничего не работает, ошибки не выдает, помогите пожалуйста
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
96
Проект
Petri Reborn
Сделал все как в данном гайде, ничего не работает, ошибки не выдает, помогите пожалуйста
Такая же проблема, помогите девушке
'ничего не работает' - можно поподробнее? несколько сотен вариантов, что же можно было сделать не так
 
  • Нравится
Реакции: DDSuper

Chernobl

Новичок
6 Апр 2020
5
0
Переходим в самый низ нашего addon_game_mode.lua и пишем туда следующее:
function GameMode:OnGameInProgress() // Функция начнет выполняться, когда начнется матч( на часах будет 00:00 ).
local point = Entities:FindByName( nil, "spawnerino"):GetAbsOrigin() // Записываем в переменную 'point' координаты нашего спавнера 'spawnerino'
local waypoint = Entities:FindByName( nil, "way1") // Записываем в переменную 'waypoint' координаты первого бокса way1.
local return_time = 10 // Записываем в переменную значение '10'
Timers:CreateTimer(15, function() // Создаем таймер, который запустится через 15 секунд после начала матча и запустит следующую функцию.
GAME_ROUND = GAME_ROUND + 1 // Значение GAME_ROUND увеличивается на 1.
if GAME_ROUND == MAX_ROUNDS // Если GAME_ROUND равно MAX_ROUNDS, переменная return_time получит нулевое значение.
return_time = nil
end
Say(nil,"Wave №" .. GAME_ROUND, false) // Выводим в чат сообщение 'Wave №', в конце к которому добавится значение GAME_ROUND.
for i=1, ROUND_UNITS do // Произведет нижние действия столько раз, сколько указано в ROUND_UNITS. То есть в нашем случае создаст 2 юнита.
local unit = CreateUnitByName( "example_unit_" .. GAME_ROUND, point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS ) // Создаем юнита 'example_unit_', в конце к названию добавится 1,2,3,4 или 5, в зависимости от раунда, и в итоге получатся наши example_unit_1, example_unit_2 и т.д.. Юнит появится в векторе point + RandomVector( RandomFloat( 0, 200 ) ) - point - наша переменная, а рандомный вектор добавляется для того, чтобы мобы не появлялись в одной точке и не застревали. Мобы будут за силы света.
unit:SetInitialGoalEntity( waypoint ) // Посылаем мобов на наш way1, координаты которого мы записали в переменную 'waypoint'
end
return return_time // Возвращаем таймеру время, через которое он должен снова сработать. Когда пройдет последний раунд таймер получит значение 'nil' и выключится.
end)
end
Функция OnGameInProgress() или устарели, или изначально не работала. Неудивительно, что все пользователи выше жаловались.
Также тут надо добавить слушателя, иначе событие просто не произойдёт

Во всех модах, что я смотрел используется другая функция: GameMode:OnGameRulesStateChange(keys)
В итоге такие правки:
function GameMode:InitGameMode()
-- body, тут нужный код мода

ListenToGameEvent('game_rules_state_change', Dynamic_Wrap(GameMode, 'OnGameRulesStateChange'), self)
end
В этом же файле ниже добавляем:
function GameMode:OnGameRulesStateChange(keys)

--блок спавна волн

end
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
96
Проект
Petri Reborn
Функция OnGameInProgress() или устарели, или изначально не работала. Неудивительно, что все пользователи выше жаловались.
Также тут надо добавить слушателя, иначе событие просто не произойдёт

Во всех модах, что я смотрел используется другая функция: GameMode:OnGameRulesStateChange(keys)
В итоге такие правки:
function GameMode:InitGameMode()
-- body, тут нужный код мода

ListenToGameEvent('game_rules_state_change', Dynamic_Wrap(GameMode, 'OnGameRulesStateChange'), self)
end
В этом же файле ниже добавляем:
function GameMode:OnGameRulesStateChange(keys)

--блок спавна волн

end
ага ещё бы проверку тот ли это стейт
 

mka

Новичок
27 Апр 2020
4
0
Прочитал все страницы, и у всех разные ошибки. Я при повторении этого гайда в консоли получаю .
\scripts\vscripts\addon_game_mode.lua:72: attempt to index local 'unit' (a nil value)

function GameMode:OnGameInProgress()
local point = Entities:FindByName( nil, "spawnerino"):GetAbsOrigin()
local waypoint = Entities:FindByName( nil, "way1")
local return_time = 10
Timers:CreateTimer(10, function()
GAME_ROUND = GAME_ROUND + 1
if GAME_ROUND == MAX_ROUNDS then
return_time = nil
end
Say(nil,"Wave №" .. GAME_ROUND, false)
for i=1, ROUND_UNITS do
local unit = CreateUnitByName( npc_dota_creep_badguys_melee, point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, 4 )
unit:SetInitialGoalEntity( waypoint )
end
return return_time
end)
end

Кто-то может помочь почему waypoint пустой?
 

Chernobl

Новичок
6 Апр 2020
5
0
Прочитал все страницы, и у всех разные ошибки. Я при повторении этого гайда в консоли получаю .
\scripts\vscripts\addon_game_mode.lua:72: attempt to index local 'unit' (a nil value)

function GameMode:OnGameInProgress()
local point = Entities:FindByName( nil, "spawnerino"):GetAbsOrigin()
local waypoint = Entities:FindByName( nil, "way1")
local return_time = 10
Timers:CreateTimer(10, function()
GAME_ROUND = GAME_ROUND + 1
if GAME_ROUND == MAX_ROUNDS then
return_time = nil
end
Say(nil,"Wave №" .. GAME_ROUND, false)
for i=1, ROUND_UNITS do
local unit = CreateUnitByName( npc_dota_creep_badguys_melee, point + RandomVector( RandomFloat( 0, 200 ) ), true, nil, nil, 4 )
unit:SetInitialGoalEntity( waypoint )
end
return return_time
end)
end

Кто-то может помочь почему waypoint пустой?
Значит у тебя не был создан на карте объект с именем "way1"
Чтобы его сделать, тыкаешь на лампочку в hammer editor. Далее находишь info_target, ставишь на нужное место. После в свойствах этого info_target в поле"Name" пишешь "wa1".

Если хочешь, чтобы он у тебя ходил от одной точке к другой, то нужно сделать path_corner объект.
Есть вот гайд от одной пользователя с этого форума, я сделал по нему, вроде работает: урок по лайновым крипам
 

mka

Новичок
27 Апр 2020
4
0
[U]Chernobl,[/U] я тоже сначала подумал что опечатка или еще что. Проверил он есть.
Если я правильно понимаю, то если закоментировать строку unit:SetInitialGoalEntity( waypoint ), то нейтралы все равно должны появится в spawnerino. Но их нет, как и никаких ошибок в консоли=)
П.с уже подумал попробовать по видео сделать.

1588005630969.png
 
Реклама: