Ajuste de inventario y peso: de items.lua a metadatos

Ajuste de inventario y peso: de items.lua a metadatos

Resumen:Esta guía le ofrece ajustes preestablecidos de peso/ranura listos para producción, tablas de presupuesto de artículos y archivos copiables y pegables. items.lua Definiciones (ESX/QBCore/ox_inventory) y guías de migración segura entre inventarios populares. Úselo para eliminar el problema de la sobrecarga, detener la sobrecarga de artículos y mantener la coherencia de su economía.


Por qué es importante ajustar el inventario

Una economía de rol estable depende de la escasez, la fricción y las decisiones significativas. Las reglas de inventario (espacios, peso, límites de acumulación, metadatos como durabilidad/números de serie) son los factores que hacen que esas decisiones sean reales. Si todos pueden llevar todo, los precios se desploman y los bucles se rompen. Ajusta primero el inventario y luego itera tus precios, pagos y sumideros. Para una economía más amplia, consulta nuestro pilar: Diseño de una economía equilibrada para GTA RP: precios, pérdidas y progresión.


Modelos: Ranuras vs. Peso vs. Híbrido

Solo tragamonedas

  • Modelo cognitivo simple; cada ítem = 1 ranura o definido por clases de tamaño.
  • Débil para diferenciar acumulaciones pesadas de ligeras; se aprovecha de muchos objetos diminutos de alto valor.

Sólo peso

  • Cada artículo tiene un peso (normalmente en gramos). Los jugadores tienen maxWeight Por contenedor. Gran realismo; requiere valores predeterminados bien pensados.

Híbrido (recomendado)

  • Límite de peso global y Límite de ranuras. Previene exploits de micro y megaobjetos. Funciona mejor para RP.

ConsejoMantenga los números legibles para humanos. Si modela en gramos, use números enteros (p. ej., water = 500g) y gorras de jugadores redondos (por ejemplo, maxWeight = 120,000).


Ajustes preestablecidos predeterminados (copiar y adaptar)

A continuación se muestran puntos de partida probados en batalla. Ajuste ±10–20% después de una semana de telemetría en la ciudad.

Inventario de jugadores (en persona)

Escala de servidorModeloPeso máximo (g)TragamonedasNotas
Nuevo/Pequeño (≤40 pp)Híbrido80,00030Incorporación más rápida; menos problemas iniciales.
Medianos (40–150)Híbrido120,00035Equilibrado para RP general; bueno para diversos trabajos.
Pop de alta gama (más de 150)Híbrido150,00032Ajusta los slots para evitar el acaparamiento; mantén el peso justo.

Vehículos (valores predeterminados comunes)

RecipientePeso máximo (g)TragamonedasRazón fundamental
Guantera10,0005Pequeño alijo que fomenta la planificación.
Baúl de los sedanes80,00020Base.
Baúl de SUV/furgoneta120,00025Los vehículos utilitarios adquieren significado.
Camión (utilitario)180,00028Jugabilidad logística.
Almacenamiento de motocicletas8,0003Bolsillos mínimos.

Escondites y contenedores especiales

TipoPeso máximo (g)TragamonedasNotas
Alijo de la casa (niveles 1/2/3)120k / 180k / 240k40 / 60 / 80Incentiva la mejora de las viviendas.
Casillero de trabajo80,00020Prevenir exploits de transferencia.
Casillero de pruebas240,000120Conveniencia para administrador/LEO; se requiere registro de auditoría.

Presupuestos de peso de artículos (por clase)

Utilice esto para asignar pesos consistentes. Piense fricción relativa No realismo.

ClaseEjemplosPeso sugerido (g)
Muy claroCuchilla para cerraduras, USB, SIM5–50
LuzMunición de pistola (10), vendaje, refrigerio100–250
MedioBotella de agua, hamburguesa, kit de reparación.400–800
PesadoCaja de munición para rifle (30), tanque de oxígeno, caja de material1.500–4.000
Muy pesadoCaja de armas, bolsa de dinero (marcada)6.000–12.000

Munición: Presupuesto por unidad para pilas agrupadas (por ejemplo, 9mm = 15g cada uno → 30 rondas ≈ 450 g) o representar como cajas (por ejemplo, 9mm box (30) = 500g).


Tamaños de pila y estrategia de ranuras

  • Materias primas (comida, medicamentos): apile de 5 a 20 para reducir el tedio.
  • Munición: apila de 30 a 60 para pistolas; de 60 a 120 para rifles cuando están en caja.
  • Tapetes de artesanía:Apila 100–250; mantén un peso significativo.
  • Armas: stack = 1, metadatos únicos (número de serie, durabilidad).

Patrones de metadatos (durabilidad, números de serie, archivos adjuntos, calidad)

Diseñe los metadatos como un pequeño esquema. Mantenga los campos mínimos, tipificados y validados.

Esquema de metadatos canónicos (recomendación)

{
 "serial": "string", // weapon unique id
 "owner": "citizenid|identifier",
 "durability": 0.0, // 0.0–1.0; decay per use/time
 "quality": 100, // 0–100; repairable threshold 25
 "ammo": 0, // integer; weapon mags
 "tint": 0, // integer (game tint index)
 "attachments": ["flashlight", "scope"],
 "expiry": 0, // unix timestamp; perishable items
 "notes": "" // small text; avoid bloat
}

Durabilidad y deterioro

  • Armas: decaimiento 0,5–1,5% por cargador; probabilidad de atasco <5% por debajo de una calidad de 20%.
  • Herramientas (ganzúas, taladro): consume % al usarlo; se rompe a los 0.
  • Productos perecederos: expiry comprobar en uso; penalización obsoleta o bloqueo.

Seguridad y rendimiento

  • Valide los metadatos del lado del servidor; nunca confíe en las escrituras del cliente.
  • Limitar el tamaño de los metadatos (p. ej., <512 bytes). Los blobs grandes afectan negativamente al guardado/carga y las cargas útiles de red.
  • Utilice enumeraciones para archivos adjuntos y tintes.

Código: items.lua / definiciones de elementos por marco

Ejemplo de ESX (es_extended)

-- esx items.lua (example) — weight in grams; negative weight means not counted in legacy modes
['water'] = { label = 'Water Bottle', weight = 500, stack = true, close = true, description = 'Stay hydrated.' },
['bandage'] = { label = 'Bandage', weight = 150, stack = true, close = true },
['lockpick'] = { label = 'Lockpick', weight = 50, stack = true, close = true },
['pistol_ammo'] = { label = 'Pistol Ammo (30)', weight = 450, stack = true, close = true, description = '9mm, box of 30.' },
['weapon_pistol'] = { label = 'Pistol', weight = 1500, stack = false, close = true, degrade = 0.01, unique = true },

Para las variantes de ESX que aún utilizan límite en lugar de peso, colocar limit = -1 (ilimitado) y cambia el saldo económico por peso a nivel mundial.

QBCore (shared/items.lua) ejemplo

-- qb-core shared/items.lua
['water'] = { name = 'water', label = 'Water Bottle', weight = 500, type = 'item', image = 'water.png', unique = false, useable = true, shouldClose = true, description = 'Stay hydrated.',
 combinable = nil },
['bandage'] = { name = 'bandage', label = 'Bandage', weight = 150, type = 'item', image = 'bandage.png', unique = false, useable = true, shouldClose = true },
['lockpick'] = { name = 'lockpick', label = 'Lockpick', weight = 50, type = 'item', image = 'lockpick.png', unique = false, useable = true, shouldClose = true },
['pistol_ammo'] = { name = 'pistol_ammo', label = 'Pistol Ammo (30)', weight = 450, type = 'item', image = 'pistol_ammo.png', unique = false, useable = true, shouldClose = true },
['weapon_pistol'] = { name = 'weapon_pistol', label = 'Pistol', weight = 1500, type = 'weapon', image = 'weapon_pistol.png', unique = true, useable = false, shouldClose = true,
 info = { serial = '', durability = 1.0, ammo = 12, attachments = {} } },

ox_inventory (data/items.lua) ejemplo

return {
 water = {
 label = 'Water Bottle',
 weight = 500,
 stack = true,
 client = { status = { thirst = 25000 }, anim = { dict = 'mp_player_intdrink', clip = 'loop_bottle' } },
 },
 bandage = { label = 'Bandage', weight = 150, stack = true },
 lockpick = { label = 'Lockpick', weight = 50, stack = true },
 pistol_ammo = { label = 'Pistol Ammo (30)', weight = 450, stack = true },
 weapon_pistol = {
 label = 'Pistol', weight = 1500, stack = false, allowArmed = true,
 consume = 0, -- handled by durability system
 ammo = { type = 'AMMO_PISTOL', count = 12 },
 metadata = { serial = true, durability = true, attachments = true },
 },
}

inventario_de_bueyes apoya a los ricos client/server comportamientos en las definiciones de elementos: prefiera los elementos integrados en lugar de scripts ad hoc para estandarizar el comportamiento.


Ejemplos de aplicación híbrida

Configuración del contenedor QBCore (ejemplo)

-- qb-inventory/server/config.lua (illustrative)
Config.PlayerMaxWeight = 120000
Config.PlayerMaxSlots = 35
Config.Vehicle = {
 glovebox = { weight = 10000, slots = 5 },
 trunk = function(class)
 if class == 'sedan' then return 80000, 20 end
 if class == 'suv' or class == 'van' then return 120000, 25 end
 if class == 'truck' then return 180000, 28 end
 return 60000, 18
 end
}

Configuración del inventario de ox_inventory (ejemplo)

-- ox_inventory/server/custom/stashes.lua
lib.addstash('house_tier1', 40, 120000)
lib.addstash('house_tier2', 60, 180000)
lib.addstash('house_tier3', 80, 240000)

Manuales de migración (seguros y reversibles)

Principios

  1. Primero, tome una instantánea de la base de datos. 2) Migre elementos/metadatos con scripts idempotentes. 3) Ejecute en paralelo en un servidor de prueba. 4) Proporcione SQL de reversión.

A) qb-inventoryox_inventory

Campos del mapa

  • QB items.luaox data/items.lua (name, label, weight, stack/unique, client/server behaviors).
  • player inventory tabla: convertir info JSON → metadata (serie, durabilidad, munición).

Pseudocódigo (mezcla de Lua y SQL)

-- 1) Export QB items to a Lua table/JSON
-- 2) Generate ox items.lua entries
-- 3) Transform inventories
for item in qb_inventory_rows do
 local meta = json.decode(item.info or '{}')
 local metadata = {
 serial = meta.serial,
 durability = meta.durability or 1.0,
 ammo = meta.ammo or 0,
 attachments = meta.attachments or {},
 }
 insert_into_ox_inventory(item.name, item.amount, metadata)
end

Ejemplo de SQL (estilo PostgreSQL/MySQL)

-- Backup
CREATE TABLE backup_playeritems AS SELECT * FROM playeritems;

-- Transform example for a single item family
UPDATE playeritems
SET metadata = JSON_OBJECT(
 'serial', JSON_EXTRACT(info, '$.serial'),
 'durability', COALESCE(JSON_EXTRACT(info, '$.durability'), 1.0),
 'ammo', COALESCE(JSON_EXTRACT(info, '$.ammo'), 0),
 'attachments', COALESCE(JSON_EXTRACT(info, '$.attachments'), JSON_ARRAY())
)
WHERE name IN ('weapon_pistol','weapon_pistol_mk2');

Trampas

  • Artículos únicos: hacer cumplir stack = false; asegúrese de que los duplicados no se fusionen.
  • Sistemas de munición: reconciliar las convenciones de munición en caja y suelta.
  • Imágenes/iconos: re-direccionar las imágenes de los elementos para que coincidan con el nombre de Ox.

B) ESX (basado en límites) → modelo de peso

  1. Establecer global useWeight = true en configuración (varía según la bifurcación).
  2. Reemplazar por artículo limit con weight (g). Para artículos anteriormente limit = -1, asignar pesos realistas.
  3. Migre los límites de almacenamiento/vehículo según corresponda.

Pase con guión

for name, item in pairs(Items) do
 if item.limit and not item.weight then
 item.weight = estimateWeightFromClass(name)
 item.limit = nil
 end
end

DO) qs-inventory / lj-inventory → QBCore/buey

  • El mapeo de campo es similar a QB: infometadata.
  • Esté atento a las teclas personalizadas (quality, image, createdAt). Normalizar al esquema canónico.

Equilibrio del flujo de trabajo (sprint de 1 semana)

  1. Día 0:Implementar ajustes preestablecidos; migrar elementos a la tabla de presupuesto.
  2. Día 1–2: Telemetría de captura: peso promedio transportado, espacios utilizados, distribución de elementos por trabajo.
  3. Día 3:Ajustar los valores atípicos (+5–10% peso en los 5 elementos principales acumulados).
  4. Día 4–5:Roles del vehículo: mejorar los baúles utilitarios; debilitar el abuso de la guantera.
  5. Día 6:Perecederos: añadir expiry para consumibles de alto margen.
  6. Día 7:Publicar notas del parche; establecer una revisión de dos semanas.

Telemetría mínima

  • % time encumbered, avg slots used, los 20 artículos principales por cantidad y peso total, percentiles de utilización de existencias.

Lista de verificación de control de calidad (lista para enviar)

  • Todos los artículos tienen weight, stacky etiquetas claras.
  • Las armas son unique/no apilar e incluir serial, durability.
  • Los contenedores hacen cumplir ambos peso y ranuras (donde sea compatible).
  • Las clases de vehículos se asignan a capacidades sensibles.
  • Alijos escalonados según la progresión.
  • Migraciones respaldadas y reversiones probadas.
  • Tamaño de metadatos limitado; validado del lado del servidor.

Plantillas descargables (en línea)

Presupuesto de peso CSV (copiar a Hojas de cálculo de Google)

name,label,class,weight_g,stack,stack_size
water,Water Bottle,consumable,500,true,10
bandage,Bandage,medical,150,true,5
lockpick,Lockpick,tool,50,true,10
pistol_ammo,Pistol Ammo (30),ammo,450,true,5
weapon_pistol,Pistol,weapon,1500,false,1

Tabla de capacidad del vehículo (CSV)

container,weight_g,slots
Glovebox,10000,5
Sedan Trunk,80000,20
SUV/Van Trunk,120000,25
Truck Trunk,180000,28
Motorcycle,8000,3

Errores comunes y soluciones

  • Los jugadores siempre están sobrecargados → Reducir el peso de los 3 objetos más comunes en 15%; aumentar el límite de jugadores en 10%.
  • Acaparamiento infinito de microartículos → Introduzca un límite de ranura; establezca el peso mínimo del artículo (por ejemplo, 25 g).
  • Inflación económica por acumulación de existencias → Añadir productos perecederos expiry, creación de fricción de peso de entrada o tarifas de alijo.
  • Hinchazón de la base de datos → Podar claves de metadatos; evitar grandes notes campos.

Próximos pasos

  • Implemente los ajustes preestablecidos híbridos anteriores y luego itere con telemetría.
  • Alinee la fricción del inventario con los pagos y los precios: consulte nuestra publicación sobre economía para lavabos y modelos de progresión que combinan bien con estas configuraciones.

¿Tienes preguntas sobre una bifurcación específica del framework o un inventario personalizado? Cuéntanos los detalles y adaptaré las configuraciones exactas.