Skip to content

event handler

mtanksl edited this page Feb 14, 2025 · 8 revisions

Introduction

Commands may generate events, which can be listened by Event Handlers.

Example

Let's listen to the PlayerLoginEventArgs, which occurs when any player logs in the game.

public class PlayerLoginScripts : Script
{
    private Guid playerLogin;

    public override void Start()
    {
        playerLogin = Context.Server.EventHandlers.Subscribe<PlayerLoginEventArgs>( (context, e) =>
        {
            Context.Server.Logger.WriteLine(e.Player.Name + " login.", LogLevel.Information);

            return Promise.Completed;
        } );
    }

    public override void Stop()
    {
        Context.Server.EventHandlers.Unsubscribe(playerLogin);
    }
}

Global events

You can listen to some global events and react accordingly.

GlobalRealClockTickEventArgs is fired every 1 minute.

GlobalTibiaClockTickEventArgs is fired every 1 in-game minute (2.5 seconds).

GlobalTickEventArgs is fired every 100 milliseconds (1 second per group using 10 groups) and can be used by NPCs and monsters to update its internal state.

GlobalSpawnEventArgs is fired every 10 seconds.

GlobalRaidEventArgs is fired every 60 seconds.

GlobalEnvironmentLightEventArgs is fired every 10 seconds.

GlobalPingEventArgs is fired every 10 seconds.

Event handler collections

There are 3 event handler collections: EventHandlerCollection, GameObjectEventHandlerCollection and PositionalEventHandlerCollection. Let's use PlayerSayEventArgs as the example.

EventHandlerCollection

When ++a++ player says something, the event is fired.

Context.Server.EventHandlers.Subscribe<PlayerSayEventArgs>( (context, e) =>
{
    Context.Server.Logger.WriteLine(e.Player.Name + " said " + e.Message, LogLevel.Information);

    return Promise.Completed;
} );

GameObjectEventHandlerCollection

When ++the++ player says something, the event is fired.

Context.Server.GameObjectEventHandlerCollection.Subscribe<PlayerSayEventArgs>(player, (context, e) =>
{
    Context.Server.Logger.WriteLine(e.Player.Name + " said " + e.Message, LogLevel.Information);

    return Promise.Completed;
} );

PositionalEventHandlerCollection

When a player says something near the observer, the event is fired.

Context.Server.PositionalEventHandlerCollection.Subscribe<PlayerSayEventArgs>(observer, (context, e) =>
{
    Context.Server.Logger.WriteLine(e.Player.Name + " said " + e.Message, LogLevel.Information);

    return Promise.Completed;
} );

ObserveEventArgs

Some events are dispatched direct to nearby observers using ObserveEventArgs. For example, when the player says something with PlayerSayEventArgs, the observer hears something with ObserveEventArgs<PlayerSayEventArgs>. Those are related, but two distinct events.

EventHandlerCollection

When ++a++ observer hears something, the event is fired.

Context.Server.EventHandlers.Subscribe< ObserveEventArgs<PlayerSayEventArgs> >( (context, e) =>
{
    Context.Server.Logger.WriteLine(e.SourceEvent.Player.Name + " said " + e.SourceEvent.Message, LogLevel.Information);

    return Promise.Completed;
} );

GameObjectEventHandlerCollection

When ++the++ observer hears something, the event is fired.

It is similar to using PositionalEventHandlerCollection.

Context.Server.GameObjectEventHandlerCollection.Subscribe< ObserveEventArgs<PlayerSayEventArgs> >(observer, (context, e) =>
{
    Context.Server.Logger.WriteLine(e.SourceEvent.Player.Name + " said " + e.SourceEvent.Message, LogLevel.Information);

    return Promise.Completed;
} );