Cómo funcionan las integraciones#
Camera nunca habla directamente con tu framework ni con tu inventario. A cada uno se llega a través de un pequeño archivo puente, y el puente correcto se elige al iniciar mirando lo que ya está en ejecución. La línea de consola qs-camera v2.0.0 started (esx / ox) indica cuáles dos eligió.
Capa | Compatibles | Sin ella |
|---|---|---|
Framework |
| Standalone: los jugadores se reconocen por su licencia y se nombran con su nombre de FiveM. |
Inventario |
| Obligatorio. Si no hay ninguno de estos en ejecución, se asume el puente de qs-inventory y no se puede dar ni usar nada. |
Capturas de pantalla |
| Obligatorio. No se puede tomar ninguna foto ni tarjeta. |
Notificaciones y barras de progreso |
| ox_lib, que de todos modos es una dependencia. |
HUD |
| Tu HUD queda en pantalla mientras hay una cámara levantada. El HUD y el radar propios del juego siempre se ocultan. |
Misiones |
| Sin misiones; nada más cambia. |
Base de datos |
| Obligatorio. |
Qbox usa el puente de QBCore gracias a la compatibilidad con QBCore de
qbx_core, y usa ox_inventory para sus ítems.
Sobrescribir la detección#
La detección lee dos pequeñas tablas al principio de shared/config.lua. El lado izquierdo es un nombre de recurso y el derecho, el puente que usa. Si tu framework o inventario funciona con otro nombre, agrégalo:
-- qs-camera/shared/config.lua
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb',
['my-core'] = 'qb', -- a renamed QBCore
}
local inventories = {
['ox_inventory'] = 'ox',
['qs-inventory'] = 'qs',
['qb-inventory'] = 'qb',
['ps-inventory'] = 'qb',
['lj-inventory'] = 'qb',
}La detección solo ve los recursos que ya están iniciados, así que todo lo que quieras que se encuentre debe estar por encima de ensure qs-camera en server.cfg. Ejecuta solo un inventario de la lista: con dos iniciados a la vez, no está garantizado cuál gana.
Notificaciones y barras de progreso#
Los mensajes (You loaded a new roll of film, Nobody is close enough) y las barras de progreso de reparar y cargar rollo usan qs-interface cuando está en ejecución y ox_lib en caso contrario. Ambas son funciones simples en client/custom/framework/<your framework>.lua — SendTextMessage y ProgressBar — así que otro recurso de notificaciones son unas pocas líneas:
-- client/custom/framework/esx.lua (or qb.lua / standalone.lua)
function SendTextMessage(msg, kind)
-- kind is 'success', 'error' or 'inform'
exports['my-notify']:Show(msg, kind)
endOcultar el HUD#
Mientras hay un visor, un álbum o el editor de tableros en pantalla, tu HUD se oculta, y vuelve cuando ya nada necesita la pantalla. Qué HUD se ocultan es una lista en client/custom/hud.lua. qs-interface viene en ella, y agregar el tuyo es una entrada:
-- client/custom/hud.lua
HudResources = {
['qs-interface'] = function(visible)
exports['qs-interface']:ToggleHud(visible)
end,
['my-hud'] = function(visible)
exports['my-hud']:SetVisible(visible) -- false hides it, true brings it back
end,
}Una entrada de un recurso que no está en ejecución se omite, así que una lista de varios HUD no cuesta nada. Un hook que lanza un error se captura y se informa en F8, y nunca deja a un jugador atrapado detrás de una cámara.
Avisos flotantes#
Los avisos [E] Take down y [E] Board en paredes y tableros los dibuja DrawText3D en client/custom/prompt.lua. Reemplaza su cuerpo para dibujarlos a tu manera. Se llama en cada frame mientras el jugador está dentro del rango, así que un text UI que se muestra y se oculta (en lugar de dibujarse en cada frame) necesita recordar si ya está en pantalla.
Usar ítems#
Los ítems se vuelven utilizables a través de tu framework y tu inventario por sí solos, con una excepción: ox_inventory llama a un export indicado en la definición del ítem. Es la línea server = { export = 'qs-camera.useItem' } de cada definición de ox_inventory en Ítems del inventario: si la omites, el ítem no se puede usar.
Sea cual sea la vía, el servidor comprueba que el jugador realmente tenga el ítem en ese slot antes de que pase nada, e ignora un segundo uso del mismo ítem en menos de un tercio de segundo.
Misiones con qs-inventory#
Con qs-inventory en ejecución, Camera le da a cada jugador cinco misiones. Están en server/custom/missions.lua, que puedes editar: títulos, descripciones, recompensas y niveles.
Misión | Objetivo |
|---|---|
Shocking Experience | Recibe una descarga cuando una cámara se avería. |
Camera Repairman | Devuelve a la vida una cámara rota. |
Camera Enthusiast | Toma al menos 20 fotos; cuentan tanto las fotos digitales como las tarjetas impresas. |
Photo Viewer | Mira 5 fotos. |
Collector of Moments | Guarda 5 fotos en un álbum. |
Alojamiento de fotos#
Las dos cámaras suben de forma distinta, algo que conviene saber cuando algo falla:
| Fotos digitales | Tarjetas instantáneas |
|---|---|---|
Quién sube | El juego del jugador, a través de | El servidor, después de que la tarjeta se compone en la pantalla del jugador. |
A dónde |
| El mismo |
Se comprueba | La respuesta debe ser una dirección web válida. | La dirección debe pertenecer a un host de la lista Uploads, y la imagen debe pesar menos de unos 3 MB. |
La lista Uploads del panel de configuración contiene cdn.discordapp.com, media.discordapp.net y *.fivemanage.com por defecto. Déjala así salvo que el servicio al que subes responda con una dirección distinta; una lista vacía acepta cualquier host https.
Agregar un backend#
Dar soporte a un framework o inventario que no está en la lista es deliberadamente sencillo: un archivo copiado por lado, más una línea.
Copia el puente más parecido
Los inventarios están en
server/custom/inventory/yclient/custom/inventory/; los frameworks enserver/custom/framework/yclient/custom/framework/. Ninguno está cifrado. Copia el más parecido al tuyo (ox.lua, por ejemplo) y ponle el nombre de tu recurso.Cambia las llamadas de dentro
Cada puente solo se ejecuta cuando es el elegido, y rellena cuatro funciones con los exports propios de tu recurso:
lua if Config.Inventory ~= 'myinv' then return end function GetItems(src) ... end function AddItem(src, item, count, slot, metadata) ... end function RemoveItem(src, item, count, slot) ... end function SetItemMetaData(src, slot, metadata) ... endRegístralo para la detección
Agrega tu recurso a la tabla
inventories(oframeworks) enshared/config.luacon el id que usaste en la comprobación:['my-inventory'] = 'myinv'.
Tu inventario debe guardar metadatos en los ítems: cada foto, cámara y álbum vive ahí. Si escribir el puente es más de lo que quieres asumir, envíanos el nombre del recurso.
Idiomas#
Se incluyen 41 idiomas en locales/: árabe, bengalí, búlgaro, catalán, chino, croata, checo, danés, neerlandés, inglés, estonio, finés, francés, alemán, griego, hebreo, hindi, húngaro, indonesio, italiano, japonés, coreano, letón, lituano, malayo, noruego, persa, polaco, portugués, rumano, ruso, eslovaco, esloveno, español, suajili, sueco, tailandés, turco, ucraniano, urdu y vietnamita.
Elige uno en /cameraconfig → General → Language; se aplica a todos los jugadores a la vez, interfaz incluida. Cualquier texto que falte en un idioma usa el inglés. Los archivos de idioma no están cifrados, así que cualquier texto se puede cambiar en su archivo JSON.



