Cómo funcionan las integraciones#
Vending Machine Creator nunca habla directamente con tu framework o tu inventario. A cada uno se llega mediante un pequeño archivo bridge fuera del escrow, y el bridge correcto se elige al iniciar a partir de los recursos que ya están en ejecución.
Capa | Compatibles | Se usa para |
|---|---|---|
Framework |
| Dinero, dar y quitar ítems, identificadores, nombres, trabajos y comprobaciones de administrador. Obligatorio. |
Inventario |
| La lista de ítems y las imágenes en el creador y en el panel del propietario. Obligatorio. |
Base de datos |
| Máquinas colocadas, propietarios, stock y ganancias. Obligatorio. |
Text UI |
| Avisos |
HUD |
| Se oculta, junto con el minimapa, mientras el creador o el panel del propietario están abiertos. Otros HUD siguen en pantalla; el minimapa siempre se oculta. |
Teléfono |
| La app VendGo. Sin ella, las máquinas solo se usan en persona. |
Avisos a la policía | Cualquiera, mediante | Alertas de robo. De serie: una notificación y un blip para los trabajos de |
El dinero y los ítems siempre pasan por el bridge del framework. El bridge del inventario solo aporta la lista de ítems y las imágenes, así que cuando un producto no se entrega, el lugar donde mirar es la propia lista de ítems del framework.
Forzar la detección#
Ambos mapas de detección están al principio de config/main.lua. La detección devuelve el primer recurso iniciado que encuentra, y los mapas no tienen un orden fijo, así que con dos inventarios en ejecución a la vez no está garantizado cuál se elige. En su lugar, configura el valor a mano:
-- Auto, the default: whatever is started wins.
Config.Framework = DependencyCheck(frameworks) or 'standalone'
Config.Inventory = DependencyCheck(inventories) or 'standalone'
-- Manual: skip detection entirely.
Config.Framework = 'qb' -- esx · qb
Config.Inventory = 'ox' -- ox · qs · qb · tgiann · codem · origenUn core o inventario renombrado en tu servidor no se encuentra con su nombre habitual. Añádelo al mapa con el bridge que debe usar (['my-core'] = 'qb') y se detecta como el original. La detección solo ve los recursos que ya se han iniciado, así que todo lo que quieras que se encuentre debe estar por encima de ensure qs-vendingmachine-creator en server.cfg.
Imágenes de los ítems#
Las imágenes de la lista de productos del creador y del panel del propietario vienen del bridge del inventario, que apunta a la carpeta de imágenes del propio inventario:
Inventario | Ruta de las imágenes |
|---|---|
| El convar |
|
|
|
|
|
|
|
|
|
|
¿Has movido tus imágenes a otro sitio? Cambia la ruta al principio de server/custom/inventory/<inventory>.lua o, para ox_inventory, el convar.
Notificaciones#
Los mensajes como "You received Cola" o "Your inventory is full" se muestran como avisos propios del script, con el mismo estilo que sus paneles. Todos pasan por una función en custom/client.lua (el servidor también le envía sus mensajes), así que sustituir su cuerpo lleva todas las notificaciones a tu propio sistema:
-- custom/client.lua
function Notification(msg, type) -- type: 'info' · 'error' · 'success'
lib.notify({ description = msg, type = type })
endAvisos a la policía#
AlertPolice(src, machine) en custom/server.lua se ejecuta cuando empieza un robo y sale la probabilidad de alerta. De serie envía una notificación y un blip parpadeante a todos los jugadores conectados cuyo trabajo está en Config.Robbery.alert.jobs. Sustituye su cuerpo para enviar la alerta a tu recurso de avisos:
-- custom/server.lua
function AlertPolice(src, machine)
local coords = machine.coords -- x, y, z of the machine
local label = machine.label -- its name, e.g. 'Drink Machine'
-- src is the thief's server id
-- call your dispatch resource here
endEl interruptor y la probabilidad siguen en Config.Robbery.alert, así que siguen funcionando con tu sistema de avisos. Un error dentro de la función se captura y se imprime: un sistema de avisos roto nunca detiene el robo.
Añadir un framework#
Un framework que no está en la lista requiere una carpeta y una línea. Nada más en el recurso se refiere a un framework por su nombre.
Copia el bridge más parecido
Copia
custom/qb/(ocustom/esx/) encustom/<name>/. Contiene unclient.luay unserver.lua, cada uno de los cuales devuelve una tabla de funciones.Cambia las llamadas de dentro
Rellena cada función con las llamadas propias de tu core. La lista completa, con lo que debe devolver cada una, está en
types.lua(ServerFrameworkyClientFramework).lua -- custom/mycore/server.lua local framework = {} function framework:getIdentifier(source) ... end function framework:getAccountMoney(source, account) ... end function framework:removeAccountMoney(source, account, amount) ... end -- true when paid function framework:addItem(source, item, count) ... end -- true when given -- ...the rest of ServerFramework return frameworkRegístralo para la detección
Añade tu core al mapa
frameworksenconfig/main.lua. El valor es el nombre de la carpeta:['my_core'] = 'mycore'.
Añadir un inventario#
Copia el bridge más parecido
Copia
server/custom/inventory/qb.luaenserver/custom/inventory/<name>.lua.Cambia la condición, la ruta y la lista
La primera línea mantiene el archivo inactivo salvo que sea el inventario elegido.
formatItemListdevuelve cada ítem con su nombre, su etiqueta y la dirección completa de su imagen.lua if Config.Inventory ~= 'myinv' then return end sv_inventory.imagePath = 'nui://my-inventory/html/images/' function sv_inventory:formatItemList() -- { [name] = { name = ..., label = ..., image = self.imagePath .. 'cola.png' } } endRegístralo para la detección
Añádelo al mapa
inventoriesenconfig/main.luacon el valor de la condición:['my-inventory'] = 'myinv'.
Si es más de lo que quieres asumir, abre un ticket con el nombre del recurso.
Idiomas#
Se incluyen 41 traducciones en locales/: ar · bg · bn · ca · cs · da · de · el · en · es · et · fa · fi · fr · he · hi · hr · hu · id · it · ja · ko · lt · lv · ms · nl · no · pl · pt · ro · ru · sk · sl · sv · sw · th · tr · uk · ur · vi · zh. Configura Config.Locale con el nombre del archivo.
Para añadir otro, copia en.json con el nuevo código, tradúcelo y configura el locale con ese código. Cualquier clave que falte en una traducción, a cualquier profundidad, se completa desde el inglés, así que una traducción antigua sigue funcionando tras una actualización. Un locale cuyo archivo no existe usa el inglés con una advertencia en la consola.



