Ir al contenido

Changelog

Todas las versiones de SL-Marketplace, de la más reciente a la más antigua. El formato sigue Keep a Changelog y el proyecto usa Semantic Versioning.

29 de septiembre de 2026

  • Paquete regenerado desde el código fuente sin cambios de la versión 1.16.1; no cambia el comportamiento del juego ni la base de datos.

v1.16.1 · Corrección de traducción del selector de temas

Sección titulada «v1.16.1 · Corrección de traducción del selector de temas»

29 de septiembre de 2026

  • Corregido el nombre que faltaba en inglés y español para el tema Mono del selector.
  • No hay cambios en la base de datos ni hace falta una migración.

v1.16.0 · Idiomas y preferencias por jugador

Sección titulada «v1.16.0 · Idiomas y preferencias por jugador»

29 de septiembre de 2026

  • Todos los mensajes Lua que ve un jugador usan el idioma de su perfil: avisos, compras y pujas, robos de entregas, indicaciones, fotos y buzón.
  • Se añaden 427 textos editables en inglés y español en locales/en.lua y locales/es.lua. Se dejan sin cifrar para que los administradores puedan cambiarlos o añadir idiomas.
  • Los textos compartidos usan Config.DefaultLang, ahora en. El registro de jugadores nuevos usa el idioma por defecto del servidor y la interfaz recurre al inglés cuando falta una traducción.
  • Los temas de la interfaz se guardan por separado para cada personaje en el dispositivo actual. Al cambiar de personaje se recuperan su tema y el color de sus markers.
  • Se corrige la documentación de la integración de teléfono: lb-phone está integrado si se activa Config.Phone.Enabled = true.
  • No hay cambios en la base de datos ni hace falta una migración.

29 de septiembre de 2026

  • El README describe ahora todas las funcionalidades, incluidos los atracos al repartidor y el minijuego: quién puede robar, qué se lleva cada parte y cómo ajustarlo.
  • Instalación paso a paso: descarga desde el Cfx Portal, el requisito de licencia del escrow, cómo conseguir la key gratuita de Imgbb y el permiso de admin.
  • Secciones nuevas: comandos y teclas, mapa de configuración, qué puedes editar, y preguntas frecuentes y problemas.
  • DOCUMENTATION añade el resultado de los atracos y la lista completa de hooks de servidor y eventos de cliente.
  • Se quitan afirmaciones que no eran ciertas: no hay app de teléfono incluida.
  • Sin cambios de código ni de base de datos: no hace falta ninguna migración.

29 de septiembre de 2026

  • El checklist de release deja constancia de que la 1.15.0 se publicó tras probar su build cifrado en un servidor real.
  • Se quitan de la lista de versiones los enlaces a un repositorio antiguo de terceros.
  • Sin cambios de código ni de base de datos: no hace falta ninguna migración.

v1.15.0 · Rediseño de la interfaz y el pulso del robo

Sección titulada «v1.15.0 · Rediseño de la interfaz y el pulso del robo»

29 de septiembre de 2026

