Çözüldü Bukkit: ProtocolLIB gibi bir bağımlılık kullanmadan oyuncu nametaglarını değiştirebilir miyim ?

  • Konuyu Başlatan Konuyu Başlatan mdfnative
  • Başlangıç tarihi Başlangıç tarihi
  • Görüntüleme 537
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

mdfnative

Odunlara Vur Vur Vur!
Katılım
22 Şubat 2025
Mesajlar
49
Elmaslar
36
Puan
970
Konum
Turkey
Minecraft
mdfnative

Discord:

theskrr

Bir plugin üzerinde çalışıyorum ve bir oyuncunun nametagını değiştirmek istiyorum. Ancak protocollib kullanmadan bunu yapmanın mümkün olup olmadığını öğrenmek istiyorum. Yardımcı olursanız sevinirim
 
Evet, ProtocolLib kullanmadan da oyuncu nametaglarını değiştirebilirsin. Ancak Bukkit ve Spigot apisi doğrudan nametagleri değiştirmek için bir seçenek sunmuyor. Benim düşüncem bunun yerine scoreboard teams veya packet manipulation kullanabilirsin.

şöyle ufak bir örnek verebilirim:

Java:
public class NameTagChanger {
    public static void setPlayerNametag(Player player, String prefix, String suffix) {
        Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
        Team team = scoreboard.getTeam(player.getName());

Scoreboard Teams için konuşacak olursak;

- Eklenti API desteği ile çalışır.
- 16 karakter limiti var.
- Renk kodlarının desteklemektedir.
 
Evet, ProtocolLib kullanmadan da oyuncu nametaglarını değiştirebilirsin. Ancak Bukkit ve Spigot apisi doğrudan nametagleri değiştirmek için bir seçenek sunmuyor. Benim düşüncem bunun yerine scoreboard teams veya packet manipulation kullanabilirsin.

şöyle ufak bir örnek verebilirim:

Java:
public class NameTagChanger {
    public static void setPlayerNametag(Player player, String prefix, String suffix) {
        Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
        Team team = scoreboard.getTeam(player.getName());

Scoreboard Teams için konuşacak olursak;

- Eklenti API desteği ile çalışır.
- 16 karakter limiti var.
- Renk kodlarının desteklemektedir.
team.setDisplayName(customName); ile değiştirmeye çalıştığımda değişmiyor

team.setPrefix ile değiştirirsemde customName + playerName olarak değişiyor
 
Nametagdan kastınız prefix mi?
 
O zaman tam çözüm olarak sana şunu önerebilirim: (Ama yapması çok zor)

NMS kullanarak isim değiştirebilirsin doğrudan PacketPlayOutPlayerInfo paketini düzenlemen lazım.

Oyuncuyu listeden kaldırman için: PacketPlayOutPlayerInfo REMOVE

Yeni ismi tekrar eklemesi için: PacketPlayOutPlayerInfo ADD

Bu kod, minecraft sürümüne göre değişir. Eğer bu yöntemi denemek istiyorsan hangi sürümde çalıştığını söyle, ona uygun bir örnek verebilirim.
 
1.21.3 sürümünde çalışıyorum fakat daha önce NMS kullanmayı denedim baya zor fakat deneyeceğim teşekkürler
 
Listeden kaldırman için:
Java:
PacketPlayOutPlayerInfo removePacket = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, entityPlayer);
        connection.a(removePacket);

Yeni bir isim belirlemen için: (Bu yöntemle Oyuncu UUID'si aynı kalacak ve görünen adını değiştircek)

Java:
entityPlayer.b(newName, (ProfilePublicKey) null);

Yeni ismi tekrar eklemesi için:

Java:
 PacketPlayOutPlayerInfo addPacket = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, entityPlayer);
        connection.a(addPacket);

Eğer bir yanlışlık olmadıysada bu şekilde kullanımı var:

Java:
changePlayerName(player, "NewCustomName");

1.21.3 için düzenledim gelişmelerden haberdar veyahut aklına bir şey takılırsa sorabilirsin.
 
Listeden kaldırman için:
Java:
PacketPlayOutPlayerInfo removePacket = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, entityPlayer);
        connection.a(removePacket);

Yeni bir isim belirlemen için: (Bu yöntemle Oyuncu UUID'si aynı kalacak ve görünen adını değiştircek)

Java:
entityPlayer.b(newName, (ProfilePublicKey) null);

Yeni ismi tekrar eklemesi için:

Java:
 PacketPlayOutPlayerInfo addPacket = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, entityPlayer);
        connection.a(addPacket);

Eğer bir yanlışlık olmadıysada bu şekilde kullanımı var:

Java:
changePlayerName(player, "NewCustomName");

1.21.3 için düzenledim gelişmelerden haberdar veyahut aklına bir şey takılırsa sorabilirsin.
1.18+ surumlerde mojang mapping kullanirsan isin kolaylasir.
 
Bir plugin üzerinde çalışıyorum ve bir oyuncunun nametagını değiştirmek istiyorum. Ancak protocollib kullanmadan bunu yapmanın mümkün olup olmadığını öğrenmek istiyorum. Yardımcı olursanız sevinirim
Kod:
package lunaris.core.utils;

import lunaris.core.account.Account;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;


public class PlayerDisplayManager {
    public static void update(Player player, Account account) {
        Scoreboard sb;
        fr.minuskube.netherboard.bukkit.BPlayerBoard pb = fr.minuskube.netherboard.Netherboard.instance().getBoard(player);

        if (pb != null) {
            sb = pb.getScoreboard();
        } else {
            sb = player.getServer().getScoreboardManager().getMainScoreboard();
        }
        
        String _tempTeam = "nt_" + player.getName();
        
        Team team = sb.getTeam(_tempTeam);
        if (team != null) {
            team.unregister();
        }
        
        team = sb.registerNewTeam(_tempTeam);
        
        String pPrefix = account.getLevelColor() + "[" + account.getLevel() + "] ";

        if (account.getPlayerClass() != null && account.getPlayerClass().getIcon() != null) {
            pPrefix += account.getPlayerClass().getIcon() + " ";
        }

        team.setPrefix(pPrefix);
        team.setSuffix(" " + account.getRank().getFormattedName());
        
        team.setColor(ChatColor.valueOf(account.getRank().getColor().getName().toUpperCase()));
        
        team.addEntry(player.getName());
        
        String _tab = account.getLevelColor() + "[" + account.getLevel() + "] " +
                        (account.getPlayerClass().getIcon() != null ? account.getPlayerClass().getIcon() + " " : "") +
                        account.getRank().getFormattedName() + " " +
                        account.getRank().getColor() + player.getName();
        player.setPlayerListName(_tab);
        
        for (Player onlinePlayer : player.getServer().getOnlinePlayers()) {
            onlinePlayer.setScoreboard(sb);
        }
    }
}

Ben bu şekilde yapmışım, çalışıyordu
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

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