Главная » Полезные статьи » Расширение функционала при помощи плагинов

Сортировать по: Дате · Названию · Рейтингу · Комментариям · Просмотрам
В этой статье я расскажу Вам, как можно написать систему регистрации с нуля (можно и адаптировать под Ваш Godfather мод). 

Итак, для этого нам понадобятся следующие вещи:
1.Denwer 3 (2012) — через эту программу мы будем запускать и администрировать наш MySQL сервер.  Скачать Denwer 3.

2.MySQL Plugin от g-stylezzz — плагин для работы с базой данных.

Это кинуть в папку Plugins (жми на ссылку)

Это кинуть в папку с сервером (жми на ссылку)  + в server.cfg добавить строку: plugins mysql sscanf 

a_mysql.inc - это кинуть в папку Pawno\Includes

3. Sscanf Plugin — плагин, при помощи которого нам будет удобней и быстрей извлекать данные из результата при выборке из таблицы.

Начнём! 

 - Устанавливаем Denwer, запускаем сервер (на рабочем столе появится ярлык «Start Denwer»). 
 - Заходим в браузер и в адресной строке вводим «localhost» (без кавычек). 
 - Спускаемся ниже и переходим по ссылке: http://localhost/Tools/CODEmyadmin/index.CODE 
 - Итак, вы видите CODEmyadmin, сейчас мы можем управлять базой данных. 
 - Создаём таблицу: 
 - Примерно в центре есть «Create new database». 
 - Я назвал свою БД «pawno», кодировку выбрал «cp1251_bin». 

 

БД создана 



Теперь нам нужно создать таблицу для аккаунтов

Name — Название таблицы, Number of Fields — количество полей. 
Мы используем 3 поля,
1. ID аккаунта, чтобы можно было его распознать в таблице, можно, конечно использовать ник, но с ИД удобней;
2. Ник игрока, думаю тут всё ясно;
3. Пароль игрока.
Таблица создана, сейчас мы настроим наши поля. 

Нажимаем Save.
Все нужное я выделил красным, теперь расскажу, что за что отвечает.
Field — название поля;
Type — тип данных, есть integer (целые числа), string (VARCHAR, TEXT), float, DATE, DATETIME, TIME и т.д., в общем как в павно, тут я использую VARCHAR для строк, и INT для целых чисел.
Length/Values — сколько «ячеек» мы выделяем для поля, для ника 24 (MAX_PLAYER_NAME), для пароля — 64.
Collation — кодировка.
AUTO_INCREMENT — генерирует значения для ID игрока в порядке возрастания (1, 2, 3...).

Так будет выглядеть пустая, без аккаунтов таблица: 

- Базу данных и таблицу мы подготовили, теперь перейдем к моду. 

 - Сверху мода, где вы подключаете все инклюды, добавляем эти строки: 

#include <a_mysql> // SQL функции.
#include <sscanf2> // Извлечение данных.


 - Чуть ниже задефайним парметры БД: 

#define SQL_HOST "localhost" // IP адресс БД.
#define SQL_USER "root" // Login БД.
#define SQL_DB "pawno" // Название БД.
#define SQL_PASS "" // Пароль БД.


- Дефайны для ID'ов диалогов и цвета сообщений. 

#define DIALOG_LOGIN 1
#define DIALOG_REGISTER 2
#define DIALOG_WRONGPAS 3
#define COLOR_LIGHTRED 0xFF6347AA
#define COLOR_YELLOW 0xFFFF00AA


- Создадим массив для хранения данных аккаунта. 

enum Variables {
aID,
aName[MAX_PLAYER_NAME],
aPassword[64],
bool: aLogged,
aWrongPassword,
};
new playerVariable[100][Variables];
// 100 - моё кол-во слотов для игроков на сервере.

- Создадим функцию для подключения и отключения к БД

ConnectMySQL() { // В OnGameModeInIt вставьте ConnectMySQL();
mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS); // Тут мы используем все данные, которые мы дефайнили.
switch(mysql_ping()) { // Проверка на то, что мы подключены к БД.
case 1: print("MySQL connection: alive."); // Если подключена БД.
case -1: print("MySQL connection: dead."); // Если не подключена БД.
}
return 1;
}


DisconnectMySQL() { // Вставьте DisconnectMySQL(); в OnGameModeExit, отключаемся от БД.
mysql_close();
print("MySQL connection closed.");
}


