Всем доброго времени суток! Возник следующий вопрос: как я могу в 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
Должно работать.
Чутка подправил.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
Опа! Что это собой представляет?
В сообщении ранее ссылка на патч на слове "патч". А в том, на которое ты сослался, есть ссылка на числе "1.30".
Ууух, как я их замаскировал.
26
Расскажи, что конкретно это означает, а не ходи вокруг
28
Ну камон. Сложно тыкнуть на ссылку и почитать патчноут? Я же даже сказал, где она...
Кину ещё раз.
Я правда не совсем уверен, работает ли это во время самой игры или только в меню подготовки.
26
PT153:
Ну камон. Сложно тыкнуть на ссылку и почитать патчноут?
Просто мне представилось, что это может быть какая-то дополнительная кнопка в самой игре, вот и допытывался.
Но теперь понятно, что это команда в чат для хоста !kick [name|slot]. А это значит, у меня удобнее реализовано)
Правда, там не хватает в диалоге, чтобы надписи с именами игроков на кнопках были цветом этих игроков, там следует сочетать это с Meddin'овой системой назначения цвета игроку. Или просто забить, всё равно больше подойдёт, чем ник игрока вводить.

Added kick and ban to player menu
То есть лишь в меню подготовки, а значит вообще не вариант

А вот и причина, по которой красного игрока не получается кикнуть
For arranged forces, changing player color will change player slot in game list
Цвет теперь привязан к игроку, а не слот.
28
То есть лишь в меню подготовки, а значит вообще не вариант
Надо всё-таки это проверить, ибо и на 1.26а можно кикнуть игрока тупо закрыв его слот.
Цвет теперь привязан к игроку, а не слот.
Наоборот, раньше цвет был привязан к игроку, а теперь с изменением цвета меняется и слот, то есть цвет привязан к слоту, как это сделано в StarCraft 2. То есть, игрок с красным цветом в картах с arranged forces теперь всегда Player(0).
Знать бы, что значит arranged в данном контексте.

Раз уж так, то нужно использовать такой вариант триггера для кика по цвету. Настройки кланов должны быть фиксированы!
Код
globals
    constant group EmptyGroup = CreateGroup()
    constant player Admin = Player(0)
endglobals

function StringToPlayer takes string color returns player
    set color = StringCase(color, false)
    if color == "red" then
        return Player(0)
    elseif color == "blue" then
        return Player(1)
    elseif color == "teal" then
        return Player(2)
    elseif color == "purple" then
        return Player(3)
    elseif color == "yellow" then
        return Player(4)
    elseif color == "orange" then
        return Player(5)
    elseif color == "green" then
        return Player(6)
    elseif color == "pink" then
        return Player(7)
    elseif color == "gray" then
        return Player(8)
    elseif color == "light blue" then
        return Player(9)
    elseif color == "dark green" then
        return Player(10)
    elseif color == "brown" then
        return Player(11)
    elseif color == "maroon" then
        return Player(12)
    elseif color == "navy" then
        return Player(13)
    elseif color == "turquoise" then
        return Player(14)
    elseif color == "violet" then
        return Player(15)
    elseif color == "wheat" then
        return Player(16)
    elseif color == "peach" then
        return Player(17)
    elseif color == "mint" then
        return Player(18)
    elseif color == "lavender" then
        return Player(19)
    elseif color == "coal" then
        return Player(20)
    elseif color == "snow" then
        return Player(21)
    elseif color == "emerald" then
        return Player(22)
    elseif color == "peanut" then
        return Player(23)
    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 and p != Admin and GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING then
        call GroupEnumUnitsOfPlayer(EmptyGroup, p, Filter(function KickPlayer))
    endif
    set p = null
endfunction

function InitMyTrig takes nothing returns nothing
    set gg_trg_My = CreateTrigger(  )
    call TriggerRegisterPlayerChatEvent( gg_trg_My, Admin, "gg", false )
    call TriggerAddAction( gg_trg_My, function MyTrig_Actions )
endfunction

Meddin, нужно поменять политику в карте. Теперь не хост главный, а тот, у кого красный цвет.
А можно мне в лс новый common.j?
24
Знать бы, что значит arranged в данном контексте.
Это для "фиксированных кланов" - если в карте настроены кланы, то теперь можно в лобби поменять свой цвет и тебя перекинет в тот слот которому этот цвет соответствует, а раньше, насколько я помню, просто нельзя было менять цвет при фиксированных кланах. Во всех остальных ситуациях как было так и осталось. Т.е. как были цвета к слотам привязаны при фиксированных кланах, так и остались, а без фиксированных кланов как не было привязки, так и не появилось.
28
"фиксированных кланов"
Просто в редакторе это называется Fixed player settings, а не arranged forces. Но я так и думал, ещё на HIVE спросил на всякий случай.
Спасибо.
26
Исходя из этого внёс изменения в триггеры:
Hosts have * next to their name
Теперь они проверяют наличие звёздочки в конце имени. Но проверь, работает ли, может быть звёздочка не считается частью имени. Ещё для тебя там не хватает событий для 17-24 игроков.

Наоборот, раньше цвет был привязан к игроку, а теперь с изменением цвета меняется и слот, то есть цвет привязан к слоту, как это сделано в StarCraft 2. То есть, игрок с красным цветом в картах с arranged forces теперь всегда Player(0).
Так в чём ошибка? Раньше игрок в слоте 12 мог иметь красный цвет и быть Player(11), а теперь он получит красный цвет и станет Player(0). Цвет был не привязан к игроку.
Возможно, под arranged forces имеются ввиду карты, где нескольким игрокам не назначен один общий цвет. То есть классическое melee.
Загруженные файлы
28
Так в чём ошибка? Раньше игрок в слоте 12 мог иметь красный цвет и быть Player(11), а теперь он получит красный цвет и станет Player(0). Цвет был не привязан к игроку.
Твоё предложение я прочитал как "Цвет ранее был привязан к слоту, а не к игроку". Перечитав сейчас, я понял, что имелось в виду "Ранее игрок был привязан к слоту, а теперь к цвету".
А вообще не важно, мы поняли друг друга.
То есть классическое melee.
Я всё же думаю, что prog ближе к истине. Посмотрим, что скажут на HIVE. Да и Meddin может это легко проверить.
For arranged forces, changing player color will change player slot in game list
И спасибо, что обратил на это внимание.
26
PT153:
Я всё же думаю, что prog ближе к истине. Посмотрим, что скажут на HIVE. Да и Meddin может это легко проверить.
Да мы примерно об одном и том же, просто сначала не вник в его комментарий. Есть ведь в триггерах функция, которая назначает любой цвет игроку, а если цвет игрока определяет слот, то как она будет работать для двух игроков одного цвета? Вот и предположил, что это не работает при определённых условиях, делающих карту кастомной. Как раз фиксированные кланы делают карту кастомной.
А так как триггеры по большей части тоже делают карту не melee, то свойства игрока и кланы вроде единственно возможные причины.
24
Есть ведь в триггерах функция, которая назначает любой цвет игроку
А это дело как работало, так, скорее всего, и будет работать - насколько я знаю, поменялось только поведение в лобби.

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