SCRIPT

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

Cadena de trabajo

La cadena de cada vino es: uva, mosto (prensa), vino sin etiqueta (barril), vino (etiquetado) y copas.

  1. 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.
  2. Prensar: 6 uvas dan 1 mosto, en 10 s.
  3. Barril: del mosto sale el vino sin etiqueta. El estado del barril se guarda en la tabla ov_vinedo_barriles y sobrevive a los reinicios. Capacidades y tiempos están en la sección "Configuración".
  4. Etiquetar: el vino sin etiqueta pasa a ser vino con la etiqueta ov_vin_etiqueta.
  5. Limpieza: las tijeras y las botellas sucias son items propios (ov_vin_tijeras_sucias, ov_vin_botella_sucia).
  6. Servir: 4 copas en 4 s.
  7. Beber: quita 15 de sed, dura 3 s y devuelve la copa vacía.
  8. 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:

RecursoPara qué
ox_libLógica no visual (comandos, callbacks, puntos)
oxmysqlBase de datos
qb-coreTrabajo vinedo, dinero y permisos
ox_inventoryItems, almacén y tienda
ov_vinedo_propsPrensa, husillo, barril y racimos

Opcionales, se cambian en config.lua:

Instalación

  1. Copia las carpetas ov_vinedo_props y ov_vinedo a la carpeta de recursos del servidor.
  2. Añade al server.cfg, después de ox_inventory y ov_negocios:

ensure ov_vinedo_props ensure ov_vinedo

  1. Pega items_ox_inventory.txt en ox_inventory/data/items.lua (sección siguiente).
  2. Añade el trabajo vinedo a qb-core/shared/jobs.lua (sección "Trabajo en jobs.lua").
  3. Arranca el servidor. Las tablas se crean solas y la primera vez se cargan los puntos de fábrica de Marlowe Vineyards.
  4. Ejecuta /ovtest ov_vinedo y 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.

GrupoItems
Herramientasov_vin_tijeras, ov_vin_tijeras_sucias
Uvaov_vin_uva_tinta, ov_vin_uva_blanca, ov_vin_uva_rosada
Mostoov_vin_mosto_tinto, ov_vin_mosto_blanco, ov_vin_mosto_rosado
Botellasov_vin_botella_vacia, ov_vin_botella_sucia, ov_vin_etiqueta
Vino sin etiquetaov_vin_tinto_sin, ov_vin_blanco_sin, ov_vin_rosado_sin
Vinoov_vin_tinto, ov_vin_blanco, ov_vin_rosado
Copasov_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:

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ónValor por defectoQué controla
Config.Idioma'es'Idioma: es, en o pt
Config.Distancia2.0Metros para usar un punto
Config.DistanciaVer25.0Metros a los que se ven las placas de los puntos
Config.Trabajovinedo, abierto = false, gradoJefe = 3Trabajo exigido
Config.PermisosAdmingod, adminPermisos de qb-core para el editor
Config.Recoger6 s, 2 a 4 racimos, rebrote 180 s, ensuciar 0.15Cortar uva
Config.Prensa10 s, 6 uvasPrensado
Config.Servir4 copas, 4 sServir copas
Config.Bebersed 15, 3 s, efecto 40, devuelveCopa = trueBeber
Config.Tiendatijeras 150, botella vacía 15, etiqueta 10, copa 20Precios (dinero en mano; si no alcanza, del banco)
Config.Reparto2 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 mRepartos
Config.Garajevehículo bison, ped s_m_y_xmech_01Garaje del trabajo
Config.Almacen60 slots, peso 300000Almacé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 teclaQuiénQué hace
/vinedoeditorAdminAbre el editor de puntos (server/extra.lua, línea 221)
Tecla E (control 38)JugadorUsa 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.

ColumnaTipo
idINT UNSIGNED, autoincremental, clave primaria
tipoVARCHAR(20)
x, y, zDOUBLE
hDOUBLE, por defecto 0

Tabla ov_vinedo_barriles: el estado de cada barril, que sobrevive a los reinicios.

ColumnaTipo
puntoINT UNSIGNED, clave primaria
vinoVARCHAR(10), admite NULL
mostoINT, por defecto 0
listoBIGINT, admite NULL
botellasINT, 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:

ModeloColisiónUso
ov_vin_prensaSí (en el .ydr y en el .ybn)Prensa de uvas
ov_vin_prensa_husilloNo, declaradaHusillo que un script gira y baja; la colisión la da la prensa fija
ov_vin_barril_grifoSí (en el .ydr y en el .ybn)Barril con grifo
ov_vin_racimo_tintoNo, declaradaRacimo decorativo
ov_vin_racimo_rosadoNo, declaradaRacimo decorativo
ov_vin_racimo_blancoNo, declaradaRacimo 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íntomaCausa probableQué hacer
El recurso no arrancaFalta una dependencia o el orden de ensure es incorrectoComprueba ox_lib, oxmysql, qb-core, ox_inventory y ov_vinedo_props
Faltan items o salen sin imagenNo se pegó items_ox_inventory.txt o faltan los .pngPega el archivo en items.lua y copia las imágenes con el nombre del item
No puedes usar los puntos ni la tiendaNo tienes el trabajo vinedoRevisa jobs.lua y asigna el trabajo con un grado del 0 al 3
/vinedoeditor no respondeFalta el permisoDa el ACE ov_vinedo.admin o usa un permiso de Config.PermisosAdmin
Prensa o barril sin colisiónov_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 apareceFalta el modelo ov_vin_prensa_husilloComprueba que ov_vinedo_props está iniciado
Reparto sin destinosov_negocios no tiene bares, licorerías ni restaurantesPon puntos cliente con el editor
Vestuario, menú del jefe o llaves no respondenFalta el recurso del eventoRevisa Config.Vestuario, Config.Jefe y Config.Garaje.eventoLlaves
Las tijeras ya no cortanQuedaron 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:

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.