PDA

Просмотр полной версии : [Мануал] Система чатов



MrJu[N]ior
18.07.2016, 00:28
Здравствуйте, пользователи и гости портала pro-pawn.ru
Не так давно ко мне пришла идея в голову создать систему чатов. Систему я быстренько написал, но потестить удалось недавно. Теперь без багов выкладываю сюда.
Система реализована на командах и массивах. Сохранения не делал.
Начнем вставлять код.
Ко всем переменным:


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 добавляем:


public OnPlayerConnect(playerid)
{
GetPlayerName(playerid, PlayerName[playerid], MAX_PLAYER_NAME+1);
PlayerChatModer{playerid} =
PlayerChat{playerid} =
PlayerChatOwner{playerid} =
PlayerChatInvited{playerid} =
PlayerChatIgnore{playerid} = -1;
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
if(PlayerChat{playerid} >= 0)
{
foreach(new i: Player)
{
if(PlayerChat{i} != PlayerChat{playerid}) return 1;
PlayerChat{i} =
PlayerChatModer{i} =
PlayerChatOwner{i} = -1;
ChatNames[PlayerChat{playerid}] = !"";
SendClientMessage(i, 0xFF0000FF, !"Создатель чата покинул чат! Чат был удалён");
}
}
PlayerChatModer{playerid} =
PlayerChat{playerid} =
PlayerChatOwner{playerid} =
PlayerChatInvited{playerid} =
PlayerChatIgnore{playerid} = -1;
return 1;
}

Думаю тут не составит труда вырезать код. Если у вас паблики не пусты то вырезаем то что внутри паблика.
Ко всем stocks/publics добавляем:


stock IsNums(const string[])
{
for(new i = 0, j = strlen(string); i < j; i++)
{
if(string[i] > '9' || string[i] < '0') return 0;
}
return 1;
}

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

Далее сама "система". 9 команд:


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(playerid, params[])
{
if(PlayerChat{playerid} == -1) return SendClientMessage(playerid, 0xFF0000FF, !"Вы не находитесь в чате!");
if(1 > strlen(params) > 100) return SendClientMessage(playerid, 0xFF0000FF, !"Отправленный текст может иметь от 1 до 100 символов");
new string[4 + 37 + 10 + (MAX_PLAYER_NAME+1) + 100 + 2] = "[";
strcat(string, ChatNames[PlayerChat{playerid}]);
strcat(string, !"][");
strcat(string, (PlayerChatModer{playerid} == -1) ? (!"") : ((PlayerChatOwner{playerid} == -1) ? (!"Модератор ") : (!"Создатель ")));
strcat(string, PlayerName[playerid]);
strcat(string, !"]: ");
strcat(string, params);
foreach(new i: Player)
{
if(PlayerChat{i} != PlayerChat{playerid}) return 1;
if(PlayerChatIgnore{i} == 1) return 1;
SendClientMessage(i, 0xEEF743FF, string);
}
return 1;
}
CMD:createchat(playerid, params[])
{
if(PlayerChat{playerid} != -1) return SendClientMessage(playerid, 0xFF0000FF, !"Вы уже находитесь в чате, что-бы его покинуть введите /chatleave");
if(3 > strlen(params) > 20) return SendClientMessage(playerid, 0xFF0000FF, !"Название чата должно иметь в себе от 3 до 20 символов");
for(new i = 0; i < MAX_CHATS; i++)
{
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(playerid, params[])
{
if(PlayerChatOwner{playerid} >= 0|| PlayerChatModer{playerid} >= 0)
{
if(isnull(params)) return SendClientMessage(playerid, 0xFF0000FF, !"Введите ID игрока");
if(!IsNums(params)) return SendClientMessage(playerid, 0xFF0000FF, !"ID игрока может состоять только с цифр!");
new targetid = strval(params);
if(PlayerChat{targetid} != -1) return SendClientMessage(playerid, 0xFF0000FF, !"Игрок уже состоит в другом чате!");
if(PlayerChatInvited{targetid} != -1) return SendClientMessage(playerid, 0xFF0000FF, !"Игрок уже приглашен в чат!");
PlayerChatInvited{targetid} = PlayerChat{playerid};
new string[(MAX_PLAYER_NAME+1) +25];
strcat(string, PlayerName[targetid]);
strcat(string, !" был приглашён в ваш чат");
SendClientMessage(playerid, 0x14FF20FF, string);
string = "";
strcat(string, PlayerName[playerid]);
strcat(string, !" пригласил вас в чат");
SendClientMessage(targetid, 0x14FF20FF, string);
SendClientMessage(targetid, 0x14FF20FF, !"Что-бы принят приглашенние введите /chataccept");
}
else return SendClientMessage(playerid, 0xFF0000FF, !"Вы не уполномочены использовать данную команду!");
return 1;
}
CMD:chatmoder(playerid, params[])
{
if(PlayerChatOwner{playerid} == -1) return SendClientMessage(playerid, 0xFF0000FF, !"Вы не создатель чата!");
if(isnull(params)) return SendClientMessage(playerid, 0xFF0000FF, !"Введите ID игрока");
if(!IsNums(params)) return SendClientMessage(playerid, 0xFF0000FF, !"ID игрока может состоять только с цифр!");
new targetid = strval(params);
if(PlayerChat{targetid} != PlayerChatOwner{playerid}) return SendClientMessage(playerid, 0xFF0000FF, !"Игрок не состоит в вашем чате!");
PlayerChatModer{targetid} = PlayerChatOwner{playerid};
new string[(MAX_PLAYER_NAME+1) +28];
strcat(string, PlayerName[targetid]);
strcat(string, !" теперь модератор чата");
SendClientMessage(playerid, 0x14FF20FF, string);
string = "";
strcat(string, PlayerName[playerid]);
strcat(string, !" сделал вас модератором чата");
return SendClientMessage(targetid, 0x14FF20FF, string);
}
CMD:chatkick(playerid, params[])
{
if(PlayerChatOwner{playerid} >= 0 || PlayerChatModer{playerid} >= 0)
{
if(isnull(params)) return SendClientMessage(playerid, 0xFF0000FF, !"Введите ID игрока");
if(!IsNums(params)) return SendClientMessage(playerid, 0xFF0000FF, !"ID игрока может состоять только с цифр!");
new targetid = strval(params);
if(PlayerChat{targetid} != PlayerChat{playerid}) return SendClientMessage(playerid, 0xFF0000FF, !"Игрок не в вашем чате!");
PlayerChat{targetid} =
PlayerChatModer{targetid} = -1;
new string[(MAX_PLAYER_NAME+1) + 18];
strcat(string, PlayerName[targetid]);
strcat(string, !" был кикнут с чата");
SendClientMessage(playerid, 0x14FF20FF, string);
string = "";
strcat(string, PlayerName[playerid]);
strcat(string, !" кикнул вас с чата");
SendClientMessage(playerid, 0xFF0000FF, string);
}
else return SendClientMessage(playerid, 0xFF0000FF, !"Вы не уполномочены использовать данную команду!");
return 1;
}
CMD:chatignore(playerid, params[])
{
if(PlayerChat{playerid} != -1) return PlayerChatIgnore{playerid} = !PlayerChatIgnore{playerid};
return SendClientMessage(playerid, -1, (PlayerChatIgnore{playerid} == -1) ? (!"Теперь вы видите чат") : (!"Теперь вы не видите чат"));
}
CMD:chatleave(playerid, params[])
{
if(PlayerChat{playerid} == -1) return SendClientMessage(playerid, 0xFF0000FF, !"Вы не находитесь в чате!");
if(PlayerChatOwner{playerid} != -1) return SendClientMessage(playerid, 0xFF0000FF, !"Вы не можете выйти с чата, потому-что вы создатель! Удалите чат с помощю команды /deletechat");
PlayerChat{playerid} =
PlayerChatModer{playerid} = -1;
return SendClientMessage(playerid, -1, !"Вы покинули чат");
}
CMD:deletechat(playerid, params[])
{
if(PlayerChat{playerid} == -1) return SendClientMessage(playerid, 0xFF0000FF, !"Вы не находитесь в чате!");
if(PlayerChatOwner{playerid} != PlayerChat{playerid}) return SendClientMessage(playerid, 0xFF0000FF, !"Вы не можете удалить чат! Вы не его создатель!");
ChatNames[PlayerChat{playerid}] = !"";
PlayerChatOwner{playerid} =
PlayerChatModer{playerid} =
PlayerChat{playerid} = -1;
return SendClientMessage(playerid, 0x14FF20FF, !"Чат удалён!");
}
CMD:chataccept(playerid, params[])
{
if(PlayerChatInvited{playerid} == -1) return SendClientMessage(playerid, 0xFF0000FF, !"Вы не были приглашенны в чат!");
if(ChatNames[PlayerChatInvited{playerid}][0] == '\0') return SendClientMessage(playerid, 0xFF0000FF, !"Чат был удалён создателем или несуществует!");
PlayerChat{playerid} = PlayerChatInvited{playerid};
PlayerChatInvited{playerid} = -1;
return SendClientMessage(playerid, -1, !"Вы приняли приглашение в чат!");
}

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

#Johnson
19.07.2016, 18:45
Разве это что то не типо IRC чатов которые есть в GF ?
Зачем изобретать велосипед :wacko:

TheMallard
20.07.2016, 12:12
В GF нет динамических чатов, там фиксированное количество.

MrJu[N]ior
21.07.2016, 01:14
Разве это что то не типо IRC чатов которые есть в GF ?
Зачем изобретать велосипед :wacko:

Никогда не знал что такое эти IRC, GF.
Что пришло в голову - то написал. Нигде такого не видел.