Ludwig´s Furniture Management
The Complete Furniture Commerce Solution for RedM
Stop fiddling with furniture configs across a dozen different scripts.
LUDWIG_FURNITUREMANAGEMENT is the definitive central hub for buying, placing, and managing props. It provides a seamless, unified experience for your players and a robust API for developers to hook into.
Links
Key Features
-
In-World NPC Stores Spawn furniture vendors at any location with custom coords, animations, scenarios, and map blips.
-
Live 3D Preview Players can rotate and zoom props directly in-world before adding them to the basket. Every store has a dedicated preview zone so nothing feels abstract.
-
Category & Search System Furniture is organised into categories (beds, chairs, bathroom, and more). Players can filter by keyword inside the buy panel for fast browsing.
-
20 Categories with 1300+ Items Preconfigured Categorized Furniture-Items with custom Labels (german), pricing etc. Easy to expand and edit (some Assets are Free Spooni Stuff like “badewanne1”.
-
Basket Checkout Add multiple items at different quantities, see the running total, and purchase everything in one go. No repeated menu-diving.
-
VORP-Native Full VORP Core + vorp_inventory integration out of the box — money checks, item grants with metadata, carry-weight validation. No patching required.
-
Open Developer API Expose your own housing/camp resource to the furniture management UI (move / sell / pickup) with a single client-side export call. Callbacks give you full control.
-
Per-Store Catalogues Assign individual category lists (or all categories) to each store. Blacklist categories per location. One config file, total flexibility.


Technical Excellence
Native VORP Support
Ludwig Furnitureselling integrates seamlessly with VORP Core and vorp_inventory right out of the box. Money deductions, item grants, metadata — all handled through the shared VORP-bridge that is open in both versions.
Open Developer Exports
Don´t want to maintain UIs for all your Resources ? Just use the initUi client export with your own spawned entities and receive typed callbacks for every player action.
How It Works
- Browse the Store: Player walks up to an NPC vendor and opens the buy panel.
- Preview Items: Hover a furniture card — the prop spawns at the preview point and the camera focuses on it. Rotate and zoom with the mouse.
- Fill the Basket: Add items at any quantity, watch the total update live.
- Checkout: One click purchases the entire basket. Items land in inventory with model metadata attached.
- Place at Home: Player uses the inventory item → placement is handled using
gs_gizmoinside furnituremanagement → Your Provider gets the Info to handle the rest.
Examples
Store Config
["Ludwig´s Store"] = {
coords = vector3(-726.2164306640625, -1275.0068359375, 43.57690048217773),
npc = {
heading = 358.8620,
ped = "cs_watson_02",
animDict = "script_amb@stores@store_shadyshop",
animName = "base",
scenario = "WORLD_HUMAN_SMOKE" --scenario will beat animation
},
blip = {
show = true,
overwriteName = false, -- optional
sprite = "blip_chest", -- optional
color = false -- optional
},
props = {
previewPropCoords = vector3(-722.9008, -1272.0609, 43.5769),
heading = 1.6307,
},
configs = "all" -- or table selecting specific categories
blacklist = { "campfire", "tent" } -- dont show these categories
},
Item Config:
Config.fencesFurniture = {
["p_barricadewood_lrg01x"] = {
costToBuy = 2,
sellFor = false,
label = "Eine mannshohe Holzwand",
description = false,
icon = false,
canPickup = false -- optional value that shall allow pickup instead of sell
},
["p_hitchingpost04x"] = {
costToBuy = 8,
sellFor = false,
label = "Anbindepfosten",
description = false,
icon = false,
canPickup = false -- optional value that shall allow pickup instead of sell
},
}
How to call UI from your script
exports.ludwig_furnituremanagement:initUi {
uniqueId = "testHouse123",
furnitureList = testFurniture,
onPickup = function(uniqueId, uniqueFurnId, handle, _, model)
print("Picked up:", uniqueId, uniqueFurnId, handle, model)
end,
onDelete = function(uniqueId, uniqueFurnId, handle, _, model)
print("Sold:", uniqueId, uniqueFurnId, handle, model)
end,
onMove = function(uniqueId, uniqueFurnId, handle, cfg, model, newPosition, newRotation)
print("Moved:", uniqueId, uniqueFurnId, handle, model,
"New Pos:", newPosition.x, newPosition.y, newPosition.z,
"New Rot:", newRotation.x, newRotation.y, newRotation.z, "Config:", json.encode(cfg))
end,
}
example Outputs from Functions above:
Moved: testHouse123 test_item_3 6289922 p_hitchingpost04x New Pos: -727.60760498047 -1283.3571777344 42.713634490967 New Rot: 0.0 0.0 0.0 Config: {"label":"Anbindepfosten","description":false,"canPickup":false,"furniture":"p_hitchingpost04x","sellFor":5.6,"costToBuy":8,"icon":false}
Sold: testHouse123 test_item_3 4431874 p_hitchingpost04x
Checklist
- I have reviewed the latest version of the Releases rules.
- I have included a detailed description of my work as described in the rules.
- I have included a download link or a store link.
- I have filled out the required information at the end of the topic
If you’re selling your resource, please include the following information at the end of your post:
| Code is accessible | Yes & No (2 versions) |
| Subscription-based | No |
| Lines (approximately) | Number of lines |
| Requirements | ox_lib, murphy_interact, vorp_core, gs_gizmo |
| Support | Yes |
