Pumpkin-Docs/docs/tr_TR/plugin-dev/migrating-from-bukkit/events.md
Alexander Medvedev 5c23b676ed feat: d binding
2026-09-17 09:23:24 +02:00

4.1 KiB
Raw Permalink Blame History

Bukkit'ten Olayları Taşıma

Bukkit'te olaylar, Listener arayüzünü uygulayan sınıflar oluşturularak ve metotlara @EventHandler ek açıklaması (annotation) eklenerek işlenir.

Pumpkin'da olay işleyicileri (event handlers), context.register_event_handler(...) aracılığıyla açıkça kaydedilen yapılar (structs) veya nesnelerdir. Pumpkin ayrıca sunucu eşzamanlılığını maksimize etmek için Bloklayan (Blocking) ve Bloklamayan (Non-blocking) olaylar arasında ayrım yapar.


Temel Farklar

Özellik Bukkit / Spigot Pumpkin
Dinleyici Bildirimi Metotlar üzerinde @EventHandler ek açıklaması EventHandler<E> trait / arayüz uygulaması
Kayıt pm.registerEvents(listener, plugin) context.register_event_handler(handler, priority, is_blocking)
Yürütme Modeli Ana iş parçacığında yürütme (EventPriority) Bloklayan (sıralı/iptal edilebilir) ve Bloklamayan (eşzamanlı) arasında seçim
İptal Etme event.setCancelled(true) Bloklayan olaylarda event.cancel()

Pumpkin'da Bloklayan ve Bloklamayan Olaylar

Tüm olay işleyicilerinin ana sunucu iş parçacığında sıralı olarak çalıştığı Bukkit'in aksine Pumpkin, bir olay işleyicisinin bloklayan olup olmadığını belirlemenize olanak tanır:

// Registration signature in Rust:
context.register_event_handler(handler, priority, is_blocking)?;
  • Bloklayan (is_blocking = true): Sıralı öncelik sırasına göre yürütülür. Olay verilerini değiştirebilir (ör. giriş mesajını düzenleme) veya olayı iptal edebilir.
  • Bloklamayan (is_blocking = false): Çalışan iş parçacıkları (worker threads) arasında eşzamanlı olarak yürütülür. İptal işleminin gerekmediği günlük kaydı (logging), metrikler veya harici bildirimler için idealdir.

Kod Karşılaştırması: Oyuncu Giriş Olayı

1. Bukkit Uygulaması (Java)

public class JoinListener implements Listener {
    @EventHandler(priority = EventPriority.NORMAL)
    public void onPlayerJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        event.setJoinMessage("Welcome " + player.getName() + " to the server!");
    }
}

// In JavaPlugin:
// getServer().getPluginManager().registerEvents(new JoinListener(), this);

2. Pumpkin Uygulamaları

::: code-group

use pumpkin_plugin_api::{
    Context, Plugin, PluginMetadata, Server,
    events::{EventData, EventHandler, EventPriority, PlayerJoinEvent},
    text::TextComponent,
};

struct JoinHandler;

impl EventHandler<PlayerJoinEvent> for JoinHandler {
    fn handle<'a>(
        &'a self,
        _server: Server,
        mut event: EventData<PlayerJoinEvent>,
    ) -> EventData<PlayerJoinEvent> {
        event.join_message = TextComponent::text("Welcome to the Pumpkin server!");
        event
    }
}

pub struct MyPlugin;

impl Plugin for MyPlugin {
    fn new() -> Self { MyPlugin }

    fn metadata(&self) -> PluginMetadata {
        PluginMetadata {
            name: "join_plugin".into(),
            version: "1.0.0".into(),
            authors: vec!["Developer".into()],
            description: "Join event handler".into(),
        }
    }

    fn on_load(&mut self, context: Context) -> pumpkin_plugin_api::Result<()> {
        // Register blocking event handler with Normal priority
        context.register_event_handler(JoinHandler, EventPriority::Normal, true)?;
        Ok(())
    }
}
from pumpkin_api import (
    Plugin, PluginMetadata, register_plugin,
    event, server, context
)

class MyPlugin(Plugin):
    def metadata(self) -> PluginMetadata:
        return PluginMetadata(name="join_plugin", version="1.0.0", authors=["Dev"], description="Join event")

    def on_load(self, ctx: context.Context) -> None:
        self.register_event(ctx, event.EventType.PLAYER_JOIN_EVENT, self.on_player_join)

    def on_player_join(self, srv: server.Server, evt: event.PlayerJoinEventData) -> event.PlayerJoinEventData:
        print(f"Player joined!")
        return evt

register_plugin(MyPlugin)

:::