CheckMySQLConnection() {
// Этот сток мы будем использовать для проверки, подключена ли БД перед её использованием.
if(mysql_ping() == -1) mysql_reconnect();
return 1;
}
 
Расширение функционала при помощи плагинов | Просмотров: 14535 | Дата: 11.02.2013 | Комментарии (0)

- Тут у нас стоки для регистрации и логина. 

CreateAccount(playerid, password[]) {
new
query[128],
// Для запроса.
sqlname[MAX_PLAYER_NAME],
sqlpassword[32];
mysql_real_escape_string(playerVariable[playerid][aName], sqlname);
// Защитит от sql inject
mysql_real_escape_string(password, sqlpassword); // Защитит от sql inject
format(query, sizeof(query), "INSERT INTO `Accounts` (`Nickname`, `Password`) VALUE ('%s', '%s')", sqlname, sqlpassword); // Добавляем в таблицу запись.
// INSERT - добавление записи в таблицу, 1. () — поля. 2. VALUE — значения этих полей.
mysql_query(query); // Отправляем запрос.
playerVariable[playerid][aID] = mysql_insert_id(); // Узнаём ИД аккаунта, будет использоваться для сохранения и прочих операций.
strmid(playerVariable[playerid][aPassword], password, 0, 64, 255); // Внедряем в массив аккаунта введенный игроком пароль.
playerVariable[playerid][aLogged] = true; // Мы авторизованы.
return 1;
}
LoadAccount(playerid, password[]) {
new
query[128],
sqlpass[32],
result[5+24+64],
dialog[128];
mysql_real_escape_string(password, sqlpass);
// Защита от SQL Inject, шифрует кодировку.
format(query, sizeof(query), "SELECT * FROM `Accounts` WHERE `Password` = '%s' AND `ID` = '%i'", sqlpass, playerVariable[playerid][aID]);
// SELECT * - выбрать, FROM - с таблицы, WHERE - где, пароль равен введенному паролю и ID равен иду ника человека.
mysql_query(query); // Отправляем запрос.
mysql_store_result(); // Смотрим записи, которые мы выбрали запросом выше.
if(mysql_num_rows() == 1) { // Если выбрало только 1 аккаунт с таким паролем и ИД - успех, пароль введен верно, загружаем данные в массив.
mysql_fetch_row_format(result, "|"); // split, данные в результате записываются типо "1|Snoowker|parol"
sscanf(result, "p<|>is[24]s[32]", // i - ид (int), s[размер] - string, ник и пароль.
playerVariable[playerid][aID],
playerVariable[playerid][aName],
playerVariable[playerid][aPassword]);
playerVariable[playerid][aLogged] = true;
mysql_free_result();
// Очищаем память.
return 1;
}
else {
// Мы ввели неверный пароль.
if(playerVariable[playerid][aWrongPassword] == 4) {
SendClientMessage(playerid, COLOR_LIGHTRED, "Вы 3 раза ввели неверный пароль и были отключены от сервера.");
Kick(playerid);
return 1;
}
playerVariable[playerid][aWrongPassword] ++;
format(dialog, sizeof(dialog),
"Вы ввели неверный пароль.\n\
У Вас осталось %i/3 попыток ввода.", 3 - playerVariable[playerid][aWrongPassword]);
ShowPlayerDialog(playerid, DIALOG_WRONGPAS, DIALOG_STYLE_MSGBOX, "Ошибка.", dialog, "Повтор", "Отмена");
}
return 1;
}
GetAccountID(playerid) {
new
query[128];
format(query, sizeof(query),"SELECT `ID` FROM `Accounts` WHERE `Nickname` = '%s'", playerVariable[playerid][aName]);

// Выбираем ID, с таблицы Accounts, где Ник равен нику игрока.
mysql_query(query); // Отправляем запрос.
mysql_store_result(); // Видим
if(mysql_num_rows() == 1) { // Если у нас в результате выбрало 1 запись, т.е. аккаунт игрока.
playerVariable[playerid][aID] = mysql_fetch_int(); // ИД игрока равен номеру записи.
mysql_free_result(); // Очищаем память.
return playerVariable[playerid][aID]; // Возвращаем ИД игрока.
}
return 0;
}

