-
Последние посетители 0 пользователей онлайн
Ни одного зарегистрированного пользователя не просматривает данную страницу
-
Похожий контент
-
От INewBRO
Хотел записать в базу данные об игроке (пароль, ник и т.д) Но происходит ошибка и оно не записывается. Я написал чтобы ошибки сохранялись в файл. Комментарием отметил где ошибка
Лог:
-
От DEST
ДИНАМИЧЕСКИЕ ЗОНЫ (streamer плагин)
ОБЩЕЕ ОПИСАНИЕ:
Как я заметил, многие интересуются, как создать действие для игрока в какой-либо определенной точке карты. Например, как выдать игроку бутылку пива автоматически при заходе в клуб? Конечно, можно это сделать, создав секундный таймер и выполнять действия там, но как по мне, динамические зоны справятся с этим лучше.
ТРЕБОВАНИЯ:
Для работы необходимо:
1) Плагин streamer.
2) Инклуд streamer.
Желательно иметь актуальную версию плагина и инклуда, хотя это не обязательно.
ТЕХНИЧЕСКОЕ ОПИСАНИЕ РАБОТЫ:
Принцип работы данных зон прост: когда игрок заходит в зону, которая создается кстати, в виде геометрических фигур (об этом позже) для него срабатывает коллбэк - OnPlayerEnterDynamicArea. После того, как игрок покидает динамическую зону для него срабатывает другой коллбэк - OnPlayerLeaveDynamicArea. В оба эти коллбэка поступают одинаковые аргументы - playerid, areaid. Где playerid - ид игрока, который вошел / покинул зону, а areaid - ид самой зоны.
ТИПЫ СОЗДАВАЕМЫХ ЗОН:
1) Круг. Для создания данной зоны потребуются X и Y координата центра круга, а также радиус создаваемой зоны.
2) Прямоугольник. Для создания данной зоны, необходимо иметь координаты противоположных углов, образующих прямоугольник.
3) Сфера. Для данной зоны требуются X, Y, Z координаты центра сферы и ее размер (радиус).
4) Куб. Точно также как и прямоугольник, только потребуются еще и Z координаты противоположных углов. Рисунок не требуется.
Пример использования:
new zone_army; public OnGameModeInit(playerid) { zone_army = zone51 = CreateDynamicCube(-13.0555,1702.1824, 15.0,405.9110, 2071.6646, 850.0); return 1; } public OnPlayerEnterDynamicArea(playerid, areaid) { if(areaid == zone_army) SendClientMessage(playerid,-1,"Покиньте охряняемую зону. Иначе будет открыт огонь."); return 1; } public OnPlayerLeaveDynamicArea(playerid, areaid) { if(areaid == zone_army) SendClientMessage(playerid,-1,"Благодарим за понимание."); return 1; } Пример взят с сайта forum-pawno.ru.
СВЯЗАННЫЕ ФУНКЦИИ:
DestroyDynamicArea(areaid); - уничтожение динамической зоны. IsValidDynamicArea(areaid); - проверка за существование динамической зоны с данным ID. TogglePlayerDynamicArea(playerid, areaid, toggle); - скрытие динамической зоны для игрока. TogglePlayerAllDynamicAreas(playerid, toggle); - скрытие всех динамических зон для игрока. IsPlayerInDynamicArea(playerid, areaid); - проверка на нахождение игрока в динамической зоне с определенным ID. AttachDynamicAreaToPlayer(areaid, playerid); - прикрепление динамической зоны с определенным ID к игроку. AttachDynamicAreaToVehicle(areaid, vehicleid); - прикрепление динамической зоны с определенным ID к машине. DestroyAllDynamicAreas(); - уничтожение всех динамических зон. CountDynamicAreas(); - подсчет количества динамических зон. Внимание! К игрокам и машинам можно прикрепить только зоны с типом круг и сфера.
На этом все!
Благодарности:
Благодарность выражается следующим веб-ресурсам:
forum-pawno.ru
forum.sa-mp.com
Автор: @DEST.
-
От MartinJoys
Всем привет на связи MartinJoys | Cherlock
Cегодня мы научимся делать вип аккаунты по времени, с автоматическим удалением по истечению времени.
Перейдем в самый вверх вашего мода и впишем туда этот код:
Теперь необходимо установить подключение к базе при включении мода, перейдем в OnGameModeInit и впишем туда этот код:
mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DB, MYSQL_PASS); //устанавливаем подключение switch(mysql_ping()) { case 1: print("Соединение установлено"); // Если подключена БД. case -1: print("Нет соединения с БД"); // Если не подключена БД. }
Теперь если все будет нормально то в консоли появится инфа о том что соединение установлено.
Сейчас сделаем отключение от базы при выключении/перезагрузке мода, перейдем в OnGameModeExit и впишем:
mysql_close(); Теперь нужно сделать проверку, переходим в OnPlayerConnect и вписываем:
Теперь построим команду для выдачи випки. Внимание команда построена на YCM
Теперь сделаем функцию выдачи випки, перейдем в низ вашего мода и напишем следующий код:
Теперь нужно создать таблицу в нашей бд:
Создаем таблицу с именем Donate, делаем 2 столбца Name и Days.
В первом укажем значение string(24), а во втором int(11).
Необходимые для работы инклуды а так же плагины можете скачать по этой ссылкам:
http://rghost.ru/40382201
http://rghost.ru/40382221
http://rghost.ru/40382234
http://rghost.ru/40382569
Автор: Я MartinJoys | Cherlock
-
От Nikita_Wrhavskiy
Вопрос такой ребята как на php сделать так что что бы когда на сайте меняется статус аккаунта к примеру "онлайн" был зелёным цветом а "оффлайн" красным то есть работает через mysql базу статус аккаунта
-
От Antoxa39
Дратути,я научился делать регистрацию, и хочу поделится со всеми как это сделать им самим.
1.Нам потребуется: Denwer или Open Server. ( Урок про подключение я делал ранее, так что обьяснять сейчас что и как делать для подключения не буду, но урок можно посмотреть тут)
2.MySQL R39-6.
3. Прямые руки.
4. Переходим к процессу.
//P.S БД - База Данных
Делаем подключение к БД.
main(){} #include <a_samp> #include <a_mysql> #include <Pawn.CMD> #include <sscanf2> #include <streamer> #include <time> //-------------- SQL ---------------------- new dbHandle; #define MYSQL_HOST "127.0.0.1" #define MYSQL_USER "mysql" #define MYSQL_BD "urok" #define MYSQL_PASSWORD "mysql" //------------------------ public OnGameModeInit() { dbHandle = mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_BD,MYSQL_PASSWORD); CheckConnectSQL(); return 1; } public OnGameModeExit() { return 1; } stock CheckConnectSQL() { if(mysql_errno()) printf("Подключение к БД %s прервалось. Код ошибки: %d",MYSQL_BD,mysql_errno()) else printf("Подключение к БД %s успешно!",MYSQL_BD) return 1; }
Подключение сделано.
Далее мы должны сделать такое: Когда игрок заходит на сервер, нужно проверить есть ли игрок с таким Никнеймом в БД.
Делаем массив,который будет хранить в себе пароль,имя игрока. ( сделаем еще и уровень ).
// перед -------------- SQL ---------------------- создаем enum //Enum - это вещь, позволяющая создавать большее количество адресов одной переменной enum pInfo{ pID, pNick[24], pPassword[32], pLevel } new Player[MAX_PLAYERS][pInfo];//Мы обьявили переменную,которая будет хранить в себе наш Enum. Идем создавать БД.
1.
2.
3.
4.
5. Идем обратно к скриптингу
И вот тут, мы сделаем проверку есть ли в БД аккаунт с таким никнеймом.
public OnPlayerConnect(playerid) { GetPlayerName(playerid,Player[playerid][pNick],MAX_PLAYER_NAME);//Мы записали ник игрока в массив pNick. new query[100];//создаем переменную с запросом. format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);//Форматируем запрос, SELECT * FROM, то есть //загружаем всю информацию о игроке с ником, записаным в pNick. mysql_function_query(dbHandle,query,true,"CheckPlayerBD","i",playerid);//Посылаем запрос в БД, указываем ИД подключение - dbHandle. true - потому что мы хотим получить информацию. И вызываем следующим паблик "CheckPlayerBD" return 1; } //в конец мода forward CheckPlayerBD(playerid); public CheckPlayerBD(playerid) { new rows,fields; cache_get_data(rows,fields);//Проверили есть ли строка с таким именем. if(!rows)//если нет такого игрока то показываем регистрацию { ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Приветствуем Вас! Вы еще не зарегистрированы,введите свой пароль ниже.", "Далее", ""); } else { ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Рады видеть Вас снова на Urok. Авторизуйтесь.", "Далее", ""); cache_get_field_content(0,"pPassword",Player[playerid][pPassword],dbHandle);//Загружаем пароль игрока из БД. } return 1; } Я мог сделать ИД диалогов через енум, но для примера можно и так.
Далее идем в OnDialogResponse
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { //case 1 это регистрация case 1: { if(!response) return Kick(playerid); // если игрок отказывается от регистрации кикаем его. if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0) return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Длина пароля от 4 до 32 символов.\n Вы также не можете продолжить не указав пароль", "Далее", ""); //это была проверка на длину пароля for(new i; i < strlen(inputtext); i++) { switch(inputtext[i]) { case 'A'..'Z','a'..'z','0'..'9':continue; default: return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Пароль может быть только: a-z, A-Z,0-9", "Далее", ""); } } //это проверка на символы,если игрок будет писать пароль на русском, или какие нибудь другие символы //например \*? то ему будет возвращатся этот же диалог,а если все отлично то регистрация продолжится. new query[120 + MAX_PLAYER_NAME];//также создали запрос format(query,sizeof(query),"INSERT INTO `account` (`pNick`,`pPassword`,`pLevel`) VALUES ('%s','%s','1')"),Player[playerid][pNick],inputtext); /*Мы отформатировали строку,сделав в ней запрос: Добавить строку в таблице account, со столбцами pNick = '%s', %s значит строка в данном случае эта строка, это массив который хранит в себе никнейм игрока,inputtext это введеный текст игроком, pLevel это уровень игрока,изначально в бд он будет 1.*/ mysql_query(dbHandle,query); //теперь делаем запрос на загрузку акканута. new query1[100]; format(query1,sizeof(query1),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);//отфарматироваали новый запрос mysql_function_query(dbHandle,query1,true,,"LoadAcc","i",playerid); } } case 2: { if(!response) return Kick(playerid); // если игрок отказывается от авторизации также кикаем его. if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0) return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Неверный пароль", "Далее", "");//Делаем проверку на длину пароля, т.к при регистрации у нас пароль был от 4 до 32, тут тоже самое должно быть for(new i; i < strlen(inputtext); i++) { switch(inputtext[i]) { case 'A'..'Z','a'..'z','0'..'9': continue;//если он также вводит правильные символы продолжаем выполнение кода для игрока. default: return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Не верный пароль!", "Далее", "");// при вводе спец.символов ему будет возвращать диалог авторизации } } new query[120]; format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s' AND `pPassword` = '%s'",Player[playerid][pNick],inputtext)//Загрузить информацию о игроке,и проверить совпадает введеный пароль игроком,с тем который в БД. mysql_function_query(dbHandle,query,true,"CheckPass","i",playerid); } return 1; } //создаем паблик LoadAcc forward LoadAcc(playerid); public LoadAcc(playerid) { Player[playerid][pID] = cache_get_field_content_int(0,"pID",dbHandle);// 0 потому что в БД может быть только одна строка с таким именем или ИД Player[playerid][pLevel] = cache_get_field_content_int(0,"pLevel",dbHandle);// приравнение, то есть записываем Левел и ИД игрока в наши массивы. //Пароль и никнейм загружать не надо } forward CheckPass(playerid); public CheckPass(playerid) { new rows,fields; cache_get_data(rows,fields);//сверяем пароль if(rows) { //если веденный пароль совпадает с паролем в БД то авторизуем игрока SpawnPlayer(playerid); SendClientMessage(playerid,-1,"Вы успешно авторизовались!"); } else { //если нет то считаем попытки ввода пароля SetPVarInt(playerid,"wrong_password",GetPVarInt(playerid,"wrong_password") + 1) ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Авторизация","Не верный пароль!","Далее",""); new str[64]; format(str,sizeof(str),"У вас осталось: %d попыток",GetPVarInt(playerid,"wrong_password")); SendClientMessage(playerid,-1,str);//форматируем строку, где говорим игроку сколько у него осталось попыток if(GetPVarInt(playerid,"wrong_password") >= 5) return Kick(playerid);//если игрок использовал больше 5 попыток, то кикаем его } } и в OnGameModeExit()
public OnGameModeExit() { mysql_close(dbHandle);//отключаемся от БД return 1; }
-