-
-
Notifications
You must be signed in to change notification settings - Fork 9
event handler
Commands may generate events, which can be listened by Event Handlers.
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);
}
}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 10 buckets) and can be used by players, NPCs and monsters to update its internal state.
GlobalDecayEventArgs is fired every 250 milliseconds (1 second per 4 buckets) and can be used by items 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.
There are 3 event handler collections: EventHandlerCollection, GameObjectEventHandlerCollection and PositionalEventHandlerCollection. Let's use PlayerSayEventArgs as the example.
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;
} );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;
} );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;
} );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.
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;
} );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;
} );