• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в RAGE Multiplayer.

    Ошибка: Ваша версия Grand Theft Auto V не поддерживается RAGE Multiplayer.
    ERROR: Your game version is not supported by RAGE Multiplayer.

    Данная ошибка говорит о том, что GTA V обновилась до новой версии (GTA Online тоже). Вам необходимо обновить саму игру в главном меню вашего приложения (Steam / Epic Games / Rockstar Games).
    Если после этого RAGE:MP все равно не работает - вам нужно дождаться выхода патча для самого мультиплеера (обычно это занимает от нескольких часов до нескольких дней).

    Новости и апдейты Rockstar Games - https://www.rockstargames.com/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


    Grand Theft Auto 5 (+ GTA Online) последний раз были обновлены:

Вопрос Работа с бд

Valdemar

Новый участник
1 Авг 2025
19
0
3
Подскажите пожалуйста, как работать с базой данных? Именно как взаимодествовать проект -> бд, чтобы сохранялись предметы, для системы домов или же админ системы как пример.
Вроде подключился к mongodb compass, но как работать и что делать дальше не знаю(
 

Вложения

  • 1759238124348.png
    1759238124348.png
    22.1 KB · Просмотры: 29
  • 1759238133226.png
    1759238133226.png
    10.7 KB · Просмотры: 29

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
2,571
250
100
Для начала вам нужно определить структуру вашей базы данных и создать необходимые коллекции (таблицы) для хранения данных о предметах, домах, пользователях и т.д. Затем вам нужно подключить ваш проект к MongoDB с помощью драйвера или ORM (например Mongoose для Node.js). Далее вы сможете выполнять операции чтения, записи, обновления и удаления данных в вашей базе данных. Помимо этого, вы можете создавать запросы для извлечения нужной информации и связывать данные между различными коллекциями. Вы также можете использовать индексы для оптимизации запросов. Надеюсь, это поможет вам начать работу с базой данных!
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,361
2,139
208
36
странные у тебя вопросы вольдемар
погугли что такое субд
как она хранит данные
как с ними работать и как их хранить

ну урок там какой нибудь найди я хз
не применительно к рейджу, потом сам осознаешь
жпт попроси тебе не просто код написать, а ну, серию образовательных уроков провести

это вопрос нихуя не на пару предложений

монго кстати врядли хороший выбор для таких данных как аккичи-хуяккичи и тд
 

Valdemar

Новый участник
1 Авг 2025
19
0
3
странные у тебя вопросы вольдемар
погугли что такое субд
как она хранит данные
как с ними работать и как их хранить

ну урок там какой нибудь найди я хз
не применительно к рейджу, потом сам осознаешь
жпт попроси тебе не просто код написать, а ну, серию образовательных уроков провести

это вопрос нихуя не на пару предложений

монго кстати врядли хороший выбор для таких данных как аккичи-хуяккичи и тд
крч что-бы систему сделать надо еще и выучить работу с базой данных по типу mysql?)
Я просто открыл видео и смотрю что тут есть: кластеры, индексы, схемы, запросы, insern, select, join и тп. :oops:
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,361
2,139
208
36
крч что-бы систему сделать надо еще и выучить работу с базой данных по типу mysql?)
Я просто открыл видео и смотрю что тут есть: кластеры, индексы, схемы, запросы, insern, select, join и тп. :oops:
ну да sql это база
это базово довольно несложный язык если не начинать сразу прыгать в джойны например

индексы + сами селекты-инсерты и общая схема бд это в целом всё что тебе пока нужно
sql очень логичный язык
 

Valdemar

Новый участник
1 Авг 2025
19
0
3
ну да sql это база
это базово довольно несложный язык если не начинать сразу прыгать в джойны например

индексы + сами селекты-инсерты и общая схема бд это в целом всё что тебе пока нужно
sql очень логичный язык
Какую таблицу использовать/посоветуешь? Видел в видео по ragemp, подключение и регистрация mysql на js. Там он phpmyadmin исползовал, но таким видосам уже по 4-5 лет
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,361
2,139
208
36
Какую таблицу использовать/посоветуешь? Видел в видео по ragemp, подключение и регистрация mysql на js. Там он phpmyadmin исползовал, но таким видосам уже по 4-5 лет
phpmyadmin - это просто средство просмотра, это софт, это не субд, как хейди, мс студия или ещё хз че
это веб морда

mysql - субд

майскл-мария дефолт и база в целом тем более в рейдже
обычно наверное чаще юзают марию, потому что это фул фри и фул кайф форк, который стал пизже оригинала
постгря наверное в современности круче и моднее, но посложнее чтобы вкатиться с ходу

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

а так майскуль это база, наверное
самая простая, дешёвая и привычная (ну и мария - это почти одно и то же в целом)
монго - специфическая не реляционная бд для специфических вещей типа каких-то больших структур
 

Valdemar

Новый участник
1 Авг 2025
19
0
3
Тоесть пофиг отображаю я таблицы в phpmyadmin или в MySQL Workbench, но сервер который хранит данные и выполняет sql код - mariadb, который используют в рейдже и вообще?
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,361
2,139
208
36
Тоесть пофиг отображаю я таблицы в phpmyadmin или в MySQL Workbench, но сервер который хранит данные и выполняет sql код - mariadb, который используют в рейдже и вообще?
да воркбренч это тоже просто просмотрщик
 
Реакции: Valdemar

johndoe

Активный участник
10 Май 2025
96
34
30
Какую таблицу использовать/посоветуешь? Видел в видео по ragemp, подключение и регистрация mysql на js. Там он phpmyadmin исползовал, но таким видосам уже по 4-5 лет

Не слушай местных знатоков. Все проекты популярные данные пишут в json файлы, чего и тебе советую. fs в помощь!

p.s. Валдемар, ну ты конечно дал) Основа бд - insert, update, select. Оплати cursor ai за $10 и проси его писать запросы, тогда ничего учить не придется. В противном случае, все что ты напишешь без использования индексов и джоинов будет куском хуйни, которое нужно будет в дальнейшем нормализовать. Но для учебной практики а-ля "потыкать" - можно и кусок хуйни сделать)

Касаемо как поднять - скачай докер, подними образ любой субд и подключайся к ней - скачай mysql, установи, будет дефолт подключение к localhost (есть даже open server вроде программа, там под капотом и база и пхп май админ идет)
 

🐝 ubees

Специалист
11 Фев 2023
560
86
79
41
Не слушай местных знатоков. Все проекты популярные данные пишут в json файлы, чего и тебе советую. fs в помощь!

p.s. Валдемар, ну ты конечно дал) Основа бд - insert, update, select. Оплати cursor ai за $10 и проси его писать запросы, тогда ничего учить не придется. В противном случае, все что ты напишешь без использования индексов и джоинов будет куском хуйни, которое нужно будет в дальнейшем нормализовать. Но для учебной практики а-ля "потыкать" - можно и кусок хуйни сделать)

Касаемо как поднять - скачай докер, подними образ любой субд и подключайся к ней - скачай mysql, установи, будет дефолт подключение к localhost (есть даже open server вроде программа, там под капотом и база и пхп май админ идет)
Опенсервер весит как мамонт, проще ксамп скачать
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,361
2,139
208
36
Не слушай местных знатоков. Все проекты популярные данные пишут в json файлы, чего и тебе советую. fs в помощь!

p.s. Валдемар, ну ты конечно дал) Основа бд - insert, update, select. Оплати cursor ai за $10 и проси его писать запросы, тогда ничего учить не придется. В противном случае, все что ты напишешь без использования индексов и джоинов будет куском хуйни, которое нужно будет в дальнейшем нормализовать. Но для учебной практики а-ля "потыкать" - можно и кусок хуйни сделать)

Касаемо как поднять - скачай докер, подними образ любой субд и подключайся к ней - скачай mysql, установи, будет дефолт подключение к localhost (есть даже open server вроде программа, там под капотом и база и пхп май админ идет)
шутка норм в начале кста

индексы конечно база, джойны - ну типа да конечно НО
орм + правильно спроектированные сущности = нихуясе всё работает само

для того чтобы челу который сегодня первый раз потыкал че такое подключение к субд че то попробовать - нахуй ничего дальше селектов с инсертами пока себе в бошку вбивать не нужно
ну про индексы почитать да
 
Реакции: johndoe

johndoe

Активный участник
10 Май 2025
96
34
30
Опенсервер весит как мамонт, проще ксамп скачать

Я вкинул просто пример) Я в свои 12 лет так поднимал гениальные пет проекты на пхп)))

Естесна самый лучший способ это докер. Поднял все что хочешь, благо в докер хабе тысячи разных образов. Бери любой и работай)
 
Реакции: 🐝 ubees

Harvey Specter

Специалист
BackEnd developer
7 Ноя 2020
268
99
95
Я бы рекомендовал выучить базовый синтаксис SQL. После чего попробуй описать свою таблицу, с ключами, типами данных и тп. Как по мне, лучше всего работать с PostgreSQL, он такой самый продвинутый что по функционалу, что по синтаксису, плюс много чего уже есть на него. Позже как поймешь что такое SQL и как им что-то делать, учи какую-нить ORM. Drizzle/Prisma такое самое последнее и свежее, это чтобы не писать просто raw sql запросы в базу в коде, а то это не удобно, + нету никакой защиты, ее нужно делать.

А лучше всего, начинай это вообще не с рейджа. Создай себе чистый проект, где ты будешь этому обучаться, и пробовать. Я например все ласт проекты делал на bun.sh, там из коробки очень большие возможности уже, не нужно качать все эти пакеты по типу mysql2, которые и древние и медленные. Напиши какой-нить сайтик, который будет с БД взаимодейстовать, и позже эти знания сможешь перенести в рейдж.
 
Реакции: Touch и enotit

Timur(°√ °)

Новый участник
13 Апр 2023
1
0
36
Вот простой пример инвентаря на Node.js + MongoDB
  • коллекция items (владелец, тип, количество, слот);
  • CRUD: список, добавить (в первый свободный слот), перенести, удалить, изменить кол-во;
  • команды: /inv, /giveitem <type> <qty>, /move <from> <to>, /drop <slot>.

1) server/mongo/connect.js​


// Простое подключение к MongoDB (mongoose)
const mongoose = require('mongoose');

module.exports = async function connectDB(
url = process.env.MONGO_URL || 'mongodb://localhost:27017/ragemp'
) {
try {
await mongoose.connect(url, { autoIndex: true });
console.log('[mongo] connected');
} catch (err) {
console.error('[mongo] connection error:', err);
}
};


2) server/models/Item.js​



const { Schema, model } = require('mongoose');

// Один предмет = одна запись (владелец + слот уникальны)
const ItemSchema = new Schema(
{
owner: { type: Number, required: true, index: true }, // id персонажа/игрока
type: { type: String, required: true }, // "Water" | "Phone" | ...
qty: { type: Number, required: true, min: 0, default: 1 },
slot: { type: Number, required: true, min: 0 }, // 0..MAX_SLOTS-1
meta: { type: Object, default: {} },
},
{ timestamps: true }
);

// У одного владельца нельзя положить два предмета в один слот
ItemSchema.index({ owner: 1, slot: 1 }, { unique: true });

module.exports = model('Item', ItemSchema);


3) server/inventory/index.js​



const Item = require('../models/Item');

const MAX_SLOTS = 20;

// ===== helpers =====
function firstFreeSlot(used) {
const set = new Set(used);
for (let i = 0; i < MAX_SLOTS; i++) if (!set.has(i)) return i;
return -1;
}
function ownerIdOf(player) {
// подставь свой способ получения id персонажа
return player.getVariable?.('characterId') ?? player.id;
}

// ===== repo / сервис =====
const Inventory = {
async list(owner) {
return Item.find({ owner }).sort({ slot: 1 }).lean();
},

async add(owner, type, qty = 1) {
const items = await Item.find({ owner }, { slot: 1 }).lean();
const slot = firstFreeSlot(items.map(i => i.slot));
if (slot < 0) throw new Error('Нет свободных слотов');

return Item.create({ owner, type, qty, slot });
},

// упрощённый swap через «временный» слот -1 (без транзакций)
async move(owner, from, to) {
if (from === to) return;

// шаг 1: сдвигаем from -> -1 (если предмет существует)
const a = await Item.findOneAndUpdate(
{ owner, slot: from },
{ $set: { slot: -1 } },
{ new: true }
);
if (!a) throw new Error('Нет предмета в исходном слоте');

// шаг 2: to -> from (если занят)
await Item.findOneAndUpdate(
{ owner, slot: to },
{ $set: { slot: from } },
{ new: true }
);

// шаг 3: -1 -> to
await Item.updateOne({ _id: a._id }, { $set: { slot: to } });
},

async remove(owner, slot) {
await Item.deleteOne({ owner, slot });
},

async setQty(owner, slot, qty) {
qty = Math.max(0, Number(qty) || 0);
if (qty === 0) return this.remove(owner, slot);
await Item.updateOne({ owner, slot }, { $set: { qty } });
},
};

module.exports = { Inventory, ownerIdOf, MAX_SLOTS };


4) server/index.js — подключаем БД и команды​



const connectDB = require('./mongo/connect');
const { Inventory, ownerIdOf, MAX_SLOTS } = require('./inventory');

mp.events.add('packagesLoaded', async () => {
await connectDB();
console.log('[server] ready');
});

