Покраска ника в цвета

» опубликован
» Способ реализации: cJass
» Тип: Наработка
Можно использовать в карте в качестве визуальной изюминки в своем нике, меняя цвет ника прямо во время игры
» Покраска букв ника игрока в цвета
"-setcolor" далее номер игрока и далее конфигурация покраски:
[a-b] [c-d]
"a" и "c" - это номера (или индексы) нужных цветов
"b" и "d" - это номера букв
» Добавление кастомных цветов
Палитра ограничивается 8190 цветами
» Первый способ
"-addcolor" далее индекс нужного цвета, далее RGB цвет:
[r-g-b]
r - красный
g - зеленый
b - синий
» Второй способ
"-addcolor" далее индекс нужного цвета, далее RGB цвет в виде hex:
» Первые 12 цветов
» cJass
define
{
    int = integer
    void = nothing
    bool = boolean
    <else if> = elseif
}

scope setcolor initializer setcolor_Init
{
    private int ColorNumber[]
    private int CharNumber[]
    private string Color[]
    private string ColorNative[]
    private string name[]
    
    private void setcolor_Change()
    {
        string s = GetEventPlayerChatString()
        int i = 10
        int l = StringLength(s)
        int lName = 0
        int move = 0
        int count = 0
        int id = 0
        
        whilenot( i >= l || SubString(s, i, i + 1) == " " ) {i++}
        
        id = S2I(SubString(s, 10, i )) - 1
        
        if( id < 0 || id > 11 )
        {
            return
        }
        
        lName = StringLength(GetPlayerName(Player(id)))
        
        loop
        {
            move = i + 2
            whilenot( i >= l || SubString(s, i, i + 1) == "-" ) {i++}
            ColorNumber[count] = S2I(SubString(s, move, i))
            exitwhen( ColorNumber[count] < 1 || ColorNumber[count] > 8190 )
            
            move = i + 1
            whilenot( i >= l || SubString(s, i, i + 1) == "]" ) {i++}
            CharNumber[count] = S2I(SubString(s, move, i))
            exitwhen( CharNumber[count] < 1 || CharNumber[count] > lName )
            i++
            count++
        }
        count--
        
        s = name[id]
        i = 0
        move = 0
        
        whilenot( i > count )
        {
            s = SubString(s, 0, CharNumber[i] - 1) + Color[ColorNumber[i]] + SubString(s, CharNumber[i] - 1, StringLength(s))
            move = i + 1
            whilenot( move > count )
            {
                if( CharNumber[move] > CharNumber[i] )
                {
                    CharNumber[move] = CharNumber[move] + 10
                }
                move++
            }
            i++
        }
        BJDebugMsg( ColorNative[GetPlayerId(GetTriggerPlayer())+1] + GetPlayerName(GetTriggerPlayer()) + "|r покрасил ник игрока " + ColorNative[id+1] + GetPlayerName(Player(id)) + "|r в " + ColorNative[id+1] + s )
        SetPlayerName(Player(id), s)
    }
    
    private string Dec2Hex(int i)
    {
        string s = ""
        int i_2 = i - (i/16)*16
        i = i/16
        if( i_2 == 10 )
        {
            s = "A" + s
        } else if( i_2 == 11 )
        {
            s = "B" + s
        } else if( i_2 == 12 )
        {
            s = "C" + s
        } else if( i_2 == 13 )
        {
            s = "D" + s
        } else if( i_2 == 14 )
        {
            s = "E" + s
        } else if( i_2 == 15 )
        {
            s = "F" + s
        } else
        {
            s = I2S(i_2) + s
        }
        
        if( i == 10 )
        {
            s = "A" + s
        } else if( i == 11 )
        {
            s = "B" + s
        } else if( i == 12 )
        {
            s = "C" + s
        } else if( i == 13 )
        {
            s = "D" + s
        } else if( i == 14 )
        {
            s = "E" + s
        } else if( i == 15 )
        {
            s = "F" + s
        } else
        {
            s = I2S(i) + s
        }
        return s
    }
    
    private int Hex2Dec(string str)
    {
        int i = 0
        string s = SubString(str, 0, 1)
        if( s == "A" || s == "a"  )
        {
            i = 160
        } else if( s == "B" || s == "b" )
        {
            i = 176
        } else if( s == "C" || s == "c"  )
        {
            i = 192
        } else if( s == "D" || s == "d"  )
        {
            i = 208
        } else if( s == "E" || s == "e"  )
        {
            i = 224
        } else if( s == "F" || s == "f"  )
        {
            i = 240
        } else
        {
            i = S2I(s) * 16
        }
        
        s = SubString(str, 1, 2)
        if( s == "A" )
        {
            return i + 10
        } else if( s == "B" )
        {
            return i + 11
        } else if( s == "C" )
        {
            return i + 12
        } else if( s == "D" )
        {
            return i + 13
        } else if( s == "E" )
        {
            return i + 14
        } else if( s == "F" )
        {
            return i + 15
        } else
        {
            return i + S2I(s)
        }
    }
    
    private void setcolor_Add()
    {
        string s = GetEventPlayerChatString()
        int l = StringLength(s)
        int i = 10
        int id = 0
        int move = 0
        
        whilenot( i >= l || SubString(s, i, i + 1) == " " ) {i++}
        
        id = S2I(SubString(s, 10, i ))
        
        if( id < 1 || id > 8190 )
        {
            return
        }
        
        if( SubString(s, i+1, i+2) != "c")
        {
            move = i + 2
            whilenot( i >= l || SubString(s, i, i + 1) == "-" ) {i++}
            ColorNumber[0] = S2I(SubString(s, move, i))
            if( ColorNumber[0] < 0 || ColorNumber[0] > 255 )
            {
                return
            }
            i++
            
            move = i
            whilenot( i >= l || SubString(s, i, i + 1) == "-" ) {i++}
            ColorNumber[1] = S2I(SubString(s, move, i))
            if( ColorNumber[1] < 0 || ColorNumber[1] > 255 )
            {
                return
            }
            i++
            
            move = i
            whilenot( i >= l || SubString(s, i, i + 1) == "-" ) {i++}
            ColorNumber[2] = S2I(SubString(s, move, i))
            if( ColorNumber[2] < 0 || ColorNumber[2] > 255 )
            {
                return
            }
            
            Color[id] = "|c00" + Dec2Hex(ColorNumber[0]) + Dec2Hex(ColorNumber[1]) + Dec2Hex(ColorNumber[2])
        } else
        {
            l = i
            i = Hex2Dec(SubString(s, l+4, l+6))
            Color[id] = "|c00" + Dec2Hex(i)
            i = Hex2Dec(SubString(s, l+6, l+8))
            Color[id] = Color[id] + Dec2Hex(i)
            i = Hex2Dec(SubString(s, l+8, l+10))
            Color[id] = Color[id] + Dec2Hex(i)
        }
        BJDebugMsg(ColorNative[GetPlayerId(GetTriggerPlayer())+1] + GetPlayerName(GetTriggerPlayer()) + "|r поменял цвет под индексом " + I2S(id) + " на " +  Color[id] + "ЦВЕТ")
    }
    
    private void setcolor_Actions()
    {
        string s = GetEventPlayerChatString()
        if( SubString(s, 0, 10) == "-setcolor " )
        {
            setcolor_Change()
        } else if( SubString(s, 0, 10) == "-addcolor " )
        {
            setcolor_Add()
        }
    }
    
    private void setcolor_Init()
    {
        trigger trg_setcolor = CreateTrigger(  )
        int i = 0
        
        ColorNative[1] = "|c00FF0303"
        ColorNative[2] = "|c000042FF"
        ColorNative[3] = "|c001CE6B9"
        ColorNative[4] = "|c00540081"
        ColorNative[5] = "|c00FFFC01"
        ColorNative[6] = "|c00fEBA0E"
        ColorNative[7] = "|c0020C000"
        ColorNative[8] = "|c00E55BB0"
        ColorNative[9] = "|c00959697"
        ColorNative[10] = "|c007EBFF1"
        ColorNative[11] = "|c00106246"
        ColorNative[12] = "|c004E2A04"
        
        Color[1] = "|c00FF0303"
        Color[2] = "|c000042FF"
        Color[3] = "|c001CE6B9"
        Color[4] = "|c00540081"
        Color[5] = "|c00FFFC01"
        Color[6] = "|c00fEBA0E"
        Color[7] = "|c0020C000"
        Color[8] = "|c00E55BB0"
        Color[9] = "|c00959697"
        Color[10] = "|c007EBFF1"
        Color[11] = "|c00106246"
        Color[12] = "|c004E2A04"
        
        whilenot( i >= 12 )
        {
            name[i] = GetPlayerName(Player(i))
            i++
        }
        
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(0), "", true )
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(1), "", true )
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(2), "", true )
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(3), "", true )
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(4), "", true )
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(5), "", true )
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(6), "", true )
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(7), "", true )
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(8), "", true )
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(9), "", true )
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(10), "", true )
        TriggerRegisterPlayerChatEvent( trg_setcolor, Player(11), "", true )
        TriggerAddAction( trg_setcolor, function setcolor_Actions )
    }
}