Es la versión más grande desde que existe el recurso: la interfaz está reescrita entera y el robo de entregas ha dejado de ser una espera.

  • El webhook de Discord pasa a una convar exclusiva del servidor. Configura set sl_marketplace_discord_webhook "TU_URL" en server.cfg y elimina el antiguo campo Config.Discord.Webhook de tu configuración compartida. El recurso ya no lee ese campo. Mantén Config.Discord.Enabled = true para activar los logs; usa set, nunca setr ni sets, para la URL.
  • Config.Gameplay.NPCDelivery.ExtractionTime ya no existe. Forzar el maletero era aguantar una tecla seis segundos; ahora es un minijuego de puntería que dura lo que tarde el jugador, así que un número fijo de milisegundos dejó de significar nada. Lo sustituyen ExtractionAttempts (cuántos intentos hay) y ExtractionMinSeconds (el suelo que valida el servidor). Quien actualice conservando su config.lua no verá ningún error: el ajuste viejo simplemente se ignora, así que hay que revisarlo a mano.
  • Desaparece también StopSpeedThreshold, que ya estaba anotado en 1.14.3.
  • Toda la documentación está en inglés (*.md) y en español (*.es.md). DOCUMENTACION.md pasa a ser DOCUMENTATION.es.md.
  • La portada de la tienda de un vendedor se desplaza con el contenido y el avatar monta sobre ella sin quedar recortado; el botón de cerrar sigue fijo en la esquina.
  • Vue 3.4.38, Lucide 0.462.0 y las fuentes se incluyen localmente, con sus licencias. El arranque de la interfaz ya no necesita los CDN de JavaScript ni Google Fonts; las fotos y los iconos externos siguen usando sus servicios.
  • Rediseño visual completo, por componentes y con una vista por archivo: catálogo, ficha de producto, publicar, mensajería, perfil, buzón, alertas, seguidos, favoritos, mis anuncios y panel de administración.
  • app.js queda partido en módulos de dominio bajo store/, con una batería de pruebas que vigila que la plantilla no use bindings que setup() no devuelve — el fallo que tenía las ofertas flash invisibles sin un solo error en consola.
  • Los avisos pasan a forma de notificación de móvil, se agrupan cuando se repiten y llevan el color del tema. El icono del HUD y los avisos comparten columna, así que el tercer aviso ya no tapa el icono.
  • Once avisos más pasan de frase a campos, de modo que el artículo, el importe y quién lo manda se leen sin releer la frase entera.
  • Un error de JavaScript ya no deja al jugador sin poder jugar, y un icono o una foto rota ya no se llevan por delante la interfaz.
  • Los markers son un anillo y no un disco: marcan el sitio sin taparlo, laten despacio y se iluminan al acercarte. Cogen el color del tema que tenga puesto el jugador.
  • El «pulsa E para…» es propio, no la cajita gris de GTA, así que también se entera del tema. Va clavado en la entidad de la que habla —el repartidor, la persona con la que has quedado, el maletero— y encoge con la distancia.
  • Con eso desaparece el último texto 3D dibujado con nativas de GTA.
  • Nuevo minijuego: un anillo que da una vuelta y un tramo que hay que acertar. Tres fases, cada una más rápida, más estrecha y con otra tecla, para que no se pueda machacar una sola. Se configura entero en Config.SkillCheck.

  • Fallar cuesta: hay tres intentos por furgoneta y por jugador, y gastados los tres el cierre se revienta para ese jugador. Solo gasta intento fallar el pulso; que te disparen o que la furgoneta arranque, no.

  • Recibir daño corta el intento. Antes solo cortaba disparar tú, así que podías comerte una ráfaga entera con el minijuego girando tan tranquilo.

  • El ladrón se queda quieto y con una animación de estar manipulando algo, en vez de abrir una furgoneta con los brazos colgando.

  • Corregido: con el repartidor encañonado se podía pulsar E y recibir el pedido igual, quedándote el paquete robado y el comprado. Un repartidor retenido ya no entrega nada, y el servidor lo comprueba aunque quien encañone sea un tercero.

  • Tres eventos nuevos para integraciones: sl-marketplace:onSkillCheckStarted, onSkillCheckPhase y onSkillCheckFinished.

  • Tema nuevo: Mono. Neón blanco sobre negro puro, el único sin color de marca. Los markers y el «pulsa E» del mundo lo siguen como a los demás, así que también se vuelven blancos.

  • Los avisos por vendedor seguido se pueden apagar sin dejar de seguirlo, desde la vista de seguidos. Requiere sql/migrate_1.15.sql.
  • El límite de solicitudes de robo por jugador y entrega ya no se reinicia al caducar el token; al agotarlo se invalida también el token anterior.
  • La intimidación comprueba el modelo y la vida del repartidor registrado.
  • Los lotes no se podían publicar con ox_inventory.
  • El buzón trataba un lote como si fuera un item suelto, y la entrega por NPC no llevaba su contenido.
  • Los modales eran invisibles dentro del juego.
  • El panel de administración no abría.
  • La entrega inmediata prometía un buzón que no usa.

