/** * Inicializa el TutorMessage. * * @nota Solo debe ser usado dentro de la función plugin_precache() * * @noreturn **/ stock Tutor_Init()
/** * Envia un TutorMessage al jugador. * * @param id Client index * @param Color Ver el enum TutorTypeColor * @param message Mensaje a mostrar al jugador * @param ... ... * * @noreturn **/ stock Tutor_ShowMsg(id, TutorTypeColor:Color, const szMessage[], any:...)
Ejemplo de uso:
Código PHP:
#include <amxmodx> #include <cztutor>
#define PLUGIN "Ejemplo de uso del Include CZTutor" #define VERSION "1.0" #define AUTHOR "[N]drs"
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /timeleft", "ShowTimeleft") }
public plugin_precache() Tutor_Init()
public ShowTimeleft(id) { new szTimeleft[8] get_cvar_string("amx_timeleft", szTimeleft, charsmax(szTimeleft))
Cita:Ya sé que hay varios ejemplos de uso de este tema, pero no había algo solido para masticar Hypnotize - Por indirectamente darme la idea de armar ese include
Claro, el problema es que en CS 1.6, tendrían que instalarse cada uno los archivos de resource, por lo que sé, solo se puede de forma automática por slowhacking, lástima, porque sería buena forma de implementarlo
pero es muy bueno
(01/03/2023, 10:17 PM)andrexsitop escribió: Hola me sale esto al momento que tiene que salir el tutor mgs
cabe recalcar que tengo precacheado el Tutor_Init() en public plugin_precache()
Código PHP:
#include <amxmodx> #include <cztutor>
#define PLUGIN "Ejemplo de uso del Include CZTutor" #define VERSION "1.0" #define AUTHOR "[N]drs"
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say a", "ShowTimeleft") }
public plugin_precache() Tutor_Init()
public ShowTimeleft(id) { new szTimeleft[8] get_cvar_string("amx_timeleft", szTimeleft, charsmax(szTimeleft))
/** * Inicializa el TutorMessage. * * @nota Solo debe ser usado dentro de la función plugin_precache() * * @noreturn **/ stock Tutor_Init()
/** * Envia un TutorMessage al jugador. * * @param id Client index * @param Color Ver el enum TutorTypeColor * @param message Mensaje a mostrar al jugador * @param ... ... * * @noreturn **/ stock Tutor_ShowMsg(id, TutorTypeColor:Color, const szMessage[], any:...)
Ejemplo de uso:
Código PHP:
#include <amxmodx> #include <cztutor>
#define PLUGIN "Ejemplo de uso del Include CZTutor" #define VERSION "1.0" #define AUTHOR "[N]drs"
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /timeleft", "ShowTimeleft") }
public plugin_precache() Tutor_Init()
public ShowTimeleft(id) { new szTimeleft[8] get_cvar_string("amx_timeleft", szTimeleft, charsmax(szTimeleft))
13/09/2023, 03:48 PM (Última modificación: 13/09/2023, 03:53 PM por meTaLiCroSS. Edited 2 times in total.)
Está mal diseñado el uso de Tutor_Init, y la gente que ha tenido el error mencionado y tiene el código correcto se debe principalmente a que es el primer arranque del server. El problema yace en get_user_msgid, del cual sería bueno le eches un ojo:
Cita:/**
* Returns unique id of a client message.
*
* @note Example usage: get_user_msgid("TextMsg")
* @note The message id is unique as long as the server is running, but might
* change between updates. They should not be hardcoded into plugins. * @note On first server start, this function will return 0 if used inside
* plugin_precache(). Consider hooking RegUserMsg in order to retrieve
* the correct message id.
*
* @param name Client message name
*
* @return Message id, 0 if message was not found
*/
native get_user_msgid(const name[]);
En el primer arranque del servidor, no hay ningun MsgId registrado, por lo que usar get_user_msgid dentro de plugin_precache devolvería 0 a cualquier parámetro. Esto solo aplica al primer arranque, los posteriores ya no tendrán problema porque basta con 1 llamado a LinkUserMessages (https://github.com/s1lentq/ReGameDLL_CS/....cpp#L3715) para que todos los MsgId estén cacheados
No es necesario guardar el valor en Tutor_Init, puedes perfectamente hacerlo en cada llamado y hacer caché ahí mismo. Aproveché de limpiar el include con algunas mejoras y unos fixes que te invito los documentes si estás de acuerdo:
Código PHP:
#if defined _cztutor #endinput #endif #define _cztutor
/*======================== Inc CZTutor v1.6 by [N]drs ========================*/
/** * Inicializa el TutorMessage. * * @note Solo debe ser usado dentro de la función plugin_precache() * * @noreturn **/ stock Tutor_Init() { for(new i = 0; i < sizeof(__szTResources); i++) { if(!file_exists(__szTResources[i])) set_fail_state("[CZTutor] Falta el archivo %s, descargalo de https://amxmodx-es.com/Thread-INC-CZTutor-v1-6", __szTResources[i])
precache_generic(__szTResources[i]) } }
/** * Envia un TutorMessage al jugador. * * @param id Client index * @param Color Ver el enum TutorTypeColor * @param Duration Duracion en pantalla del Tutor * @param message Mensaje a mostrar al jugador * @param ... ... * * @noreturn **/ stock Tutor_ShowMsg(id, TutorTypeColor:Color, Float:Duration, const szMessage[], any:...) { static iTutorTextMsgId
if(!iTutorTextMsgId) { if( !(iTutorTextMsgId = get_user_msgid("TutorText")) ) set_fail_state("[CZTutor] TutorText no esta programado en el gamedll") }
new iArgs[1] iArgs[0] = iTaskId set_task(Duration, "__Tutor_DestroyMsg", id + iTaskId, iArgs, sizeof iArgs) }
public __Tutor_DestroyMsg(const args[], id) { id -= args[0]
if(!is_user_connected(id)) return;
static iTutorCloseMsgId
if(!iTutorCloseMsgId) { if( !(iTutorCloseMsgId = get_user_msgid("TutorClose")) ) set_fail_state("[CZTutor] TutorClose no esta programado en el gamedll") }
- Ahora los índices de los MsgId provenientes de los client messages serán obtenidos y cacheados en cada ejecución respectiva para evitar cachearlos en una única llamada bajo la función Tutor_Init
- El task index ahora será distinto en cada mapa para evitar colisiones de task indexes.
- Todas las declaraciones de funciones/variables internas del stock fueron antepuestas con "__" como norma para evitar conflictos con nombres de otras funciones/variables del plugin.
- Fixeado bug que llamaba TutorClose cuando el jugador potencialmente podría estar desconectado.
- Cambiado los mensajes a un canal RELIABLE (MSG_ONE_UNRELIABLE -> MSG_ONE, MSG_BROADCAST -> MSG_ALL) al ser mensajes que requieren que el destinatario reciba sin excepciones el HUD
- Ahora en vez de remover el task y llamar TutorClose, simplemente se cambiará el timer del task actual ya que se sobrepone el TutorText actual con el que se está por enviar.
- Limpiados los mensajes de error para una lectura más simple
- Agregado parámetro "Duration" para definir la duración del TutorText en vez de un número fijo
(no lo compilé porque no estoy en mi PC pero al ojo la semántica está bien, de haber un problema al compilar me imagino será fácilmente arreglable)