Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Ангары

Статус
В этой теме нельзя размещать новые ответы.

Cr1meful

Ученик
Ангары (GalaxY)

Ангары
Идея слизана с GY

Нам нужно: sscanf и командный процессор DC_CMD (или похожий, шапку сами замените)
​

Описание: Ангары служат для сбора/скопления игроков и проведения чего-либо в ангарах. Каждый ангар имеет персональный интерьер.
Скришоты:





Итак начнём.​

Первое, ко всем new:
PHP:
new pickups;
new HangarNumber[6] = 0;
new Hangar[MAX_PLAYERS];
new pickuphangar[6];
HangarNumbe - С помощью этого, у нас будет статус о ангаре, закрыт он или открыт / всего ангаров 6.
Hangar - информация о игроке, в ангаре он или нет.
pickuphangar - из названия все понятно.

Добавляем к OnPlayerConnect:
PHP:
Hangar[playerid] = 0;
Обнуление переменной при заходе игрока.

Добавляем к GameModeInit:
PHP:
pickuphangar[0] = CreatePickup(19132, 23, 901.3920,-1202.6172,16.9832, 0); pickups++;
    Create3DTextLabel("Ангар №1.",-1,901.3920,-1202.6172,16.9832,15.0,0,0);
    
    pickuphangar[1] = CreatePickup(19132, 23, 867.2936,-1202.6172,16.9766, 0); pickups++;
    Create3DTextLabel("Ангар №2.",-1,867.2936,-1202.6172,16.9766,15.0,0,0);
    
    pickuphangar[2] = CreatePickup(19132, 23, 831.2269,-1202.6172,16.9766, 0); pickups++;
    Create3DTextLabel("Ангар №3.",-1,831.2269,-1202.6172,16.9766,15.0,0,0);
    
    pickuphangar[3] = CreatePickup(19132, 23, 860.8140,-1245.1157,14.7578, 0); pickups++;
    Create3DTextLabel("Ангар №4.",-1,860.8140,-1245.1157,14.7578,15.0,0,0);
    
    pickuphangar[4] = CreatePickup(19132, 23, 860.8186,-1255.4730,14.7578, 0); pickups++;
    Create3DTextLabel("Ангар №5.",-1,860.8186,-1255.4730,14.7578,15.0,0,0);
    
    pickuphangar[5] = CreatePickup(19132, 23, 845.5270,-1293.2771,13.6510, 0); pickups++;
    Create3DTextLabel("Ангар №6."-1,845.5270,-1293.2771,13.6510,15.0,0,0);
Создаем пикапы для входа в ангар и 3D тексты поверх пикапа.
___________________________________________________________
​

