Показано с 1 по 9 из 9

Тема: [ALL] Кодовый замок (алгоритм)

  1. #1
    Активный пользователь Аватар для LMapper
    Регистрация
    01.04.2011
    Адрес
    != true
    Сообщений
    991
    Репутация: 91

    Звание: скоро придёт к известности

    [ALL] Кодовый замок (алгоритм)


    Описание
    Выкладываю саморучно-написанный код простенького кодового замка.
    В коде реализован только сам алгоритм работы замка, по этой причине
    оформление замка - очень простенькое.



    Принцип работы
    Игрок замораживается, появляются текстдравы.
    Комбинация на замке вводиться клавишами:
    Ctrl (KEY_FIRE) <
    Alt (KEY_WALK) >
    Y (KEY_YES) Подняться выше
    N (KEY_NO) Опуститься ниже
    Shift (KEY_JUMP) Применить
    После нажатия клавиши (Shift) - игрок размораживается,
    и в зависимости от того, ввёл ли он верную комбинацию -
    появляется надпись Открыто/Закрыто


    Важно
    Код не готов для вставки в мод в том виде, в каком он здесь представлен.
    Я постарался лишь описать, и показать вам алгоритм, а вы уже можете на его основе
    делать необходимые вам решения.



    Код


    PHP код:
    new bool:InLock[MAX_PLAYERS];
    new 
    level;
    new 
    key[3];

    new 
    Text:Background;
    new 
    Text:ArrowTopRight;
    new 
    Text:ArrowTopLeft;
    new 
    Text:keyTD[3];
    new 
    Text:Letters;
    new 
    Text:ArrowMiddleRight;
    new 
    Text:ArrowMiddleLeft;
    new 
    Text:ArrowBottomRight;
    new 
    Text:ArrowBottomLeft;

    forward ThrowLock(playerid); 



    PHP код:
    ThrowLock(playerid)
    {
        
    InLock[playerid] = true// Игрок взаимодействует с замком
        
    level 1// "Обнуляем переменные"
        
    key[0] = 0// "Обнуляем переменные"
        
    key[1] = 0// "Обнуляем переменные"
        
    key[2] = 0// "Обнуляем переменные"
         
    TogglePlayerControllable(playerid,0); // Замораживаем игрока

            
    Background TextDrawCreate(360.000000180.000000"           ");
        
    TextDrawBackgroundColor(Background255);
        
    TextDrawFont(Background1);
        
    TextDrawLetterSize(Background0.5000001.000000);
        
    TextDrawColor(Background, -1);
        
    TextDrawSetOutline(Background0);
        
    TextDrawSetProportional(Background1);
        
    TextDrawSetShadow(Background1);
        
    TextDrawUseBox(Background1);
        
    TextDrawBoxColor(Background255);
        
    TextDrawTextSize(Background273.0000007.000000);

        
    ArrowTopRight TextDrawCreate(357.000000186.000000">");
        
    TextDrawBackgroundColor(ArrowTopRight255);
        
    TextDrawFont(ArrowTopRight1);
        
    TextDrawLetterSize(ArrowTopRight0.6500001.800000);
        
    TextDrawColor(ArrowTopRight, -1);
        
    TextDrawSetOutline(ArrowTopRight1);
        
    TextDrawSetProportional(ArrowTopRight1);

        
    ArrowTopLeft TextDrawCreate(260.000000186.000000"<");
        
    TextDrawBackgroundColor(ArrowTopLeft255);
        
    TextDrawFont(ArrowTopLeft1);
        
    TextDrawLetterSize(ArrowTopLeft0.6500001.800000);
        
    TextDrawColor(ArrowTopLeft, -1);
        
    TextDrawSetOutline(ArrowTopLeft1);
        
    TextDrawSetProportional(ArrowTopLeft1);
        
        
    ArrowMiddleRight TextDrawCreate(357.000000216.000000">");
        
    TextDrawBackgroundColor(ArrowMiddleRight255);
        
    TextDrawFont(ArrowMiddleRight1);
        
    TextDrawLetterSize(ArrowMiddleRight0.6500001.800000);
        
    TextDrawColor(ArrowMiddleRight, -1);
        
    TextDrawSetOutline(ArrowMiddleRight1);
        
    TextDrawSetProportional(ArrowMiddleRight1);
        
        
    ArrowMiddleLeft TextDrawCreate(260.000000216.000000"<");
        
    TextDrawBackgroundColor(ArrowMiddleLeft255);
        
    TextDrawFont(ArrowMiddleLeft1);
        
    TextDrawLetterSize(ArrowMiddleLeft0.6500001.800000);
        
    TextDrawColor(ArrowMiddleLeft, -1);
        
    TextDrawSetOutline(ArrowMiddleLeft1);
        
    TextDrawSetProportional(ArrowMiddleLeft1);
        
        
    ArrowBottomRight TextDrawCreate(357.000000246.000000">");
        
    TextDrawBackgroundColor(ArrowBottomRight255);
        
    TextDrawFont(ArrowBottomRight1);
        
    TextDrawLetterSize(ArrowBottomRight0.6500001.800000);
        
    TextDrawColor(ArrowBottomRight, -1);
        
    TextDrawSetOutline(ArrowBottomRight1);
        
    TextDrawSetProportional(ArrowBottomRight1);
        
        
    ArrowBottomLeft TextDrawCreate(260.000000246.000000"<");
        
    TextDrawBackgroundColor(ArrowBottomLeft255);
        
    TextDrawFont(ArrowBottomLeft1);
        
    TextDrawLetterSize(ArrowBottomLeft0.6500001.800000);
        
    TextDrawColor(ArrowBottomLeft, -1);
        
    TextDrawSetOutline(ArrowBottomLeft1);
        
    TextDrawSetProportional(ArrowBottomLeft1);

        
    keyTD[0] = TextDrawCreate(309.000000179.000000"0");
        
    TextDrawBackgroundColor(keyTD[0], 255);
        
    TextDrawFont(keyTD[0], 3);
        
    TextDrawLetterSize(keyTD[0], 0.9000013.000000);
        
    TextDrawColor(keyTD[0], -1);
        
    TextDrawSetOutline(keyTD[0], 0);
        
    TextDrawSetProportional(keyTD[0], 1);
        
    TextDrawSetShadow(keyTD[0], 1);

        
    keyTD[1] = TextDrawCreate(309.000000209.000000"0");
        
    TextDrawBackgroundColor(keyTD[1], 255);
        
    TextDrawFont(keyTD[1], 3);
        
    TextDrawLetterSize(keyTD[1], 0.9000013.000000);
        
    TextDrawColor(keyTD[1], -1);
        
    TextDrawSetOutline(keyTD[1], 0);
        
    TextDrawSetProportional(keyTD[1], 1);
        
    TextDrawSetShadow(keyTD[1], 1);

        
    keyTD[2] = TextDrawCreate(309.000000239.000000"0");
        
    TextDrawBackgroundColor(keyTD[2], 255);
        
    TextDrawFont(keyTD[2], 3);
        
    TextDrawLetterSize(keyTD[2], 0.9000013.000000);
        
    TextDrawColor(keyTD[2], -1);
        
    TextDrawSetOutline(keyTD[2], 0);
        
    TextDrawSetProportional(keyTD[2], 1);
        
    TextDrawSetShadow(keyTD[2], 1);

        
    Letters TextDrawCreate(305.000000163.000000"LOCK");
        
    TextDrawBackgroundColor(Letters255);
        
    TextDrawFont(Letters3);
        
    TextDrawLetterSize(Letters0.7000002.000000);
        
    TextDrawColor(Letters, -16776961);
        
    TextDrawSetOutline(Letters0);
        
    TextDrawSetProportional(Letters1);
        
    TextDrawSetShadow(Letters1);
        
        
    TextDrawShowForPlayer(playeridBackground);
        
    TextDrawShowForPlayer(playeridArrowTopRight);
        
    TextDrawShowForPlayer(playeridArrowTopLeft);
        
    TextDrawShowForPlayer(playeridkeyTD[0]);
        
    TextDrawShowForPlayer(playeridkeyTD[1]);
        
    TextDrawShowForPlayer(playeridkeyTD[2]);
        
    TextDrawShowForPlayer(playeridLetters);



    PHP код:
    if (newkeys KEY_FIRE// Ctrl (Переключение цифры)
        
    {
            if (
    InLock[playerid] == true// Игрок взаимодействует с замком ?
            
    {

                if(
    key[level] == 9key[level] = 0// Если цифра на уровне = 9, то после нее будет следовать "0"
                
    else key[level]++; // Прибавляем единичку
                
    new str[4]; // Создаем строку
                
    valstr(str,key[level]); // Преобразуем цифру в строку
                 
    TextDrawSetString(keyTD[level],str); // И выводим новою цифру
                 
    TextDrawHideForPlayer(playeridkeyTD[level]); // Обновняем
                
    TextDrawShowForPlayer(playeridkeyTD[level]);
            }
        }
        if (
    newkeys KEY_WALK)
        {
            if (
    InLock[playerid] == true)
            {
                if(
    key[level] == 0key[level] = 9;
                else 
    key[level] = key[level] -1;
                new 
    str[4];
                
    valstr(str,key[level]);
                 
    TextDrawSetString(keyTD[level],str);
                 
    TextDrawHideForPlayer(playeridkeyTD[level]);
                
    TextDrawShowForPlayer(playeridkeyTD[level]);
            }
        }
        if (
    newkeys KEY_NO// N (Опуститься на уровень ниже)
        
    {
            if (
    InLock[playerid] == true// Игрок взаимодействует с замком ?
            
    {
                switch(
    level)// С каким уровнем замка взаимодействует игрок ?
                
    {
                    case 
    1// Если первый - то показываем игроку стрелки второго уровня, и записываем, что он на втором уровне замка
                    
    {
                        
    TextDrawHideForPlayer(playeridArrowTopRight);
                        
    TextDrawHideForPlayer(playeridArrowTopLeft);
                        
    TextDrawShowForPlayer(playeridArrowMiddleRight);
                        
    TextDrawShowForPlayer(playeridArrowMiddleLeft);
                        
    level 2;
                    }
                    case 
    2// Аналогично
                       
    {
                           
    TextDrawHideForPlayer(playeridArrowMiddleRight);
                        
    TextDrawHideForPlayer(playeridArrowMiddleLeft);
                        
    TextDrawShowForPlayer(playeridArrowBottomRight);
                        
    TextDrawShowForPlayer(playeridArrowBottomLeft);
                        
    level 3;
                    }
    // Если игрок на третьем уровне - игнорируем. Дальше спуститься не возможно.
                
    }
            }
        }
        if (
    newkeys KEY_YES)
        {
            if (
    InLock[playerid] == true)
            {
                switch(
    level)
                {
                    case 
    2:
                    {
                        
    TextDrawHideForPlayer(playeridArrowMiddleRight);
                        
    TextDrawHideForPlayer(playeridArrowMiddleLeft);
                        
    TextDrawShowForPlayer(playeridArrowTopRight);
                        
    TextDrawShowForPlayer(playeridArrowTopLeft);
                        
    level 1;
                    }
                    case 
    3:
                       {
                           
    TextDrawHideForPlayer(playeridArrowBottomRight);
                        
    TextDrawHideForPlayer(playeridArrowBottomLeft);
                        
    TextDrawShowForPlayer(playeridArrowMiddleRight);
                        
    TextDrawShowForPlayer(playeridArrowMiddleLeft);
                        
    level 2;
                    }
                }
            }
        }
        if (
    newkeys KEY_JUMP// Shift (Проверка кода)
        
    {
            if (
    InLock[playerid] == true// Игрок взаимодействует с замком ?
            
    {
                if((
    key[0] == 0) && (key[1] == 6) && (key[2] == 9)) // Комбинация "069" ? (По умолчанию)
                
    {
                    
    TextDrawHideForPlayer(playeridBackground);
                    
    TextDrawHideForPlayer(playeridArrowTopRight);
                    
    TextDrawHideForPlayer(playeridArrowTopLeft);
                    
    TextDrawHideForPlayer(playeridArrowMiddleRight);
                    
    TextDrawHideForPlayer(playeridArrowMiddleLeft);
                    
    TextDrawHideForPlayer(playeridArrowBottomRight);
                    
    TextDrawHideForPlayer(playeridArrowBottomLeft);
                    
    TextDrawHideForPlayer(playeridkeyTD[0]);
                    
    TextDrawHideForPlayer(playeridkeyTD[1]);
                    
    TextDrawHideForPlayer(playeridkeyTD[2]);
                    
    TextDrawHideForPlayer(playeridLetters);
                    
    TogglePlayerControllable(playerid,1);
                    
    GameTextForPlayer(playerid"~g~Unlocked"15005);
                    
    InLock[playerid] = false;
                    
    // Убираем все текстдравы, размораживаем игрока, записываем что он больше не
                    // взаимодействует с замком, и в качестве примера - выводим ему надпись, что замок открыт.
                
    }
                else
                {
                    
    TextDrawHideForPlayer(playeridBackground);
                    
    TextDrawHideForPlayer(playeridArrowTopRight);
                    
    TextDrawHideForPlayer(playeridArrowTopLeft);
                    
    TextDrawHideForPlayer(playeridArrowMiddleRight);
                    
    TextDrawHideForPlayer(playeridArrowMiddleLeft);
                    
    TextDrawHideForPlayer(playeridArrowBottomRight);
                    
    TextDrawHideForPlayer(playeridArrowBottomLeft);
                    
    TextDrawHideForPlayer(playeridkeyTD[0]);
                    
    TextDrawHideForPlayer(playeridkeyTD[1]);
                    
    TextDrawHideForPlayer(playeridkeyTD[2]);
                    
    TextDrawHideForPlayer(playeridLetters);
                    
    TogglePlayerControllable(playerid,1);
                    
    GameTextForPlayer(playerid"~r~Locked"15005);
                    
    InLock[playerid] = false;
                    
    // Аналогично, только пишем, что замок по прежнему закрыт.
                
    }
            }
        } 



    PHP код:
    new bool:InLock[MAX_PLAYERS];
    new 
    level;
    new 
    TopNumber;
    new 
    MiddleNumber;
    new 
    BottomNumber;

    new 
    Text:Background;
    new 
    Text:ArrowTopRight;
    new 
    Text:ArrowTopLeft;
    new 
    Text:Top;
    new 
    Text:Middle;
    new 
    Text:Bottom;
    new 
    Text:Letters;
    new 
    Text:ArrowMiddleRight;
    new 
    Text:ArrowMiddleLeft;
    new 
    Text:ArrowBottomRight;
    new 
    Text:ArrowBottomLeft;

    forward ThrowLock(playerid); 



    PHP код:
    ThrowLock(playerid)
    {
        
    InLock[playerid] = true// Игрок взаимодействует с замком
        
    level 1// "Обнуляем переменные"
        
    TopNumber 0// "Обнуляем переменные"
        
    MiddleNumber 0// "Обнуляем переменные"
        
    BottomNumber 0// "Обнуляем переменные"
         
    TogglePlayerControllable(playerid,0); // Замораживаем игрока

            
    Background TextDrawCreate(360.000000180.000000"           ");
        
    TextDrawBackgroundColor(Background255);
        
    TextDrawFont(Background1);
        
    TextDrawLetterSize(Background0.5000001.000000);
        
    TextDrawColor(Background, -1);
        
    TextDrawSetOutline(Background0);
        
    TextDrawSetProportional(Background1);
        
    TextDrawSetShadow(Background1);
        
    TextDrawUseBox(Background1);
        
    TextDrawBoxColor(Background255);
        
    TextDrawTextSize(Background273.0000007.000000);

        
    ArrowTopRight TextDrawCreate(357.000000186.000000">");
        
    TextDrawBackgroundColor(ArrowTopRight255);
        
    TextDrawFont(ArrowTopRight1);
        
    TextDrawLetterSize(ArrowTopRight0.6500001.800000);
        
    TextDrawColor(ArrowTopRight, -1);
        
    TextDrawSetOutline(ArrowTopRight1);
        
    TextDrawSetProportional(ArrowTopRight1);

        
    ArrowTopLeft TextDrawCreate(260.000000186.000000"<");
        
    TextDrawBackgroundColor(ArrowTopLeft255);
        
    TextDrawFont(ArrowTopLeft1);
        
    TextDrawLetterSize(ArrowTopLeft0.6500001.800000);
        
    TextDrawColor(ArrowTopLeft, -1);
        
    TextDrawSetOutline(ArrowTopLeft1);
        
    TextDrawSetProportional(ArrowTopLeft1);
        
        
    ArrowMiddleRight TextDrawCreate(357.000000216.000000">");
        
    TextDrawBackgroundColor(ArrowMiddleRight255);
        
    TextDrawFont(ArrowMiddleRight1);
        
    TextDrawLetterSize(ArrowMiddleRight0.6500001.800000);
        
    TextDrawColor(ArrowMiddleRight, -1);
        
    TextDrawSetOutline(ArrowMiddleRight1);
        
    TextDrawSetProportional(ArrowMiddleRight1);
        
        
    ArrowMiddleLeft TextDrawCreate(260.000000216.000000"<");
        
    TextDrawBackgroundColor(ArrowMiddleLeft255);
        
    TextDrawFont(ArrowMiddleLeft1);
        
    TextDrawLetterSize(ArrowMiddleLeft0.6500001.800000);
        
    TextDrawColor(ArrowMiddleLeft, -1);
        
    TextDrawSetOutline(ArrowMiddleLeft1);
        
    TextDrawSetProportional(ArrowMiddleLeft1);
        
        
    ArrowBottomRight TextDrawCreate(357.000000246.000000">");
        
    TextDrawBackgroundColor(ArrowBottomRight255);
        
    TextDrawFont(ArrowBottomRight1);
        
    TextDrawLetterSize(ArrowBottomRight0.6500001.800000);
        
    TextDrawColor(ArrowBottomRight, -1);
        
    TextDrawSetOutline(ArrowBottomRight1);
        
    TextDrawSetProportional(ArrowBottomRight1);
        
        
    ArrowBottomLeft TextDrawCreate(260.000000246.000000"<");
        
    TextDrawBackgroundColor(ArrowBottomLeft255);
        
    TextDrawFont(ArrowBottomLeft1);
        
    TextDrawLetterSize(ArrowBottomLeft0.6500001.800000);
        
    TextDrawColor(ArrowBottomLeft, -1);
        
    TextDrawSetOutline(ArrowBottomLeft1);
        
    TextDrawSetProportional(ArrowBottomLeft1);

        
    Top TextDrawCreate(309.000000179.000000"0");
        
    TextDrawBackgroundColor(Top255);
        
    TextDrawFont(Top3);
        
    TextDrawLetterSize(Top0.9000013.000000);
        
    TextDrawColor(Top, -1);
        
    TextDrawSetOutline(Top0);
        
    TextDrawSetProportional(Top1);
        
    TextDrawSetShadow(Top1);

        
    Middle TextDrawCreate(309.000000209.000000"0");
        
    TextDrawBackgroundColor(Middle255);
        
    TextDrawFont(Middle3);
        
    TextDrawLetterSize(Middle0.9000013.000000);
        
    TextDrawColor(Middle, -1);
        
    TextDrawSetOutline(Middle0);
        
    TextDrawSetProportional(Middle1);
        
    TextDrawSetShadow(Middle1);

        
    Bottom TextDrawCreate(309.000000239.000000"0");
        
    TextDrawBackgroundColor(Bottom255);
        
    TextDrawFont(Bottom3);
        
    TextDrawLetterSize(Bottom0.9000013.000000);
        
    TextDrawColor(Bottom, -1);
        
    TextDrawSetOutline(Bottom0);
        
    TextDrawSetProportional(Bottom1);
        
    TextDrawSetShadow(Bottom1);

        
    Letters TextDrawCreate(305.000000163.000000"LOCK");
        
    TextDrawBackgroundColor(Letters255);
        
    TextDrawFont(Letters3);
        
    TextDrawLetterSize(Letters0.7000002.000000);
        
    TextDrawColor(Letters, -16776961);
        
    TextDrawSetOutline(Letters0);
        
    TextDrawSetProportional(Letters1);
        
    TextDrawSetShadow(Letters1);
        
        
    TextDrawShowForPlayer(playeridBackground);
        
    TextDrawShowForPlayer(playeridArrowTopRight);
        
    TextDrawShowForPlayer(playeridArrowTopLeft);
        
    TextDrawShowForPlayer(playeridTop);
        
    TextDrawShowForPlayer(playeridMiddle);
        
    TextDrawShowForPlayer(playeridBottom);
        
    TextDrawShowForPlayer(playeridLetters);



    PHP код:
        if (newkeys KEY_FIRE// Ctrl (Переключение цифры)
        
    {
            if (
    InLock[playerid] == true// Игрок взаимодействует с замком ?
            
    {
                switch(
    level// С каким уровнем замка взаимодействует игрок ?
                
    {
                       case 
    1:
                    {
                        if(
    TopNumber == 9TopNumber 0// Если цифра на уровне = 9, то после нее будет следовать "0"
                        
    else TopNumber++; // Прибавляем единичку
                        
    new str[4]; // Создаем строку
                        
    valstr(str,TopNumber); // Преобразуем цифру в строку
                         
    TextDrawSetString(Top,str); // И выводим новою цифру
                         
    TextDrawHideForPlayer(playeridTop); // Обновняем
                        
    TextDrawShowForPlayer(playeridTop);
                    }
                    case 
    2:
                      {
                        if(
    MiddleNumber == 9MiddleNumber 0;
                        else 
    MiddleNumber++;
                        new 
    str[4];
                        
    valstr(str,MiddleNumber);
                         
    TextDrawSetString(Middle,str);
                         
    TextDrawHideForPlayer(playeridMiddle);
                        
    TextDrawShowForPlayer(playeridMiddle);
                    }
                    case 
    3:
                      {
                        if(
    BottomNumber == 9BottomNumber 0;
                        else 
    BottomNumber++;
                        new 
    str[4];
                        
    valstr(str,BottomNumber);
                         
    TextDrawSetString(Bottom,str);
                         
    TextDrawHideForPlayer(playeridBottom);
                        
    TextDrawShowForPlayer(playeridBottom);
                    }
                }
            }
        }
        if (
    newkeys KEY_WALK)
        {
            if (
    InLock[playerid] == true)
            {
                switch(
    level)
                {
                       case 
    1:
                    {
                        if(
    TopNumber == 0TopNumber 9;
                        else 
    TopNumber TopNumber -1;
                        new 
    str[4];
                        
    valstr(str,TopNumber);
                         
    TextDrawSetString(Top,str);
                         
    TextDrawHideForPlayer(playeridTop);
                        
    TextDrawShowForPlayer(playeridTop);

                    }
                    case 
    2:
                      {
                        if(
    MiddleNumber == 0MiddleNumber 9;
                        else 
    MiddleNumber MiddleNumber -1;
                        new 
    str[4];
                        
    valstr(str,MiddleNumber);
                         
    TextDrawSetString(Middle,str);
                         
    TextDrawHideForPlayer(playeridMiddle);
                        
    TextDrawShowForPlayer(playeridMiddle);
                    }
                    case 
    3:
                      {
                        if(
    BottomNumber == 0BottomNumber 9;
                        else 
    BottomNumber BottomNumber -1;
                        new 
    str[4];
                        
    valstr(str,BottomNumber);
                         
    TextDrawSetString(Bottom,str);
                         
    TextDrawHideForPlayer(playeridBottom);
                        
    TextDrawShowForPlayer(playeridBottom);
                    }
                }
            }
        }
        if (
    newkeys KEY_NO// N (Опуститься на уровень ниже)
        
    {
            if (
    InLock[playerid] == true// Игрок взаимодействует с замком ?
            
    {
                switch(
    level)// С каким уровнем замка взаимодействует игрок ?
                
    {
                    case 
    1// Если первый - то показываем игроку стрелки второго уровня, и записываем, что он на втором уровне замка
                    
    {
                        
    TextDrawHideForPlayer(playeridArrowTopRight);
                        
    TextDrawHideForPlayer(playeridArrowTopLeft);
                        
    TextDrawShowForPlayer(playeridArrowMiddleRight);
                        
    TextDrawShowForPlayer(playeridArrowMiddleLeft);
                        
    level 2;
                    }
                    case 
    2// Аналогично
                       
    {
                           
    TextDrawHideForPlayer(playeridArrowMiddleRight);
                        
    TextDrawHideForPlayer(playeridArrowMiddleLeft);
                        
    TextDrawShowForPlayer(playeridArrowBottomRight);
                        
    TextDrawShowForPlayer(playeridArrowBottomLeft);
                        
    level 3;
                    }
    // Если игрок на третьем уровне - игнорируем. Дальше спуститься не возможно.
                
    }
            }
        }
        if (
    newkeys KEY_YES)
        {
            if (
    InLock[playerid] == true)
            {
                switch(
    level)
                {
                    case 
    2:
                    {
                        
    TextDrawHideForPlayer(playeridArrowMiddleRight);
                        
    TextDrawHideForPlayer(playeridArrowMiddleLeft);
                        
    TextDrawShowForPlayer(playeridArrowTopRight);
                        
    TextDrawShowForPlayer(playeridArrowTopLeft);
                        
    level 1;
                    }
                    case 
    3:
                       {
                           
    TextDrawHideForPlayer(playeridArrowBottomRight);
                        
    TextDrawHideForPlayer(playeridArrowBottomLeft);
                        
    TextDrawShowForPlayer(playeridArrowMiddleRight);
                        
    TextDrawShowForPlayer(playeridArrowMiddleLeft);
                        
    level 2;
                    }
                }
            }
        }
        if (
    newkeys KEY_JUMP// Shift (Проверка кода)
        
    {
            if (
    InLock[playerid] == true// Игрок взаимодействует с замком ?
            
    {
                if((
    TopNumber == 0) && (MiddleNumber == 6) && (BottomNumber == 9)) // Комбинация "069" ? (По умолчанию)
                
    {
                    
    TextDrawHideForPlayer(playeridBackground);
                    
    TextDrawHideForPlayer(playeridArrowTopRight);
                    
    TextDrawHideForPlayer(playeridArrowTopLeft);
                    
    TextDrawHideForPlayer(playeridArrowMiddleRight);
                    
    TextDrawHideForPlayer(playeridArrowMiddleLeft);
                    
    TextDrawHideForPlayer(playeridArrowBottomRight);
                    
    TextDrawHideForPlayer(playeridArrowBottomLeft);
                    
    TextDrawHideForPlayer(playeridTop);
                    
    TextDrawHideForPlayer(playeridMiddle);
                    
    TextDrawHideForPlayer(playeridBottom);
                    
    TextDrawHideForPlayer(playeridLetters);
                    
    TogglePlayerControllable(playerid,1);
                    
    GameTextForPlayer(playerid"~g~Unlocked"15005);
                    
    InLock[playerid] = false;
                    
    // Убираем все текстдравы, размораживаем игрока, записываем что он больше не
                    // взаимодействует с замком, и в качестве примера - выводим ему надпись, что замок открыт.
                
    }
                else
                {
                    
    TextDrawHideForPlayer(playeridBackground);
                    
    TextDrawHideForPlayer(playeridArrowTopRight);
                    
    TextDrawHideForPlayer(playeridArrowTopLeft);
                    
    TextDrawHideForPlayer(playeridArrowMiddleRight);
                    
    TextDrawHideForPlayer(playeridArrowMiddleLeft);
                    
    TextDrawHideForPlayer(playeridArrowBottomRight);
                    
    TextDrawHideForPlayer(playeridArrowBottomLeft);
                    
    TextDrawHideForPlayer(playeridTop);
                    
    TextDrawHideForPlayer(playeridMiddle);
                    
    TextDrawHideForPlayer(playeridBottom);
                    
    TextDrawHideForPlayer(playeridLetters);
                    
    TogglePlayerControllable(playerid,1);
                    
    GameTextForPlayer(playerid"~r~Locked"15005);
                    
    InLock[playerid] = false;
                    
    // Аналогично, только пишем, что замок по прежнему закрыт.
                
    }
            }
        }
        return 
    1;





    Тестируем

    Для вызова функции отображения замка игроку используем:
    PHP код:
    ThrowLock(playerid); 
    Пример:
    PHP код:
    public OnPlayerStateChange(playeridnewstateoldstate)
    {
        if(
    newstate == PLAYER_STATE_DRIVER)
        {
            
    ThrowLock(playerid);
            }
            return 
    1;

    Опять-же напомню, что это лишь пример алгоритма. Замок просто появляется, и выводит различные надписи, в зависимости от правильности введёного игроком комбинация (по умолчанию верная комбинация: 069).
    Автор: LMapper
    Pawn,Sourcepawn,ArmA.
    Delphi,Pascal,etc..
    Досье:
    ...У ДЦ были проблемы с электроснабжением, никак не связанные с тем, что я играю в лол....
    С уважением,
    Команда Ru-hoster
    Психически не устойчив, на таблетках.

  2. 1 пользователь сказал cпасибо LMapper за это полезное сообщение:

    Yung Lean (17.02.2015)

  3. #2
    Активный пользователь Аватар для LMapper
    Регистрация
    01.04.2011
    Адрес
    != true
    Сообщений
    991
    Репутация: 91

    Звание: скоро придёт к известности

    Re: [ALL] Кодовый замок (алгоритм)

    Критика/предложения по оптимизации, господа ?
    Pawn,Sourcepawn,ArmA.
    Delphi,Pascal,etc..
    Досье:
    ...У ДЦ были проблемы с электроснабжением, никак не связанные с тем, что я играю в лол....
    С уважением,
    Команда Ru-hoster
    Психически не устойчив, на таблетках.

  4. #3
    Ясно, понятно. Аватар для Jekazzz
    Регистрация
    08.01.2011
    Сообщений
    1,830
    Репутация: 188

    Звание: - весьма и весьма положительная личность

    Re: [ALL] Кодовый замок (алгоритм)

    Используй массивы вместо кучи переменных.
    Top, Middle и Bottom можно заменить на Key[0], Key[1] и Key[2] соответственно. Тогда можно не свитчить, используя Key[level]

  5. 1 пользователь сказал cпасибо Jekazzz за это полезное сообщение:

    LMapper (01.02.2015)

  6. #4
    Активный пользователь Аватар для LMapper
    Регистрация
    01.04.2011
    Адрес
    != true
    Сообщений
    991
    Репутация: 91

    Звание: скоро придёт к известности

    Re: [ALL] Кодовый замок (алгоритм)

    Цитата Сообщение от Jekazzz Посмотреть сообщение
    Используй массивы вместо кучи переменных.
    Top, Middle и Bottom можно заменить на Key[0], Key[1] и Key[2] соответственно. Тогда можно не свитчить, используя Key[level]
    Спасибо, обновил код.
    Pawn,Sourcepawn,ArmA.
    Delphi,Pascal,etc..
    Досье:
    ...У ДЦ были проблемы с электроснабжением, никак не связанные с тем, что я играю в лол....
    С уважением,
    Команда Ru-hoster
    Психически не устойчив, на таблетках.

  7. #5
    Ясно, понятно. Аватар для Jekazzz
    Регистрация
    08.01.2011
    Сообщений
    1,830
    Репутация: 188

    Звание: - весьма и весьма положительная личность

    Re: [ALL] Кодовый замок (алгоритм)

    Примерно это я имел ввиду:


    #include <a_samp>


    new bool:InLock[MAX_PLAYERS];
    new level[MAX_PLAYERS];
    new key[MAX_PLAYERS][3];


    new Text:Background;
    new Text:keyTD[3];
    new Text:ArrowRight[3];
    new Text:ArrowLeft[3];
    new Text:Letters;


    new const keyPswrd[4] = "069"; // Пароль (ровно 3 цифры)


    public OnGameModeInit()
    {
    Background = TextDrawCreate(360.000000, 180.000000, " ");
    TextDrawLetterSize(Background, 0.500000, 1.000000);
    TextDrawUseBox(Background, 1);
    TextDrawBoxColor(Background, 255);
    TextDrawTextSize(Background, 273.000000, 7.000000);


    Letters = TextDrawCreate(305.000000, 163.000000, "LOCK");
    TextDrawBackgroundColor(Letters, 255);
    TextDrawFont(Letters, 3);
    TextDrawLetterSize(Letters, 0.700000, 2.000000);
    TextDrawColor(Letters, -16776961);
    TextDrawSetOutline(Letters, 0);
    TextDrawSetProportional(Letters, 1);
    TextDrawSetShadow(Letters, 1);


    new Float:awY[] = { 186.0, 216.0, 246.0 };
    new Float:keyY[] = { 179.0, 209.0, 239.0 };


    for( new i = 0; i < 3; i ++ ) {
    ArrowLeft[i] = TextDrawCreate(260.0, awY[i], "<");
    TextDrawBackgroundColor(ArrowLeft[i], 255);
    TextDrawFont(ArrowLeft[i], 1);
    TextDrawLetterSize(ArrowLeft[i], 0.65, 1.8);
    TextDrawColor(ArrowLeft[i], -1);
    TextDrawSetOutline(ArrowLeft[i], 1);
    TextDrawSetProportional(ArrowLeft[i], 1);


    ArrowRight[i] = TextDrawCreate(357.0, awY[i], ">");
    TextDrawBackgroundColor(ArrowRight[i], 255);
    TextDrawFont(ArrowRight[i], 1);
    TextDrawLetterSize(ArrowRight[i], 0.65, 1.8);
    TextDrawColor(ArrowRight[i], -1);
    TextDrawSetOutline(ArrowRight[i], 1);
    TextDrawSetProportional(ArrowRight[i], 1);


    keyTD[i] = TextDrawCreate(309.000000, keyY[i], "0");
    TextDrawBackgroundColor(keyTD[i], 255);
    TextDrawFont(keyTD[i], 3);
    TextDrawLetterSize(keyTD[i], 0.9, 3.0);
    TextDrawColor(keyTD[i], -1);
    TextDrawSetOutline(keyTD[i], 0);
    TextDrawSetProportional(keyTD[i], 1);
    TextDrawSetShadow(keyTD[i], 1);
    }
    return 1;
    }


    public OnPlayerSpawn(playerid)
    {
    HideThrowLock(playerid);
    return 1;
    }


    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if (InLock[playerid] == true) // Игрок взаимодействует с замком ?
    {
    new str[4]; // Создаем строку


    if (newkeys & KEY_FIRE) // Ctrl (Переключение цифры +)
    {
    if(key[playerid][level[playerid]] == 9) key[playerid][level[playerid]] = 0; // Если цифра на уровне = 9, то после нее будет следовать "0"
    else key[playerid][level[playerid]] ++; // Прибавляем единичку


    valstr(str, key[playerid][level[playerid]]); // Преобразуем цифру в строку
    TextDrawSetString(keyTD[level[playerid]], str); // И выводим новою цифру
    return 1;
    }


    if (newkeys & KEY_WALK) // Alt (Переключение цифры -)
    {
    if(key[playerid][level[playerid]] == 0) key[playerid][level[playerid]] = 9;
    else key[playerid][level[playerid]] --;


    valstr(str, key[playerid][level[playerid]]);
    TextDrawSetString(keyTD[level[playerid]], str);
    return 1;
    }


    if (newkeys & KEY_NO) // N (Опуститься на уровень ниже)
    {
    if(level[playerid] == 2) return 1;


    TextDrawHideForPlayer(playerid, ArrowRight[level[playerid]]);
    TextDrawHideForPlayer(playerid, ArrowLeft[level[playerid]]);


    level[playerid] ++;


    TextDrawShowForPlayer(playerid, ArrowRight[level[playerid]]);
    TextDrawShowForPlayer(playerid, ArrowLeft[level[playerid]]);
    return 1;
    }


    if (newkeys & KEY_YES) // N (Подняться на уровень выше)
    {
    if(level[playerid] == 0) return 1;


    TextDrawHideForPlayer(playerid, ArrowRight[level[playerid]]);
    TextDrawHideForPlayer(playerid, ArrowLeft[level[playerid]]);


    level[playerid] --;


    TextDrawShowForPlayer(playerid, ArrowRight[level[playerid]]);
    TextDrawShowForPlayer(playerid, ArrowLeft[level[playerid]]);
    return 1;
    }


    if (newkeys & KEY_JUMP) // Shift (Проверка кода)
    {
    HideThrowLock(playerid);


    for( new i = 0; i < 3; i ++ )
    {
    if(key[playerid][i] == (keyPswrd[i] - '0')) continue;
    GameTextForPlayer(playerid, "~r~Locked", 1500, 5);
    return 1;
    }


    GameTextForPlayer(playerid, "~g~Unlocked", 1500, 5);


    // Убираем все текстдравы, размораживаем игрока, записываем что он больше не
    // взаимодействует с замком, и в качестве примера - выводим ему надпись, что замок открыт.
    return 1;
    }
    // return 1; // Тут по желанию
    }
    return 1;
    }


    stock HideThrowLock(playerid, bool:unfreeze = true)
    {
    TextDrawHideForPlayer(playerid, Background);
    TextDrawHideForPlayer(playerid, Letters);

    for( new i = 0; i < 3; i ++ ) {
    TextDrawHideForPlayer(playerid, ArrowRight[i]);
    TextDrawHideForPlayer(playerid, ArrowLeft[i]);
    TextDrawHideForPlayer(playerid, keyTD[i]);
    }

    if(unfreeze) {
    TogglePlayerControllable(playerid, 1);
    }
    InLock[playerid] = false;
    return 1;
    }


    stock ThrowLock(playerid)
    {
    HideThrowLock(playerid, false);


    InLock[playerid] = true; // Игрок взаимодействует с замком
    key[playerid] = { 0, 0, 0 }; // "Обнуляем переменные"
    level[playerid] = 1; // "Обнуляем переменные"


    TogglePlayerControllable(playerid, 0); // Замораживаем игрока


    TextDrawShowForPlayer(playerid, Background);
    TextDrawShowForPlayer(playerid, ArrowRight[0]);
    TextDrawShowForPlayer(playerid, ArrowLeft[0]);
    TextDrawShowForPlayer(playerid, keyTD[0]);
    TextDrawShowForPlayer(playerid, keyTD[1]);
    TextDrawShowForPlayer(playerid, keyTD[2]);
    TextDrawShowForPlayer(playerid, Letters);


    return 1;
    }

  8. #6
    Активный пользователь Аватар для LMapper
    Регистрация
    01.04.2011
    Адрес
    != true
    Сообщений
    991
    Репутация: 91

    Звание: скоро придёт к известности

    Re: [ALL] Кодовый замок (алгоритм)

    ап
    Pawn,Sourcepawn,ArmA.
    Delphi,Pascal,etc..
    Досье:
    ...У ДЦ были проблемы с электроснабжением, никак не связанные с тем, что я играю в лол....
    С уважением,
    Команда Ru-hoster
    Психически не устойчив, на таблетках.

  9. #7
    Активный пользователь Аватар для LMapper
    Регистрация
    01.04.2011
    Адрес
    != true
    Сообщений
    991
    Репутация: 91

    Звание: скоро придёт к известности

    Re: [ALL] Кодовый замок (алгоритм)

    Мало критики :c
    Pawn,Sourcepawn,ArmA.
    Delphi,Pascal,etc..
    Досье:
    ...У ДЦ были проблемы с электроснабжением, никак не связанные с тем, что я играю в лол....
    С уважением,
    Команда Ru-hoster
    Психически не устойчив, на таблетках.

  10. #8
    Пользователь Аватар для Dante_Codeo
    Регистрация
    09.07.2015
    Адрес
    Россия, Киров
    Возраст
    26
    Сообщений
    11
    Репутация: 10

    Звание: на пути к лучшему

    Re: [ALL] Кодовый замок (алгоритм)

    Цитата Сообщение от Jekazzz Посмотреть сообщение
    Используй массивы вместо кучи переменных.
    Top, Middle и Bottom можно заменить на Key[0], Key[1] и Key[2] соответственно. Тогда можно не свитчить, используя Key[level]
    А что измениться? Только количество строк, а количество съедаемой оперативой памяти останется тем же =)

  11. #9
    Проверенный Аватар для georJik
    Регистрация
    07.07.2013
    Сообщений
    1,370
    Репутация: 427

    Звание: - очень-очень хороший человек

    Re: [ALL] Кодовый замок (алгоритм)

    Переместить тему в Скрипты для любого мода

Похожие темы

  1. Алгоритм системы AFK [срабатывание при ESC и сворачивании игры]
    от e.kosovskij в разделе Вопросы по скриптингу
    Ответов: 4
    Последнее сообщение: 01.07.2013, 00:25
  2. [fs] замок зажигания для авто
    от _Dimk_ в разделе Скрипты
    Ответов: 12
    Последнее сообщение: 29.06.2012, 22:34

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •