Cómo funcionan las integraciones#
Nada dentro de Apartments está ligado a un único framework, inventario o script de ropa. A cada uno se accede a través de un pequeño archivo bridge abierto en client/custom/ o server/custom/, y el adecuado se elige al arrancar observando lo que ya está en ejecución.
Capa | Compatible | Sin ella |
|---|---|---|
Framework |
| No funciona nada, y |
Inventario |
| Los stashes no se pueden abrir. |
Ropa |
| Un armario de respaldo: el menú de atuendos de qb-clothing en QBCore y Qbox. En ESX, instala uno de los scripts compatibles. |
Target |
| Avisos flotantes y una pulsación de tecla. |
Text UI |
| Texto 3D dibujado sin más. |
Aparición |
| Sin apartamento al aparecer; los jugadores usan |
Teléfono | Un teléfono que gestione | El punto Charge no hace nada. |
Misiones |
| Sin misiones de apartamento. |
Sincronización del clima |
| Nada que pausar. |
HUD |
| Solo se oculta el radar mientras se decora. |
Sonidos |
| Las puertas, el timbre, el stash y el armario no suenan. |
Anticheat | FiveGuard, con | Nada que avisar, o un anticheat puede marcar la cámara de decoración. |
Base de datos |
| Obligatoria. La única. |
Ejecuta un recurso por capa. La detección comprueba qué recursos están iniciados, no un orden de preferencia, así que con dos inventarios o dos scripts de ropa en ejecución la elección no está garantizada. En ese caso, configúrala a mano, como se indica abajo.
Anular la detección#
Cada capa es una línea en config/main.lua. Sustituye la detección por el nombre del bridge que quieras: el nombre del archivo en client/custom/inventory/ o client/custom/wardrobe/, sin .lua:
-- Auto, the default
Config.Inventory = DependencyCheck(inventories) or 'default'
Config.Wardrobe = DependencyCheck(wardrobes) or 'default'
-- Manual: skip detection
Config.Inventory = 'ox_inventory'
Config.Wardrobe = 'illenium-appearance'Así también se usa un bridge que se incluye sin detección: client/custom/wardrobe/mAppearance.lua funciona con Config.Wardrobe = 'mAppearance'.
Inventarios y stashes#
Cada stash (el del propio apartamento y cada mueble de almacenamiento) se abre a través del bridge de inventario, con su nombre y tamaño:
Inventario | Notas |
|---|---|
| El stash se registra en el servidor la primera vez que se abre, con sus espacios y su peso. |
| Se abre con sus espacios y su peso. |
| El bridge envía |
| El tamaño viene de la configuración de stashes del propio core_inventory. |
| Los stashes se llaman |
| Se abre con su peso; los espacios siguen la configuración de Chezza. |
qb-inventory sin Quasar Housing: abre el stash mediante el evento de servidor propio de Apartments, que llama al export de qb-inventory:
-- client/custom/inventory/qb-inventory.lua
function OpenStash(customData, uniq)
local house = CurrentApartmentId
uniq = (uniq or house):gsub('-', '_')
TriggerServerEvent('apartments:server:openStash', uniq)
endPara un qb-inventory antiguo (anterior a 2.0), el bridge ya contiene las dos líneas que hay que descomentar en su lugar.
La ropa y el armario#
El punto de armario y los muebles armario llaman a una función, openWardrobe(), del bridge detectado en client/custom/wardrobe/. Cada bridge son unas pocas líneas que abren el menú de atuendos de ese script; ajústalo ahí si tu versión renombró un export o un evento.
La primera aparición de un personaje nuevo abre el creador de personajes mediante TriggerCharacterCreation() en config/main.lua. Dispara el evento de primer personaje de qb-clothing; apúntalo al de tu script de ropa:
function TriggerCharacterCreation()
TriggerEvent('qb-clothes:client:CreateFirstCharacter')
endTargets#
Con Config.UseTarget = true, los avisos se convierten en entradas de target:
Dónde | Entradas |
|---|---|
La puerta de un edificio | Enter Apartment para el propietario; Move Apartment y Ring Doorbell para todos los demás. |
La puerta del apartamento | Exit Apartment; Doorbell tras un timbrazo; Locations con |
Los puntos de stash y armario | Stash y Set Vault Code; Wardrobe. |
Muebles interactivos | Interact with object y Set Vault Code. |
El robot de limpieza | Start Cleaning Robot, Stop Cleaning Robot, Return to Dock. |
Las puertas, los puntos y los muebles se añaden mediante la API de qtarget, que ox_target responde de serie; el robot se registra directamente con ox_target o qb-target. El bridge es client/custom/target/main.lua, y Config.ZoneDebug = true dibuja las cajas.
Selectores de aparición y apartamentos iniciales#
Multicharacter de Quasar lee tus edificios desde el export de Apartments y los muestra en su selector de aparición a los personajes nuevos, en cualquier framework. Elegir uno crea el apartamento y lleva al personaje dentro. Inicia Apartments antes que Multicharacter para que lo encuentre.
Con qb-multicharacter y qb-spawn, elegir un personaje dispara apartments:client:setupSpawnUI:
Un personaje con apartamento recibe la lista normal de qb-spawn y el blip de su casa.
Un personaje nuevo recibe qb-spawn con tus edificios cuando
Config.InitialSpawnEnabledestrue, o la lista normal cuando esfalse.
Apartments muestra un Apartment Menu con tus edificios a un personaje nuevo. Elegir uno crea el apartamento, hace aparecer al personaje dentro y dispara los eventos de jugador cargado, así que se abre el menú de ropa. Un personaje que vuelve va al selector de aparición como siempre. Elimina qbx_properties primero.
Cualquier script de aparición o de personajes puede entregar un apartamento inicial con el evento que usan los menús integrados; consulta Comandos y exports. Sin ninguno, los jugadores reclaman el suyo con /Apartment.
Cargador de teléfono#
Cuando un propietario coloca el punto Charge, Apartments dispara el evento de servidor phone:CreateChargeLocation en el servidor, con el ID del apartamento y la posición, para que tu script de teléfono ponga allí un punto de carga. Un teléfono que no gestione ese evento ignora el punto.
-- server side, in your phone resource
AddEventHandler('phone:CreateChargeLocation', function(apartmentId, coords)
-- coords = { x = ..., y = ..., z = ... }
end)Misiones de Advanced Inventory#
Con qs-inventory en ejecución, cada jugador recibe dos misiones al cargar:
Misión | Objetivo | Progreso | Recompensa |
|---|---|---|---|
First Apartment Setup | Compra al menos 5 muebles. | +20 por pieza comprada | 200 |
New Place, New Vibes | Múdate a otra ubicación de apartamento. | Se completa con el primer apartamento pagado | 250 |
Sus títulos, descripciones y recompensas están en server/custom/missions.lua. Sin qs-inventory el archivo no hace nada.
Clima, HUD, sonidos y anticheat#
Hook | Dónde | Qué hace |
|---|---|---|
Sincronización del clima |
| Pausa qb-weathersync, cd_easytime y vSync al entrar y los reanuda al salir. Añade los eventos de tu propia sincronización a la misma función. |
HUD |
| Oculta el radar y qs-interface mientras se decora y en el Furniture Creator. Añade ahí la llamada de ocultar de tu HUD. |
Sonidos |
| Reproduce |
FiveGuard |
| Ponle el nombre de tu recurso de FiveGuard: mientras un jugador decora, recibe el bypass temporal de cámara libre y noclip de FiveGuard, para que la cámara no sea marcada. |
Notificaciones#
Los mensajes se muestran con el estilo de notificación propio de Apartments, dentro de su interfaz. Para enviarlos a través de otro sistema, edita Notification(msg, type) en client/custom/framework/esx.lua o qb.lua; ya hay ejemplos comentados para qs-interface y ox_lib. type es info, success o error.
Añadir un backend#
Dar soporte a un inventario o script de ropa que no está en la lista requiere un archivo y una línea.
Copia el bridge más parecido
Cada bridge es un archivo pequeño y sin cifrar. Copia el más parecido al tuyo (
client/custom/inventory/ox_inventory.lua, por ejemplo) y ponle el nombre de tu recurso.Cambia la condición y la llamada
La primera línea hace que el archivo solo se ejecute cuando es el bridge elegido; la función de debajo llama a tu recurso:
lua if Config.Inventory ~= 'my_inventory' then return end function OpenStash(customData, uniq) local data = customData or Config.DefaultStashData uniq = (uniq or CurrentApartmentId):gsub('-', '_') -- call your inventory's own stash export or event here, -- with uniq, data.slots and data.maxweight endRegístralo para la detección
Añade una entrada a la lista
inventoriesenconfig/main.lua—['my_inventory'] = 'my_inventory'— o asignaConfig.Inventorya mano.
Un bridge de ropa es igual con una función, openWardrobe(), y la lista wardrobes. Los bridges de framework en server/custom/framework/ y client/custom/framework/ contienen los identificadores, el dinero, los metadatos, los routing buckets y la comprobación de administrador.
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 en config/main.lua. Para añadir otro, copia en.json con el nuevo código, tradúcelo y configura el locale con ese código; todo lo que quede sin traducir vuelve al inglés, y la consola indica cada clave que falta.