SaveAccount(playerid) {
// Сохранение аккаунта.
if(playerVariable[playerid][aLogged] == true) { // Проверка, если аккаунт авторизован.
CheckMySQLConnection(); // Проверяем, подключена ли БД.
new
query[186],
sqlname[MAX_PLAYER_NAME],
sqlpass[64];
mysql_real_escape_string(playerVariable[playerid][aName], sqlname);
mysql_real_escape_string(playerVariable[playerid][aPassword], sqlpass);
format(query, sizeof(query), "UPDATE `Accounts` SET `Nickname` = '%s', `Password` = '%s' WHERE `ID` = '%i'", sqlname, sqlpass, playerVariable[playerid][aID]);
mysql_query(query);
// Отправляем запрос
}
return 1;
}


Создадим сток для очистки массивов при коннекте/дисконнекте.

RemovePlayerVariables(playerid) {
playerVariable[playerid][aWrongPassword] = 0;
playerVariable[playerid][aID] = 0;
playerVariable[playerid][aLogged] = false;
return 1;
}


Наши диалоги:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
switch(dialogid) {
case DIALOG_LOGIN: {
// Диалог авторизации.
if(!response) { // Если нажал «Отмена».
SendClientMessage(playerid, COLOR_YELLOW, "* Введите /q(uit), чтобы выйти из игры.");
Kick(playerid);
return 1;
}
if(!strlen(inputtext)) {
// Если поле ввода пустое.
new dialog[134+MAX_PLAYER_NAME];
format(dialog, sizeof(dialog),
"Добро пожаловать на Сервер!\n\
Этот аккаунт зарегистрирован.\n\n\
Логин: %s\n\
Введите пароль:",
playerVariable[playerid][aName]);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Авторизация.", dialog, "Войти", "Отмена");
return 1;
}
LoadAccount(playerid, inputtext);
// Пробуем его авторизовать.
}
case DIALOG_REGISTER: { // Диалог регистрации.
if(!response) { // Если нажал "Отмена".
SendClientMessage(playerid, COLOR_YELLOW, "* Введите /q(uit), чтобы выйти из игры.");
Kick(playerid);
return 1;
}
if(!strlen(inputtext) || strlen(inputtext) < 6 || strlen(inputtext) > 64) {
// Если пустое поле ввода или пароль имеет меньше 6 или больше 64 символов
new dialog[380+24+10];
format(dialog, sizeof(dialog),
"Добро пожаловать на Сервер!\n\
Этот аккаунт не зарегистрирован.\n\n\
Логин: %s\n\
Введите пароль и нажмите \"Далее\".\n\n\
Примечания:\n\
- Пароль чувствительный к регистру.\n\
- Длина пароля от 6 до 32 символов.\n\
- В пароле можно использовать символы на кириллице и латинице.\n", playerVariable[playerid][aName]);
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Регистрация.", dialog, "Далее", "Отмена");
return 1;
}
CreateAccount(playerid, inputtext);
// Создаём аккаунт.

playerVariable[playerid][aLogged] = true; // Авторизуем игрока.


case DIALOG_WRONGPAS: { // Если неверный пароль.
if(response) {
new dialog[134+MAX_PLAYER_NAME];
format(dialog, sizeof(dialog),
"Добро пожаловать на Сервер!\n\
Этот аккаунт зарегистрирован.\n\n\
Логин: %s\n\
Введите пароль:",
playerVariable[playerid][aName]);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Авторизация.", dialog, "Войти", "Отмена");
return 1;
}
else {
// Если нажал "Отмена".
Kick(playerid);
return 1;
}
}
}
return 1;
}
 

Отключаем возможность писать в чат неавторизованному. 

public OnPlayerText(playerid, text[]) 
{
if(playerVariable[playerid][aLogged] == false) return 0;
return 1;
}


Наш OnPlayerConnect. 

public OnPlayerConnect(playerid)
{
RemovePlayerVariables(playerid);
//------------------------------------------------------------------------------
GetPlayerName(playerid, playerVariable[playerid][aName], MAX_PLAYER_NAME);
//------------------------------------------------------------------------------
if(GetAccountID(playerid)) { // Аккаунт зарегистрирован
new dialog[128+MAX_PLAYER_NAME];
format(dialog, sizeof(dialog),
"Добро пожаловать на Сервер!\n\
Этот аккаунт зарегистрирован.\n\n\
Логин: %s\n\
Введите пароль:",
playerVariable[playerid][aName]);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Авторизация.", dialog, "Войти", "Отмена");
}
else {
// Аккаунт не зарегистрирован (return 0, в функции GetAccountID, т.е. не нашло записи с аккаунтом).
new dialog[344+MAX_PLAYER_NAME];
format(dialog, sizeof(dialog),
"Добро пожаловать на Сервер!\n\
Этот аккаунт не зарегистрирован.\n\n\
Логин: %s\n\
Введите пароль и нажмите \"Далее\".\n\n\
Примечания:\n\
- Пароль чувствительный к регистру.\n\
- Длина пароля от 6 до 32 символов.\n\
- В пароле можно использовать символы на кириллице и латинице.\n", playerVariable[playerid][aName]);
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Регистрация.", dialog, "Далее", "Отмена");
}
return 1;
}