20 de agosto de 2026

  • Crítico: server/devtools.lua estaba declarado en fxmanifest.lua pero excluido del ZIP de distribución, de modo que el recurso no arrancaba limpio en una instalación nueva. El archivo vuelve a formar parte del paquete y sigue inerte salvo que Config.Debug sea true y quien lo invoque sea administrador.
  • Las trazas de diagnóstico del flujo de fotografías (39 en Lua, 9 en la interfaz) ya no escriben en consola: quedan detrás de Config.Debug en el servidor y el cliente, y detrás de PHOTO_DEBUG en la interfaz.
  • La carpeta tests/ se excluye del paquete comercial, igual que html/tests/.
  • RELEASE_CHECKLIST.md documenta que git archive produce un ZIP vacío sin error si se lanza fuera de la raíz del repositorio, y añade un paso de verificación del contenido del paquete.

20 de agosto de 2026

  • El servidor elige los modelos de repartidor y furgoneta y el cliente ya no puede spawnear otros distintos.
  • El registro de entidades de una entrega es inmutable, valida modelo, vínculo conductor-vehículo, cercanía al origen y rechaza net IDs reutilizados por otra entrega.
  • Los IDs de entrega y de red se normalizan de forma estricta: se descartan NaN, decimales, negativos y valores fuera del rango de 16 bits.
  • La recogida exige un repartidor vivo, con el modelo esperado y a distancia real del comprador; el reporte de entrega perdida requiere el vehículo destruido y verificado.
  • El robo comprueba el modelo del vehículo y acota la ventana de extracción por arriba, además del mínimo ya existente.
  • Nuevos rate limits dedicados: deliverySpawn, deliveryClaim y deliveryRobbery.
  • La extracción del maletero deja de depender de StopSpeedThreshold (eliminado): puede iniciarse en movimiento, pero mantiene la exigencia de proximidad.
  • Añadida la batería tests/security.test.js que cubre estas garantías.

7 de agosto de 2026

  • Las entregas NPC validan en servidor entidades de red, proximidad, tiempos y motivos de fallo; ya no se puede robar o liquidar una entrega desde cualquier posición.
  • Las pujas usan claims condicionales para evitar carreras de saldo/estado; proxy-bids, cancelaciones y reclamaciones de buzón tienen límites y validaciones adicionales.
  • Reembolsos, cancelaciones administrativas y operaciones de trueque evitan doble resolución; las contraofertas monetarias ahora reservan el dinero del comprador al aceptarse.
  • Se rechazan entradas malformadas, cantidades/precios fuera de rango y acciones bulk sin rate limit.
  • El permiso del panel admin usa el ACE explícito marketplace.admin y la interfaz ya no queda vacía si el usuario no está autorizado.

v1.14.1 · Seguridad de credenciales de imágenes

Sección titulada «v1.14.1 · Seguridad de credenciales de imágenes»

7 de agosto de 2026

  • Las credenciales de Imgbb/Imgur ya no se guardan en config.lua, que se comparte con los clientes.
  • La subida de fotos lee las credenciales desde convars exclusivamente server-side.
  • Añadidas instrucciones de configuración para sl_marketplace_imgbb_key y sl_marketplace_imgur_client_id.

v1.14.0 · Trueque con máquina de estados + contraoferta

Sección titulada «v1.14.0 · Trueque con máquina de estados + contraoferta»

19 de abril de 2026

🔁 Los trueques ahora negocian antes de cerrarse

