Всем доброго времени суток! Возник следующий вопрос: как я могу в 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
Должно работать.
Чутка подправил.
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
26
5 лет назад
2
prog:
возможно есть и новые способы узнать кто хост.
Очень рассчитываю на это, всё-таки у меня очень ненадёжный вариант
0
15
5 лет назад
0
PT153, да кикать можно только в лобби игры, во время самой игры нельзя кикнуть этим функционалом от близзов. Ну вы тут и понаписали) common.j сейчас пришлю.
В целом решение работает, кроме красного цвета, просто скажу, что админу нельзя менять цвет. Пока пойдет, а потом, возможно, попробую сделать кик по нику игрока. Спасибо всем большое!
4
26
5 лет назад
4
PT153:
Просто в редакторе это называется Fixed player settings, а не arranged forces. Но я так и думал, ещё на HIVE спросил на всякий случай.
А ведь они тоже задаются этим вопросом: www.hiveworkshop.com/posts/3306944

Meddin, так проверь, отлавливает ли звёздочку в имени хоста.
0
15
5 лет назад
0
8gabriel8, звездочка наоборот не в конце имени, а в начале же, по крайней мере так отображается, когда я хостю карты в батлнет. Проверить как именно? Я полагаю, что если я создам карту и напишу что-то в чате, то если звездочка считается частью имени, то в чате будет написано *Meddin: "какой то текст", иначе же, звездочка не является частью имени. Но это я смогу проверить только вечером с другом на батлнете.
0
26
5 лет назад
0
Изменил триггер под первый символ имени равно *. По идее можешь один посмотреть с компьютерами, если возможно. Пропиши в чат кик, если увидешь кнопку диалога со своим именем, значит не работает, если не увидешь, то работает.
Но вообще надо бы посмотреть, вдруг есть какое-то условие определения хоста.
Приложи сюда common.j
Загруженные файлы
2
23
5 лет назад
2
все напишут красный цвет и счастья если хост боиться кикать всех красных и самому себя =)
2
26
5 лет назад
2

Лучше просто запусти эту карту, только не меняй красный и синий цвета игроков. Должно появиться через 2 секунды после старта сообщение, если в имени будет *.
Загруженные файлы
0
15
5 лет назад
0
8gabriel8, запустил, не было сообщения. Ну я в принципе так и думал, что звездочка не входит в имя хоста.
Загруженные файлы
2
26
5 лет назад
2
И в common.j тоже определения хоста не видать( Очень печально, хорошо бы сообщить близзам.
2
28
5 лет назад
Отредактирован PT153
2
Очень печально, хорошо бы сообщить близзам.
Да им уже говорили об этом на HIVE ещё давно.
Хост так-то не очень нужен теперь, ведь хост может выйти, и хостом станет кто-то другой. Тем более, что теперь хоста можно передать командой !owner (прочитал на HIVE).
Для "чистых" melee карт нахождение хоста тоже не нужно.
Так что тот, у кого красный, тот и главный, если принципиально иметь главного на карте.
2
26
5 лет назад
2
Хмм, может секретное комбо сделать на права админа? Типа верх, верх, низ, право, Esc, лево, низ, Esc, Esc, лево, право)
Если что, это дичь. Просто пошутил)
0
15
5 лет назад
0
8gabriel8, лол)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.