Documentación de OV Viñedo
OV Viñedo (ov_vinedo)
Que hace
Trabajo de bodega de Otra Vida. El jugador corta uva en las parras, la prensa, fermenta el mosto en barriles, lava y llena botellas, las etiqueta, sirve copas y reparte pedidos a bares, licorerías y restaurantes de ov_negocios. Hay tres vinos (tinto, blanco y rosado), tienda, garaje, almacén, vestuario y menú del jefe. Trae un editor de puntos en el juego y textos en español, inglés y portugués.
Estado
- Versión 1.0.0 en pruebas.
- Precio: 30 USD.
/ovtest ov_vinedodio 15 OK y 0 fallos segúndatos/ENCARGO.md(línea 9). Esta documentación no lo ejecutó.- Sin probar en el juego: menú, editor, cadena completa de trabajo, reparto, garaje y tienda.
- Los datos salen de
config.lua,fxmanifest.lua,server/db.lua,items_ox_inventory.txtyLEEME.mddel recurso.
Cadena de trabajo
La cadena de cada vino es: uva, mosto (prensa), vino sin etiqueta (barril), vino (etiquetado) y copas.
- Recoger: con tijeras, de 2 a 4 racimos por parra, 6 s de corte. La parra vuelve a tener uva a los 180 s, para todos los jugadores. Con un 15 % de probabilidad las tijeras quedan sucias.
- Prensar: 6 uvas dan 1 mosto, en 10 s.
- Barril: del mosto sale el vino sin etiqueta. El estado del barril se guarda en la tabla
ov_vinedo_barrilesy sobrevive a los reinicios. Capacidades y tiempos están en la sección "Configuración". - Etiquetar: el vino sin etiqueta pasa a ser vino con la etiqueta
ov_vin_etiqueta. - Limpieza: las tijeras y las botellas sucias son items propios (
ov_vin_tijeras_sucias,ov_vin_botella_sucia). - Servir: 4 copas en 4 s.
- Beber: quita 15 de sed, dura 3 s y devuelve la copa vacía.
- Repartir: pedido de 2 a 6 botellas a un bar, licorería o restaurante, a 140-220 dólares por botella más 60 por km. Hay 900 s para entregar y 60 s de espera entre pedidos.
Dependencias
Declaradas en dependencies del fxmanifest.lua:
| Recurso | Para qué |
|---|---|
ox_lib | Lógica no visual (comandos, callbacks, puntos) |
oxmysql | Base de datos |
qb-core | Trabajo vinedo, dinero y permisos |
ox_inventory | Items, almacén y tienda |
ov_vinedo_props | Prensa, husillo, barril y racimos |
Opcionales, se cambian en config.lua:
ov_negocios: de su tablaov_negociossalen los destinos de reparto. Si no hay ninguno, se usan los puntosclientepuestos con el editor.- Vestuario: evento
illenium-appearance:client:openOutfitMenu(Config.Vestuario). - Menú del jefe: evento
qb-bossmenu:client:OpenMenu(Config.Jefe). - Llaves: evento
vehiclekeys:client:SetOwner(Config.Garaje.eventoLlaves). Vacío significa sin llaves.
Instalación
- Copia las carpetas
ov_vinedo_propsyov_vinedoa la carpeta de recursos del servidor. - Añade al
server.cfg, después deox_inventoryyov_negocios:
ensure ov_vinedo_props ensure ov_vinedo
- Pega
items_ox_inventory.txtenox_inventory/data/items.lua(sección siguiente). - Añade el trabajo
vinedoaqb-core/shared/jobs.lua(sección "Trabajo en jobs.lua"). - Arranca el servidor. Las tablas se crean solas y la primera vez se cargan los puntos de fábrica de Marlowe Vineyards.
- Ejecuta
/ovtest ov_vinedoy comprueba que da 0 fallos.
Para desactivar el recurso, saca su carpeta fuera de la carpeta de recursos. No dejes # ensure ov_vinedo comentado en el server.cfg.
Items para ox_inventory
items_ox_inventory.txt trae 21 items con prefijo ov_vin_. Se pega dentro de ox_inventory/data/items.lua. Las imágenes van en ox_inventory/web/images con el nombre del item y extensión .png.
| Grupo | Items |
|---|---|
| Herramientas | ov_vin_tijeras, ov_vin_tijeras_sucias |
| Uva | ov_vin_uva_tinta, ov_vin_uva_blanca, ov_vin_uva_rosada |
| Mosto | ov_vin_mosto_tinto, ov_vin_mosto_blanco, ov_vin_mosto_rosado |
| Botellas | ov_vin_botella_vacia, ov_vin_botella_sucia, ov_vin_etiqueta |
| Vino sin etiqueta | ov_vin_tinto_sin, ov_vin_blanco_sin, ov_vin_rosado_sin |
| Vino | ov_vin_tinto, ov_vin_blanco, ov_vin_rosado |
| Copas | ov_vin_copa, ov_vin_copa_tinto, ov_vin_copa_blanco, ov_vin_copa_rosado |
Los nombres de los items también están en Config.Items y Config.Vinos. Si renombras un item, cámbialo en los tres sitios.
Trabajo en jobs.lua
El trabajo se llama vinedo y tiene grados del 0 al 3. El grado 3 es el jefe (Config.Trabajo.gradoJefe). Añade esto a qb-core/shared/jobs.lua:
['vinedo'] = { label = 'Viñedo', defaultDuty = true, offDutyPay = false, grades = { ['0'] = { name = 'Recolector', payment = 0 }, ['1'] = { name = 'Bodeguero', payment = 0 }, ['2'] = { name = 'Maestro de bodega', payment = 0 }, ['3'] = { name = 'Jefe del viñedo', isboss = true, payment = 0 }, }, },
Los nombres de los grados y los pagos son los del servidor Legacy; puedes cambiarlos. El script solo usa la clave y los grados 0 a 3. Lo que el script usa:
- La clave del trabajo es
vinedoy existen los grados 0 a 3. - Con
Config.Trabajo.abierto = truecualquiera puede trabajar sin tener el trabajo. - La tienda tiene
soloTrabajo = true.
Configuración (config.lua)
Todo lo que puede cambiar el dueño del servidor está en config.lua y en shared/idiomas_es.lua, shared/idiomas_en.lua y shared/idiomas_pt.lua.
| Opción | Valor por defecto | Qué controla |
|---|---|---|
Config.Idioma | 'es' | Idioma: es, en o pt |
Config.Distancia | 2.0 | Metros para usar un punto |
Config.DistanciaVer | 25.0 | Metros a los que se ven las placas de los puntos |
Config.Trabajo | vinedo, abierto = false, gradoJefe = 3 | Trabajo exigido |
Config.PermisosAdmin | god, admin | Permisos de qb-core para el editor |
Config.Recoger | 6 s, 2 a 4 racimos, rebrote 180 s, ensuciar 0.15 | Cortar uva |
Config.Prensa | 10 s, 6 uvas | Prensado |
Config.Servir | 4 copas, 4 s | Servir copas |
Config.Beber | sed 15, 3 s, efecto 40, devuelveCopa = true | Beber |
Config.Tienda | tijeras 150, botella vacía 15, etiqueta 10, copa 20 | Precios (dinero en mano; si no alcanza, del banco) |
Config.Reparto | 2 a 6 botellas, 140 a 220 por botella, 60 por km, mínimo 400 m, espera 60 s, caduca 900 s, entrega a 6.0 m | Repartos |
Config.Garaje | vehículo bison, ped s_m_y_xmech_01 | Garaje del trabajo |
Config.Almacen | 60 slots, peso 300000 | Almacén |
Los precios de la tienda y del reparto son dólares. Los destinos de reparto salen de los tipos licoreria, bar y restaurante y de los catálogos licoreria, licoreria_puerto, licoreria_sectorcero, bar_marina, sky_lounge y vanilla.
Copia literal de config.lua, líneas 40 a 54
Husillo, barril, fregadero y etiquetado, tal como están en el archivo:
-- Husillo de la prensa (modelo de ov_vinedo_props): se coloca 'altura' m sobre el origen de la prensa, gira 'vueltas' y baja 'bajada' m durante el prensado, luego sube en 'subidaMs' Config.Husillo = { modelo = 'ov_vin_prensa_husillo', altura = 1.08, bajada = 0.30, vueltas = 4, subidaMs = 1200 }
-- Barril: se mete mosto de UN tipo, fermenta y da vino para llenar botellas Config.Barril = { capacidad = 10, -- mosto maximo por barril fermentar = 900, -- segundos que fermenta (15 minutos reales); se cuenta aunque nadie este cerca botellasPorMosto = 3, -- botellas que salen de cada mosto segundosPorBotella = 2, maxPorTanda = 10, -- botellas como maximo en cada llenado }
Config.Fregadero = { segundosPorUnidad = 1.5, maxPorTanda = 10 } Config.Etiquetado = { segundosPorBotella = 2, maxPorTanda = 10 }
Copia literal de config.lua, desde la línea 99
Blip, modelos de los puntos y objetos en la mano, tal como están en el archivo:
-- Blip del viñedo (en el primer punto 'almacen') Config.Blip = { sprite = 85, color = 27, escala = 0.8 }
-- Objetos que se ponen en algunos puntos (nil = ninguno). Del juego base, elegidos en la biblioteca de objetos. -- prensa y barril son modelos propios del recurso ov_vinedo_props. Config.Props = { prensa = 'ov_vin_prensa', barril = 'ov_vin_barril_grifo', almacen = 'h4_prop_h4_barrel_pile_01a', reparto = 'prop_fruit_plas_crate_01', }
-- Objetos en la mano durante cada accion (del juego base) Config.Mano = { recoger = { model = 'prop_fruit_basket', bone = 57005, pos = { 0.40, 0.0, -0.10 }, rot = { 0.0, -90.0, 0.0 } }, etiquetar = { model = 'prop_wine_red', bone = 18905, pos = { 0.10, 0.02, 0.05 }, rot = { -80.0, 0.0, 0.0 } }, servir = { model = 'prop_wine_red', bone = 18905, pos = { 0.10, 0.02, 0.05 }, rot = { -80.0, 0.0, 0.0 } }, beber = { model = 'prop_drink_redwine', bone = 18905, pos = { 0.10, -0.05, 0.03 }, rot = { -100.0, 0.0, -10.0 } }, }
-- Puntos de fabrica en Marlowe Vineyards. Solo se usan la primera vez (tabla vacia); despues manda el editor -- (/vinedoeditor). Tipos validos en shared/logica.lua (Vin.TIPOS). Config.PuntosFabrica = { { tipo = 'parra_tinta', x = -1859.24, y = 2098.63, z = 138.53 }, { tipo = 'parra_tinta', x = -1851.58, y = 2107.21, z = 135.69 }, { tipo = 'parra_tinta', x = -1843.90, y = 2105.78, z = 137.79 }, { tipo = 'parra_tinta', x = -1833.63, y = 2110.65, z = 136.31 }, { tipo = 'parra_tinta', x = -1844.72, y = 2110.52, z = 135.02 }, { tipo = 'parra_tinta', x = -1831.57, y = 2116.44, z = 133.32 }, { tipo = 'parra_blanca', x = -1874.71, y = 2099.45, z = 139.14 }, { tipo = 'parra_blanca', x = -1882.07, y = 2099.61, z = 139.24 }, { tipo = 'parra_blanca', x = -1891.79, y = 2100.55, z = 138.21 }, { tipo = 'parra_blanca', x = -1883.13, y = 2104.22, z = 137.61 }, { tipo = 'parra_blanca', x = -1880.00, y = 2108.84, z = 136.42 }, { tipo = 'parra_blanca', x = -1878.03, y = 2112.95, z = 135.13 }, { tipo = 'parra_rosada', x = -1850.22, y = 2089.88, z = 139.88 }, { tipo = 'parra_rosada', x = -1840.25, y = 2095.50, z = 138.61 }, { tipo = 'parra_rosada', x = -1845.62, y = 2087.16, z = 139.19 }, { tipo = 'parra_rosada', x = -1837.54, y = 2087.06, z = 138.00 }, { tipo = 'parra_rosada', x = -1835.64, y = 2082.72, z = 137.66 }, { tipo = 'parra_rosada', x = -1830.74, y = 2080.66, z = 136.53 }, { tipo = 'prensa', x = -1882.69, y = 2091.74, z = 139.89, h = 250.75 }, { tipo = 'prensa', x = -1888.42, y = 2092.98, z = 139.89, h = 250.75 }, { tipo = 'barril', x = -1904.67, y = 2093.08, z = 139.85, h = 8.0 }, { tipo = 'barril', x = -1900.44, y = 2093.76, z = 139.85, h = 8.0 }, { tipo = 'barril', x = -1895.93, y = 2094.27, z = 139.85, h = 8.0 }, { tipo = 'fregadero', x = -1897.65, y = 2078.97, z = 140.78 }, { tipo = 'etiquetado', x = -1907.54, y = 2092.26, z = 139.99 }, { tipo = 'almacen', x = -1885.70, y = 2075.11, z = 140.00, h = 160.5 }, { tipo = 'vestuario', x = -1909.29, y = 2072.05, z = 140.64 }, { tipo = 'jefe', x = -1860.37, y = 2053.66, z = 141.18 }, { tipo = 'tienda', x = -1890.75, y = 2074.56, z = 140.00, h = 250.0 }, { tipo = 'garaje', x = -1924.95, y = 2048.03, z = 139.83, h = 258.23 }, { tipo = 'garaje_salida', x = -1918.35, y = 2056.79, z = 139.74, h = 258.15 }, { tipo = 'reparto', x = -1879.77, y = 2091.79, z = 140.35 }, }
Comandos y teclas
| Comando o tecla | Quién | Qué hace |
|---|---|---|
/vinedoeditor | Admin | Abre el editor de puntos (server/extra.lua, línea 221) |
| Tecla E (control 38) | Jugador | Usa el punto más cercano (client/main.lua, línea 232) |
Permiso del editor: el ACE ov_vinedo.admin, o ser admin o god de qb-core (Config.PermisosAdmin, comprobado con Functions.HasPermission).
El editor muestra todos los puntos con su número. Permite añadir uno del tipo elegido donde está parado el admin, moverlo, ir a él o borrarlo con confirmación.
Tablas SQL
Las crea el propio recurso al arrancar con CREATE TABLE IF NOT EXISTS (VinDB.Crear en server/db.lua). Se pueden crear dos veces sin error y no hace falta importar ningún archivo SQL.
Tabla ov_vinedo_puntos: los puntos del editor.
| Columna | Tipo |
|---|---|
id | INT UNSIGNED, autoincremental, clave primaria |
tipo | VARCHAR(20) |
x, y, z | DOUBLE |
h | DOUBLE, por defecto 0 |
Tabla ov_vinedo_barriles: el estado de cada barril, que sobrevive a los reinicios.
| Columna | Tipo |
|---|---|
punto | INT UNSIGNED, clave primaria |
vino | VARCHAR(10), admite NULL |
mosto | INT, por defecto 0 |
listo | BIGINT, admite NULL |
botellas | INT, por defecto 0 |
Ambas usan el motor InnoDB y el juego de caracteres utf8mb4.
Props (ov_vinedo_props)
Recurso aparte, versión 1.2.0, con this_is_a_map 'yes' en su manifest. Trae 6 modelos en stream/ y el archivo ov_vinedo_props.ytyp:
| Modelo | Colisión | Uso |
|---|---|---|
ov_vin_prensa | Sí (en el .ydr y en el .ybn) | Prensa de uvas |
ov_vin_prensa_husillo | No, declarada | Husillo que un script gira y baja; la colisión la da la prensa fija |
ov_vin_barril_grifo | Sí (en el .ydr y en el .ybn) | Barril con grifo |
ov_vin_racimo_tinto | No, declarada | Racimo decorativo |
ov_vin_racimo_rosado | No, declarada | Racimo decorativo |
ov_vin_racimo_blanco | No, declarada | Racimo decorativo |
Los modelos sin colisión están declarados con su motivo en OV_DECLARADOS.json del recurso de props.
Solución de problemas
| Síntoma | Causa probable | Qué hacer |
|---|---|---|
| El recurso no arranca | Falta una dependencia o el orden de ensure es incorrecto | Comprueba ox_lib, oxmysql, qb-core, ox_inventory y ov_vinedo_props |
| Faltan items o salen sin imagen | No se pegó items_ox_inventory.txt o faltan los .png | Pega el archivo en items.lua y copia las imágenes con el nombre del item |
| No puedes usar los puntos ni la tienda | No tienes el trabajo vinedo | Revisa jobs.lua y asigna el trabajo con un grado del 0 al 3 |
/vinedoeditor no responde | Falta el permiso | Da el ACE ov_vinedo.admin o usa un permiso de Config.PermisosAdmin |
| Prensa o barril sin colisión | ov_vinedo_props no está iniciado o no se recargó | Haz refresh, restart ov_vinedo_props y reconecta; revisa con /ovtest ov_vinedo |
| El husillo no aparece | Falta el modelo ov_vin_prensa_husillo | Comprueba que ov_vinedo_props está iniciado |
| Reparto sin destinos | ov_negocios no tiene bares, licorerías ni restaurantes | Pon puntos cliente con el editor |
| Vestuario, menú del jefe o llaves no responden | Falta el recurso del evento | Revisa Config.Vestuario, Config.Jefe y Config.Garaje.eventoLlaves |
| Las tijeras ya no cortan | Quedaron sucias (15 % de probabilidad al cortar) | Cambia a unas tijeras limpias o lávalas |
Pruebas con /ovtest ov_vinedo
/ovtest ov_vinedo es el comando de pruebas de Otra Vida. No está en el código de ov_vinedo. Según datos/ENCARGO.md, comprueba:
- los recursos necesarios y los 21 items;
- las tablas
ov_vinedo_puntosyov_vinedo_barriles; - el trabajo
vinedocon grados 0 a 3; - los 6 modelos de
ov_vinedo_props; - los 32 puntos de fábrica;
- la colisión de prensa y barril, medida con rayos (CHOCA 5/5);
- el husillo animado.
Resultado registrado en el encargo: 15 OK y 0 fallos.
Pruebas de simulación del recurso, con lua5.4 desde la carpeta de ov_vinedo:
lua5.4 tests/sim_logica.lua lua5.4 tests/sim_idiomas.lua lua5.4 tests/sim_servidor.lua
Sin probar en el juego: el menú, el editor, la cadena completa de trabajo, el reparto, el garaje y la tienda. Hector debe hacer esa prueba antes de publicar.
