Reaccionar a los eventos del juego en CounterStrikeSharp
Los eventos del juego son mensajes que el juego envía cuando ocurre algo: muere un jugador, empieza una ronda, se planta la bomba. La mayoría de los plugins interesantes se construyen con ellos. En CounterStrikeSharp suscribirse a un evento lleva solo unas pocas líneas.
Qué es un evento
Cada evento tiene su propia clase, con un nombre que empieza por Event, como EventPlayerDeath o EventRoundStart, y lleva datos de lo ocurrido, por ejemplo quién murió y quién lo mató. Tu plugin recibe un método al que se llama cada vez que el evento sucede.
Suscríbete con un atributo
La forma más sencilla es el atributo GameEventHandler sobre un método. El método recibe el evento y devuelve un HookResult. Los datos del evento se leen directamente del objeto evento.
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
using Microsoft.Extensions.Logging;
public class EventsPlugin : BasePlugin
{
public override string ModuleName => "Events Example";
public override string ModuleVersion => "1.0.0";
[GameEventHandler] public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info) {
Logger.LogInformation("{Name} died", @event.Userid?.PlayerName);
return HookResult.Continue;
}
}
Suscríbete desde el código
También puedes registrar un manejador en el método Load con RegisterEventHandler. Hace lo mismo y es mejor cuando quieres suscribirte solo bajo ciertas condiciones, por ejemplo según la configuración.
public override void Load(bool hotReload)
{
RegisterEventHandler<EventRoundStart>((@event, info) =>
{
Logger.LogInformation("Round started");
return HookResult.Continue;
});
}
Pre y Post
Por defecto tu manejador se ejecuta después de que el juego procese el evento (Post). Con HookMode.Pre se ejecuta antes, lo que te permite cambiar lo que ocurre, por ejemplo ocultar el mensaje por defecto con DontBroadcast. Usa Post salvo que de verdad necesites intervenir.
[GameEventHandler(HookMode.Pre)]
public HookResult OnPlayerDeathPre(EventPlayerDeath @event, GameEventInfo info)
{
if ([email protected])
{
info.DontBroadcast = true;
}
return HookResult.Continue;
}
Los jugadores pueden ser null
Propiedades como Userid pueden venir vacías, por ejemplo si el jugador se fue justo cuando saltó el evento o si el asesino es el propio mundo. Comprueba siempre null antes de usarlas; si no, un mal momento lanza una excepción en mitad de la ronda.
Qué significa HookResult
Continue deja que el juego siga con normalidad y es la respuesta correcta casi siempre. Handled le dice al juego que te has ocupado tú, y Stop impide que se ejecuten otros manejadores. Devuelve Continue salvo que tengas un motivo para otra cosa.
Buenos hábitos
Los manejadores se ejecutan en el hilo principal del juego, así que mantenlos rápidos y nunca esperes en ellos a una base de datos o a una petición web. No hace falta darse de baja al descargar el plugin, CounterStrikeSharp quita los manejadores por ti. Para la lista de eventos y sus campos, consulta la documentación de eventos del juego.
¿Te ha resultado útil este tutorial?
Barlap para la comunidad.