Sección titulada «🔁 Los trueques ahora negocian antes de cerrarse»
  • Una propuesta pasa por: propuesto → (contrapropuesto)* → aceptado → en-ventana → completado/cancelado
  • El vendedor puede mandar una contraoferta desde el chat pidiendo items distintos; la propuesta original se marca Contrapropuesto y los items ofertados vuelven al comprador
  • El comprador puede aceptar la contraoferta (bloqueando los items pedidos como escrow), rechazarla o cancelar su propuesta original
  • Al aceptar el trueque no se hace el intercambio al instante: se crea un trade en persona que requiere quedada física (misma UX que compra person)
  • Cuando ambos se encuentran en proximidad y confirman, los items + dinero se intercambian finalmente
  • Todos los eventos (propuesta, contraoferta, aceptado, cancelado, rechazado) se registran en el hilo del chat como filas de sistema
  • marketplace:counterTrade — el vendedor publica una contraoferta indicando qué items quiere a cambio
  • marketplace:cancelProposal — el emisor retira su propuesta abierta (refund de escrow)
  • marketplace:rejectProposal — el destinatario rechaza (refund de escrow)
  • marketplace:acceptTrade — reescrito: crea un marketplace_trades de trade_kind='barter' con snapshot de la oferta y arranca la ventana de encuentro
  • Ejecutar sql/migrate_1.14.sql → amplía trade_status del mensaje (countered, cancelled, expired, completed) y añade counter_of_message_id, wanted_items, trade_id; y añade trade_kind + barter_offer en marketplace_trades
  • Trueques ya aceptados en v1.13 siguen completando con el intercambio tradicional; el nuevo flujo solo aplica a propuestas creadas a partir de v1.14

v1.13.0 · Quedar bajo demanda (on-demand meetup)

Sección titulada «v1.13.0 · Quedar bajo demanda (on-demand meetup)»

19 de abril de 2026

🤝 El trade en persona ya no dispara blips/prompts automáticamente

Sección titulada «🤝 El trade en persona ya no dispara blips/prompts automáticamente»
  • Tras comprar con person, se abre el chat con el vendedor como antes, pero no hay blip ni prompt
  • Cualquiera de los dos envía una propuesta de quedada desde el chat (posición actual o punto en el mapa)
  • La otra parte Acepta / Rechaza la propuesta desde el chat
  • Solo al aceptarse se activan blip + prompt de proximidad; además se abre una ventana temporal (10 min por defecto)
  • Si nadie se acerca a tiempo, la quedada caduca y vuelve al estado “chat-only” — se puede re-proponer
  • Cualquier parte puede cancelar una propuesta o una quedada activa en cualquier momento
  • Todos los eventos (propose/accept/cancel/decline/expire) quedan registrados en el hilo del chat como filas de sistema
Config.InPersonTrade = {
...
MeetRequestTimeoutSeconds = 300, -- propuesta caduca sin respuesta
MeetWindowSeconds = 600 -- 10 min para encontraros tras aceptar
}
  • Ejecutar sql/migrate_1.13.sql → añade meet_status, meet_proposed_by, meet_proposed_coords, meet_proposed_at, meet_window_ends_at a marketplace_trades
  • Trades existentes pasan a meet_status='none' → se puede proponer quedada desde el chat

13 de abril de 2026

🚚 El comprador elige cómo recibir, el vendedor marca sus preferidos

Sección titulada «🚚 El comprador elige cómo recibir, el vendedor marca sus preferidos»
  • En listados fixed/dutch/bundle el vendedor marca modos de entrega preferidos (checkboxes multi)
  • El comprador siempre puede elegir cualquier modo al comprar, desde un modal unificado
  • Si elige un modo NO preferido → paga un extra (Config.DeliveryBuyerFee) que va íntegro al vendedor
  • Subastas/trueque/reverse mantienen un único modo fijado por el vendedor (no hay buyer activo al cerrar)
Config.DeliveryBuyerFee = {
mailbox = 0, meetup = 100, npc = 0, person = 300
}
  • Ejecutar sql/migrate_1.10.sql → añade delivery_modes_allowed VARCHAR(60) a marketplace_listings
  • Listados legacy (NULL) siguen funcionando en modo single-mode
  • Modal de compra unificado con radio de 4 modos + chip visual “preferido” / “+$X”
  • Total a pagar se calcula en vivo (precio + extra mode + NPC cost + seguro)
  • Meetup se deshabilita si el listado no tiene punto configurado

v1.9.0 · Vehículos, armas, iconos y toasts propios

Sección titulada «v1.9.0 · Vehículos, armas, iconos y toasts propios»

13 de abril de 2026

  • Inventory.GetList ahora incluye los vehículos de owned_vehicles del jugador
  • Listar un vehículo cambia owner a 'marketplace' (escrow) preservando todas las props/tuning
  • En cancel/expiración → se restaura al vendedor; en venta → se transfiere al comprador
  • Vehículos solo soportan fixed/auction/blind/dutch, con entrega mailbox/meetup/person (NPC delivery bloqueada)
  • item_metadata persiste plate + model del vehículo para la entrega diferida
  • Se listan armas del getLoadout() con ammo y componentes
  • Al listar se hace p.removeWeapon; al reclamar del buzón se restaura con ammo y componentes
  • Label automático: Pistola (120 mun)
  • (ox_inventory ya maneja armas como items, no hace falta capa extra)
  • Config.ItemIcons.UrlPatterns con soporte %s (nombre) y %c (categoría)
  • Prioriza nui://ox_inventory/web/images/ (self-contained, ~2000 iconos gratis)
  • Fallback a nui://marketplace/html/images/ para items custom
  • Cascada on-error: si el primer pattern falla, prueba el siguiente
  • Fallbacks específicos para vehicle y weapon (_vehicle.png / _weapon.png en la carpeta local)
  • Cero dependencias externas — todo se sirve desde FiveM assets

🔔 Toasts propios (no más ESX notify bajo el UI)

Sección titulada «🔔 Toasts propios (no más ESX notify bajo el UI)»
  • Helper notify(msg, ok) en client: si el marketplace está abierto usa el toast NUI interno; si está cerrado cae a ESX
  • Soluciona el bug de notificaciones ESX quedando tapadas por la interfaz
  • La tabla marketplace_listings ya tenía item_metadata; no se necesita migration SQL
  • Si usas un fork con esta columna renombrada, ajusta en createListing

12 de abril de 2026

  • Sin blips por defecto (stealth): ShowBlipToBuyer=false y ShowBlipToWorld=false
  • Los compradores/interceptores deben localizar al repartidor físicamente en el mapa
  • Intimidación: apunta con arma al NPC a <5m → prompt “E” → NPC para el vehículo y alza manos
  • % de éxito configurable (55% por defecto) al intimidar
  • Si falla la intimidación, el NPC intenta huir
  • Hook Config.OnDeliveryRobbed para que servers conecten alerta a policía
  • Broadcast de network IDs del NPC a todos los clientes para que puedan interceptar
  • Nuevo delivery_mode = 'person' en listados
  • Al comprar, el buyer elige punto de encuentro (meetup predefinido o waypoint libre)
  • Tabla marketplace_trades con buyer_accepted + seller_accepted bilateral
  • Ambos ven blip del punto + notificación
  • Proximity scan: cuando ambos están <3m del punto → prompt “E — Iniciar tradeo”
  • Modal bilateral: cada uno ve el estado del otro, los dos deben pulsar “Confirmar mi parte”
  • Transferencia atómica cuando ambos aceptan (item → comprador, dinero → vendedor)
  • Cancelación por timeout (2h default), por abandono, o manual
  • Refunds ya no duplican items: applyRefund ahora retira el item del comprador antes de devolverlo al vendedor. Si el comprador está offline o no tiene el item, el refund se rechaza automáticamente (salvo force admin)
  • Corregido refund de bundles para procesar todos los items del lote
  • Config.Gameplay.NPCDelivery.ShowBlipToBuyer / ShowBlipToWorld
  • Config.Gameplay.NPCDelivery.IntimidationEnabled / IntimidationDistance / RobSuccessRate / PoliceAlertOnRob
  • Config.InPersonTrade.* (Enabled, ProximityMeters, LocationRadiusMeters, TimeoutMinutes, AllowCustomLocation)
  • Config.OnDeliveryRobbed(thiefSrc, deliveryId, value) hook function

12 de abril de 2026

  • Storefronts expandidos: perfil público convertido en una tienda completa
    • Banner de cabecera (URL configurable por vendedor)
    • Descripción larga (hasta 1500 chars)
    • Listados fijados (hasta 3) que aparecen arriba con borde dorado
    • Tabs: Activos / Vendido / Valoraciones / Sobre (long description)
    • Muestra historial de ventas recientes + top valoraciones
    • Link rápido desde el perfil propio para ver “mi storefront”
  • Pin/unpin listings con botón en la propia tienda del vendedor
  • Sistema de refunds completo:
    • Ventana configurable (7 días por defecto)
    • Botón “Pedir refund” en historial para compras elegibles
    • Modal de solicitud con motivo obligatorio (mín 10 chars)
    • Sección en historial para el vendedor con refunds pendientes
    • Vendedor aprueba (→ item vuelve, dinero vuelve) o rechaza con nota
    • Auto-aprobación por timeout configurable (72h default)
    • Panel admin con cola de refunds y botón force
  • Columnas nuevas en marketplace_users: banner_url, long_description, pinned_listings
  • Tabla nueva marketplace_refunds con tracking completo
  • Config.Storefront.Enabled / MaxPinned / LongDescriptionMaxLen
  • Config.Refunds.Enabled / WindowDays / AutoApproveAfterHours / ServerFeeRefunded

12 de abril de 2026

  • Nuevo listing_type barter: intercambio de items sin dinero (o con componente monetario)
  • Vendedor especifica wants_items (items que acepta a cambio) o marca wants_any
  • Columna offered_items en marketplace_messages para propuestas de trueque
  • Columna trade_status (open/accepted/rejected/withdrawn) en messages
  • Modal “Proponer trueque” con selector de items del inventario + dinero opcional
  • Items propuestos se bloquean en escrow hasta aceptar/rechazar/expirar
  • Al aceptar: transferencia atómica bidireccional
  • Al aceptar una propuesta: todas las demás se auto-rechazan y se reembolsan
  • Al expirar: item del publicante vuelve al buzón + refund de todas las propuestas
  • Botón “Aceptar trueque” en chat (solo visible para el publicante del barter)
  • Config.Barter.Enabled / AllowMoneyComponent / MaxItemsPerProposal / DurationMinutes

12 de abril de 2026

  • Subastas holandesas (dutch): precio empieza alto y baja automáticamente
    • Columnas dutch_floor, dutch_step_percent, dutch_interval_min
    • Precio actual calculado en vivo (client + server)
    • UI muestra countdown hasta la próxima bajada
    • Validaciones de rango: step 5-25%, floor >= 10% del precio inicial
  • Subastas inversas (reverse): el comprador publica lo que busca
    • El comprador deposita el precio máximo en escrow
    • Los vendedores envían ofertas via chat con offer_amount
    • Botón “Aceptar oferta” en el chat para el comprador
    • Al aceptar: transfer de item, payout con comisión, refund del excedente
    • Si expira sin aceptar: devuelve depósito automáticamente
  • Config nuevos: Config.Auctions.Dutch, Config.Auctions.Reverse (toggles)

12 de abril de 2026

  • Nuevo delivery mode npc: un NPC en vehículo lleva el paquete al comprador
  • Spawn automático de ped + vehículo desde el meetup más cercano
  • NPC conduce hasta el destino con IA de GTA V
  • Sistema de interceptación opcional: si Config.Gameplay.NPCDelivery.Interceptable=true, otros jugadores ven un blip rojo en el origen y pueden robar al NPC
  • Solo listados por valor >= MinValueForIntercept generan blips compartidos
  • Seguro opcional (+10%): si roban el paquete, el vendedor cobra el 80% del precio
  • Payout al vendedor solo al confirmarse la entrega (no al comprar)
  • Detección de robo por muerte del NPC o destrucción del vehículo
  • Auto-retry si el vehículo se queda atascado
  • Blip privado del comprador siempre visible para seguir su paquete
  • Timeout automático de 15 min que cancela la entrega y reembolsa
  • Tabla marketplace_deliveries con historial completo
  • Config.Gameplay.NPCDelivery.Enabled
  • Config.Gameplay.NPCDelivery.Cost ($500 por envío)
  • Config.Gameplay.NPCDelivery.Interceptable (toggle para server no-PvP)
  • Config.Gameplay.NPCDelivery.MinValueForIntercept
  • Config.Gameplay.NPCDelivery.InsuranceCost / InsurancePayout
  • Config.Gameplay.NPCDelivery.MaxDistance, Speed, DeliveryTimeout
  • Config.Gameplay.NPCDelivery.Models.Peds / Vehicles

12 de abril de 2026

  • Flash sales con descuento temporal (10-70%) y duración configurable (10-120 min)
  • Badge rojo pulsante y countdown visible en cards
  • Precio tachado con descuento aplicado
  • Bundles (lotes): empaqueta hasta 8 items del inventario en un listado
  • UI builder para crear lotes con selector desde inventario
  • Entrega múltiple al comprar un lote
  • Placeholder Config.Gameplay.NPCDelivery para v1.4

12 de abril de 2026

  • Subastas ciegas (blind): pujas ocultas hasta el final
  • Proxy bidding estilo eBay: sube tu puja automáticamente hasta tu máximo
  • Config.Auctions.Blind.Enabled y Config.Auctions.ProxyBidding.Enabled

12 de abril de 2026

  • Follow vendedores con notificaciones de nuevos listados
  • Wishlist / alertas por item con precio máximo opcional
  • Badge vendedor verificado automático (50 ventas + 4.5★ + 10 ratings)
  • Sistema de reportes con motivos configurables
  • Perfil público clicable con listados activos
  • UI overhaul: sidebar, design tokens, iconos Lucide, command palette (Ctrl+K)
  • Skeleton loaders, toasts con iconos, empty states mejorados

12 de abril de 2026

  • Venta directa y subastas con anti-snipe automático
  • Buy Now en subastas con refund al pujador
  • Bump de listados expirados/activos (cuesta dinero)
  • Featured listings con borde dorado y prioridad en orden
  • Perfiles de vendedor con shop name único, bio, avatar color
  • Ratings 1-5 estrellas + comentario tras cada compra
  • Reputación automática (+1 por venta, +1 por 5★)
  • Categorías de items con iconos
  • Rarezas (común → legendario) con precio mínimo forzado
  • Multi-foto por listado (hasta 4) con cámara libre in-game
  • Upload de fotos a Imgur vía API
  • Chat/ofertas comprador↔vendedor por listado con inbox
  • Favoritos / watchlist con notificaciones al pujar
  • Notificaciones push en tiempo real con toasts por tipo
  • Sonidos en eventos clave (outbid, venta, compra)
  • Entrega física “meetup” en 4 puntos del mapa con blip + ruta
  • Buzón (mailbox) para items y dinero con claim
  • Historial de transacciones filtrable (ventas/compras/todo)
  • Estadísticas de precio histórico al elegir item en vender
  • Filtros avanzados: búsqueda, categoría, rareza, rango precio, orden
  • Paginación con total de listados y páginas
  • Panel admin con listar/cancelar/banear
  • ACE permissions group.admin + identifiers manuales
  • Comando /marketadmin para abrir en modo admin
  • Webhooks Discord configurables por evento
  • Rate limiting (ventana deslizante) por acción y jugador
  • Auto-cleanup de listados y mailbox antiguos (cron 1h)
  • UI Vue 3 por CDN (sin build step) con i18n ES/EN
  • Modal de confirmación sustituyendo confirm() del navegador
  • Galería de fotos con navegación teclado
  • Empty states con iconos grandes por sección
  • Soporte para ox_inventory autodetectado
  • Stub de integración con lb-phone / qb-phone
  • 8 tablas SQL con índices apropiados y foreign keys
  • Abstracción de inventario ESX/ox en server/inventory.lua
  • Módulo de webhooks Discord aislado en server/discord.lua
  • Módulo de cámara libre aislado en client/camera.lua