Теперь, добавляем сами ангары, добавляем к OnPlayerPickUpPickup:
PHP:
     if(pickupid == pickuphangar[0])
     {
         if(HangarNumber[0] == 0) return GameTextForPlayer(playerid, RusToGame("~r~ЗАКРЫТО"), 5000, 1);
         SetPlayerPos(playerid, -1465.268676,1557.868286,1052.531250);
         SetPlayerInterior(playerid, 14);
         SetPlayerVirtualWorld(playerid, 1);
         SendClientMessage(playerid, COLOR_OOC, "Покинуть ангар - {33AA33}/exit{33AA33}.");
         Hangar[playerid] = 1;
         SetCameraBehindPlayer(playerid);
     }
     if(pickupid == pickuphangar[1])
     {
         if(HangarNumber[1] == 0) return GameTextForPlayer(playerid, RusToGame("~r~ЗАКРЫТО"), 5000, 1);
         SetPlayerPos(playerid, 963.418762,2108.292480,1011.030273);
         SetPlayerInterior(playerid, 1);
         SetPlayerVirtualWorld(playerid, 1);
         SendClientMessage(playerid, COLOR_OOC, "Покинуть ангар - {33AA33}/exit{33AA33}.");
         Hangar[playerid] = 2;
         SetCameraBehindPlayer(playerid);
     }
     if(pickupid == pickuphangar[2])
     {
         if(HangarNumber[2] == 0) return GameTextForPlayer(playerid, RusToGame("~r~ЗАКРЫТО"), 5000, 1);
         SetPlayerPos(playerid, 384.808624,173.804992,1008.382812);
         SetPlayerInterior(playerid, 3);
         SetPlayerVirtualWorld(playerid, 1);
         SendClientMessage(playerid, COLOR_OOC, "Покинуть ангар - {33AA33}/exit{33AA33}.");
         Hangar[playerid] = 3;
         SetCameraBehindPlayer(playerid);
     }
     
     if(pickupid == pickuphangar[3])
     {
         if(HangarNumber[3] == 0) return GameTextForPlayer(playerid, RusToGame("~r~ЗАКРЫТО"), 5000, 1);
         SetPlayerPos(playerid, -975.975708,1060.983032,1345.671875);
         SetPlayerInterior(playerid, 10);
         SetPlayerVirtualWorld(playerid, 1);
         SendClientMessage(playerid, COLOR_OOC, "Покинуть ангар - {33AA33}/exit{33AA33}.");
         Hangar[playerid] = 4;
         SetCameraBehindPlayer(playerid);
     }  
     if(pickupid == pickuphangar[4])
     {
         if(HangarNumber[4] == 0) return GameTextForPlayer(playerid, RusToGame("~r~ЗАКРЫТО"), 5000, 1);
         SetPlayerPos(playerid, -1398.103515,937.631164,1036.479125);
         SetPlayerInterior(playerid, 15);
         SetPlayerVirtualWorld(playerid, 1);
         SendClientMessage(playerid, COLOR_OOC, "Покинуть ангар - {33AA33}/exit{33AA33}.");
         Hangar[playerid] = 5;
         SetCameraBehindPlayer(playerid);
     }
     if(pickupid == pickuphangar[5])
     {
         if(HangarNumber[5] == 0) return GameTextForPlayer(playerid, RusToGame("~r~ЗАКРЫТО"), 5000, 1);
         SetPlayerPos(playerid, 1267.663208,-781.323242,1091.906250);
         SetPlayerInterior(playerid, 5);
         SetPlayerVirtualWorld(playerid, 1);
         SendClientMessage(playerid, COLOR_OOC, "Покинуть ангар - {33AA33}/exit{33AA33}.");
         Hangar[playerid] = 6;
         SetCameraBehindPlayer(playerid);
     }
SetPlayerPos - установка позиции для игрока.
SetPlayerInterior - установка интерьера для игрока.
SetPlayerVirtualWorld - установка виртуального мира.
SendClientMessage - вывод сообщения.
SetCameraBehindPlayer - установка камеры.
Hangar[playerid] - устанавливаем проверку ангара для игрока. (/hkick, /exit)
___________________________________________________________
​

Добавляем команду для открытия/закрытия ангара.

