Команда Spectator'ов

KaRMa4

Пользователь
9 Июн 2017
52
0
Здравствуйте, как сделать команду "Зрителей", которую можно выбрать в начале игры, при выборе сторон.
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Здравствуйте, как сделать команду "Зрителей", которую можно выбрать в начале игры, при выборе сторон.
Делаешь обычную команду дополнительную и героев зрителей удаляешь, давая им фоввиевер над всей картой
 
20 Дек 2016
892
170
Я очень ленивый, сделайте все за меня пжлста.
1. Создание более двух команд
2. Удаление героя. Не уверен, что будет работать. На крайняк можно давать вечный стан, инвиз и неуязвимость.
3. Обеспечение обзора.

До этого момента не был знаком ни с одной из вышеуказанных конструкций. При этом на их поиск ушло от силы минут пятнадцать. Думаю, ты бы и сам справился за такое же время. И не пришлось бы ждать ответа несколько часов.
 
  • Нравится
Реакции: Илья

KaRMa4

Пользователь
9 Июн 2017
52
0
1. Создание более двух команд
2. Удаление героя. Не уверен, что будет работать. На крайняк можно давать вечный стан, инвиз и неуязвимость.
3. Обеспечение обзора.

До этого момента не был знаком ни с одной из вышеуказанных конструкций. При этом на их поиск ушло от силы минут пятнадцать. Думаю, ты бы и сам справился за такое же время. И не пришлось бы ждать ответа несколько часов.
Последняя ссылка не работает, и меня интересует, как пропускать стадию пика для Зрителей, или сделать, как в обычной доте, на фоне драфт героев.
 
20 Дек 2016
892
170
Последняя ссылка не работает, и меня интересует, как пропускать стадию пика для Зрителей, или сделать, как в обычной доте, на фоне драфт героев.
Пропустить стадию пика для одной команды стандартными средствами не получится. Вариант, который предложил тебе I_GRIN_I просто сделает стадию пика незначимой для спектраторов. Драфт при этом отображается в верхней строке, чего могло бы хватить для многих разработчиков, если бы они поставили перед собой твою задачу.
Ну а если ты хочешь сделать все красиво, то пиши свой пик.
А еще лучше - пиши свою доту. Немного сложнее, зато без ограничений и без вальвовских багов.
 

KaRMa4

Пользователь
9 Июн 2017
52
0
Пропустить стадию пика для одной команды стандартными средствами не получится. Вариант, который предложил тебе I_GRIN_I просто сделает стадию пика незначимой для спектраторов. Драфт при этом отображается в верхней строке, чего могло бы хватить для многих разработчиков, если бы они поставили перед собой твою задачу.
Ну а если ты хочешь сделать все красиво, то пиши свой пик.
А еще лучше - пиши свою доту. Немного сложнее, зато без ограничений и без вальвовских багов.
Хорошо, а можно подробнее написать, это все, что я прошу.
Я не силен в этой сфере на столько, что бы так легко все понимать.
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
96
Проект
Petri Reborn
Так в доте же есть команда спектаторов, мб можно как нибудь перекидывать за неё?
 
20 Дек 2016
892
170
Так в доте же есть команда спектаторов, мб можно как нибудь перекидывать за неё?
Это не команда. Это просто зрители. Они беспоследственоо могут подключиться и отключиться от просмотра игры в любой момент. Не знаю как сейчас, но раньше спектраторы могли даже смотреть как люди играют в кастомки. Значит эта структура вынесена за игровой процесс, и обращаться к ней в адоне нельзя (но это не точно).
 
20 Дек 2016
892
170
Хорошо, а можно подробнее написать, это все, что я прошу.
Я не силен в этой сфере на столько, что бы так легко все понимать.
Тогда нужно становиться сильнее (в своя время я стал сильнее просто читая все темы форума подряд, пытаясь разобраться в каждой, независимо от того, нужна она мне или нет), потому что даже эти 3 шага можно реализовать разными способами, и какой из них больше подходит лучше выбирать тебе самому. Конечно можно постоянно просить "чуть подробнее", до того момента, пока кто-нибудь не скинет готовый код. Но когда-нибудь тебе просто перестанут отвечать.

С дополнительной командой сам разберешься, если еще не разобрался.
По-моему удалять героя лучше всего, когда стадия игры меняется на DOTA_GAMERULES_STATE_PRE_GAME. Подключаешь слушателя, реагирующего на смену стадии игры, а в вызываемой функции делаешь проверку
Код:
if GameRules:State_Get() == DOTA_GAMERULES_STATE_PRE_GAME then
Потом перебираешь всех героев игроков нужной команды.
Код:
for playerID = 0, PlayerResource:GetPlayerCount() - 1 do --Перебираем ИД всех игроков, подключенных к серверу
    if PlayerResource:IsValidPlayerID(playerID) then --Перестраховка на всякий случай
         if PlayerResource:GetTeam(playerID) == 42 --Принадлежит ли игрок с текущим ИД к команде с ИД 42. Замени 42 на ИД своей команды спектраторов
             --Сюда пройдут только ИД интересующих нас плейеров в момент, когда начнется сама игра.
             local hero = PlayerResource:GetPlayer(playerID):GetAssignedHero() --А вот и герой нашего игрока. Делаем с этим парнем все, что захотим.
Ну а дальше либо удаляешь героя
Код:
if hero then
    UTIL_Remove( hero )
end
Либо накладываешь на него модификатор со следующими состояниями:
MODIFIER_STATE_STUNNED
MODIFIER_STATE_INVULNERABLE
MODIFIER_STATE_UNSELECTABLE
MODIFIER_STATE_NOT_ON_MINIMAP
MODIFIER_STATE_NO_UNIT_COLLISION
MODIFIER_STATE_INVISIBLE
MODIFIER_STATE_TRUESIGHT_IMMUNE