// /inv — показать инвентарь
mp.events.addCommand('inv', async (player) => {
const owner = ownerIdOf(player);
const items = await Inventory.list(owner);
const text = items.length
? items.map(i => ${i.slot}:${i.type}x${i.qty}).join(' | ')
: 'пусто';
player.outputChatBox(!{#7fbfff}[INV]!{#ffffff} ${text});
});

// /giveitem <type> <qty>
mp.events.addCommand('giveitem', async (player, full) => {
const [type, qtyStr] = (full || '').trim().split(/\s+/);
if (!type) return player.outputChatBox('Использование: /giveitem <type> <qty?>');
const owner = ownerIdOf(player);
try {
await Inventory.add(owner, type, Number(qtyStr) || 1);
player.outputChatBox(Добавлено: ${type});
} catch (e) {
player.outputChatBox(Ошибка: ${e.message});
}
});

// /move <from> <to>
mp.events.addCommand('move', async (player, full) => {
const [fromStr, toStr] = (full || '').trim().split(/\s+/);
const from = Number(fromStr); const to = Number(toStr);
if (Number.isNaN(from) || Number.isNaN(to))
return player.outputChatBox('Использование: /move <from> <to>');
if (from < 0 || to < 0 || from >= MAX_SLOTS || to >= MAX_SLOTS)
return player.outputChatBox(Слоты: 0..${MAX_SLOTS - 1});

try {
await Inventory.move(ownerIdOf(player), from, to);
player.outputChatBox(Перемещено: ${from} -> ${to});
} catch (e) {
player.outputChatBox(Ошибка: ${e.message});
}
});

// /drop <slot>
mp.events.addCommand('drop', async (player, full) => {
const slot = Number((full || '').trim());
if (Number.isNaN(slot)) return player.outputChatBox('Использование: /drop <slot>');
await Inventory.remove(ownerIdOf(player), slot);
player.outputChatBox(Удалён слот ${slot});
});
 

aspidemon

Начинающий специалист
26 Сен 2022
176
57
85
Подскажите пожалуйста, как работать с базой данных? Именно как взаимодествовать проект -> бд, чтобы сохранялись предметы, для системы домов или же админ системы как пример.
Вроде подключился к mongodb compass, но как работать и что делать дальше не знаю(
Я использую монго и у меня подключение как у тебя, только я еще со своего конфига загружаю строку подключения, советую использовать SQL в связке с редиской - очень полезная штука при большом количестве игроков, к слову монго хорошо подходит именно под игровые сервера, с большой нагрузкой на базу, но если используешь редиску, то смысла от монго не особо много, но все же сможешь через редиску обрабатывать тысяч на 10 больше запросов
 

johndoe

Активный участник
10 Май 2025
96
34
30
Я использую монго и у меня подключение как у тебя, только я еще со своего конфига загружаю строку подключения, советую использовать SQL в связке с редиской - очень полезная штука при большом количестве игроков, к слову монго хорошо подходит именно под игровые сервера, с большой нагрузкой на базу, но если используешь редиску, то смысла от монго не особо много, но все же сможешь через редиску обрабатывать тысяч на 10 больше запросов

Вечный холивар, но как по мне - монго вообще не для гта проектиков придуман был. Есть постгра - её хватает с головой. Если ты конечно каждый тик игры пишешь и читаешь в/из базу/базы - то ты либо ебанат, либо не совсем понимаешь какие данные надо сохранять здесь и сейчас, а какие можно сейвить, к примеру кроной или при выходе с сервера
 
Реакции: Inoi

aspidemon

Начинающий специалист
26 Сен 2022
176
57
85
Вечный холивар, но как по мне - монго вообще не для гта проектиков придуман был. Есть постгра - её хватает с головой. Если ты конечно каждый тик игры пишешь и читаешь в/из базу/базы - то ты либо ебанат, либо не совсем понимаешь какие данные надо сохранять здесь и сейчас, а какие можно сейвить, к примеру кроной или при выходе с сервера
Когда у тебя 500 игроков и, пускай даже 50 человек открывают какой-нибудь инвентарь - то сложно будет тебе с базой, а вот редиска помогает, по своей сути редиска выступает хешем в котором и записано то, что в базе, с редиской взаимодействуют и быстро за считанные миллисекунды получают данные, в любом случае монго лучше чем любая сикюль без редиски, но с редиской сикюль будет выигрывать монго, лично для моих нужд монго подходит с головой

p.s. редиска только первый запрос долго обрабатывает, потому что ей нужно записать в себя данные, а далее все как по маслу
 

johndoe

Активный участник
10 Май 2025
96
34
30
Когда у тебя 500 игроков и, пускай даже 50 человек открывают какой-нибудь инвентарь - то сложно будет тебе с базой, а вот редиска помогает, по своей сути редиска выступает хешем в котором и записано то, что в базе, с редиской взаимодействуют и быстро за считанные миллисекунды получают данные, в любом случае монго лучше чем любая сикюль без редиски, но с редиской сикюль будет выигрывать монго, лично для моих нужд монго подходит с головой

p.s. редиска только первый запрос долго обрабатывает, потому что ей нужно записать в себя данные, а далее все как по маслу

Брат, давай по порядку)

1. Редис изначально был в бОльшей степени придуман для кэширования запросов (чтобы каждый раз не делать выгрузку из БД - мы результат записываем туда и уже при повторном запросе достаём оттуда данные и отдаем в ответ). Разумеется, распинаться про инвалидацию кэша, ttl и прочего я не буду

2. Кейс с инвентарём. Что тебе мешает при загрузке персонажа выгружать его предметы в инвентарь в память твоего приложения (сервера)? И уже при открытии инвентаря (хоть по тысячу раз в секунду) - отдавать предметы из памяти сервера (которые тебе отдадутся моментально), нежели каждый запуск инвентаря бегать в БД (или редис, кек) и просить предметы? Тут же следом еще один вопрос: что тебе мешает каждое изменение состояния инвентаря пушить в стор на фронт? Чтобы вообще никого не ждать и просто показывать инвентарь?

И снова я вижу сильные пробелы в знаниях, когда говорят что под проект в гта (де факто классическое клиент-серверное приложение) монго (документно-ориентированная) лучше чем реляционная (кек сука :jer: )

И вот подобные ответы и аргументы будут всегда, пока люди не поймут достаточно очевидную истину. База данных это про:
положил данные, данные лежат
Нужны данные?
прочитал данные
Что-то поменялось?
Обновил данные.
Все.

@Inoi где моя плашка "биг хик кодыр" ?

upd: Повторюсь - если в вашем моде вы каждое изменение состояния обновляете в бд моментально (при онлайне 5 человек - ок, при онлайне в 500 - пиздец), то возможно вы что-то делаете неправильно
 
Реакции: Inoi и aspidemon

Similar threads