Skip to content

📦 BLN Storage ​

bln storage

📺 Preview ​

Video Preview

💰 Buy Now ​

Get it now

BLN Storage lets players place chests and safes in the world, set a 6-digit combination, and share a persistent stash tied to that prop. Anyone nearby can try to open or pick up the storage — but only after entering the correct code. Picking up returns the item to inventory; the stash keeps the same identity when replaced.

✨ What can you do with it? ​

For players ​

  • 📦 Place from inventory — use a configured chest or safe item to place anywhere.
  • 🔢 Combination lock — set a code on first placement; enter it later to Open or Pick up
  • 🗄️ Shared stash — one custom inventory per placed storage, survives restarts
  • 🎬 Immersion — approach animations, chest lid visuals, safe crack sequences
  • 👥 synced for everyone — all clients see the same chest/safe; prompts at configurable range
  • 🧳 Pick up — hold prompt returns the storage item; contents stay in the linked stash

For server owners ​

  • 🧱 pre-configured items — 12 chest variants + safe; slots, weapons, and labels per type in config
  • 🔐 Lockout — max failed attempts and cooldown against brute force
  • ⏱️ Unlock sessions — code success grants a timed unlock per character (re-enter code when expired)
  • 🚫 Concurrent use — one open or pickup operation per storage at a time by a player
  • 🛠️ Admin reset — command to clear a nearby lock and force a new combination
  • 🌍 Locale — notifications, prompts, and lock UI strings in one file
  • 💾 Auto migrations — no manual SQL import

💻 Framework compatibility ​

✅ VORP ✅ RSG ✅ Custom

📦 Dependencies ​

Start these before bln_storage:

ResourceNotes
oxmysqlRequired
bln_libv3.1.7+
bln_notifyNotifications

⚙️ Installation ​

  1. Download and extract bln_storage into your resources folder.
  2. Add items from the config to your framework items db or use your own.
  3. Add to server.cfg like:
cfg
...
ensure oxmysql
ensure bln_lib
ensure bln_notify
ensure bln_storage
...
  1. Restart the server — database tables are created on first boot.

📁 Config files ​

FilePurpose
config/main.cfg.luaStorage types, interaction distance, prompts, lock rules, admin command, debug
config/locale.cfg.luaAll player-facing strings (notify, prompts, lock UI)

Storage types ​

Each entry in Config.StorageTypes defines one placeable variant:

FieldMeaning
itemUsable inventory item name
modelWorld prop model
labelStash display name in inventory UI
maxSlotsCustom stash capacity
acceptWeaponsWhether weapons can be stored (safe: true)
sharedShared stash for all characters (true recommended)
chestAnimTierOptional 'med' or 'lrg' for chest open/close animations

Default pack includes ornate, wooden, hunter, ice, log, wicker, wedding, bed, crate, trunk chests, plus a safe with higher capacity and weapons allowed.

Example (shortened):

lua
chest_wood = {
    item = 'chest_wood',
    model = 'p_chest01x',
    label = 'Wooden Chest',
    maxSlots = 50,
    acceptWeapons = false,
    shared = true,
},

safe = {
    item = 'safe',
    model = 'p_safe01',
    label = 'Safe',
    maxSlots = 300,
    acceptWeapons = true,
    shared = true,
},

Add a new type by copying a block, registering the item in your framework, and restarting bln_storage.

Lock & sessions (Config.lock) ​

OptionDefaultDescription
digits6Combination length
maxAttempts5Failed tries before lockout
attemptCooldownMs30000Lockout duration
sessionTtlMs15 minHow long unlock lasts after correct code
placementTokenTtlMs2 minPlacement session if player cancels
stashSessionMaxMs45 minAuto-release orphaned “open stash” locks (0 = off)

Combination hashes use a server salt. Optional extra secret in server.cfg:

cfg
set bln_storage:lock_pepper "your-long-random-string"

Interaction (Config.interaction) ​

OptionDescription
distancePrompt range
scanIntervalMsNearest-storage scan rate
prompts.openKey + hold for open
prompts.pickupKey + hold for pickup

Key hashes use sh/keys.lua (same style as other BLN resources).

Admin (Config.admin) ​

lua
Config.admin = {
    command = 'storagereset',
    allowIf = function(source)
        return IsPlayerAceAllowed(source, 'bln.storage.admin')
    end,
}

⚠️ Replace the default return true before production.

🤝 Support ​


Built with ❤️ by BLN Studio