Не забудь после всего этого проставить энды.
Код:
end
end
end
end

В той же функции после проверки на стадию игры пишешь
Код:
AddFOWViewer( 42, Vector(0,0,0), OVER 9999, OVER 9999, false )
Надеюсь, догадался, что некоторые значения нужно поменять.

На всякий случай вот
 
Последнее редактирование:
  • Нравится
Реакции: -ExotiC-

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Фоввиеверы не показывают область больше 15к ренжи вроде, так что если карта большая, то их нужно много распихать по карте
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
96
Проект
Petri Reborn
Это не команда. Это просто зрители. Они беспоследственоо могут подключиться и отключиться от просмотра игры в любой момент. Не знаю как сейчас, но раньше спектраторы могли даже смотреть как люди играют в кастомки. Значит эта структура вынесена за игровой процесс, и обращаться к ней в адоне нельзя (но это не точно).
Я помню, что в хаммере можно за команду спектаторов юнитов назначать
 
20 Дек 2016
892
170
Я помню, что в хаммере можно за команду спектаторов юнитов назначать
На счет хаммера ничего не могу сказать.
+В апи есть такая константа:
Код:
DOTA_MAX_SPECTATOR_TEAM_SIZE
То есть все-таки какое-то взаимодействие со зрителями предусмотрено, но можно ли игроков делать зрителями прямо в процессе игры я не знаю. Да и вообще не совсем понятно, чем зритель отличается от плейэра.
Во всяком случае самописное всегда лучше, ибо не ломается при каждом обновлении.
 

KaRMa4

Пользователь
9 Июн 2017
52
0
Тогда нужно становиться сильнее (в своя время я стал сильнее просто читая все темы форума подряд, пытаясь разобраться в каждой, независимо от того, нужна она мне или нет), потому что даже эти 3 шага можно реализовать разными способами, и какой из них больше подходит лучше выбирать тебе самому. Конечно можно постоянно просить "чуть подробнее", до того момента, пока кто-нибудь не скинет готовый код. Но когда-нибудь тебе просто перестанут отвечать.

С дополнительной командой сам разберешься, если еще не разобрался.
По-моему удалять героя лучше всего, когда стадия игры меняется на DOTA_GAMERULES_STATE_PRE_GAME. Подключаешь слушателя, реагирующего на смену стадии игры, а в вызываемой функции делаешь проверку
Код:
if GameRules:State_Get() == DOTA_GAMERULES_STATE_PRE_GAME then
Потом перебираешь всех героев игроков нужной команды.
Код:
for playerID = 0, PlayerResource:GetPlayerCount() - 1 do --Перебираем ИД всех игроков, подключенных к серверу
    if PlayerResource:IsValidPlayerID(playerID) then --Перестраховка на всякий случай
         if PlayerResource:GetTeam(playerID) == 42 --Принадлежит ли игрок с текущим ИД к команде с ИД 42. Замени 42 на ИД своей команды спектраторов
             --Сюда пройдут только ИД интересующих нас плейеров в момент, когда начнется сама игра.
             local hero = PlayerResource:GetPlayer(playerID):GetAssignedHero() --А вот и герой нашего игрока. Делаем с этим парнем все, что захотим.
Ну а дальше либо удаляешь героя
Код:
if hero then
    UTIL_Remove( hero )
end
Либо накладываешь на него модификатор со следующими состояниями:
MODIFIER_STATE_STUNNED
MODIFIER_STATE_INVULNERABLE
MODIFIER_STATE_UNSELECTABLE
MODIFIER_STATE_NOT_ON_MINIMAP
MODIFIER_STATE_NO_UNIT_COLLISION
MODIFIER_STATE_INVISIBLE
MODIFIER_STATE_TRUESIGHT_IMMUNE

Не забудь после всего этого проставить энды.
Код:
end
end
end
end

В той же функции после проверки на стадию игры пишешь
Код:
AddFOWViewer( 42, Vector(0,0,0), OVER 9999, OVER 9999, false )
Надеюсь, догадался, что некоторые значения нужно поменять.

На всякий случай вот
Либо я чего то не понял, либо это не работает я сделал все как ты написал, но во первых, перестает работать
Код:
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 2 )
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 2 )
И команды опять становятся по 5 человек, во вторых о какой функции ты говоришь?
Подключаешь слушателя, реагирующего на смену стадии игры, а в вызываемой функции делаешь проверку
 
20 Дек 2016
892
170
о какой функции ты говоришь?
Код:
function ...:InitGameMode()
 ListenToGameEvent( "game_rules_state_change", Dynamic_Wrap(GameMode, "Напиши_здесь_что_хочешь" ), self )
end

function ...:Напиши_здесь_что_хочешь( здесь_тоже_что_нибудь_напиши )
.
.
.
end

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

KaRMa4

Пользователь
9 Июн 2017
52
0
Код:
function ...:InitGameMode()
 ListenToGameEvent( "game_rules_state_change", Dynamic_Wrap(GameMode, "Напиши_здесь_что_хочешь" ), self )
end

function ...:Напиши_здесь_что_хочешь( здесь_тоже_что_нибудь_напиши )
.
.
.
end


И по поводу обратной совместимости (или как там это умные люди называют) ничем не могу помочь. Вообще тот код кроме геттеров использует только UTIL_Remove, если ты через него делаешь. Так что скорее всего это подарочек от габена, а не проблема кода.
Хорошо, тогда другой вопрос, Valve во время выхода Reborn'а писали такую вещь, что можно смотреть за кастомной игрой таким образом:
SpectateCustom.jpg
Но проблема в том, что когда кто то играет в мою кастомку, у меня такого нет, поэтому я пришел сюда, просить помощи.
 
Реклама: