This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

Как записать координаты игрока в базу данных? Или не срабатывает событие playerQuit

yagyar001

Новый участник
7 Июл 2021
38
3
18
Всем привет. Начал изучать разработку. Нужно записать в базу координаты, откуда игрок вышел из игры. Но вот беда, событие
Код:
playerQuit
не отлавливается вообще. Пример, который приведен в wiki:
Код:
function playerQuitHandler(player, exitType, reason) {
  let str = player.name;

  if (exitType != "kicked") {
    str += " quit.";
  } else {
    str = ` kicked. Reason: ${reason}.`;
  }

  console.log(str);
}

mp.events.add("playerQuit", playerQuitHandler);
Не работает. Все делаю на серверной стороне. Как можно сохранить по другому координаты? Или почему не срабатывает это событие? Могу предположить, что просто не успевает срабатывать, когда игру закрываешь. Но как то же серверы пишут последние координаты в базу.
 

JFounder

Участник портала
14 Сен 2021
29
7
55
JavaScript:
mp.events.add('playerQuit', async (player) => {
    if(player.getVariable('loggedIn') === false) return;
    let name = player.name;
    try {
        const [status] = await mp.db.query('UPDATE `accounts` SET `position` = ? WHERE username = ?', [JSON.stringify(player.position), player.name]);
        if(status.affectedRows === 1) console.log(`${name}'s data successfully saved.`);
        console.log(`${name} has quit the server.`);
    } catch(e) { errorHandler(e) }
})
Думаю не составит труда переписать для себя.
 

yagyar001

Новый участник
7 Июл 2021
38
3
18
Благодарю за ответ, результат есть, но ругается теперь на переменную
Код:
connection
:

Причем в этом же файле используется эта переменная для подключения к базе и все работает. Можешь подсказать, в чем проблема?
Файл подключения к базе:
JavaScript:
const mysql = require('mysql');

// Создаём подключение к БД

mp.events.add('packagesLoaded', () => {
    const connection = mysql.createConnection({
        host: 'localhost', //Хост !
        user: 'root',       //Пользователь БД !
        database: 'server',   //Название БД !
        password: 'root',
        waitForConnections: true,
        connectionLimit: 10,    //Максимальное количество подключений **
        queueLimit: 0
    });

exports.connection = connection;
    //Проверка подключения к БД
    connection.connect(function(err) {
        if(err) {
            console.log(`Ошибка подключения БД. Включаю отладку: ` + err.stack);
            return;
        }
        console.log('[SERVER] Успешное подключение к БД!');
    });
});

//Делаем возможность подключения других файлов к БД

Файл, из которого идет запрос к базе:
JavaScript:
let bcrypt = require('bcrypt');
let saltRounds = 10;
let counter = 4;

const DB = require('../system/DB.js');

mp.events.add('playerReady', player => {
    player.login = false;
    player.isPlayerLogged = () => player.login;
    player.call('showLoginDialog');
});

mp.events.add('playerQuit', async (player) => {
    if (player.isPlayerLogged() === false) return; // проверка авторизации игрока
    try {
        const [status] = await mp.DB.connection.query('UPDATE accounts SET lastPosX = ?, lastPosY = ?, lastPosZ = ? WHERE login = ? LIMIT 1', [player.position.x, player.position.y, player.position.z, player.login], function(err) {
            if (status.effectedRows == 1) {
                console.log(`ПОзиция игрока ${player.login} обновлена`);
            }
            console.log(`Игрок ${player.login} вышел`);
        });
    } catch (error) {
        console.log('error', error);
       
      }
});

mp.events.add('onLoginAttempt', (player, data) => {
    data = JSON.parse(data);

    DB.connection.query('SELECT * FROM accounts WHERE login = ? LIMIT 1', [data.login], function (err, results) {
        if (counter == 0) { // 3 раза неверный пароль - кик
            player.kick();
        }

       
        if (results.length == 0) {
            return player.call('showAuthError', [`Неверный логин или пароль. Осталось попыток: ${--counter}`]);
        }

        let dbPass = results[0].pass;

        bcrypt.compare(data.password, dbPass, function(err, isMatched) {
            if (isMatched) {
                player.login = true;
                player.call('hideLoginDialog');
            } else {
                player.call('showAuthError', [`Неверный логин или пароль`]);
            }
        });

        if (data.password == dbPass) {
            player.login = true;
            player.call('hideLoginDialog');
        } else {
            player.call('showAuthError', [`Неверный логин или пароль. Осталось попыток: ${--counter}`]);
        }
    })
});

mp.events.add('onRegisterAttempt', (player, data) => {
    data = JSON.parse(data);

    DB.connection.query('SELECT * FROM accounts WHERE login = ? LIMIT 1', [data.login], function (err, results) {
        if (results.length == 1) {
            return player.call('showAuthError', [`Игрок с ником ${data.login} существует, придумайте другой ник`]);
        }
        bcrypt.hash(data.password, saltRounds, function(errHash, passwordHash) {
            DB.connection.query('INSERT INTO accounts SET login = ?, pass = ?, socialClub = ?', [data.login, passwordHash, player.rgscId], function(err, results) {
                if (!err) {
                    return player.call('hideLoginDialog');
                } else {
                    return console.log(`ошибка: ${err}`);
                }
            });
        });
    })
});
 
Последнее редактирование:

kurlikmurlik

Участник портала
18 Сен 2021
91
12
53
Код:
mp.events.add('packagesLoaded', () => {
    const connection = mysql.createConnection({
        host: 'localhost', //Хост !
        user: 'root',       //Пользователь БД !
        database: 'server',   //Название БД !
        password: 'root',
        waitForConnections: true,
        connectionLimit: 10,    //Максимальное количество подключений **
        queueLimit: 0
    });

exports.connection = connection;
    //Проверка подключения к БД
    connection.connect(function(err) {
        if(err) {
            console.log(`Ошибка подключения БД. Включаю отладку: ` + err.stack);
            return;
        }
        console.log('[SERVER] Успешное подключение к БД!');
    });
});

Увидел это и аж сердце заболело, отвечаю.

Автор из серии: прочитал вчера про джаваскрипт, а завтра пошёл делать рп мод.
 

yagyar001

Новый участник
7 Июл 2021
38
3
18
Я только учусь
 

kurlikmurlik

Участник портала
18 Сен 2021
91
12
53
Я только учусь
Нет, ты задаёшь вопросы на форуме, вместо того, чтобы читать нормально документацию. У тебя экспорт из функции, которая передана в рейджовский эвент. Тебя это не смущает?
 

yagyar001

Новый участник
7 Июл 2021
38
3
18
Пока не очень) Ну другой запрос к базе выполняется же. А на UPDATE ошибка
 

TTox421

Участник портала
23 Май 2021
65
19
65
Как же люблю умников которые вместо того что бы помочь начинающему показывают блестание своих мегаумов.
 
Реакции: yagyar001

TTox421

Участник портала
23 Май 2021
65
19
65
Пока не очень) Ну другой запрос к базе выполняется же. А на UPDATE ошибка
Код:
const mysql = require('mysql')
const connection = mysql.createConnection({
    host: 'localhost', //Хост !
    user: 'root',       //Пользователь БД !
    database: 'server',   //Название БД !
    password: 'root',
    waitForConnections: true,
    connectionLimit: 10,    //Максимальное количество подключений **
    queueLimit: 0
});

//Проверка подключения к БД
connection.connect(function(err) {
    if(err) {
        console.log(`Ошибка подключения БД. Включаю отладку: ` + err.stack);
        return;
    }
    console.log('[SERVER] Успешное подключение к БД!');
});

exports.connection = connection;
 
Последнее редактирование:

kurlikmurlik

Участник портала
18 Сен 2021
91
12
53
Какже люблю умников, которые вместо того, чтобы ознакомиться с технологией с открытых источников, задают глупые вопросы на форумах, когда изначально не знают даже элементарных основ.
 

TTox421

Участник портала
23 Май 2021
65
19
65
А нахер ты высираешь свое мнение, ты либо помоги человеку либо нахер твой текст тут нужен? Ты можешь составить напутствие, а не тупорылую критику с обсиранием человека. Вот именно из за таких как ты в it очень много токсичности. Человек обучается, нахуй его хейтить с азов? Когда так сложно просто скинуть ссылку на документацию и показать, что нужно читать. От твоих комментариев кроме раздора толку 0.
 

TTox421

Участник портала
23 Май 2021
65
19
65
Пока не очень) Ну другой запрос к базе выполняется же. А на UPDATE ошибка
Когда выполняешь запросы, проверяй их в БД, локальном или уже на сервере где то, если запрос выполняется, значит какая то ошибка в подключении, если запрос не выполняется, ошибка в самом запросе.

 
Реакции: yagyar001

qwerty12355

Участник портала
27 Мар 2021
27
7
28
Ты экспортишь connection, которого нет в глобал скоупе файла, вот и ошибка
 
Реакции: yagyar001

kurlikmurlik

Участник портала
18 Сен 2021
91
12
53
Может я сам решу где и какое мне мнение высирать?) Человек, который является автором темы, не учится. Человек, который учится, читает книги, документацию, в крайнем случае смотрит видео. Тут человеку лень, ему хочется побыстрее рп мод написать. Ему не поможет ответ на форуме, ему поможет желание развиваться самому.
 

TTox421

Участник портала
23 Май 2021
65
19
65
Каким образом ты решил что ему хочется рп мод писать побыстрее?
 

TTox421

Участник портала
23 Май 2021
65
19
65
Пока не очень) Ну другой запрос к базе выполняется же. А на UPDATE ошибка
Код:
mp.events.add('playerQuit', async (player) => {
    if (player.isPlayerLogged() === false) return; // проверка авторизации игрока
    try {
        DB.connection.query('UPDATE accounts SET lastPosX = ?, lastPosY = ?, lastPosZ = ? WHERE login = ? LIMIT 1', [player.position.x, player.position.y, player.position.z, player.login], function(err) {
            if (status.effectedRows == 1) {
                console.log(`ПОзиция игрока ${player.login} обновлена`);
            }
            console.log(`Игрок ${player.login} вышел`);
        });
    } catch (error) {
        console.log('error', error);
      
      }
});
 
Реакции: yagyar001

yagyar001

Новый участник
7 Июл 2021
38
3
18
Спасибо за помощь и поддержку. Жаль, что не все люди понимают для чего придумали раздел форума "Решение проблем и помощь".
 
Последнее редактирование:

yagyar001

Новый участник
7 Июл 2021
38
3
18
Захотел бы "написать" рп мод, взял бы слитый. Да и Бог достатком не обделил, чтобы с нуля заказать разработку мода. Но хочу сделать сам. Да, js знаю сносно. Node js тоже. И API rage mp открыл несколько недель назад. Неужели сложно помочь? Так если не хочешь, дело твое. Не отвечай в теме, так ты тоже поможешь, причем лучше, чем ответил бы по делу.
 
Реакции: Harland David Sanders

kurlikmurlik

Участник портала
18 Сен 2021
91
12
53
Я привык помогать в сложных вопросах, где ответ лежит глубоко в документации, или приходит только с практикой. Помогать лентяем я не привык, извини.
 

qwerty12355

Участник портала
27 Мар 2021
27
7
28
Ты экспортишь connection, которого нет в глобал скоупе файла, вот и ошибка
вообще я бы так сделал, если бы не юзал ORM и domain driven design

JavaScript:
const connection = exports.connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  database: "usersdb",
  password: "пароль_от_сервера"
});

mp.events.add('packagesLoaded', () => {
  connection.connect((err) => {
    if (err) {
      console.error('Ошибка при подключении к БД');
      throw err;
    } else {
      console.log('Подключение к серверу MySQL успешно установлено');
    }
  });
});