Comandos#
Dos de ellos son para los jugadores y el resto para el staff. Todo lo que escribe en la base de datos se vuelve a comprobar en el servidor, así que un ace por sí solo no basta — quien lo ejecuta tiene que pasar igualmente la comprobación de administrador.
Comando | Quién | Descripción |
|---|---|---|
| Cualquier jugador | Vuelve a aplicar la apariencia guardada del jugador. Se rechaza si está muerto, en un vehículo, cayendo o dentro del tiempo de espera de recarga. |
| Cualquier jugador | Elimina todos los props pegados a su ped — la solución para un sombrero o una mochila que dejó otro script. |
| Config.PedMenuGroup | Abre el menú completo, gratis y con todas las categorías activadas. Con un server id, lo abre en ese jugador. Solo se registra cuando Config.EnablePedMenu es true. |
| Administrador | El creador: tiendas, fotos del catálogo, modelos de ped, guantes, packs de ropa y el editor del catálogo. |
| Administrador | Ajusta la cámara de captura para un slot y exporta un fragmento para Config.ImageSaver.drawableList. Requiere Config.ImageSaver.enable. |
| Consola o administrador | Muestra cada pack de ropa que puede ver, sus archivos, su número de slots y lo que haría con él. |
| Administrador, dentro del juego | Abre el creador en la pestaña Clothing Packs. No se puede ejecutar desde la consola. |
| Consola o administrador | Ejecuta el escaneo rápido de reemplazos y muestra los recuentos de coincidentes, no coincidentes, pendientes de verificar y actualizados. Con preview no cambia nada. |
| Consola o administrador | Muestra el último escaneo de hashes: addon, reemplazados, sin cambios, errores y la distribución de distancias. |
| Consola o administrador | Quita la marca de reemplazado de todas las filas del catálogo a la vez. No se puede deshacer. |
| Administrador / consola | Migraciones de un solo uso desde otro script de ropa. Consulta Integraciones. |
También hay una familia de comandos de relleno del proveedor para etiquetas, game builds y metadatos. Existen para construir el catálogo incluido y no forman parte del funcionamiento normal.
Cómo se nombran los exports#
Casi todos los exports se registran dos veces: una con qs-appearance y otra con illenium-appearance, para que un script escrito para illenium siga funcionando sin cambios. Escribe el código nuevo con el nombre qs-appearance.
exports['qs-appearance']:getPedAppearance(PlayerPedId()) -- use this
exports['illenium-appearance']:getPedAppearance(PlayerPedId()) -- compatibility aliasLa carpeta del recurso tiene que llamarse qs-appearance — de lo contrario no arranca — así que estos nombres se pueden escribir directamente en el código sin riesgo.
Exports de cliente#
Para leer lo que lleva puesto un jugador, vestirlo y abrir el menú desde tu propio script — un prop de armario, un disfraz para un atraco, un uniforme de trabajo.
Leer una apariencia
local ped = PlayerPedId()
-- everything at once: model, components, props, headBlend,
-- faceFeatures, headOverlays, hair, tattoos, eyeColor, pedScale
local appearance = exports['qs-appearance']:getPedAppearance(ped)
-- or one piece at a time
exports['qs-appearance']:getPedModel(ped)
exports['qs-appearance']:getPedComponents(ped) -- { component_id, drawable, texture }
exports['qs-appearance']:getPedProps(ped) -- { prop_id, drawable, texture }
exports['qs-appearance']:getPedHeadBlend(ped)
exports['qs-appearance']:getPedFaceFeatures(ped)
exports['qs-appearance']:getPedHeadOverlays(ped)
exports['qs-appearance']:getPedHair(ped)Estos leen el ped en vivo, así que funcionan en cualquier entidad de ped, no solo en la del jugador.
Vestir a un jugador
-- the whole look, model included
exports['qs-appearance']:setPlayerAppearance(appearance)
-- a specific ped, without changing its model
exports['qs-appearance']:setPedAppearance(ped, appearance)
-- one slot: returns false when the game refused the drawable
local ok = exports['qs-appearance']:setPedComponent(ped, {
component_id = 1, drawable = 52, texture = 0
})
exports['qs-appearance']:setPedProp(ped, { prop_id = 0, drawable = 12, texture = 1 })
exports['qs-appearance']:setPedComponents(ped, components)
exports['qs-appearance']:setPedProps(ped, props)
exports['qs-appearance']:setPlayerModel('mp_f_freemode_01')
exports['qs-appearance']:setPedTattoos(ped, tattoos)setPedComponent y setPedProp aplican el cambio y luego lo vuelven a leer, así que el booleano que devuelven te dice si el juego realmente lo aceptó. Un drawable rechazado se restaura a lo que era en lugar de quedar roto.
Abrir el menú
local cfg = exports['qs-appearance']:GetDefaultConfig()
cfg.character, cfg.creator, cfg.tattoos = true, true, true
exports['qs-appearance']:startPlayerCustomization(function(appearance)
if not appearance then
return print('the player cancelled')
end
TriggerServerEvent('qs-appearance:server:saveAppearance', appearance)
end, cfg)El callback recibe la apariencia terminada, o nil cuando el jugador se echó atrás. Pasar nil como config lo abre con los valores predeterminados.
-- start from nothing and enable only what you want
local cfg = exports['qs-appearance']:GetDefaultConfig(true) -- everything off
cfg.componentConfig.hats = true
cfg.accessories = true
cfg = exports['qs-appearance']:NormalizeAccessoryComponentConfig(cfg)MergeShopConfig superpone una config de tienda guardada sobre los valores predeterminados, y NormalizeAccessoryComponentConfig traduce los nombres de accesorios al estilo de illenium. Un objeto de config de illenium se detecta y se convierte por sí solo.
La lista de peds
CreateThread(function()
local peds = exports['qs-appearance']:GetPedList()
print(('%d peds available'):format(#peds))
end)Exports de servidor#
GetPedList
local peds = exports['qs-appearance']:GetPedList() -- string[]Todos los nombres de modelos de ped que conoce el servidor, incluidos los ocultos.
El escáner de packs de ropa
El mismo escáner que usa la pestaña Clothing Packs, expuesto para que puedas programar en torno a él. Los resultados llegan como tablas — no hace falta decodificarlos.
local scan = exports['qs-appearance']:scanAllResources(json.encode({
ignoreResources = {}, ignoreNamePatterns = {}, excludeMapResources = true,
}))
print(('%d clothing packs found'):format(scan.resourceCount))
exports['qs-appearance']:scanResource('my_clothing_pack')
exports['qs-appearance']:getReplaceSlots(optionsJson)
exports['qs-appearance']:diagnoseScan('my_clothing_pack')
exports['qs-appearance']:packScannerInfo('') -- version and platformpackScannerInfo es lo primero que debes ejecutar cuando un escaneo no encuentra nada y vas a abrir un ticket.
Eventos que puedes disparar#
Para abrir una tienda desde un prop, un menú radial o una app del teléfono, y para guardar desde tu propio flujo.
-- server → one player
TriggerClientEvent('qs-appearance:client:openClothingShop', source, 3)
TriggerClientEvent('qs-appearance:client:openClothingShopMenu', source)
TriggerClientEvent('qs-appearance:client:reloadSkin', source)
TriggerClientEvent('clothing:notification', source, 'Outfit saved', 'success')
-- client, locally
TriggerEvent('qs-appearance:client:OpenBarberShop')
TriggerEvent('qs-appearance:client:OpenTattooShop')
TriggerEvent('qs-appearance:client:OpenSurgeonShop')
TriggerEvent('clothing:openOutfitMenu')
TriggerEvent('clothing:openJobOutfitMenu')-- client → server
TriggerServerEvent('qs-appearance:server:saveAppearance', appearance)
TriggerServerEvent('qs-appearance:server:saveOutfit', 'Work suit',
appearance.model, appearance.components, appearance.props)
TriggerServerEvent('qs-appearance:server:updateOutfit', id, model, components, props)
TriggerServerEvent('qs-appearance:server:deleteOutfit', id)
TriggerServerEvent('qs-appearance:server:resetOutfitCache') -- on a character switch
TriggerServerEvent('clothing:applyPlayerScale', 1.15) -- needs Config.EnableScaleopenClothingShop recibe el id de una tienda que colocaste, así que el menú se abre con las categorías y el stock de esa tienda. openClothingShopMenu abre un menú genérico que no está vinculado a ninguna tienda.
Hooks que puedes escuchar#
Los dos que más importan para otros recursos.
-- the player closed the menu; nil means they cancelled
AddEventHandler('appearance:handleClose', function(appearance)
if not appearance then return end
print('finished as ' .. appearance.model)
end)
-- tattoos were just rebuilt on this ped
AddEventHandler('qs-appearance:client:tattoosApplied', function(ped)
-- re-add your own decorations here.
-- do NOT call ClearPedDecorations: it was already cleared for you.
AddPedDecorationFromHashes(ped, `mpbeach_overlays`, `fm_tats_m_000`)
end)Broadcasts que también puedes escuchar, cada uno enviado a todos cuando cambian los datos que hay detrás: clothing:setStores, clothing:createStore, clothing:updateStore, clothing:deleteStore, qs-appearance:syncStock, qs-appearance:syncPedModels, qs-appearance:syncFacePresets, clothing:syncGloves y clothing:syncTopHandMappings.
La altura del jugador se replica como un state bag, así que cualquier script puede leerla sin un callback:
AddStateBagChangeHandler('pedScale', nil, function(bagName, _, value)
print(bagName, 'scale is now', value or 1.0)
end)Callbacks#
Callbacks de ox_lib, todos registrados en el servidor. Llámalos desde un cliente.
Nombre | Devuelve |
|---|---|
| La apariencia guardada de quien llama, o nil. |
| Si puede pagar un tipo de tienda, y su precio. |
| Cobra un precio de money, bank o black_money. True si tiene éxito. |
| Si quien llama pasa la comprobación de administrador. |
| Los atuendos de quien llama, y la escritura en ellos. |
| Los uniformes del trabajo y el rango de quien llama. |
| Jugadores a menos de tres metros, para compartir atuendos. |
| Todos los trabajos con su etiqueta y sus rangos. |
| Lo que tiene una tienda para un modelo de ped. |
| Una página del catálogo, con los mismos filtros que usa el menú de la tienda. |
CreateThread(function()
local appearance = lib.callback.await('qs-appearance:server:getAppearance', false)
if appearance then
exports['qs-appearance']:setPlayerAppearance(appearance)
end
local canAfford, price = lib.callback.await(
'qs-appearance:server:hasMoney', false, 'barber', 'mp_m_freemode_01')
if not canAfford then print(('needs $%d'):format(price)) end
end)Todos los callbacks del creador y del catálogo — colocar tiendas, guardar stock, editar o eliminar filas, modelos de ped, guantes, escaneos — rechazan a quien no pase la comprobación de administrador, y guardar un atuendo de trabajo expulsa al jugador que lo falsifique. Construye tus propias herramientas sobre la superficie pública de arriba.