Просмотров: 1 248

» Лучшие комментарии


Diaboliko #1 - 1 год назад 0
Забавно, но едва ли юзабельно :)
Hodor #2 - 1 год назад 0
Diaboliko
был ещё вариант, чтобы задавался новый ник и сразу красился, что то типа "-setcolor 1 WorldEdit123 [1-1] [2-2] [3-3] [4-4]"
16GB #3 - 1 год назад 6
Делайте версии и на обычном jass. Не все юзают c/vJass.
PT153 #4 - 1 год назад 0
        ColorNative[1] = "|c00FF0303"
        ColorNative[2] = "|c000042FF"
        ColorNative[3] = "|c001CE6B9"
        ColorNative[4] = "|c00540081"
        ColorNative[5] = "|c00FFFC01"
        ColorNative[6] = "|c00fEBA0E"
        ColorNative[7] = "|c0020C000"
        ColorNative[8] = "|c00E55BB0"
        ColorNative[9] = "|c00959697"
        ColorNative[10] = "|c007EBFF1"
        ColorNative[11] = "|c00106246"
        ColorNative[12] = "|c004E2A04"
Откуда взяты именно эти цветовые коды? В WE используются другие (Scenario -> Map Options -> Use Water Tinting Color; File -> Preferences -> Test Colors).
8gabriel8 #5 - 1 год назад 0
Если сделать скрин экрана редактора со свойствами игроков, а потом в пейнте определить цвет, то как раз такие получаются.
PT153 #6 - 1 год назад 0
Если сделать скрин экрана редактора со свойствами игроков, а потом в пейнте определить цвет, то как раз такие получаются.
А, тогда ясно. Не теряется ли при этом качество?

