FiveM магазин и банк грабёж скрипты: setup и разработка на сервере

Как установить и дизайнировать магазин и банк грабежи на FiveM: количество полиции, server-side cooldowns, награды даны только сервером, оповещения полиции и проверки расстояния.

Симптом: игроки грабят магазин с нулевым количеством полиции онлайн, одинаковый магазин грабится десять раз подряд, или cheater запускает одно событие и получает целый выплату.

Скрипт грабежа это маленькая состояние машина сервера: проверьте правила, начните, ждите, платите. Большинство exploits происходят из помещения тех шагов на клиента. Эта статья охватывает безопасный дизайн и ошибки конфига которые вызывают проблемы выше.

Поток который вы хотите

Думайте каждого грабежа как четыре шага, и запускайте шаги 1, 2 и 4 на сервере:

  1. Начало запроса: клиент просит грабить магазин. Сервер проверяет количество полиции, cooldown, расстояние и что никто уже не грабит его.
  2. Блокировка: сервер помечает магазин как грабущийся и устанавливает cooldown.
  3. Действие: клиент воспроизводит полосу прогресса, взлом или отмычка.
  4. Завершение: клиент сообщает сделано, сервер проверяет время которое прошло и расстояние снова, затем платит.

Клиент только обрабатывает визуалы. Это никогда не решает исход.

Количество полиции

Требуйте минимальное количество офицеров на duty, посчитано на сервере. Скрипт который читает количество из клиента, или из значения которое клиент отправляет, тривиален обойти. Код подсчёта находится в установка полиция работы. Проверьте это когда грабёж начинается, и решите должна ли это быть проверена снова перед выплатой.

Cooldowns хранящейся на сервере

Держите состояние в таблице сервера, с ключом по id локации:

lua
-- server
-- [id] = { busy = bool, last = os.time(), robber = source, started = os.time() }
local robberies = {}

local function canRob(id, cooldown)
    local state = robberies[id]
    if not state then return true end
    if state.busy then return false end
    return (os.time() - state.last) >= cooldown
end

Два детали важны:

  • Таблица в памяти сбрасывается когда ресурс перезагружается. Если вы хотите cooldown пережить перезагрузку, сохраняйте время последнего грабежа в базе данных.
  • Установите busy когда грабёж начинается и очистите это когда он заканчивается или когда грабитель отключается, или магазин остаётся заблокирован навсегда.

Награды только из сервера

Самый распространённый exploit это событие награды которое клиент может запустить самостоятельно:

lua
-- WRONG: any client can fire this
RegisterNetEvent('robbery:reward', function(amount)
    exports.ox_inventory:AddItem(source, 'money', amount)
end)

Исправление это вообще не иметь то событие. Сервер решает сумму и платит внутри кода который проверил грабёж:

lua
-- server (ox_lib callback)
lib.callback.register('robbery:finish', function(source, id)
    local state = robberies[id]
    if not state or state.robber ~= source then return false end
    if os.time() - state.started < Config.MinDuration then return false end

    local ped = GetPlayerPed(source)
    if #(GetEntityCoords(ped) - Config.Stores[id].coords) > 5.0 then return false end

    state.busy = false
    state.last = os.time()
    local amount = math.random(Config.Reward.min, Config.Reward.max)
    exports.ox_inventory:AddItem(source, 'money', amount)
    return true
end)

Обратите внимание на три проверки: одинаковый игрок начал это, достаточно времени прошло, и игрок всё ещё в магазине. Расстояние на сервере работает потому что сервер знает позицию игрока с OneSync. Смотрите защита события сервера и сервер callbacks для паттерна.

Внимание: имя предмета для наличности зависит от вашей настройки. Используйте предмет или функцию фреймворка которую ваш сервер использует для денег, и держите её на сервере.

Оповещение полиции

Скажите офицерам когда грабёж начинается, из сервера, каждому офицеру на duty:

lua
-- server: send to each on-duty officer you found with your police count
TriggerClientEvent('robbery:policeAlert', officerSrc, Config.Stores[id].coords, Config.Stores[id].label)

На клиенте, добавьте blip и уведомление. Вы также можете передать оповещение вашему dispatch ресурсу вместо построения вашего собственного, что даёт офицерам одно место для всех вызовов. Маленькая задержка или шанс молчаливой сигнализации делает грабёж менее написанным. Blips охватываются в создание blips.

Распространённые ошибки конфига

  • Количество полиции установлено на 0 во время тестирования, затем оставлено таким образом на живом сервере.
  • Диапазон награды слишком высок. Грабёж который платит больше часа любой работы получает farmed. Сравните с вашей зарплатой, как в балансировка экономики сервера.
  • Cooldown слишком короткий. С несколькими магазинами и быстрыми cooldowns, игроки ротируют между ними.
  • Нет проверки расстояния на шаге завершения, поэтому игрок может начать грабёж и собрать его со всей карты.
  • Предметы необходимые (отмычка, буровая установка) никогда не удаляются, или удаляются на клиенте.
  • Флаг Busy никогда не очищается после отключения или ошибки скрипта.
  • Координаты скопированы с другой карты. Если вы используете другой MLO или карту, локация магазина неправильна.

Тестируйте со вторым аккаунтом который не админ, потому что разрешения админа могут скрыть отсутствующую проверку.

Контрольный список

Симптом Решение
Грабёж с нулевым количеством полиции онлайн Считайте офицеров на duty на сервере, установите минимум выше 0
Магазин грабится снова сразу Добавьте cooldown сервера с ключом по id магазина
Cheater получает выплату Удалите события награды клиента, платите внутри проверенного кода сервера
Выплата издалека Проверьте расстояние на сервере в начале и завершении
Магазин заблокирован навсегда Очистите флаг busy при завершении, отказе и отключении
Cooldown потерян при перезагрузке Сохраняйте время последнего грабежа в базе данных

Короткие ответы

Где должно быть хранено cooldown грабежа?

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

Почему игроки получают деньги из грабежей без их выполнения?

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

Сколько полиции должен нуждаться грабёж?

Это зависит от того сколько офицеров ваш сервер обычно имеет. Обычный старт это один или два для маленького магазина и больше для банка, затем отрегулируйте из того что вы видите.

Скрипты без этой проблемы

CCTV Security CamerasУстанавливаемые камеры, планшет с мультиэкраном в реальном времени и распечатанные фото-улики.Смотреть скрипт →Advanced BoostingУгон машин на заказ через планшет: контракты от класса D до S+, команды и живая очередь.Смотреть скрипт →Shop CreatorМагазин меньше чем за минуту — владельцы, сотрудники, сейфы и ограбления в комплекте.Смотреть скрипт →

Читайте также

FiveMБезопасностьСкриптингДизайн системы наркотиков FiveM: сбор, обработка и безопасная продажаКак спроектировать систему наркотиков FiveM: сбор и обработка с проверками предметов на сервере, ограничения скорости, безопасная продажа NPC, оповещения полиции и балансировка выплат.1 октября 2026 г. · 3 мин чтенияЧитать →FiveMСценарииБаза данныхFiveM жилая система и апартаменты: shells, instances, stashes и ключиКак работает жилая система в FiveM: оболочки и MLO интерьеры, инстансирование с routing buckets, storage для каждого дома, ключи и доступ, сохранение владения в базе данных.1 октября 2026 г. · 3 мин чтенияЧитать →FiveMLuaСценарииFiveM механик работа: repair natives, tuning модификации и проверки работыПостройте FiveM механик работу: отремонтируйте машину с SetVehicleFixed и health natives, настройте с SetVehicleModKit и SetVehicleMod, сохраните модификации, и заблокируйте действия по работе.1 октября 2026 г. · 2 мин чтенияЧитать →