PHP:
CMD:hopen(playerid, params[])
{
    if(GetPlayerFraction(playerid) != 9) return SendClientMessage(playerid, COLOR_GRAD1, "Ты не репортер.");
    if(IsPlayerInRangeOfPoint(playerid, 5.0, 901.3920,-1202.6172,16.9832) || Hangar[playerid] == 1)
    {
        switch(HangarNumber[0])
        {
            case 0:
            {
                format(stringone, sizeof(stringone), "** %s[%d] открыл ангар №1.",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты открыл ангар №1.");
                HangarNumber[0] = 1;
            }
            case 1:
            {
                format(stringone, sizeof(stringone), "** %s[%d] закрыл ангар №1.",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты закрыл ангар №1.");
                HangarNumber[0] = 0;
            }
        }
        return 1;
    }
    if(IsPlayerInRangeOfPoint(playerid, 5.0, 867.2936,-1202.6172,16.9766) || Hangar[playerid] == 2)
    {
          switch(HangarNumber[1])
        {
            case 0:
            {
                format(stringone, sizeof(stringone), "** %s[%d] открыл ангар №2.",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты открыл ангар №2.");
                HangarNumber[1] = 1;
            }
            case 1:
            {
                format(stringone, sizeof(stringone), "** %s[%d] закрыл ангар №2.",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты закрыл ангар №2.");
                HangarNumber[1] = 0;
            }
        }
    }
    if(IsPlayerInRangeOfPoint(playerid, 5.0, 831.2269,-1202.6172,16.9766) || Hangar[playerid] == 3)
    {
        switch(HangarNumber[2])
        {
            case 0:
            {
                format(stringone, sizeof(stringone), "** %s[%d] открыл ангар №3.",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты открыл ангар №3.");
                HangarNumber[2] = 1;
            }
            case 1:
            {
                format(stringone, sizeof(stringone), "** %s[%d] закрыл ангар №3.",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты закрыл ангар №3.");
                HangarNumber[2] = 0;
            }
        }
        return 1;
    }
    if(IsPlayerInRangeOfPoint(playerid, 5.0, 860.8140,-1245.1157,14.7578) || Hangar[playerid] == 4)
    {
        switch(HangarNumber[3])
        {
            case 0:
            {
                format(stringone, sizeof(stringone), "** %s[%d] открыл ангар №4.",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты открыл ангар №4.");
                HangarNumber[3] = 1;
            }
            case 1:
            {
                format(stringone, sizeof(stringone), "** %s[%d] закрыл ангар №4.",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты закрыл ангар №4.");
                HangarNumber[3] = 0;
            }
        }
        return 1;
    }
    if(IsPlayerInRangeOfPoint(playerid, 5.0, 860.8186,-1255.4730,14.7578) || Hangar[playerid] == 5)
    {
        switch(HangarNumber[4])
        {
            case 0:
            {
                format(stringone, sizeof(stringone), "** %s[%d] открыл ангар №5.",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты открыл ангар №5.");
                HangarNumber[4] = 1;
            }
            case 1:
            {
                format(stringone, sizeof(stringone), "** %s[%d] закрыл ангар №5.",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты закрыл ангар №5.");
                HangarNumber[4] = 0;
            }
        }
        return 1;
    }
    if(IsPlayerInRangeOfPoint(playerid, 5.0, 845.5270,-1293.2771,13.6510) || Hangar[playerid] == 6)
    {
        switch(HangarNumber[5])
        {
            case 0:
            {
                format(stringone, sizeof(stringone), "** %s[%d] открыл ангар №6. ",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты открыл ангар №6.");
                HangarNumber[5] = 1;
            }
            case 1:
            {
                format(stringone, sizeof(stringone), "** %s[%d] закрыл ангар №6.",PlayerInfo[playerid][pName], playerid);
                SendRadioMessage(9, TEAM_AZTECAS_COLOR, stringone);
                SendClientMessage(playerid, COLOR_LIGHTBLUE, "Ты закрыл ангар №6.");
                HangarNumber[5] = 0;
            }
        }
        return 1;
     }
     else SendClientMessage(playerid, COLOR_GRAD1, "Ты далеко от ангаров.");
     return 1;
}
Далее, добавляем команду для выхода из ангара:
PHP:
CMD:exit(playerid, params[0])
{
    if(Hangar[playerid] < 1) return SendClientMessage(playerid, COLOR_GRAD1, "Ты не в ангаре.");
    SetPlayerPos(playerid, 910.7144,-1230.8871,16.9766);
    SetPlayerInterior(playerid, 0);
    SetPlayerVirtualWorld(playerid, 0);
    SendClientMessage(playerid, -1, "Ты самостоятельно покинул ангар.");
    Hangar[playerid] = 0;
    SetCameraBehindPlayer(playerid);
    return 1;
}
И добавляем команду, что-бы репортер мог выгнать игрока с ангара:
PHP:
CMD:hkick(playerid, params[0])
{
    if(GetPlayerFraction(playerid) != 9) return SendClientMessage(playerid, COLOR_GRAD1, "Ты не репортер.");
    if(sscanf(params, "us", params[0], params[1])) return SendClientMessage(playerid, COLOR_GREY, "Использование: /hkick [ид игрока/часть ника] [причина]");
    if(!IsPlayerConnected(params[0])) return SendClientMessage(playerid, COLOR_GRAD1, "Игрок не найден.");
    if(gPlayerLogged[params[0]] == 0) return SendClientMessage(playerid, COLOR_GRAD1, "Игрок не авторизован.");
    if(Hangar[playerid] < 1) return SendClientMessage(playerid, COLOR_GRAD1, "Ты не в ангаре.");
    if(Hangar[params[0]] < 1) return SendClientMessage(playerid, COLOR_GRAD1, "Игрок не в ангаре.");
    if(Hangar[params[0]] != Hangar[playerid]) return SendClientMessage(playerid, COLOR_GRAD1, "Данный игрок не в твоём ангаре.");
    SendFormattedMessage(playerid, COLOR_LIGHTBLUE, "Ты выгнал с ангара %s[%d]. Причина: %s.", PlayerInfo[params[0]][pName], params[0], params[1]);
    SendFormattedMessage(params[0], COLOR_LIGHTBLUE, "Репортер %s[%d] выгнал тебя с ангара. Причина: %s.", PlayerInfo[playerid][pName], playerid, params[1]);
    SetPlayerPos(params[0], 910.7144,-1230.8871,16.9766); SetPlayerInterior(params[0], 0); SetPlayerVirtualWorld(params[0], 0); Hangar[params[0]] = 0; SetCameraBehindPlayer(params[0]);
    return 1;
}
Ко всем stock:

PHP:
stock GetPlayerFraction(playerid)
{
    if(PlayerInfo[playerid][pMember] != 0) return PlayerInfo[playerid][pMember];
    else if(PlayerInfo[playerid][pLeader] != 0) return PlayerInfo[playerid][pLeader];
    else return 0;
}
Эта функция для получения информации, в какой фракции состоит игрок, немного удобная функция чем писать каждый раз pMember != 11 || pLeader != 11.

___________________________________________________________​

PHP:
stock RusToGame(string[])
{
          new result[256];
          for(new i;i<256;i++)
          {
               switch(string[i])
               {
                    case 'а':result[i] = 'a';case 'А':result[i] = 'A';
                    case 'б':result[i] = '—';case 'Б':result[i] = 'Ђ';
                    case 'в':result[i] = 'ў';case 'В':result[i] = '‹';
                    case 'г':result[i] = '™';case 'Г':result[i] = '‚';
                    case 'д':result[i] = 'љ';case 'Д':result[i] = 'ѓ';
                    case 'е':result[i] = 'e';case 'Е':result[i] = 'E';
                    case 'ё':result[i] = 'e';case 'Ё':result[i] = 'E';
                    case 'ж':result[i] = '›';case 'Ж':result[i] = '„';
                    case 'з':result[i] = 'џ';case 'З':result[i] = '€';
                    case 'и':result[i] = 'њ';case 'И':result[i] = '…';
                    case 'й':result[i] = 'ќ';case 'Й':result[i] = '…';
                    case 'к':result[i] = 'k';case 'К':result[i] = 'K';
                    case 'л':result[i] = 'ћ';case 'Л':result[i] = '‡';
                    case 'м':result[i] = 'Ї';case 'М':result[i] = 'M';
                    case 'н':result[i] = '®';case 'Н':result[i] = '*';
                    case 'о':result[i] = 'o';case 'О':result[i] = 'O';
                    case 'п':result[i] = 'Ј';case 'П':result[i] = 'Њ';
                    case 'р':result[i] = 'p';case 'Р':result[i] = 'P';
                    case 'с':result[i] = 'c';case 'С':result[i] = 'C';
                    case 'т':result[i] = '¦';case 'Т':result[i] = 'Џ';
                    case 'у':result[i] = 'y';case 'У':result[i] = 'Y';
                    case 'ф':result[i] = '˜';case 'Ф':result[i] = 'Ѓ';
                    case 'х':result[i] = 'x';case 'Х':result[i] = 'X';
                    case 'ц':result[i] = ' ';case 'Ц':result[i] = '‰';
                    case 'ч':result[i] = '¤';case 'Ч':result[i] = 'Ќ';
                    case 'ш':result[i] = 'Ґ';case 'Ш':result[i] = 'Ћ';
                    case 'щ':result[i] = 'Ў';case 'Щ':result[i] = 'Љ';
                    case 'ь':result[i] = '©';case 'Ь':result[i] = '’';
                    case 'ъ':result[i] = 'ђ';case 'Ъ':result[i] = '§';
                    case 'ы':result[i] = 'Ё';case 'Ы':result[i] = '‘';
                    case 'э':result[i] = 'Є';case 'Э':result[i] = '“';
                    case 'ю':result[i] = '«';case 'Ю':result[i] = '”';
                    case 'я':result[i] = '¬';case 'Я':result[i] = '•';
                    default:result[i]=string[i];
            }
        }
        return result;
}
RusToGame - позволяет писать через GameTextForPlayer русскими буквами, по примеру:
PHP:
GameTextForPlayer(playerid, RusToGame("~r~Ваш текст"), 5000, 1);
______________________________________________________________________​

PHP:
stock SendFormattedMessage(playerid, color, fstring[], {Float, _}:...)
{
    static const
        STATIC_ARGS = 3,
        BYTES_PER_CELL = cellbits / 8;
    new
        n = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
    if (n)
    {
        new message[128],arg_start,arg_end;
        #emit CONST.alt                fstring
        #emit LCTRL                    5
        #emit ADD
        #emit STOR.S.pri               arg_start

        #emit LOAD.S.alt               n
        #emit ADD
        #emit STOR.S.pri               arg_end
        do
        {
            #emit LOAD.I
            #emit PUSH.pri
            arg_end -= BYTES_PER_CELL;
            #emit LOAD.S.pri           arg_end
        }
        while (arg_end > arg_start);

        #emit PUSH.S                   fstring
        #emit PUSH.C                   128
        #emit PUSH.ADR                 message
        n += BYTES_PER_CELL * 3;
        #emit PUSH.S                   n
        #emit SYSREQ.C                 format

        n += BYTES_PER_CELL;
        #emit LCTRL                    4
        #emit LOAD.S.alt               n
        #emit ADD
        #emit SCTRL                    4

        return SendClientMessage(playerid, color, message);
    }
    else
    {
        return SendClientMessage(playerid, color, fstring);
    }
}
Аналог SendClientMessage, только немного лучше.

___________________________________________________________​

PHP:
stock SendRadioMessage(member, color, string[]) { foreach(new i : Player) if(PlayerInfo[i][pMember] == member || PlayerInfo[i][pLeader] == member) SendClientMessage(i, color, string); }
Думаю всем и так будет понятно, что это.
___________________________________________________________
​

Ошибки которые могут возникнуть:
PHP:
PlayerInfo[playerid][pName] - меняйте на свою функцию получения ника игрока.
Цвета которые используются:
PHP:
#define COLOR_LIGHTBLUE 0x33CCFFAA
#define COLOR_GREY 0xC3C3C3AA
#define COLOR_GRAD1 0xB4B5B7FF
#define TEAM_AZTECAS_COLOR 0x01FCFFC8
P.S Говно код ван лав.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу