Доступ к архиву

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

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

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

Система выговоров администрации (/awarn, /aunwarn)(mxINI)

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

Vadik3113

Новичок
Всем привет, уважаемые форумчани. Сегодня решил выложить систему выговоров для администрации.
Система работает по тому же принципу что и на многих нубо-рп серверах (3 выговора снятие и т.д.)
Система написана мной. Она не является оптимизированной, с использование include mxINI. Первая команда не судите строго :ah:. Так же некоторые дефайны по типу цвета или SendMe - их использую лично я , вы же можите заменить их на стандартные функции по типу SendClientMessage
В начало, ко всем инклудам:
PHP:
#include <mxINI>
К define
PHP:
#define SendMe SendClientMessage // Не обязательно, но тогда придется взамен SendMe писать SendClientMessage
В enum Pinfo (у всех по разному) закиньте это
PHP:
pAwarns, // Если не самая последняя строка, то запятая нужна
Далее в public OnPlayerCommandText
PHP:
	else if(strcmp(cmd, "/awarn", true) == 0)
	{
		if(PINFO[playerid][pAdminLVL] < 6) return SendMe(playerid, CWHITE, "Ваш уровень администрирования слишком низок");
		tmp = strtok(cmdtext, idx);
		if(!strlen(tmp)) return SendMe(playerid, 0x00D900C8, "- Используйте:{FFFFFF} /awarn [ID] [причина]");// Если нужно допишите сюда свои проверки
		giveplayerid = ReturnUser(tmp);
		if (!IsPlayerConnected(giveplayerid)) return SendMe(playerid, CWHITE, "Игрок не в сети");
		if (PINFO[giveplayerid][pAdminLVL] == 6) return SendMe(playerid, CRED, "Нельзя дать выговор администратору 6-го уровня");
		new length = strlen(cmdtext);
		while ((idx < length) && (cmdtext[idx] <= ' '))
		{
			idx++;
		}
		new offset = idx;
		new result[64];
		while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
		{
			result[idx - offset] = cmdtext[idx];
			idx++;
		}
		result[idx - offset] = EOS; // Стандартный strtock
		if(!strlen(result)) return SendMe(playerid, 0x00D900C8, "- Используйте:{FFFFFF} /awarn [ID] [причина]");
		if(PINFO[giveplayerid][pAdminLVL] == 0) return SendMe(playerid, CRED, "Игрок не является администратором!");
		if(giveplayerid == playerid) return SendMe(playerid, CRED, "Вы указали свой ID");
		PINFO[giveplayerid][pAwarns] += 1;// Прибавляем к выговором 1
		if(PINFO[giveplayerid][pAwarns] >= 3)// Если это был третий выговор снимаем администратора, при необходимость удалите скобки и проверку
		{
			format(string, sizeof(string), " {F81414}%s  дал выговор [3/3] экс-администратору %s, тем самым сняв его с поста, Причина: %s"",GN(playerid),GN(giveplayerid), (result));// GN это GetName, экс-администратору чисто мой прикол, оставлю :) 
			AdminMessege(CRED,string,1);// Отправляем сообщение администраторам
			PINFO[giveplayerid][pAdminLVL] = 0;// Снимаем с поста
			PINFO[giveplayerid][pAwarns] = 0;// Выставляем выговоры на ноль, если игрока сново поставят, а у него будет 3/3 эт не очень
			return true;
		}// Далее идет, если игрок получил первый или второй выговор
		format(string, sizeof(string), "{F81414}%s Дал выговор %s [Выговоры %d/3]Причина:%s. ",GN(playerid),GN(giveplayerid),PINFO[giveplayerid][pAwarns], (result));
		AdminMessege(CRED, string,1);// Сообщение в админ чат 
		return true;
                SavePlayer(giveplayerid);// SavePlayer - сохранения игрока (этот сток не кидаю)
	}
Чуть выше были показаны некоторые стоки (И не только), их я выложу строкой ниже
PHP:
#define GN(%1) PINFO[%1][pNamePlayer] // можно заменить на PINFO[playerid][pNAME] (эт как у вас)
stock AdminMessege(color,const string[],level)
{
	foreach (Player, i)
	{
		if (PINFO[i][pAdminLVL] > level)
		{
			SendMe(i, color, string);
		}
	}
	return true;
}
strtok(const string[], &index)
{
	new length = strlen(string);
	while ((index < length) && (string[index] <= ' '))
	{
		index++;
	}
	new offset = index;
	new result[20];
	while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
	{
		result[index - offset] = string[index];
		index++;
	}
	result[index - offset] = EOS;
	return result;
} // Так же для работы в начало OnPlayerCommandText надо закинуть это:	
new cmd[256];
new tmp[256];
new idx;
cmd = strtok(cmdtext, idx);
Далее команда /aunwarn (без пояснений, устал честно говоря)
PHP:
	else if(strcmp(cmd, "/aunwarn", true) == 0)
	{
	    if(PINFO[playerid][pAdminLVL] < 6) return SendMe(playerid, CWHITE, "Ваш уровень администрирования слишком низок");
	    tmp = strtok(cmdtext, idx);
	    giveplayerid = ReturnUser(tmp);
	    if(!strlen(tmp)) return SendMe(playerid, 0x00D900C8, "- Используйте:{FFFFFF} /aunwarn [ID]");
	    if(PINFO[giveplayerid][pAdminLVL] == 0) return SendMe(playerid, 0x00D900C8, "Игрок не администратор!");
	    if(PINFO[giveplayerid][pAwarns] == 0) return SendMe(playerid, 0x00D900C8, "У администратора нет выговоров!");
	    new sstring[300];
	    new adminstring[200];
	    PINFO[giveplayerid][pAwarns] = PINFO[giveplayerid][pAwarns] - 1;
	    format(adminstring, sizeof(adminstring), "{F3FF02}[AUNWARN]{F81414} %s Снял выговор с %s [выговоры {B7FF00}%d/3{F81414}]", GN(playerid), GN(giveplayerid), PINFO[giveplayerid][pAwarns]);
	    AdminMessege(CBLUEE,adminstring,1);
            SavePlayer(giveplayerid);
	}
Вроде все. Если что-то забыл пишите в тему, если есть ошибку пишите в тему, отвечу по возможности. Буду рад объективной критике. Напоминаю код не оптимизирован, так что по поводу этого писать не надо.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу