Secret Hideout
Secret Hideout es un mapa: una tienda de reparación de móviles y, bajo una trampilla de su cuarto técnico, un nivel de abajo de tres salas que viene en cinco variantes. Las variantes son decorado, no gameplay. Lo que lleva el script es la trampilla y sus dos palancas, el cambio de variante y la gente que trabaja abajo.
Requisitos#
- Build del juego 3717 o superior. Algunos props vienen de DLCs recientes.
- OneSync, recomendado. El servidor lo usa para dos comprobaciones: que quien tira de una palanca está a su lado y que no hay nadie en el pozo cuando la trampilla se cierra. Sin OneSync el recurso funciona igual, avisa al arrancar y se salta las dos.
- Ni framework ni otros recursos. Es standalone.
- Hecho y probado en FiveM (GTA V Legacy).
Instalación#
- Consigue los archivos. Owner: en Granted Assets de tu Cfx.re Portal. Developer: el enlace de descarga del correo de Tebex.
- Pon la carpeta
secret_mloen los recursos de tu servidor. No le cambies el nombre: el export lo usa. - Añade estas líneas a tu
server.cfgy reinicia, o ejecutarefreshyensure secret_mloen la consola del servidor:
sv_enforceGameBuild 3717
ensure secret_mloDónde está#
El interior es smlo_hackshop. Su puerta es la del sótano del edificio del callejón, en 2.4, -1215.1, 25.9 más o menos. En el juego esa puerta está pintada en la pared; este recurso la recorta del edificio para que se pueda entrar (mira Conflictos con otros mapas).
El nivel de arriba queda justo por debajo de la calle, bajando una escalera corta desde la puerta del callejón: la tienda con su mostrador y su trastienda, un aseo, un taller, un almacén y el cuarto técnico. Se baja por la trampilla del cuarto técnico: da a un pozo con una escalera y abajo están las tres salas del nivel de abajo.
El recurso también trae el plano del interior para el radar y el mapa de pausa.
Variantes#
El nivel de abajo viene en cinco variantes. Solo se ve una a la vez, la misma para todos los jugadores.
| Variante | Qué tiene |
|---|---|
blackhat |
La de por defecto. Escritorios, una mesa con un mapa y una mesa de operaciones |
meth |
Un laboratorio de meta |
coke |
Mesas para cortar, embolsar y pesar coca |
weed |
Una plantación de marihuana |
empty |
Hormigón pelado: las puertas, la escalera y la trampilla con sus palancas, la jaula y la reja de la sala del medio, los conductos y los fluorescentes, con luz blanca. Para servidores que quieran amueblarlo con sus propios props |
Míralas en el vídeo de la ficha.
Cada variante es un entity set del interior (smlo_meth, smlo_coke, etc.). Ninguna trae un trabajo, un sistema de drogas ni un hackeo: eso lo ponen tus scripts.
Elige con cuál arranca#
Al arrancar, el recurso usa la primera de estas que esté puesta:
- La convar
smlo_variant, enserver.cfgantes deensure secret_mlo. Config.Variantenconfig.lua, que de serie esblackhat.
set smlo_variant meth
ensure secret_mloSi la convar nombra una variante que no existe, el servidor lo dice en su consola y usa Config.Variant.
Cámbiala en caliente#
Con el comando:
smlo_variant cokeDesde la consola del servidor funciona siempre. Los jugadores necesitan el ace command.smlo_variant:
add_ace group.admin command.smlo_variant allowSin nombre, el comando dice qué variante está puesta.
Desde otro script de servidor, con el export:
local ok = exports.secret_mlo:setVariant('weed')| Export | Lado | Devuelve |
|---|---|---|
setVariant(name) |
Servidor | true, o false si name no es una de las cinco variantes |
Cuando cambia la variante, los jugadores que están cerca del MLO recargan el interior en el momento. Nadie tiene que salir ni reconectarse.
Cambiar con jugadores en el nivel de abajo puede dejar a alguien dentro de un mueble de la variante nueva. Mejor cambiar con el nivel de abajo vacío.
Un cambio en caliente dura hasta que se reinicia el recurso. Entonces vuelve a mandar la convar o, si no está puesta, Config.Variant.
Léela desde tus scripts#
La variante puesta está en GlobalState.smlo_variant, y GlobalState.smlo_hatch vale true mientras la trampilla está abierta. Tus scripts pueden leerlos, por ejemplo para empezar un trabajo solo cuando está el laboratorio:
if GlobalState.smlo_variant == 'meth' then
-- tu código
endSolo este recurso debería escribirlos.
La trampilla y las palancas#
Hay dos palancas: una en el cuarto técnico, escondida en el lateral del armario eléctrico grande, y otra en la pared del fondo del pozo. Al acercarse a cualquiera sale el aviso «Pulsa E para tirar de la palanca.». Al tirar, la trampilla se abre o se cierra para todos: el estado lo lleva el servidor, así que todos los jugadores ven la misma. Los demás también ven el tirón. La trampilla tarda unos 6 segundos en moverse y por la escalera se puede bajar cuando ha terminado de abrirse.
Una trampilla abierta se cierra sola Config.AutoCloseSeconds después de terminar de abrirse: 45 de serie, 0 para que no se cierre nunca. Con OneSync no se cierra mientras haya alguien en el pozo; espera a que se vacíe. Si se tira de una palanca mientras la trampilla se mueve, sale «La trampilla ya se está moviendo.».
Ajustes#
Están en config.lua, que va abierto en las dos ediciones:
| Ajuste | De serie | Qué hace |
|---|---|---|
Config.AutoCloseSeconds |
45 |
Segundos hasta que una trampilla abierta se cierra sola. 0 = nunca |
Config.Key |
51, ~INPUT_CONTEXT~ |
El control que tira de la palanca (51 = E) y la etiqueta que sale en el aviso |
Config.Distance.prompt |
0.9 |
Metros desde el sitio de delante de la palanca a los que sale el aviso |
Config.Distance.pull |
2.0 |
Metros desde la palanca a los que el servidor acepta un tirón (necesita OneSync) |
Config.Locale |
'en' |
Idioma de los avisos: en o es |
Para añadir un idioma, copia locales/en.lua a locales/<código>.lua, cambia Locales.en por Locales.<código>, traduce las cuatro líneas y pon ese código en Config.Locale.
Las posiciones de la trampilla, las palancas, la escalera y el pozo están en shared/mlo.lua. Son del interior: si se mueven, la trampilla deja de funcionar.
Quién puede usar las palancas#
server/permissions.lua tiene canUse(source, lever). source es el id de servidor del jugador y lever es 1 para la del cuarto técnico o 2 para la del fondo del pozo. Devuelve true para dejar pasar el tirón. De serie deja pasar a todos. El archivo va abierto en las dos ediciones y trae ejemplos comentados con un ace, un trabajo de ESX, un trabajo de QBCore y un objeto de ox_inventory.
Con un ace, sin framework:
function canUse(source, lever)
return IsPlayerAceAllowed(source, 'secret_mlo.hatch')
endadd_ace group.admin secret_mlo.hatch allowCon una tarjeta en ox_inventory, solo para bajar (desde abajo la puede abrir cualquiera):
function canUse(source, lever)
if lever == 2 then return true end
return exports.ox_inventory:Search(source, 'count', 'keycard') > 0
endA quien se rechaza le sale «La palanca no se mueve.». Con OneSync, también a quien está más lejos de la palanca que Config.Distance.pull.
La gente de abajo#
Cada variante amueblada tiene seis personas trabajando en el nivel de abajo: en la nave, en la sala del medio y en la sala de cámaras, y un guardia en la sala del pozo. Arriba, en todas las variantes, alguien detrás del mostrador y alguien en el ordenador del taller. Solo existen en el juego de cada jugador: aparecen cuando se acerca al MLO y se van cuando se aleja, cambian con la variante, no se les puede herir y no reaccionan a nada. empty no tiene a nadie abajo.
| Ajuste | De serie | Qué hace |
|---|---|---|
Config.Ambience.enabled |
true |
Todos, encendidos o apagados |
Config.Ambience.perVariant |
las cuatro true |
La gente de cada variante amueblada, encendida o apagada |
Config.Ambience.shopkeeper |
true |
Alguien detrás del mostrador de arriba |
Config.Ambience.workshop |
true |
Alguien en el ordenador del taller de arriba |
Sus sitios están en shared/ambience.lua, abierto en las dos ediciones. Cada grupo es una escena colocada por el at de su primer ped: al moverlo se mueven juntos las personas y sus props, así que un grupo movido a mano deja de cuadrar con su silla o su mesa.
Conflictos con otros mapas#
Para que se pueda entrar por la puerta del sótano, stream/ lleva dos archivos del propio juego con esa puerta recortada:
sc1_00b_bld2.ydr, el edificio;lr_sc1_00b_0.ybn, su colisión.
Si otro recurso de tu servidor también sustituye alguno de los dos, solo carga una versión. Con la otra, la puerta de este MLO sale pintada en la pared o su colisión no deja pasar.
Para comprobarlo, busca esos dos nombres de archivo en tu carpeta resources. Quédate con una copia: quítalos del otro recurso si no los necesita o pídele a su autor una versión sin ellos. Los dos archivos van sin cifrar para que se puedan cambiar.
stream/int721482162.gfx es el plano del radar y del mapa de pausa. Si lo borras, solo desaparece eso.
Modo depuración#
Añade esto a server.cfg, antes de ensure secret_mlo:
setr smlo_debug 1El servidor y el cliente escriben entonces en su consola lo que hacen (tirones, rechazos, cambios de variante, props creados) y se activan tres comandos:
| Comando | Lado | Qué hace |
|---|---|---|
smlo_hatch |
Servidor | Abre o cierra la trampilla sin palanca |
smlo_ladder |
Cliente (F8) | Crea o quita la escalera del pozo |
smlo_crewreport |
Consola del servidor, o el ace command.smlo_crewreport |
Cada cliente cerca del MLO cuenta dónde está de verdad cada ped y cada prop de la gente de abajo. Sale con el prefijo [secret_mlo] crew y se guarda en crew_report.txt, en la carpeta del recurso |
El modo depuración es para montarlo. Déjalo apagado en un servidor abierto: mientras está encendido, cualquiera puede usar smlo_hatch.
Referencia#
| Tipo | Nombre | Lado | Qué es |
|---|---|---|---|
| Comando | smlo_variant <name> |
Servidor | Cambia la variante. Ace command.smlo_variant |
| Comando | smlo_hatch |
Servidor | Solo en depuración. Abre o cierra la trampilla |
| Comando | smlo_ladder |
Cliente | Solo en depuración. Pone o quita la escalera |
| Export | setVariant(name) |
Servidor | Cambia la variante. Devuelve true o false |
| Evento | secret_mlo:pull (index) |
Cliente a servidor | Un jugador pide tirar de la palanca 1 o 2 |
| Evento | secret_mlo:lever (index, source) |
Servidor a todos | Se ha aceptado un tirón: reproducir la animación de la palanca |
| Evento | secret_mlo:refused (label) |
Servidor a cliente | Se ha rechazado un tirón, con la etiqueta del texto que hay que enseñar |
| State bag | GlobalState.smlo_hatch |
Compartido | true mientras la trampilla está abierta |
| State bag | GlobalState.smlo_variant |
Compartido | Nombre de la variante puesta |
| Convar | smlo_variant |
Servidor | Variante al arrancar; manda sobre Config.Variant |
| Convar | smlo_debug |
Los dos | 1 = mensajes y comandos de depuración. Usa setr |