Skip to content

Plugin API (Events)

laz edited this page Jun 27, 2025 · 23 revisions

OnLoad()

This event is called one time at server startup.

public override void OnLoad()
{
    Console.WriteLine("Plugin loaded");
}

OnUnload()

This event is called one time at server shutdown.

public override void OnUnload()
{
    Console.WriteLine("Plugin unloaded");
}

OnPacketReceived(PacketEvent)

PacketEvent supports GetPlayer(), GetEndPoint(), GetPacket(), Cancel()

This event is called when server receive packet. This example is showing how to read what player said from text packet.

public override void OnPacketReceived(PacketEvent ev)
{
    var packet = ev.GetPacket();
    
    if (packet is TextMessage textMessage)
    {
        var player = ev.GetPlayer();
        Console.WriteLine($"{player.Username} said {textMessage.Message}");
    }
}

Example below shows how this can be used to prevent specific player from chatting.

public override void OnPacketReceived(PacketEvent ev)
{
    if (ev.GetPacket() is TextMessage textMessage)
    {
        var player = ev.GetPlayer();
        if (mutedPlayer.Contains(player.XUID)) //Why using XUID instead of Username? Players may change their username but XUID can't, it's like account id.
        {
            player.SendMessage("You are muted and can't chat.");
            ev.Cancel(); //So let's ignore and cancel muted player's chat text packet because he is muted.
        }
    }
}

OnPacketSent(PacketEvent)

PacketEvent supports GetPlayer(), GetEndPoint(), GetPacket(), Cancel()

This event is called when server sends packet to player. It's working similar like OnPacketReceived() but you can work with processed packets by server just before they are going to be sent.

Example below is showing how this can be used to add senders username to chat message.

public override void OnPacketSent(PacketEvent ev)
{
    if (ev.GetPacket() is TextMessage textMessage)
    {
        textMessage.Message = $"{textMessage.Username} said {textMessage.Message}"; //let's edit TextMessage packet
        textMessage.Username = "";
    }
}

OnPlayerJoined(PlayerJoinedEvent)

PlayerJoinedEvent supports GetPlayer()

This event is called when player joined the server. This example is showing how to teleport player to specific location like worlds spawn.

public override void OnPlayerJoined(PlayerJoinedEvent ev)
{
    ev.GetPlayer().Teleport(new Vector3(2, -55, -11));
}

OnPlayerLeaved(PlayerLeavedEvent)

PlayerLeavedEvent supports GetPlayer()

This event is called when player leaved the server. Example shows how to send leave message to online players.

public override void OnPlayerLeaved(PlayerLeavedEvent ev)
{
    ev.GetPlayer().CurrentWorld.SendMessage($"{player.Username} Leaved");
}

OnPlayerMove(PlayerMoveEvent)

PlayerMoveEvent supports GetPlayer(), Cancel() (to prevent player from moving)

This event is called every time when player moves, change head rotation. Example shows how to use this to make auto bridge - place block under player.

public override void OnPlayerMove(PlayerMoveEvent ev)
{
    var player = ev.GetPlayer();
    
    player.SendBlock(new DiamondBlock(), player.Position - new Vector3(0, -3, 0)); //player position - player height
}

OnPlayerSkinChanged(PlayerSkinChangedEvent)

PlayerSkinChangedEvent supprots GetPlayer(), GetSkin(), Cancel() (to prevent player from changing skins)

This event is called when player is trying to change their skin. Example below is showing how to prevent player from chaning his skin if skin is not trusted from Minecraft marketplace.

public override void OnPlayerSkinChanged(PlayerSkinChangedEvent ev)
{
    var skin = ev.GetSkin();
    if (!skin.PremiumSkin)
    {
        ev.Cancel();
    }
}