Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 4 из 4
  1. #1
    Аватар для MrJu[N]ior
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.02.2016
    Сообщений
    5
    Репутация:
    3 ±

    Система чатов

    Здравствуйте, пользователи и гости портала pro-pawn.ru
    Не так давно ко мне пришла идея в голову создать систему чатов. Систему я быстренько написал, но потестить удалось недавно. Теперь без багов выкладываю сюда.
    Система реализована на командах и массивах. Сохранения не делал.
    Начнем вставлять код.
    Ко всем переменным:
    PHP код:
    new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME+1];
    new 
    PlayerChat[MAX_PLAYERS char];
    new 
    PlayerChatModer[MAX_PLAYERS char];
    new 
    PlayerChatOwner[MAX_PLAYERS char];
    new 
    PlayerChatInvited[MAX_PLAYERS char];
    new 
    PlayerChatIgnore[MAX_PLAYERS char];
    const 
    MAX_CHATS 10;
    new 
    ChatNames[MAX_CHATS][20]; 
    Максимальное количество чатов зависит от вас. Просто измените число 10 в строке const MAX_CHATS.
    В паблики OnPlayerConnect and OnPlayerDisconnect добавляем:
    PHP код:
    public OnPlayerConnect(playerid)
    {
        
    GetPlayerName(playeridPlayerName[playerid], MAX_PLAYER_NAME+1);
        
    PlayerChatModer{playerid} =
        
    PlayerChat{playerid} =
        
    PlayerChatOwner{playerid} =
        
    PlayerChatInvited{playerid} =
        
    PlayerChatIgnore{playerid} = -1;
        return 
    1;
    }
    public 
    OnPlayerDisconnect(playeridreason)
    {
        if(
    PlayerChat{playerid} >= 0)
        {
            foreach(new 
    iPlayer)
            {
                if(
    PlayerChat{i} != PlayerChat{playerid}) return 1;
                
    PlayerChat{i} =
                
    PlayerChatModer{i} =
                
    PlayerChatOwner{i} = -1;
                
    ChatNames[PlayerChat{playerid}] = !"";
                
    SendClientMessage(i0xFF0000FF, !"Создатель чата покинул чат! Чат был удалён");
            }
        }
        
    PlayerChatModer{playerid} =
        
    PlayerChat{playerid} =
        
    PlayerChatOwner{playerid} =
        
    PlayerChatInvited{playerid} =
        
    PlayerChatIgnore{playerid} = -1;
        return 
    1;

    Думаю тут не составит труда вырезать код. Если у вас паблики не пусты то вырезаем то что внутри паблика.
    Ко всем stocks/publics добавляем:
    PHP код:
    stock IsNums(const string[])
    {
        for(new 
    0strlen(string); ji++)
        {
            if(
    string[i] > '9' || string[i] < '0') return 0;
        }
        return 
    1;

    Данный сток проверяет введены ли в массив(у нас это массив params в DC_CMD) только числа(проверка на нормально введенный ID).

    Далее сама "система". 9 команд:
    PHP код:
    CMD:chathelp(playerid)
    {
        
    SendClientMessage(playerid, -1, !"/chat [текст] - отправить сообщение в чат.");
        
    SendClientMessage(playerid, -1, !"/createchat [название_чата] - создать свой чат.");
        
    SendClientMessage(playerid, -1, !"/chatinvite [ID] - пригласить игрока в свой чат.");
        
    SendClientMessage(playerid, -1, !"/chatmoder [ID] - сделать игрока модератором.");
        
    SendClientMessage(playerid, -1, !"/chatkick [ID] - кикнуть игрока с чата.");
        
    SendClientMessage(playerid, -1, !"/chatignore - скрыть чат.");
        
    SendClientMessage(playerid, -1, !"/chatleave - уйти с чата.");
        
    SendClientMessage(playerid, -1, !"/deletechat - удалить чат.");
        return 
    SendClientMessage(playerid, -1, !"/chataccept - принять приглашение в чат");
    }
    CMD:chat(playeridparams[])
    {
        if(
    PlayerChat{playerid} == -1) return SendClientMessage(playerid0xFF0000FF, !"Вы не находитесь в чате!");
        if(
    strlen(params) > 100) return SendClientMessage(playerid0xFF0000FF, !"Отправленный текст может иметь от 1 до 100 символов");
        new 
    string[37 10 + (MAX_PLAYER_NAME+1) + 100 2] = "[";
        
    strcat(stringChatNames[PlayerChat{playerid}]);
        
    strcat(string, !"][");
        
    strcat(string, (PlayerChatModer{playerid} == -1) ? (!"") : ((PlayerChatOwner{playerid} == -1) ? (!"Модератор ") : (!"Создатель ")));
        
    strcat(stringPlayerName[playerid]);
        
    strcat(string, !"]: ");
        
    strcat(stringparams);
        foreach(new 
    iPlayer)
        {
            if(
    PlayerChat{i} != PlayerChat{playerid}) return 1;
            if(
    PlayerChatIgnore{i} == 1) return 1;
            
    SendClientMessage(i0xEEF743FFstring);
        }
        return 
    1;
    }
    CMD:createchat(playeridparams[])
    {
        if(
    PlayerChat{playerid} != -1) return SendClientMessage(playerid0xFF0000FF, !"Вы уже находитесь в чате, что-бы его покинуть введите /chatleave");
        if(
    strlen(params) > 20) return SendClientMessage(playerid0xFF0000FF, !"Название чата должно иметь в себе от 3 до 20 символов");
        for(new 
    0MAX_CHATSi++)
        {
            if(
    ChatNames[i][0] != '\0') return 1;
            
    strcat(ChatNames[i], params);
            
    PlayerChatOwner{playerid} =
            
    PlayerChatModer{playerid} =
            
    PlayerChat{playerid} = i;
            return 
    SendClientMessage(playerid, -1, !"Вы создали свой чат, подробнее о его возможностях в /chathelp");
        }
        return 
    1;
    }
    CMD:chatinvite(playeridparams[])
    {
        if(
    PlayerChatOwner{playerid} >= 0|| PlayerChatModer{playerid} >= 0)
        {
            if(
    isnull(params)) return SendClientMessage(playerid0xFF0000FF, !"Введите ID игрока");
            if(!
    IsNums(params)) return SendClientMessage(playerid0xFF0000FF, !"ID игрока может состоять только с цифр!");
            new 
    targetid strval(params);
            if(
    PlayerChat{targetid} != -1) return SendClientMessage(playerid0xFF0000FF, !"Игрок уже состоит в другом чате!");
            if(
    PlayerChatInvited{targetid} != -1) return SendClientMessage(playerid0xFF0000FF, !"Игрок уже приглашен в чат!");
            
    PlayerChatInvited{targetid} = PlayerChat{playerid};
            new 
    string[(MAX_PLAYER_NAME+1) +25];
            
    strcat(stringPlayerName[targetid]);
            
    strcat(string, !" был приглашён в ваш чат");
            
    SendClientMessage(playerid0x14FF20FFstring);
            
    string "";
            
    strcat(stringPlayerName[playerid]);
            
    strcat(string, !" пригласил вас в чат");
            
    SendClientMessage(targetid0x14FF20FFstring);
            
    SendClientMessage(targetid0x14FF20FF, !"Что-бы принят приглашенние введите /chataccept");
        }
        else return 
    SendClientMessage(playerid0xFF0000FF, !"Вы не уполномочены использовать данную команду!");
        return 
    1;
    }
    CMD:chatmoder(playeridparams[])
    {
        if(
    PlayerChatOwner{playerid} == -1) return SendClientMessage(playerid0xFF0000FF, !"Вы не создатель чата!");
        if(
    isnull(params)) return SendClientMessage(playerid0xFF0000FF, !"Введите ID игрока");
        if(!
    IsNums(params)) return SendClientMessage(playerid0xFF0000FF, !"ID игрока может состоять только с цифр!");
        new 
    targetid strval(params);
        if(
    PlayerChat{targetid} != PlayerChatOwner{playerid}) return SendClientMessage(playerid0xFF0000FF, !"Игрок не состоит в вашем чате!");
        
    PlayerChatModer{targetid} = PlayerChatOwner{playerid};
        new 
    string[(MAX_PLAYER_NAME+1) +28];
        
    strcat(stringPlayerName[targetid]);
        
    strcat(string, !" теперь модератор чата");
        
    SendClientMessage(playerid0x14FF20FFstring);
        
    string "";
        
    strcat(stringPlayerName[playerid]);
        
    strcat(string, !" сделал вас модератором чата");
        return 
    SendClientMessage(targetid0x14FF20FFstring);
    }
    CMD:chatkick(playeridparams[])
    {
        if(
    PlayerChatOwner{playerid} >= || PlayerChatModer{playerid} >= 0)
        {
            if(
    isnull(params)) return SendClientMessage(playerid0xFF0000FF, !"Введите ID игрока");
            if(!
    IsNums(params)) return SendClientMessage(playerid0xFF0000FF, !"ID игрока может состоять только с цифр!");
            new 
    targetid strval(params);
            if(
    PlayerChat{targetid} != PlayerChat{playerid}) return SendClientMessage(playerid0xFF0000FF, !"Игрок не в вашем чате!");
            
    PlayerChat{targetid} =
            
    PlayerChatModer{targetid} = -1;
            new 
    string[(MAX_PLAYER_NAME+1) + 18];
            
    strcat(stringPlayerName[targetid]);
            
    strcat(string, !" был кикнут с чата");
            
    SendClientMessage(playerid0x14FF20FFstring);
            
    string "";
            
    strcat(stringPlayerName[playerid]);
            
    strcat(string, !" кикнул вас с чата");
            
    SendClientMessage(playerid0xFF0000FFstring);
        }
        else return 
    SendClientMessage(playerid0xFF0000FF, !"Вы не уполномочены использовать данную команду!");
        return 
    1;
    }
    CMD:chatignore(playeridparams[])
    {
        if(
    PlayerChat{playerid} != -1) return PlayerChatIgnore{playerid} = !PlayerChatIgnore{playerid};
        return 
    SendClientMessage(playerid, -1, (PlayerChatIgnore{playerid} == -1) ? (!"Теперь вы видите чат") : (!"Теперь вы не видите чат"));
    }
    CMD:chatleave(playeridparams[])
    {
        if(
    PlayerChat{playerid} == -1) return SendClientMessage(playerid0xFF0000FF, !"Вы не находитесь в чате!");
        if(
    PlayerChatOwner{playerid} != -1) return SendClientMessage(playerid0xFF0000FF, !"Вы не можете выйти с чата, потому-что вы создатель! Удалите чат с помощю команды /deletechat");
        
    PlayerChat{playerid} =
        
    PlayerChatModer{playerid} = -1;
        return 
    SendClientMessage(playerid, -1, !"Вы покинули чат");
    }
    CMD:deletechat(playeridparams[])
    {
        if(
    PlayerChat{playerid} == -1) return SendClientMessage(playerid0xFF0000FF, !"Вы не находитесь в чате!");
        if(
    PlayerChatOwner{playerid} != PlayerChat{playerid}) return SendClientMessage(playerid0xFF0000FF, !"Вы не можете удалить чат! Вы не его создатель!");
        
    ChatNames[PlayerChat{playerid}] = !"";
        
    PlayerChatOwner{playerid} =
        
    PlayerChatModer{playerid} =
        
    PlayerChat{playerid} = -1;
        return 
    SendClientMessage(playerid0x14FF20FF, !"Чат удалён!");
    }
    CMD:chataccept(playeridparams[])
    {
        if(
    PlayerChatInvited{playerid} == -1) return SendClientMessage(playerid0xFF0000FF, !"Вы не были приглашенны в чат!");
        if(
    ChatNames[PlayerChatInvited{playerid}][0] == '\0') return SendClientMessage(playerid0xFF0000FF, !"Чат был удалён создателем или несуществует!");
        
    PlayerChat{playerid} = PlayerChatInvited{playerid};
        
    PlayerChatInvited{playerid} = -1;
        return 
    SendClientMessage(playerid, -1, !"Вы приняли приглашение в чат!");

    Для тех кто не может нормально скопировать(ошибки и т.п) есть тема этой же системы в виде FS: *клик
    Автор: MrJunior aka .:MrJu[N]ior:.
    Копирование темы на другие порталы/сайты без моего разрешения запрещено!

  2. #2
    Аватар для #Johnson
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.05.2016
    Сообщений
    34
    Репутация:
    0 ±
    Разве это что то не типо IRC чатов которые есть в GF ?
    Зачем изобретать велосипед

  3. #3
    Аватар для TheMallard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±
    В GF нет динамических чатов, там фиксированное количество.

  4. #4
    Аватар для MrJu[N]ior
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.02.2016
    Сообщений
    5
    Репутация:
    3 ±
    Цитата Сообщение от #Johnson Посмотреть сообщение
    Разве это что то не типо IRC чатов которые есть в GF ?
    Зачем изобретать велосипед
    Никогда не знал что такое эти IRC, GF.
    Что пришло в голову - то написал. Нигде такого не видел.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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