-
Notifications
You must be signed in to change notification settings - Fork 11
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 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.
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;
} );