Команда Spectator'ов

  • Автор темы Автор темы KaRMa4
  • Дата начала Дата начала

KaRMa4

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

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

До этого момента не был знаком ни с одной из вышеуказанных конструкций. При этом на их поиск ушло от силы минут пятнадцать. Думаю, ты бы и сам справился за такое же время. И не пришлось бы ждать ответа несколько часов.
Последняя ссылка не работает, и меня интересует, как пропускать стадию пика для Зрителей, или сделать, как в обычной доте, на фоне драфт героев.
 
Последняя ссылка не работает, и меня интересует, как пропускать стадию пика для Зрителей, или сделать, как в обычной доте, на фоне драфт героев.
Пропустить стадию пика для одной команды стандартными средствами не получится. Вариант, который предложил тебе I_GRIN_I просто сделает стадию пика незначимой для спектраторов. Драфт при этом отображается в верхней строке, чего могло бы хватить для многих разработчиков, если бы они поставили перед собой твою задачу.
Ну а если ты хочешь сделать все красиво, то пиши свой пик.
А еще лучше - пиши свою доту. Немного сложнее, зато без ограничений и без вальвовских багов.
 
Пропустить стадию пика для одной команды стандартными средствами не получится. Вариант, который предложил тебе I_GRIN_I просто сделает стадию пика незначимой для спектраторов. Драфт при этом отображается в верхней строке, чего могло бы хватить для многих разработчиков, если бы они поставили перед собой твою задачу.
Ну а если ты хочешь сделать все красиво, то пиши свой пик.
А еще лучше - пиши свою доту. Немного сложнее, зато без ограничений и без вальвовских багов.
Хорошо, а можно подробнее написать, это все, что я прошу.
Я не силен в этой сфере на столько, что бы так легко все понимать.
 
Так в доте же есть команда спектаторов, мб можно как нибудь перекидывать за неё?
 
Так в доте же есть команда спектаторов, мб можно как нибудь перекидывать за неё?
Это не команда. Это просто зрители. Они беспоследственоо могут подключиться и отключиться от просмотра игры в любой момент. Не знаю как сейчас, но раньше спектраторы могли даже смотреть как люди играют в кастомки. Значит эта структура вынесена за игровой процесс, и обращаться к ней в адоне нельзя (но это не точно).
 
Хорошо, а можно подробнее написать, это все, что я прошу.
Я не силен в этой сфере на столько, что бы так легко все понимать.
Тогда нужно становиться сильнее (в своя время я стал сильнее просто читая все темы форума подряд, пытаясь разобраться в каждой, независимо от того, нужна она мне или нет), потому что даже эти 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-
Фоввиеверы не показывают область больше 15к ренжи вроде, так что если карта большая, то их нужно много распихать по карте
 
Это не команда. Это просто зрители. Они беспоследственоо могут подключиться и отключиться от просмотра игры в любой момент. Не знаю как сейчас, но раньше спектраторы могли даже смотреть как люди играют в кастомки. Значит эта структура вынесена за игровой процесс, и обращаться к ней в адоне нельзя (но это не точно).
Я помню, что в хаммере можно за команду спектаторов юнитов назначать
 
Я помню, что в хаммере можно за команду спектаторов юнитов назначать
На счет хаммера ничего не могу сказать.
+В апи есть такая константа:
Код:
DOTA_MAX_SPECTATOR_TEAM_SIZE
То есть все-таки какое-то взаимодействие со зрителями предусмотрено, но можно ли игроков делать зрителями прямо в процессе игры я не знаю. Да и вообще не совсем понятно, чем зритель отличается от плейэра.
Во всяком случае самописное всегда лучше, ибо не ломается при каждом обновлении.
 
Тогда нужно становиться сильнее (в своя время я стал сильнее просто читая все темы форума подряд, пытаясь разобраться в каждой, независимо от того, нужна она мне или нет), потому что даже эти 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 человек, во вторых о какой функции ты говоришь?
Подключаешь слушателя, реагирующего на смену стадии игры, а в вызываемой функции делаешь проверку
 
о какой функции ты говоришь?
Код:
function ...:InitGameMode()
 ListenToGameEvent( "game_rules_state_change", Dynamic_Wrap(GameMode, "Напиши_здесь_что_хочешь" ), self )
end

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

команды опять становятся по 5 человек
И по поводу обратной совместимости (или как там это умные люди называют) ничем не могу помочь. Вообще тот код кроме геттеров использует только UTIL_Remove, если ты через него делаешь. Так что скорее всего это подарочек от габена, а не проблема кода.
 
Код:
function ...:InitGameMode()
 ListenToGameEvent( "game_rules_state_change", Dynamic_Wrap(GameMode, "Напиши_здесь_что_хочешь" ), self )
end

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


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

файл custom_ui_manifest.xml :
HTML:
<root>
    <scripts>
        <include src="file://{resources}/scripts/custom_game/spectator.js" />
      </scripts>
    <Panel>
    </Panel>
</root>

файл spectator.js:
JavaScript:
GameUI.CustomUIConfig().team_select =
{
    "bShowSpectatorTeam" : true
}

файл addon_game_mode.lua:
Lua:
local gameModeEnt = GameRules:GetGameModeEntity()
    GameRules:SetCustomGameTeamMaxPlayers(1, 2)
Последнее это количество наблюдателей. (как я понял у команды наблюдателей индекс один, поэтому их количество я смог менять только через индекс, без названия команды)
 
  • Нравится
Реакции: vulkantsk
Не знаю насколько своевременно это будет, но через понараму можно добавить полноценную команду наблюдателей.
Можно выписать как отдельную наработку )
Штука полезная, как никак !
 
Реклама: