Nuevas funciones de scripting#
Esto solo funciona en T6 e IW5.
Para IW5, debe colocar scripts de mapa/tipo de juego dentro de un mp
carpeta (Entonces, scripts/mp/mp_rust/myGsc.gsc
o scripts/mp/dm/myFfaGsc.gsc
)
Empezar#
Este tema servirá como un recurso para aquellos que deseen saber qué características / mejoras de scripting están disponibles, así como aquellas que se confirma que están próximas.
En este tema se describirá cómo se denomina la función GSC actualmente existente replaceFunc()
agregado hace bastante tiempo funciona, y entra en detalles sobre cómo funcionan los scripts personalizados también.
Información general sobre replaceFunc()#
replaceFunc() permite a un scripter reemplazar cualquier función de script de un script de stock con su propia versión.
El concepto es similar a cómo funciona un puntero de función ya, pero replaceFunc()
funcionará en cualquier función independientemente de si se llama como puntero de función o no.
El uso principal sería alterar una mecánica de juego central que está controlada por GSC y la única forma de hacerlo normalmente es anulando todo el script, incluso si solo necesita modificar una o dos funciones.
replaceFunc() funciona así:
El primer argumento es la función exacta que le gustaría reemplazar.
Puede ser una función en cualquier script cargado actualmente por el juego (por lo que los scripts dependientes del mapa deben anularse de una manera ligeramente diferente).
También puede ser una función en el mismo script.
Sobre el segundo argumento es la función a la que desea que llame el juego en lugar de la función de acciones.
Es probable que dependa del tipo de función que desea reemplazar que necesitará basar la nueva función en la que está reemplazando para minimizar la probabilidad de que haya problemas.
Cuando se usa en un script, se vería así:
main()
{
replaceFunc( common_scripts/utility::flag_set, ::flag_set_with_print );
}
flag_set_with_print( flagname )
{
print( "Flag set: " + flagname );
level.flag[ flagname ] = 1;
level notify( flagname );
common_scripts/utility::set_trigger_flag_permissions( flagname );
}
Ahora, cada vez que se establece una bandera mediante la llamada normal, en su lugar llama a nuestra función e imprime el nombre de la bandera que se está estableciendo.
Esto es, por supuesto, solo un ejemplo de reemplazo de una función de utilidad simple para tener una mejor comprensión del orden en que se pueden establecer las banderas (que es una gran parte de la lógica en los zombis) en algunos momentos.
Información general sobre scripts con nombre personalizados#
Por lo tanto, es posible que se pregunte: "¿Por qué ese código de ejemplo usa un main() en lugar de un init()?"
Junto con ReplaceFunc() ahora es posible crear scripts totalmente personalizados independientes de los scripts de stock.
Ya no es necesario anular scripts como _clientids
o _development_dvars
.
Adicionalmente ReplaceFunc()
necesita ser ejecutado antes de que se ejecute una función, de lo contrario, los cambios que desearía que se realizaran nunca sucederían.
Por lo tanto, los scripts personalizados tienen un main() para este propósito.
Puedes ReplaceFunc()
cualquier función en el main()
de un script personalizado porque los principales scripts personalizados siempre se ejecutan antes que cualquier script de stock.
Esto, por supuesto, significa que tendría que cambiar cómo funciona su código debido a este orden de carga, ¿verdad?
En realidad, además de un main() los scripts personalizados también tienen un init() al que el juego llamará automáticamente después de que se haya iniciado la lógica del tipo de juego.
De hecho, es aproximadamente al mismo tiempo que _clientids::init()
se llama.
Así que sabiendo esto puedes usar main()
para configurar cualquier tipo de lógica que desee inicializar antes de cualquier otra cosa que el juego normalmente se ejecute.
Entonces también puedes usar init()
Para invalidar valores de variables específicas y utilizar otro código, un _clientids::init()
normalmente contendría.
Ahora que he explicado a fondo los conceptos básicos de estas dos características, entraré en detalle cada peculiaridad o información potencialmente útil sobre ReplaceFunc()
y scripts de nombres personalizados.
Detalles de ReplaceFunc()#
Ahora, aunque había dicho anteriormente, puede reemplazar cualquier función utilizando esta función GSC que no es completamente precisa.
No puede reemplazar ninguna función a la que el motor llame directamente, como:
- Cualquier función que comience con
CodeCallback_
- Cualquier
main()
en una secuencia de comandos con el mismo nombre que el mapa - Cualquier
main()
en una secuencia de comandos con el mismo nombre que el tipo de juego - Una función exclusiva de los zombis llamada
gamemode_callback_setup()
también ubicado en mapname.gsc.
Puede evitar esta limitación anulando todo el script colocándolo en la misma ruta secundaria que espera en storage/gamename/
, o anular todas las funciones a las que llama.
Por ejemplo, si desea reemplazar maps/mp/gametypes/_globallogic.gsc
la ruta sería storage/T6/maps/mp/gametypes/_globallogic.gsc
.
ReplaceFunc()
MOSTO siempre se llamará antes de llamar a la función que desea reemplazar, de lo contrario no tendrá ningún efecto.
Por lo tanto, siempre use ReplaceFunc()
en un main()
de un script personalizado.
Especificaciones específicas de scripts con nombre personalizados#
Los scripts personalizados también se pueden organizar de manera eficiente.
Cualquier script que analice el juego también tendrá sus incluye analizadas, siempre y cuando estén en la misma carpeta o en una subcarpeta de esa carpeta.
Esto le permite crear scripts de utilidad y dividir sus scripts en scripts más pequeños en subcarpetas.
Por ejemplo, podría crear una subcarpeta llamada custom_perks
en scripts/zm
y en él tienen varios scripts diferentes que definen los atributos y la funcionalidad de un beneficio personalizado.
Luego, para llamar a estas funciones en estos scripts, agregaría una inclusión en uno de los scripts en la carpeta zm algo así como #include scripts/zm/custom_perks/flopper;
y entonces podrías llamar a funciones desde él.
Scripts main()
o init()
En las subcarpetas definidas por el usuario son NO llamado por el motor automáticamente.
Cualquier script de stock también se puede incluir en scripts personalizados.
Un usuario también puede colocar scripts en scripts/zm/mapname
Para que el motor solo llame automáticamente a las secuencias de comandos cuando se cargue ese mapa, o también se puede colocar en scripts/zm/gametype
para que solo el motor lo llame automáticamente cuando se cargue ese tipo de juego.
El motor solo llama a los scripts de nivel raíz en estas subcarpetas.
El orden de carga específico para aquellos curiosos funciona así:
- custom_scripts::main()
- gametype::main()
- mapname::main()
- gametype start (_callbacksetup::startgametype)
- custom_scripts::init()