Antes de empezar#
Antes de instalar Vending Machine Creator, asegúrate de que tu servidor cumple los requisitos. Un framework, un inventario y los dos recursos ox son obligatorios; todo lo demás es opcional y se detecta solo.
Requisito | Estado | Notas |
|---|---|---|
| Obligatorio | Guarda cada máquina colocada, sus productos, propietario, stock y ganancias. |
| Obligatorio | El menú de productos, los callbacks, la barra de progreso y la prueba de habilidad del robo. |
OneSync | Obligatorio | Declarado como dependencia; el recurso no se inicia sin él. |
Framework | Obligatorio |
|
Inventario | Obligatorio |
|
| Opcional | Avisos |
| Opcional | Su HUD se oculta mientras el creador o el panel del propietario están abiertos. |
Quasar Smartphone | Opcional | La app VendGo, mediante su addon |
El framework y el inventario se eligen mirando lo que ya está en ejecución cuando se inicia el recurso:
Capa | Se detecta por |
|---|---|
Framework |
|
Inventario |
|
Ejecuta un solo inventario de esa lista. Integraciones explica cómo configurar cualquiera de las dos capas a mano.
github.comReleases · overextended/oxmysqlMySQL resource for FXServer.github.comReleases · overextended/ox_libA FiveM resource and script library for Lua and JS.Descargar Vending Machine Creator#
Después de comprar Vending Machine Creator, el recurso se vincula automáticamente a tu cuenta de CFX Portal.
Inicia sesión en CFX Portal con la misma cuenta que usaste al finalizar la compra, abre Granted Assets y descarga Vending Machine Creator.
Tras extraer la descarga, deberías tener las siguientes carpetas:
[vendingmachine]/
├── qs-vendingmachine-creator/ -- the resource
├── [sql]/
│ ├── qs_vendingmachines.sql -- the machines table (required)
│ └── items_esx.sql -- the products, for ESX
└── [img]/ -- product icons for your inventoryCarpeta | Qué es |
|---|---|
| El recurso: la única carpeta que va en |
| SQL que debes ejecutar en tu base de datos. No es un recurso. |
| Iconos que debes copiar en tu inventario. No es un recurso. |
Dentro del recurso, estas son las partes que puedes editar:
qs-vendingmachine-creator/
├── config/main.lua -- every setting
├── custom/ -- framework bridges, notifications, police alert
├── server/custom/inventory/ -- inventory bridges and image paths
├── locales/ -- 41 languages
└── web/build/ -- the interface, already builtLa carpeta debe llamarse
qs-vendingmachine-creator. La app VendGo de Quasar Smartphone busca el recurso con ese nombre exacto, así que una copia renombrada se indica como no en ejecución.
Instalar el recurso#
Mueve la carpeta qs-vendingmachine-creator al directorio de recursos de tu servidor. Puede estar en cualquier lugar dentro de él, incluida una carpeta de categoría:
resources/
└── [qs]/
└── qs-vendingmachine-creator/Una vez copiada, abre tu server.cfg y asegúrate de que todas las dependencias se inician antes que Vending Machine Creator:
ensure oxmysql
ensure ox_lib
# Framework
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Inventory
ensure ox_inventory
# Optional
ensure qs-textui
ensure qs-smartphone
ensure qs-vendingmachine-creator
# VendGo, after both the phone and the machines
ensure phone-vendingmachineEl orden de carga importa. La detección lee qué recursos están iniciados en el momento en que se inicia Vending Machine Creator, así que un framework o inventario que se inicie después no se encuentra.
La base de datos#
Abre tu gestor de base de datos (HeidiSQL, phpMyAdmin, DBeaver…), selecciona la base de datos de tu servidor y ejecuta [sql]/qs_vendingmachines.sql. Crea una sola tabla, qs_vendingmachines, con una fila por cada máquina colocada:
Columnas | Contienen |
|---|---|
| El nombre de la máquina, su modelo, dónde está y hacia dónde mira, y su blip en el mapa. |
| Los productos (ítem, etiqueta, precio y stock) y la cuenta desde la que se pagan. |
| Si un jugador puede comprar la máquina y por cuánto, y si se puede forzar. |
| Quién la compró y las ganancias pendientes de recoger. |
| La lista de Access Control configurada en el creador. |
| Quién la colocó y cuándo. |
¿Actualizas desde una versión anterior? Conserva tu tabla. En cada inicio, el recurso comprueba las columnas de propiedad y robo (
for_sale,price,owner,owner_name,earnings,robbable) y añade las que falten sin tocar tus máquinas. Esa comprobación solo se ejecuta sobre una tabla que existe, así que un servidor nuevo debe importar primero el archivo.
Los productos#
Vending Machine Creator entrega ítems: nunca los crea ni los hace usables. Comer y beber es tarea de tu inventario o de tu script de consumibles. Los siete tipos de máquina de config/main.lua venden estos:
Ítem | Etiqueta | Lo vende |
|---|---|---|
| Water | Drink Machine, Drink Fridge, Water Dispenser |
| Cola | Drink Machine, Drink Fridge |
| Orange Soda | Drink Machine |
| Energy Drink | Drink Machine, Sprunk Machine |
| Beer | Drink Fridge |
| Sprunk | Sprunk Machine |
| Lime Soda | Sprunk Machine |
| Chips, Chocolate, Nuts, Candy | Snack Machine |
| Cookies, Donut, Cupcake | Snack Machine 2 |
| Coffee, Espresso, Cappuccino | Coffee Machine |
| Lockpick | Necesario para los robos ( |
¿Ya tienes equivalentes en tu servidor, como water o sandwich? Apunta Config.MachineTypes a ellos en lugar de crear otros nuevos; Uso muestra cómo. Si no, declara los productos donde tu inventario lee sus ítems:
Añádelos a ox_inventory/data/items.lua, en cualquier framework:
['water_bottle'] = { label = 'Water', weight = 500, client = { status = { thirst = 200000 }, usetime = 2500 } },
['cola'] = { label = 'Cola', weight = 350, client = { status = { thirst = 200000 }, usetime = 2500 } },
['orange_soda'] = { label = 'Orange Soda', weight = 350, client = { status = { thirst = 180000 }, usetime = 2500 } },
['energy_drink'] = { label = 'Energy Drink', weight = 350, client = { status = { thirst = 150000 }, usetime = 2500 } },
['beer'] = { label = 'Beer', weight = 500, client = { status = { thirst = 150000 }, usetime = 3000 } },
['sprunk'] = { label = 'Sprunk', weight = 350, client = { status = { thirst = 200000 }, usetime = 2500 } },
['lime_soda'] = { label = 'Lime Soda', weight = 350, client = { status = { thirst = 180000 }, usetime = 2500 } },
['chips'] = { label = 'Chips', weight = 100, client = { status = { hunger = 150000 }, usetime = 2500 } },
['chocolate'] = { label = 'Chocolate', weight = 100, client = { status = { hunger = 150000 }, usetime = 2500 } },
['nuts'] = { label = 'Nuts', weight = 100, client = { status = { hunger = 120000 }, usetime = 2500 } },
['candy'] = { label = 'Candy', weight = 50, client = { status = { hunger = 100000 }, usetime = 2000 } },
['cookies'] = { label = 'Cookies', weight = 150, client = { status = { hunger = 180000 }, usetime = 2500 } },
['donut'] = { label = 'Donut', weight = 150, client = { status = { hunger = 180000 }, usetime = 2500 } },
['cupcake'] = { label = 'Cupcake', weight = 150, client = { status = { hunger = 180000 }, usetime = 2500 } },
['coffee'] = { label = 'Coffee', weight = 200, client = { status = { thirst = 150000 }, usetime = 3000 } },
['espresso'] = { label = 'Espresso', weight = 150, client = { status = { thirst = 120000 }, usetime = 2500 } },
['cappuccino'] = { label = 'Cappuccino', weight = 200, client = { status = { thirst = 150000 }, usetime = 3000 } },
['lockpick'] = { label = 'Lockpick', weight = 100 },Para la animación de comer o beber, añade anim y prop dentro de client, como hacen los propios water y burger de ox_inventory.
Añádelos a qb-core/shared/items.lua; en QBox con qs-inventory, a qs-inventory/shared/items.lua:
['water_bottle'] = { name = 'water_bottle', label = 'Water', weight = 500, type = 'item', image = 'water_bottle.png', unique = false, useable = true, shouldClose = true, description = 'Bottle of fresh water' },
['cola'] = { name = 'cola', label = 'Cola', weight = 350, type = 'item', image = 'cola.png', unique = false, useable = true, shouldClose = true, description = 'A cold cola' },
['orange_soda'] = { name = 'orange_soda', label = 'Orange Soda', weight = 350, type = 'item', image = 'orange_soda.png', unique = false, useable = true, shouldClose = true, description = 'Orange flavoured soda' },
['energy_drink'] = { name = 'energy_drink', label = 'Energy Drink', weight = 350, type = 'item', image = 'energy_drink.png', unique = false, useable = true, shouldClose = true, description = 'Wings not included' },
['beer'] = { name = 'beer', label = 'Beer', weight = 500, type = 'item', image = 'beer.png', unique = false, useable = true, shouldClose = true, description = 'A cold one' },
['sprunk'] = { name = 'sprunk', label = 'Sprunk', weight = 350, type = 'item', image = 'sprunk.png', unique = false, useable = true, shouldClose = true, description = 'The refreshing choice' },
['lime_soda'] = { name = 'lime_soda', label = 'Lime Soda', weight = 350, type = 'item', image = 'lime_soda.png', unique = false, useable = true, shouldClose = true, description = 'Lime flavoured soda' },
['chips'] = { name = 'chips', label = 'Chips', weight = 100, type = 'item', image = 'chips.png', unique = false, useable = true, shouldClose = true, description = 'A bag of chips' },
['chocolate'] = { name = 'chocolate', label = 'Chocolate', weight = 100, type = 'item', image = 'chocolate.png', unique = false, useable = true, shouldClose = true, description = 'A chocolate bar' },
['nuts'] = { name = 'nuts', label = 'Nuts', weight = 100, type = 'item', image = 'nuts.png', unique = false, useable = true, shouldClose = true, description = 'A bag of salted nuts' },
['candy'] = { name = 'candy', label = 'Candy', weight = 50, type = 'item', image = 'candy.png', unique = false, useable = true, shouldClose = true, description = 'Sweet candy' },
['cookies'] = { name = 'cookies', label = 'Cookies', weight = 150, type = 'item', image = 'cookies.png', unique = false, useable = true, shouldClose = true, description = 'Freshly baked cookies' },
['donut'] = { name = 'donut', label = 'Donut', weight = 150, type = 'item', image = 'donut.png', unique = false, useable = true, shouldClose = true, description = 'Cops love them' },
['cupcake'] = { name = 'cupcake', label = 'Cupcake', weight = 150, type = 'item', image = 'cupcake.png', unique = false, useable = true, shouldClose = true, description = 'A sweet cupcake' },
['coffee'] = { name = 'coffee', label = 'Coffee', weight = 200, type = 'item', image = 'coffee.png', unique = false, useable = true, shouldClose = true, description = 'Hot coffee' },
['espresso'] = { name = 'espresso', label = 'Espresso', weight = 150, type = 'item', image = 'espresso.png', unique = false, useable = true, shouldClose = true, description = 'Short and strong' },
['cappuccino'] = { name = 'cappuccino', label = 'Cappuccino', weight = 200, type = 'item', image = 'cappuccino.png', unique = false, useable = true, shouldClose = true, description = 'Coffee with milk foam' },
['lockpick'] = { name = 'lockpick', label = 'Lockpick', weight = 100, type = 'item', image = 'lockpick.png', unique = false, useable = true, shouldClose = true, description = 'Opens what is not yours' },useable = true solo marca el ítem como usable; lo que hace al usarse depende de tu script de consumibles.
En ESX, los inventarios que leen la tabla items (qs-inventory y el propio de ESX) necesitan todos los productos ahí. Un ítem que falte en esa tabla no se puede llevar, diga lo que diga cualquier archivo Lua. Importa [sql]/items_esx.sql, o ejecuta:
INSERT IGNORE INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES
('water_bottle', 'Water', 1, 0, 1),
('cola', 'Cola', 1, 0, 1),
('orange_soda', 'Orange Soda', 1, 0, 1),
('energy_drink', 'Energy Drink', 1, 0, 1),
('beer', 'Beer', 1, 0, 1),
('sprunk', 'Sprunk', 1, 0, 1),
('lime_soda', 'Lime Soda', 1, 0, 1),
('chips', 'Chips', 1, 0, 1),
('chocolate', 'Chocolate', 1, 0, 1),
('nuts', 'Nuts', 1, 0, 1),
('candy', 'Candy', 1, 0, 1),
('cookies', 'Cookies', 1, 0, 1),
('donut', 'Donut', 1, 0, 1),
('cupcake', 'Cupcake', 1, 0, 1),
('coffee', 'Coffee', 1, 0, 1),
('espresso', 'Espresso', 1, 0, 1),
('cappuccino', 'Cappuccino', 1, 0, 1),
('lockpick', 'Lockpick', 1, 0, 1);Quita rare y can_remove si tu tabla no los tiene. La tabla items no tiene columna de imagen, así que el panel del propietario muestra una imagen predeterminada para estos productos; la compra y el stock no se ven afectados.
En tgiann-inventory, codem-inventory u origen_inventory, decláralos donde ese inventario guarde su lista de ítems.
Iconos de los productos#
Copia los iconos de [img]/ en la carpeta de imágenes de tu inventario:
Inventario | Carpeta |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Acceso al creador#
Colocar, editar y eliminar máquinas se hace en el creador, que se abre con /vendingcreator. Se abre en cualquiera de estos casos:
Automático, nada que configurar. En ESX, los grupos admin y superadmin. En QBCore y QBox, los permisos admin y god, y cualquiera al que se le permita el ace command.
Config.CreatorJobs en config/main.lua también deja entrar a los jugadores con un trabajo:
Config.CreatorJobs = {
{ job = 'police', grade = false }, -- every grade
{ job = 'mechanic', grade = { 3, 4 } }, -- only grades 3 and 4
}grade es false para todos los rangos, o una lista de los rangos permitidos. Escribe también un único rango como lista: { 4 }, no 4.
Configurar el recurso#
Todos los ajustes están en config/main.lua, fuera del escrow. El resto de archivos editables son para la integración:
Archivo | Contenido |
|---|---|
| Idioma, formato de precios, trabajos del creador, cuentas de pago, máquinas en propiedad, robos, el teléfono, tipos de máquina, altura de los avisos, sonidos y debug. |
| Todos los textos que ven los jugadores, en 41 idiomas. |
| Los bridges de ESX y QBCore, las notificaciones, los avisos y la alerta policial. |
| Un bridge por inventario: la lista de ítems y dónde están sus imágenes. |
Los valores que conviene revisar primero:
Config.Locale = 'en' -- 41 languages in locales/
Config.Intl = { -- how prices are written in the panels
locales = 'en-US',
options = { style = 'currency', currency = 'USD', minimumFractionDigits = 0 },
}
Config.CreatorJobs = { ... } -- jobs allowed into the creator, besides admins
Config.Ownable.enabled = true -- machines players can buy
Config.Robbery.enabled = true -- break-ins
Config.Robbery.allowSelfRobbery = false -- testing only
Config.Phone.enabled = true -- the VendGo app
Config.Debug = false -- console output, testing onlyUso explica cada ajuste, e Integraciones cada archivo.
Verificar la instalación#
Tras completar la instalación, reinicia tu servidor y lee la consola. El bridge de tu framework se identifica:
[INFO] Successfully loaded the framework. esxSi en su lugar se repite cada pocos segundos una línea roja [ERROR] Using standalone inventory, no había ningún inventario compatible en ejecución cuando se inició el recurso: mueve su ensure por encima de ensure qs-vendingmachine-creator.
Después entra en tu servidor y completa el primer ciclo:
Usa una máquina del mapa
Acércate a cualquier máquina eCola de la ciudad. Aparece
[E] - Use Drink Machine; elige un producto y tu personaje lo compra.Coloca una máquina propia
/vendingcreator→ + → Apply Template → Select en Placement, apunta, clic izquierdo → Create Machine. Aparece para todos los jugadores a la vez.Ponla a la venta
Activa For sale, guarda y acércate a ella:
[E] - Buy machine. Una vez comprada, el aviso pasa a ser[E] - Managey abre el panel del propietario. Uso continúa desde ahí.
Los jugadores pagan pero no reciben nada hasta que los productos existan en tu inventario; consulta Los productos más arriba.



