Всем доброго времени суток! Возник следующий вопрос: как я могу в jass или с помощью триггеров получить номер игрока по его цвету? Пытаюсь решить следующую задачу: На карте первый игрок назначается своеобразным администратором игры, он может прописать команду в чат, где укажет цвет игрока, например green, после чего все сооружения и юниты, подконтрольные зеленому игроку будут убиты. Проблема заключается в том, что если игроки выберут себе цвета по вкусу, то может получится неразбериха, например админ введет green пытаясь, образно говоря, "кикнуть" игрока, выбравшего себе зеленый цвет, а пострадает игрок, который занял при присоединении к игре 7 слот. В голову приходит только такое решение: при выборе всех юнитов, подконтрольных игроку, как то получать номер этого игрока по цвету. Прошу помощи.
Принятый ответ
Слишком сложно.
Вот так попроще будет.
Вот так попроще будет.
Код
function StringToPlayerColor takes string color returns playercolor
set color = StringCase(color, false)
if color == "red" then
return PLAYER_COLOR_RED
elseif color == "blue" then
return PLAYER_COLOR_BLUE
elseif color == "teal" then
return PLAYER_COLOR_CYAN
elseif color == "purple" then
return PLAYER_COLOR_PURPLE
elseif color == "yellow" then
return PLAYER_COLOR_YELLOW
elseif color == "orange" then
return PLAYER_COLOR_ORANGE
elseif color == "green" then
return PLAYER_COLOR_GREEN
elseif color == "pink" then
return PLAYER_COLOR_PINK
elseif color == "gray" then
return PLAYER_COLOR_LIGHT_GRAY
elseif color == "light blue" then
return PLAYER_COLOR_LIGHT_BLUE
elseif color == "dark green" then
return PLAYER_COLOR_AQUA
elseif color == "brown" then
return PLAYER_COLOR_BROWN
elseif color == "maroon" then
return PLAYER_COLOR_MAROON
elseif color == "navy" then
return PLAYER_COLOR_NAVY
elseif color == "turquoise" then
return PLAYER_COLOR_TURQUOISE
elseif color == "violet" then
return PLAYER_COLOR_VIOLET
elseif color == "wheat" then
return PLAYER_COLOR_WHEAT
elseif color == "peach" then
return PLAYER_COLOR_PEACH
elseif color == "mint" then
return PLAYER_COLOR_MINT
elseif color == "lavender" then
return PLAYER_COLOR_LAVENDER
elseif color == "coal" then
return PLAYER_COLOR_COAL
elseif color == "snow" then
return PLAYER_COLOR_SNOW
elseif color == "emerald" then
return PLAYER_COLOR_EMERALD
elseif color == "peanut" then
return PLAYER_COLOR_PEANUT
endif
return null
endfunction
function StringToPlayer takes string color returns player
local integer i
set bj_setPlayerTargetColor = StringToPlayerColor(color)
if bj_setPlayerTargetColor != null then
set i = 1
loop
set bj_forceRandomCurrentPick = Player(i)
if GetPlayerSlotState(bj_forceRandomCurrentPick) == PLAYER_SLOT_STATE_PLAYING and /*
*/ GetPlayerColor(bj_forceRandomCurrentPick) == bj_setPlayerTargetColor then
return bj_forceRandomCurrentPick
endif
set i = i + 1
exitwhen i == bj_MAX_PLAYERS
endloop
endif
return null
endfunction
function KickPlayer takes nothing returns boolean
call KillUnit(GetFilterUnit())
return false
endfunction
function MyTrig_Actions takes nothing returns nothing
local string color = GetEventPlayerChatString()
local player p = StringToPlayer(SubString(color, 3, StringLength(color)))
if p != null then
call GroupEnumUnitsOfPlayer(bj_lastCreatedGroup, p, Filter(function KickPlayer))
set p = null
endif
endfunction
function InitMyTrig takes nothing returns nothing
set gg_trg_My = CreateTrigger( )
call TriggerRegisterPlayerChatEvent( gg_trg_My, Player(0), "gg", false )
call TriggerAddAction( gg_trg_My, function MyTrig_Actions )
endfunction
Должно работать.
Чутка подправил.
Чутка подправил.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован PT153
Отредактирован PT153
Отредактирован PT153
Отредактирован Meddin
Player 13 - Maroon - PLAYER_COLOR_MAROON
Player 14 - Navy - PLAYER_COLOR_NAVY
Player 15 - Turquoise - PLAYER_COLOR_TURQUOISE
Player 16 - Violet - PLAYER_COLOR_VIOLET
Player 17 - Wheat - PLAYER_COLOR_WHEAT
Player 18 - Peach - PLAYER_COLOR_PEACH
Player 19 - Mint - PLAYER_COLOR_MINT
Player 20 - Lavender - PLAYER_COLOR_LAVENDER
Player 21 - Coal - PLAYER_COLOR_COAL
Player 22 - Snow - PLAYER_COLOR_SNOW
Player 23 - Emerald - PLAYER_COLOR_EMERALD
Player 24 - Peanut - PLAYER_COLOR_PEANUT.
Да так глянул, что варкрафт поломался к чертям собачим, просто при запуске игры/лаунчера/редактора выходило окно, что произошла ошибка при запуске и предлагало отправить репорт близзам. Это крайне странно, потому как я просто посмотрел common.j, ничего в нем не редактируя, и закрыл, скопировав нужные переменные. Проблему удалось решить только переустановкой вара, причем удалял и чистил реестр вручную, так как утилита для удаления от близзов тоже крашилась при запуске. Кстати заметил, что если не все слоты будут заняты, например если занять первые несколько слотов, потом один пропустить и заполнить следующие игроками, то для того игрока, который занимает первый слот после пропущенного почему то удаление всех юнитов не срабатывает. Например, если я при создании игры второй слот оставляю пустым, затем в третий слот сую компа, потом в четвертый компа и стартую, то когда в игре пропишу команду, чтобы убило все войска игроку, который в третьем слоте, то ничего не происходит. Сейчас пытаюсь понять в чем дело.
Понял, по-любому не срабатывает условие в цикле, так как "разрывный" между игроками слот пуст.
Стоит завести свой массив игроков и искать в нём.
8gabriel8, просто начал двигаться уже в таком направлении, сначала я сделал вообще не цвет а номер игрока, но мне сказали, что по номеру кикать геморно, попросили сделать кик через цвет и как то пошло поехало...
К тому же представь ситуацию, допустим в FFA остался игрок, который играет за орду, он по факту проиграл, его вынесли, но он успел где-нибудь в одном из захолустных местечек карты построить мейн на последние деньги. И у него есть блейд, которым он уходит в виндволк. Админу придется ждать, пока он выйдет из виндвока, чтобы прожать блейда и прописать кик. Легче уже через цвет, как по мне.
8gabriel8, это да, я согласен. Уже обсуждали и этот момент, пришли к выводу, что логичнее копать в сторону кика по нику игрока, но мне это тоже не особо нравится, поскольку такие ники иногда бывают, тоже хрен еще напишешь в точности.
Отредактирован PT153
Ну и я не понял, что именно не работает.
Отредактирован Meddin
Ну у админа id 0, так как он первый слот занимает всегда. Не работает именно тот момент, когда красный цвет у кого-нибудь из игроков, например пусть у нас Игрок 1 - админ, будет синего цвета, а Игрок 2 - обычный игрок себе поставит красный цвет. В этот случае вот не работает.
8gabriel8, хм, это не плохая идея кстати. Я подумаю над этим. Спасибо. Но тогда надо как то сделать "включатель" этого диалога, чтобы он появлялся, когда админ захочет, в принципе, можно просто по команде в чат сделать...
Meddin: