Rehber SpigotAPI Conversation | Oyuncudan input alma

  • Konuyu Başlatan Konuyu Başlatan NotPatch
  • Başlangıç tarihi Başlangıç tarihi
  • Görüntüleme 155

NotPatch

Elmas Güneş Gibi Parıldıyor
Katılım
19 Ocak 2019
Mesajlar
619
Elmaslar
227
Puan
14.555
Konum
İstanbul
Minecraft
NotPatch

Discord:

notpatch

Merhabalar, eklenti yaparken genellikle oyunculardan bir input alırken önce oyuncuyu bir mape ya da sete ekleyip chat eventi dinlemeye çalışırız ve iş biraz karmaşıklaşır birde birden fazla soru varsa her adım için tekrar uygulamalar bazen kişileri yorabiliyor. Conversation oyuncuyla adım adım konuşmayı sağlayan bir özelliktir, oyuncunun sohbete yazdığı mesajı conversationa yönlendirir normal sohbete düşmez ve Prompt classıyla rahatca yönetilebilir.

Karşılaştırma için yapay zekaya kodları yazdırdım.

Map-Set ile olan yöntem:
Kod:
public class EskiYontem extends JavaPlugin implements Listener {

    // Hangi oyuncunun cevap beklediğini tutuyoruz
    private final Set<UUID> bekleyenler = new HashSet<>();

    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(this, this);
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (!(sender instanceof Player player)) return true;

        bekleyenler.add(player.getUniqueId());
        player.sendMessage("Adın ne?");
        return true;
    }

    @EventHandler
    public void onChat(AsyncPlayerChatEvent event) {
        Player player = event.getPlayer();
        if (!bekleyenler.contains(player.getUniqueId())) return;

        event.setCancelled(true);
        bekleyenler.remove(player.getUniqueId());
        player.sendMessage("Merhaba, " + event.getMessage() + "!");
    }
}

Conversation ile olan yöntem:
Kod:
// Plugin
public class YeniYontem extends JavaPlugin {

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (!(sender instanceof Player player)) return true;

        new ConversationFactory(this)
            .withModality(true)
            .withLocalEcho(false)
            .withFirstPrompt(new IsimPrompt())
            .buildConversation(player)
            .begin();

        return true;
    }
}

// Prompt
public class IsimPrompt extends StringPrompt {

    @Override
    public String getPromptText(ConversationContext ctx) {
        return "Adın ne?";
    }

    @Override
    public Prompt acceptInput(ConversationContext ctx, String input) {
        Player player = (Player) ctx.getForWhom();
        player.sendMessage("Merhaba, " + input + "!");
        return Prompt.END_OF_CONVERSATION;
    }
}

Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
 
Merhabalar, eklenti yaparken genellikle oyunculardan bir input alırken önce oyuncuyu bir mape ya da sete ekleyip chat eventi dinlemeye çalışırız ve iş biraz karmaşıklaşır birde birden fazla soru varsa her adım için tekrar uygulamalar bazen kişileri yorabiliyor. Conversation oyuncuyla adım adım konuşmayı sağlayan bir özelliktir, oyuncunun sohbete yazdığı mesajı conversationa yönlendirir normal sohbete düşmez ve Prompt classıyla rahatca yönetilebilir.

Karşılaştırma için yapay zekaya kodları yazdırdım.

Map-Set ile olan yöntem:
Kod:
public class EskiYontem extends JavaPlugin implements Listener {

    // Hangi oyuncunun cevap beklediğini tutuyoruz
    private final Set<UUID> bekleyenler = new HashSet<>();

    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(this, this);
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (!(sender instanceof Player player)) return true;

        bekleyenler.add(player.getUniqueId());
        player.sendMessage("Adın ne?");
        return true;
    }

    @EventHandler
    public void onChat(AsyncPlayerChatEvent event) {
        Player player = event.getPlayer();
        if (!bekleyenler.contains(player.getUniqueId())) return;

        event.setCancelled(true);
        bekleyenler.remove(player.getUniqueId());
        player.sendMessage("Merhaba, " + event.getMessage() + "!");
    }
}

Conversation ile olan yöntem:
Kod:
// Plugin
public class YeniYontem extends JavaPlugin {

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (!(sender instanceof Player player)) return true;

        new ConversationFactory(this)
            .withModality(true)
            .withLocalEcho(false)
            .withFirstPrompt(new IsimPrompt())
            .buildConversation(player)
            .begin();

        return true;
    }
}

// Prompt
public class IsimPrompt extends StringPrompt {

    @Override
    public String getPromptText(ConversationContext ctx) {
        return "Adın ne?";
    }

    @Override
    public Prompt acceptInput(ConversationContext ctx, String input) {
        Player player = (Player) ctx.getForWhom();
        player.sendMessage("Merhaba, " + input + "!");
        return Prompt.END_OF_CONVERSATION;
    }
}

Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
Eklenti yazanlara desteğin için teşekkürler işlerine yarayacağını düşünüyorum.
 
Elinize Sağlık Kısa güzel rehber olmuș
 
güzel anlatım olmuş, her iki yöntemde aynı mantık aslında, birisi cahilce yapılan diğeri de doğrudan düşük seviye olsa gerek... ama artık bunlar da mazide kaldı, yeni sürümlerde dialogue varken pek kullanılacağını sanmam... belki bunun dialogue olanını geliştirebilirsin; aşırı kullanışlı olurdu. mesela para transferi, sunucu ayarları (admin paneli), market sistemi vs vs...
 
güzel anlatım olmuş, her iki yöntemde aynı mantık aslında, birisi cahilce yapılan diğeri de doğrudan düşük seviye olsa gerek... ama artık bunlar da mazide kaldı, yeni sürümlerde dialogue varken pek kullanılacağını sanmam... belki bunun dialogue olanını geliştirebilirsin; aşırı kullanışlı olurdu. mesela para transferi, sunucu ayarları (admin paneli), market sistemi vs vs...
Bence hala bir çok oyuncu 1.21.4 client kullanıyor o yüzden çok güzel olsa da dialog şimdilik bi tık kullanışsız geliyor bana ama güzel fikrin için teşekkürler oyuncuları üst sürüme geçirecek kesin bi update gelirse neden olmasın
 
paperda birkac surumdur deprecated ve removal icin isaretlenmis ve dispeten eski bir api. yerine ilk basta "kotu" dedigin asyncchatevent veya dialog apisi ile yapilmasini oneriyorlar, daha cok esneklik sagliyor. ben de bu sekilde yapiyordum fakat degistirecegim deprecated yapi kullanmanin kimseye artisi yok, eskisi var.
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.


asyncchatevent icinde islem yapmak yerine map<uuid, consumer<string>> gibi bir map tutman daha iyi olur, tek listenerda birden cok sey yapabilirsin farkli consumerlar vererek, ornek tabi sadece.
 
paperda birkac surumdur deprecated ve removal icin isaretlenmis ve dispeten eski bir api. yerine ilk basta "kotu" dedigin asyncchatevent veya dialog apisi ile yapilmasini oneriyorlar, daha cok esneklik sagliyor. ben de bu sekilde yapiyordum fakat degistirecegim deprecated yapi kullanmanin kimseye artisi yok, eskisi var.
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.


asyncchatevent icinde islem yapmak yerine map<uuid, consumer<string>> gibi bir map tutman daha iyi olur, tek listenerda birden cok sey yapabilirsin farkli consumerlar vererek, ornek tabi sadece.
Chat evente kötü demedim ki böyle bir yol olduğunu bi süre önce öğrenmiştim o yüzden açmak istedim konuyu ama deprecated olduğunu bilmiyordum benim hatam, bende tam olarak verdiğin örnekteki gibi
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
bu şeyleri. teşekkurler
 

Hala Discord sunucumuza katılmadın mı?

Büyük bir topluluğun parçası ol, etkinliklere katıl ve özel hediyeler kazanma şansı yakala!

Şimdi Katıl
Üst