Наш OnPlayerDisconnect. 

public OnPlayerDisconnect(playerid, reason)
{
if(playerVariable[playerid][aLogged] == true) SaveAccount(playerid);
return 1;
}

Готово, у нас есть система регистрации. 

Вот так выглядит таблица с аккаунтами:

Основу дал, объяснил. Дальше дорабатывайте сами под свой лад. 

Защиту от съезда полей (из-за sscanf) сами делайте, опять же, тут разжевал основу.  
Автор урока: Snoowker (на SRC — Satellite).

Xtreme Admin 2.2 r1



Поехали:

Уровневая система: Простая конфигурации файла и/или функции в скрипте позволит тебе установить свой уровень. Давайте уже перейдём от старой к новой 10 уровневой системе администратора. Каждая команда имеет свою собственную пре-установку уровня в файле. По умолчанию уровней администратора 10. Всё что вам нужно это открыть файл конфигурации и подправить уровни какие захотите. Всё это – простота скрипта. В заключении, вы можете иметь столько уровней сколько захотите; 1 или 1,000,000! Выбор за вами.
Типичное объяснение конфигурации – Оно безусловно есть , на мой взгляд, лучшая особенность, это позволяет вам настроить каждую команду индивидуально в некотором значении. Что на счёт уровневой системы, так же есть установка конфигурации файлов установленных для этих команд. Потом разок в игре просто пропишите /UCONFIG чтобы обновить изменения. Вот лист переменных, которые вы можете редактировать:

ServerMessage – Эта запоминает серверное сообщение при соединении.

Teleport_X_Offset – Это ответвление для X координат когда вы телепортируетесь или телепортированы
Teleport_Y_Offset - Это ответвление для Y координат когда вы телепортируетесь или телепортированы
Teleport_Z_Offset - Это ответвление для Z координат когда вы телепортируетесь или телепортированы

MinimumPasswordLength – Установить минимальную длину пароля для регистрации.

DisplayServerMessage – Отображать серверное сообщение при входе?

SlapDecrement - Кол-во здоровья которое будет отниматься за шлепок(Slap).

WiredWarnings – Кол-во предупреждений в адрес когда вы связываете кого-либо.

GodWeapons – Дать оружие для /god?

MaxLevel – Максимальный уровень админа.

DisplayCommandMessage – Показать администратора использовавшего команду?

DisplayConnectMessages - Отображать connect и disconnect сообщение?

MaxPing – Максимально допустимый пинг у пользователя, при превышении которого игрок будет кикнут (0 = выключить).

AdminImmunity – Сделать иммунитет админа для пинг-кикера?

PingSecondUpdate – Кол-во секунд за которое будет произведена проверка пинга.

ForbidData - Назначить действие которое будет произведено когда игрок зайдёт на сервер с запрещённым ником (0=ничего, 1=кик, 2=бан)

DisableJailCommands – Ограничить команды связанные с тюремным заключением и посадить за использование оных при этом ограничении.

WireWithPM – Ограничить действия игрока использовавшего Приватные Сообщения, если стоит ограничение.

ExposePMS – Ограничить, когда установлено, ограничения на посылку PM, определённому игроку имя/id , к администраторам.

Player Variables- Переменные игроков находятся с третьей и финальной конфигурации файлов. Эти переменные будут зарегистрированы за каждым файлом конфигурации игрока при регистрации.
Сноска: Это должно будет установлено в скрипте. Эта функция назывется 'CreateUserConfigFile' которая может быть найдена под 'OnFilterscriptInit'.
Добавь переменные к этому, для всего того встроенного что используется в целом скрипте.

Registration System – В перую очередь, префикс Х был перемещён – (это просто уточнение). Новое регистрационное сообщение при входе.

Входящие в состав фскрипта, команды:
/REGISTER- Используй эту команду, если требуется; вы не зарегистрировали аккаунт. В регистрации, вы можете добавить текст в 'OnPlayerRegister' отзыв, если вам нужно установить любое сообщение-уточнение для вашего игрового мода. Так же, вы будете автоматически залогинены и ваш IP будет записан в файл.
/LOGIN- Используйте эту команду, только если ваш IP адрес был изменён и отличный от того, с которого вы в последний раз были залогинены; В другом случае вы будете автоматически залогинены. Ещё раз, это OnPlayerLogin функция.
/LOGOUT- Используйте эту команду, если вы хотите выйти из аккаунта; но если вы выйдите из сервера вы всё равно автоматически завершите сеанс! Дополнительно, тут OnPlayerLogout функция так же.
Ping Kick System – Пинг кик это уникальная система which которая кикнет любого игрока который превысит максимально установленный пинг. Как описано выше, вы можете установить функцию иммунитета для админа, а в игре вы можете использовать /SETPING для этой же цели.
Jail System – Эта система прежде всего для перманентного заключения людей в их камеры, пока не будут освобождены. Используя /XJAIL команду, игрок будет телепортирован в камеру заключения и при респавне он так же будет отправлен туда. Освобождение его от заключения при респавне и освобождение совсем.

Spectator System – На ряду с 0.2 версии, надлежащая система наблюдения была осуществлена. Это работает как волшебство, и вы это сможете увидеть своими глазами. Когда игрок заходит или выходит из транспорта, вам более не нужно перезапускать слежение за ним.

Wire System – Это както оговаривалось, что старая система ограждения приводила к краху сервера с нулём предупреждений, так же в добавок это не никому не давало общаться, когда пытались использовать скрипт с v 0.2. С новой системой ограды, на сервере не будет крашей, и как любая другая система, должна работать идеально с любыми колебаниями.

Giveme System - Да, с созданием динамичности транспорта, включающих XAdmin, админ меню «дай мне» добавило разнообразия и интереса. Меню «дай мне» которое в определённых условиях создаст любой транспорт который вы выберете из меню. При выделении, вы будете посажены в транспорт на том месте где стоите.
Круто не так ли? Если вы дадите себе транспорт в интерьере, он будет добавлен туда – Больше никаких невидимых машин!
«Усовершенствовано Goto и Gethere команды» – При телепортации, вы можете так же быть телепортированы в здание, где находится игрок; были не большие недоделки в версии 0.2 ошибки при телепортации, если вас телепортирует не так как надо, Сделайте это ещё раз! И тогда всё 100% заработает. The same applies for gethere
Небольшие корректировки для gethere. Как уже обсуждалось, вы можете установить ответвления телепортации, используя конфигурацию переменных. Как только вы это изменили, просто напишите /UCONFIG в игре; изменено.

«Admin CHAT SYSTEM» - Знак по умолчанию для админ чата теперь #, с тех пор, как большинство модов не используют знак фунтов для команд чата. Сообщение администрации гарантированно будет оправлено между администраторами находящимися в онлайне и никак не могут быть увиденными игроками.

НИК или ID – Вы можете использовать часть ника (часть имени) для команды вместо ID. Это исправление касается всех версий начиная с v1.3. На это есть причина в конце концов.

Запирание и отпирание машины – Система осуществляется немножко по другому: Сейчас вы можете закрывать и открывать любые транспортные средства. Когда вы выходите из транспорта, оно будет отпёрто, поэтому в этом случае вам не прийдётся отпирать весь вами использованный транспорт или перезапускать мод.

Система присоединения имён – Включена в релиз - смотри Xadmin папку руководства.

Некоторые важные нововведения – И так, этот скрипт, совместим только с SA:MP 0.2. Скрипт был полностью переделан, и значительно улучшен по сравнению с предыдущими версиями. Скрипт использует DCMD для максимальной эффективности процессора., Вы способны воспользоваться такими функциями как, 'IsPlayerXAdmin', 'GetPlayerFileVar', 'GetPlayerFile', 'IsPlayerLevel', и т.д. в вашем фильтрскрипте и игровом моде. В отличии от старой версии, эффективность непосредственно улучшена, и содержит максимальное число базовых особенностей поэтому вам не потребуется доделывать или редактировать скрипт. Now, for the fun stuff. Есть так же меню в определённых системах, таких как /giveme, /weather, и /givecar осуществимые для вас чтобы максимизировать организацию всего процесса в управлении сервером. Перед тем как вы сосредоточитесь на скрипте, с тех пор как появилась динамика в фскриптах, если вы загрузите или перезагрузите фскрипт, то вы будете переподключены, как будто вы просто перезашли на сервер. В заключении, сообщения connect и disconnect имеют свои




1-5 6-8