Когда я делал покраску цвета в ник, использовал цвета из WE. Где их найти, я уже писал.
Scenario -> Map Options -> Use Water Tinting Color; File -> Preferences -> Test Colors
Hodor #7 - 1 год назад (отредактировано ) 0
PT153:
Где их найти, я уже писал.
Scenario -> Map Options -> Use Water Tinting Color; File -> Preferences -> Test Colors
как думаешь откуда они там взялись? Вдруг там просто подогнали на глаз)
» Ещё был алгоритм, который мог делать подобное с ником в мультиборде:
Темные оттенки на скриншоте плавно передвигались по строке в любом направлении (как было задано в конфиге)
И когда темные оттенки удалялись, они могли заменяться другими и даже мог меняться фоновый цвет
Вообще можно бесконечно перечислять то что мог делать алгоритм, т.к там конфиг был ну просто огромный, там могли меняться очень много оттенков (оттенки генерировались алгоритмом и вносились в массив) и движение могло быть в любые стороны и даже "разбивание" с центра или наоборот "столкновение" оттенков
В том числе можно было регулировать скорость и ширину оттенка на фоновом цвете
Помню даже делал возможность совмещать несколько видов оттенков на одном фоновом цвете
Жаль конечно, я потерял этот алгоритм, но приблизительно помню как он работал
прикреплены файлы
PT153 #8 - 1 год назад 0
как думаешь откуда они там взялись? Вдруг там просто подогнали на глаз)
Не понял. Там сразу с RGB кодом цвет показывается.
Hodor #9 - 1 год назад 0
PT153:
Не понял. Там сразу с RGB кодом цвет показывается.
это в JNGP?
PT153 #10 - 1 год назад (отредактировано ) 0
это в JNGP?
В обычном.
Странно было, подумать, что это только в JNPG. Менять цвет воды и текста можно и в обычном редакторе.
Hodor #11 - 1 год назад (отредактировано ) 0
» об этих цветах идет речь?
Если да, то A - это 1 вариант синего, B - 2 вариант синего, а C - это ColorNative.
На вид и в paint, цвет ника WorldEdit и цвет "C" совпадают
прикреплены файлы
Нернер Волчий Во #12 - 7 месяцев назад 0
а можешь состряпать код для рпг чтоб в дом можно было войти, но и сломать его тоже можно было, пж кто может помогите!