Çözüldü Kütüphane kullanmadan oyuncunun protokol versiyonunu alma

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

Senpai

Züm... Zümrü... Zümrüt...
Yasaklandı
Katılım
24 Kasım 2014
Mesajlar
816
Elmaslar
341
Puan
14.845
Yaş
27
Konum
Istanbul
Minecraft
NaN2
Kodda herhangi bir hata yok ancak hiçbir şekilde oyuncunun protokol versiyonunu alamıyorum. Yardımcı olabilecek birisi varsa sevinirim.

1741297453071.webp




Kod:
package com.hywave.etu.universal;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import com.hywave.etu.Gamemaster;
// import com.hywave.etu.universal.packets.PacketSender;
// import com.hywave.etu.universal.packets.PacketListener;
// import com.hywave.etu.universal.packets.Packet;
// import com.hywave.etu.universal.packets.sniffing.PacketSniffer;

public class NetworkProtocolManager implements CommandExecutor {

    public static int g_protocolVersion(Player player) {
        try {
            Gamemaster.getInstance().getLogger().info("versiyon deneme " + player.getName());
            
            Object craftPlayer = player.getClass().getMethod("getHandle").invoke(player);
            Gamemaster.getInstance().getLogger().info("1: " + craftPlayer.getClass().getName());
            
            Gamemaster.getInstance().getLogger().info("F:");
            for (Field field : craftPlayer.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                try {
                    Object val = field.get(craftPlayer);
                    Gamemaster.getInstance().getLogger().info("[F]: " + field.getName() +
                                                             " | Tip: " + field.getType().getName() +
                                                             " | Değer: " + (val != null ? val.getClass().getName() : "null"));
                } catch (Exception e) {
                    Gamemaster.getInstance().getLogger().info("[F]: " + field.getName() +
                                                             " | Tip: " + field.getType().getName() +
                                                             " | Değer yok");
                }
            }
            

            Object connection = null;
            Method[] methods = craftPlayer.getClass().getMethods();
            for (Method method : methods) {
                String name = method.getName().toLowerCase();
                if ((name.contains("connection") || name.contains("player") ||
                name.contains("packet") || name.contains("network")) &&
                    method.getParameterCount() == 0) { // if its not 0 then we're not looking for it, probably
                    try {
                        Object res = method.invoke(craftPlayer);
                        if (res != null) {
                            Gamemaster.getInstance().getLogger().info("potansiyel connect packet: " +
                                                                      method.getName() + " -> " + res.getClass().getName());
                            
                            String resCs = res.getClass().getName().toLowerCase();
                            if (resCs.contains("connection") ||
                            resCs.contains("packet") ||
                            resCs.contains("listener") ||
                            resCs.contains("network")) {
                                connection = res;
                                Gamemaster.getInstance().getLogger().info("connect packet: " + res.getClass().getName());
                                break;
                            }
                        }
                    } catch (Exception ignored) {}
                }
            }
            
            if (connection == null) {
                for (Field field : craftPlayer.getClass().getDeclaredFields()) {
                    field.setAccessible(true);
                    String ftn = field.getType().getName().toLowerCase();
                    
                    if ((ftn.contains("connection") ||
                    ftn.contains("packet") ||
                    ftn.contains("network") ||
                    ftn.contains("listener")) &&
                        !ftn.contains("logger")) {
                        try {
                            Object val = field.get(craftPlayer);
                            if (val != null) {
                                connection = val;
                                Gamemaster.getInstance().getLogger().info("connection bulundu: " +
                                                                          field.getName() + " -> " + val.getClass().getName());
                                break;
                            }
                        } catch (Exception ignored) {}
                    }
                }
            }
            
            // fallback
            if (connection == null || connection.getClass().getName().contains("Logger")) {
                Gamemaster.getInstance().getLogger().info("<-> 1.20.4 fallback");
                
                try {
                    return gs_protocolVersion();
                } catch (Exception e) {
                    Gamemaster.getInstance().getLogger().warning("1.20.4 fallback hata " + e.getMessage());
                    e.printStackTrace();
                    return -1;
                }
            }
            
            Object network = null;
            
            Gamemaster.getInstance().getLogger().info("[cObject]:");
            for (Field field : connection.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                try {
                    Object val = field.get(connection);
                    Gamemaster.getInstance().getLogger().info("[F]: " + field.getName() +
                                                             " | Tip: " + field.getType().getName() +
                                                             " | Değer: " + (val != null ? val.getClass().getName() : "null"));
                    
                    String typeeeee = field.getType().getName().toLowerCase();
                    if (typeeeee.contains("network") || typeeeee.contains("connection") ||
                    typeeeee.contains("channel") || typeeeee.contains("netty")) {
                        network = val;
                        Gamemaster.getInstance().getLogger().info("potansiyel network packet: " + field.getName());
                    }
                } catch (Exception e) {
                    Gamemaster.getInstance().getLogger().info("[F]: " + field.getName() +
                                                             " | Tip: " + field.getType().getName() +
                                                             " | Değer yok");
                }
            }
            
            if (network != null) {
                for (Method method : network.getClass().getMethods()) {
                    String methoddddddd = method.getName().toLowerCase();
                    if ((methoddddddd.contains("version") || methoddddddd.contains("protocol")) &&
                        method.getParameterCount() == 0 &&
                        (method.getReturnType() == int.class || method.getReturnType() == Integer.class)) {
                        int version = (int) method.invoke(network);
                        Gamemaster.getInstance().getLogger().info("method ile bulundu: " + method.getName() + " = " + version);
                        return version;
                    }
                }
                
                for (Field field : network.getClass().getDeclaredFields()) {
                    field.setAccessible(true);
                    String fielddddddd = field.getName().toLowerCase();
                    if ((fielddddddd.contains("version") || fielddddddd.contains("protocol")) &&
                        (field.getType() == int.class || field.getType() == Integer.class)) {
                        int version = field.getInt(network);
                        Gamemaster.getInstance().getLogger().info("field ile bulundu: " + field.getName() + " = " + version);
                        return version;
                    }
                }
            }
            
            return gs_protocolVersion();
            
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().severe("hata -> versiyon bulunamadı: " + e.getMessage());
            e.printStackTrace();
            return -1;
        }
    }
    
    private static int gs_protocolVersion() throws Exception {
        Gamemaster.getInstance().getLogger().info("sunucu protocol versiyon bulunuyo:");
        
        try {
            Class<?> scClass = Class.forName("net.minecraft.SharedConstants");
            Method gpvMethod = scClass.getMethod("getCurrentVersion");
            Object gameVersion = gpvMethod.invoke(null);
            Method gpMethod = gameVersion.getClass().getMethod("getProtocolVersion");
            int version = (int) gpMethod.invoke(gameVersion);
            Gamemaster.getInstance().getLogger().info("server protocol version (deneme 1): " + version);
            return version;
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 1 hata: " + e.getMessage());
        }

        // scClass = SharedConstantsClass, gpvMethod = getProtocolVersionMethod
        
        try {
            Class<?> scClass = Class.forName("net.minecraft.SharedConstants");
            Method gpvMethod = scClass.getMethod("getProtocolVersion");
            int version = (int) gpvMethod.invoke(null);
            Gamemaster.getInstance().getLogger().info(" server protocol version (deneme 2): " + version);
            return version;
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 2 hata: " + e.getMessage());
        }
        
        // SharedConstants.PROTOCOL_VERSION < 1.20.4?
        try {
            Class<?> scClass = Class.forName("net.minecraft.SharedConstants");
            Field versfield = scClass.getDeclaredField("PROTOCOL_VERSION");
            versfield.setAccessible(true);
            int version = versfield.getInt(null);
            Gamemaster.getInstance().getLogger().info("server protocol version (deneme 3): " + version);
            return version;
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 3 hata: " + e.getMessage());
        }
        
        try {
            Class<?> mcClazz = Class.forName("net.minecraft.server.MinecraftServer");
            Method gsm = mcClazz.getMethod("getServer");
            Object server = gsm.invoke(null);
            
            for (Method method : server.getClass().getMethods()) {
                String _mName = method.getName().toLowerCase();
                if ((_mName.contains("protocol") || _mName.contains("version")) &&
                    method.getParameterCount() == 0 &&
                    (method.getReturnType() == int.class || method.getReturnType() == Integer.class)) {
                    int version = (int) method.invoke(server);
                    Gamemaster.getInstance().getLogger().info("server protocol version (deneme 4): " + version);
                    return version;
                }
            }
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 4 hata: " + e.getMessage());
        }
        
        Gamemaster.getInstance().getLogger().info("basarisiz, 765 (1.20.4?) fallback");
        return 765;
    }

    // Comment<[email protected]>: Added for debugging, don't remove
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        Player player = (Player) sender;
        Gamemaster.getInstance().getLogger().info("protocol kontrol: " + player.getName());
        int protocolVersion = g_protocolVersion(player);
        
        if (protocolVersion != -1) {
            player.sendMessage("Protocol versiyon: " + protocolVersion);
            Gamemaster.getInstance().getLogger().info("oyuncu " + player.getName() + " protocol versiyonu: " + protocolVersion);
        } else {
            player.sendMessage("Protocol versiyon bulunamadı");
            Gamemaster.getInstance().getLogger().warning("protocol versiyon bulunamadı: " + player.getName());
        }

        return true;
    }
}

Kod:
[00:38:51] [Server thread/INFO]: [Gamemaster] protocol kontrol: liveyourmovie
[00:38:51] [Server thread/INFO]: [Gamemaster] versiyon deneme liveyourmovie
[00:38:51] [Server thread/INFO]: [Gamemaster] 1: net.minecraft.server.level.EntityPlayer
[00:38:51] [Server thread/INFO]: [Gamemaster] F:
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: b | Tip: org.slf4j.Logger | Değer: org.apache.logging.slf4j.Log4jLogger
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cm | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cn | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: co | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: c | Tip: net.minecraft.server.network.PlayerConnection | Değer: net.minecraft.server.network.PlayerConnection
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: d | Tip: net.minecraft.server.MinecraftServer | Değer: net.minecraft.server.dedicated.DedicatedServer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: e | Tip: net.minecraft.server.level.PlayerInteractManager | Değer: net.minecraft.server.level.PlayerInteractManager
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cp | Tip: net.minecraft.server.AdvancementDataPlayer | Değer: net.minecraft.server.AdvancementDataPlayer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cq | Tip: net.minecraft.stats.ServerStatisticManager | Değer: net.minecraft.stats.ServerStatisticManager
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cr | Tip: float | Değer: java.lang.Float
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cs | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: ct | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cu | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cw | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cx | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cy | Tip: float | Değer: java.lang.Float
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cz | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cA | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cB | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cC | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cD | Tip: net.minecraft.world.entity.player.EnumChatVisibility | Değer: net.minecraft.world.entity.player.EnumChatVisibility
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cE | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cF | Tip: long | Değer: java.lang.Long
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cG | Tip: net.minecraft.world.entity.Entity | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cH | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cI | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cJ | Tip: net.minecraft.stats.RecipeBookServer | Değer: net.minecraft.stats.RecipeBookServer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cK | Tip: net.minecraft.world.phys.Vec3D | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cL | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cM | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cN | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cO | Tip: java.lang.String | Değer: java.lang.String
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cP | Tip: net.minecraft.world.phys.Vec3D | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cQ | Tip: net.minecraft.world.phys.Vec3D | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cR | Tip: net.minecraft.world.phys.Vec3D | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cS | Tip: net.minecraft.core.SectionPosition | Değer: net.minecraft.core.SectionPosition
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cT | Tip: net.minecraft.server.level.ChunkTrackingView | Değer: net.minecraft.server.level.ChunkTrackingView$a
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cU | Tip: net.minecraft.resources.ResourceKey | Değer: net.minecraft.resources.ResourceKey
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cV | Tip: net.minecraft.core.BlockPosition | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cW | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cX | Tip: float | Değer: java.lang.Float
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cY | Tip: net.minecraft.server.network.ITextFilter | Değer: net.minecraft.server.network.ITextFilter$1
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: cZ | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: da | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: db | Tip: net.minecraft.world.entity.monster.warden.WardenSpawnTracker | Değer: net.minecraft.world.entity.monster.warden.WardenSpawnTracker
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: dc | Tip: net.minecraft.world.inventory.ContainerSynchronizer | Değer: net.minecraft.server.level.EntityPlayer$1
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: dd | Tip: net.minecraft.world.inventory.ICrafting | Değer: net.minecraft.server.level.EntityPlayer$2
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: de | Tip: net.minecraft.network.chat.RemoteChatSession | Değer: net.minecraft.network.chat.RemoteChatSession
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: df | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: f | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: displayName | Tip: java.lang.String | Değer: java.lang.String
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: listName | Tip: net.minecraft.network.chat.IChatBaseComponent | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: compassTarget | Tip: org.bukkit.Location | Değer: org.bukkit.Location
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: newExp | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: newLevel | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: newTotalExp | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: keepLevel | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: maxHealthCache | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: joining | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: sentListPacket | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: kickLeaveMessage | Tip: java.lang.String | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: timeOffset | Tip: long | Değer: java.lang.Long
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: relativeTime | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: weather | Tip: org.bukkit.WeatherType | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: pluginRainPosition | Tip: float | Değer: java.lang.Float
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: pluginRainPositionPrevious | Tip: float | Değer: java.lang.Float
[00:38:51] [Server thread/INFO]: [Gamemaster] potansiyel connect packet: getPlayerTime -> java.lang.Long
[00:38:51] [Server thread/INFO]: [Gamemaster] connection bulundu: c -> net.minecraft.server.network.PlayerConnection
[00:38:51] [Server thread/INFO]: [Gamemaster] [cObject]:
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: g | Tip: org.slf4j.Logger | Değer: org.apache.logging.slf4j.Log4jLogger
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: d | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: h | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: i | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: j | Tip: net.minecraft.network.chat.IChatBaseComponent | Değer: net.minecraft.network.chat.IChatMutableComponent
[00:38:51] [Server thread/INFO]: [Gamemaster] potansiyel network packet: j
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: e | Tip: net.minecraft.server.level.EntityPlayer | Değer: net.minecraft.server.level.EntityPlayer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: f | Tip: net.minecraft.server.network.PlayerChunkSender | Değer: net.minecraft.server.network.PlayerChunkSender
[00:38:51] [Server thread/INFO]: [Gamemaster] potansiyel network packet: f
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: k | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: l | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: m | Tip: java.util.concurrent.atomic.AtomicInteger | Değer: java.util.concurrent.atomic.AtomicInteger
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: n | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: o | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: p | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: q | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: r | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: s | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: t | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: u | Tip: net.minecraft.world.entity.Entity | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: v | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: w | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: x | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: y | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: z | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: A | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: B | Tip: net.minecraft.world.phys.Vec3D | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: C | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: D | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: E | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: F | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: G | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: H | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: I | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: J | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: K | Tip: net.minecraft.network.chat.RemoteChatSession | Değer: net.minecraft.network.chat.RemoteChatSession
[00:38:51] [Server thread/INFO]: [Gamemaster] potansiyel network packet: K
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: L | Tip: net.minecraft.network.chat.SignedMessageChain$b | Değer: net.minecraft.network.chat.SignedMessageChain$$Lambda/0x00000090021c0d18
[00:38:51] [Server thread/INFO]: [Gamemaster] potansiyel network packet: L
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: M | Tip: net.minecraft.network.chat.LastSeenMessagesValidator | Değer: net.minecraft.network.chat.LastSeenMessagesValidator
[00:38:51] [Server thread/INFO]: [Gamemaster] potansiyel network packet: M
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: N | Tip: net.minecraft.network.chat.MessageSignatureCache | Değer: net.minecraft.network.chat.MessageSignatureCache
[00:38:51] [Server thread/INFO]: [Gamemaster] potansiyel network packet: N
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: O | Tip: net.minecraft.util.FutureChain | Değer: net.minecraft.util.FutureChain
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: P | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: lastTick | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: allowedPlayerTicks | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: lastDropTick | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: lastBookTick | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: dropCount | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: hasMoved | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: lastPosX | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: lastPosY | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: lastPosZ | Tip: double | Değer: java.lang.Double
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: lastPitch | Tip: float | Değer: java.lang.Float
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: lastYaw | Tip: float | Değer: java.lang.Float
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: justTeleported | Tip: boolean | Değer: java.lang.Boolean
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: limitedPackets | Tip: int | Değer: java.lang.Integer
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: lastLimitedPacket | Tip: long | Değer: java.lang.Long
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: $SWITCH_TABLE$net$minecraft$world$level$block$entity$TileEntityCommand$Type | Tip: [I | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: $SWITCH_TABLE$net$minecraft$network$protocol$game$PacketPlayInBlockDig$EnumPlayerDigType | Tip: [I | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: $SWITCH_TABLE$net$minecraft$network$protocol$game$PacketPlayInEntityAction$EnumPlayerAction | Tip: [I | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: $SWITCH_TABLE$net$minecraft$network$protocol$game$PacketPlayInClientCommand$EnumClientCommand | Tip: [I | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: $SWITCH_TABLE$net$minecraft$world$inventory$InventoryClickType | Tip: [I | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: $SWITCH_TABLE$org$bukkit$event$inventory$InventoryAction | Tip: [I | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] [F]: $SWITCH_TABLE$org$bukkit$event$Event$Result | Tip: [I | Değer: null
[00:38:51] [Server thread/INFO]: [Gamemaster] sunucu protocol versiyon bulunuyo:
[00:38:51] [Server thread/WARN]: [Gamemaster] deneme 1 hata: net.minecraft.SharedConstants.getCurrentVersion()
[00:38:51] [Server thread/WARN]: [Gamemaster] deneme 2 hata: net.minecraft.SharedConstants.getProtocolVersion()
[00:38:51] [Server thread/WARN]: [Gamemaster] deneme 3 hata: PROTOCOL_VERSION
[00:38:51] [Server thread/INFO]: [Gamemaster] basarisiz, 765 (1.20.4?) fallback
[00:38:51] [Server thread/INFO]: [Gamemaster] oyuncu liveyourmovie protocol versiyonu: 765
 
Daha önce benzer bir kod yazmış arkadaşlar bir kaç dakikasını ayırırsa sevinirim
 
Türkiyede kullanılmayan çok özel bir yapay zeka kullanıyorum ona bu soruyu sorduğumda doğal olarak kodu diğer kodlara sahip olmadığı için bayağı değiştirdi ama kod değişikliklerinde genelde %90'a yakın bir çözüm oranı var. Belki fikir katar sana, yapay zekanın cevabını seninle paylaşıyorum.

Protokol versiyonu alamama sorununuzla ilgili birkaç olası neden bulunuyor. Log kayıtlarını incelediğimde, reflection kullanarak Minecraft sınıflarına erişmeye çalıştığınızı görüyorum, ancak bazı metotlar ve alanlar bulunamıyor.

Problem şu sebeplerden kaynaklanabilir:

  1. Erişim Sorunu: CraftBukkit/Spigot obfuscation (kod karıştırma) kullanır, yani sınıf ve metot isimleri sürüm ve dağıtıma göre değişebilir.
  2. Sürüm Uyumsuzluğu: Kodunuz belirli bir Minecraft sürümü için yazılmış olabilir, ancak farklı bir sürüm çalıştırıyor olabilirsiniz.
  3. NMS Erişimi: net.minecraft.* sınıflarına doğrudan erişim, Paper/Spigot tarzı sunucularda sınırlandırılabilir.
İyi haber şu ki, fallback mekanizmanız çalışıyor ve 765 değerini döndürüyor (1.20.4 protokol versiyonu), ancak daha sağlam bir çözüm isterseniz şu düzeltmeleri öneriyorum:

attached_assets/Pasted-import-org-bukkit-command-Command-import-org-bukkit-command-CommandExecutor-import-org-bukkit-co-1741298839801.txt
+152
-238
Bu değişiklikler şu iyileştirmeleri içeriyor:

  1. İlk olarak Bukkit API'sının Unsafe sınıfını kullanarak versiyon bilgisini almayı dener
  2. Popüler eklentiler olan ViaVersion ve ProtocolLib üzerinden versiyon bilgisi almayı dener
  3. Daha spesifik alan/metot isimleri kullanarak NMS sınıflarını aramayı dener
  4. Herhangi bir metot çalışmazsa fallback olarak 765 (1.20.4) değerine döner
Ayrıca, bu bileşenlerden herhangi birini kullanmadan protokol versiyon numarasını bulmanın başka bir yolu, ProtocolLib veya ViaVersion gibi plugin'leri projenize eklemektir. Bu plugin'leri kullanarak doğrudan protokol versiyonunu alabilirsiniz.


JavaScript:
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.UUID;

import com.hywave.etu.Gamemaster;

public class NetworkProtocolManager implements CommandExecutor {

    public static int g_protocolVersion(Player player) {
        try {
            Gamemaster.getInstance().getLogger().info("versiyon deneme " + player.getName());

            // Önce Paper/Spigot API'sinin versiyon bilgisini almayı deneyelim
            try {
                Class<?> bukkitClass = Class.forName("org.bukkit.Bukkit");
                Method getVersionMethod = bukkitClass.getMethod("getUnsafe");
                Object unsafe = getVersionMethod.invoke(null);

                try {
                    // Paper kullanıyorsa direkt protokol versiyonu alabiliriz
                    Method getProtocolVersionMethod = unsafe.getClass().getMethod("getProtocolVersion");
                    if (getProtocolVersionMethod != null) {
                        int version = (int) getProtocolVersionMethod.invoke(unsafe);
                        Gamemaster.getInstance().getLogger().info("Bukkit API ile versiyon alındı: " + version);
                        return version;
                    }
                } catch (Exception ignored) {
                    Gamemaster.getInstance().getLogger().info("Bukkit API protokol versiyon metodu bulunamadı");
                }
            } catch (Exception ignored) {
                Gamemaster.getInstance().getLogger().info("Bukkit Unsafe API'ye erişilemedi");
            }

            // ViaVersion plugin kontrolü - eğer sunucuda varsa
            try {
                Class<?> viaVersionClass = Class.forName("com.viaversion.viaversion.api.Via");
                Method getApiMethod = viaVersionClass.getMethod("getAPI");
                Object viaApi = getApiMethod.invoke(null);

                Class<?> playerVersionClass = Class.forName("com.viaversion.viaversion.api.ViaAPI");
                Method getPlayerVersionMethod = playerVersionClass.getMethod("getPlayerVersion", UUID.class);
                int version = (int) getPlayerVersionMethod.invoke(viaApi, player.getUniqueId());

                Gamemaster.getInstance().getLogger().info("ViaVersion ile versiyon alındı: " + version);
                return version;
            } catch (Exception ignored) {
                Gamemaster.getInstance().getLogger().info("ViaVersion bulunamadı veya versiyon alınamadı");
            }

            // ProtocolLib plugin kontrolü
            try {
                Class<?> protocolLibClass = Class.forName("com.comphenix.protocol.ProtocolLibrary");
                Method getManagerMethod = protocolLibClass.getMethod("getProtocolManager");
                Object protocolManager = getManagerMethod.invoke(null);

                Method getProtocolVersionMethod = protocolManager.getClass().getMethod("getProtocolVersion", Player.class);
                int version = (int) getProtocolVersionMethod.invoke(protocolManager, player);

                Gamemaster.getInstance().getLogger().info("ProtocolLib ile versiyon alındı: " + version);
                return version;
            } catch (Exception ignored) {
                Gamemaster.getInstance().getLogger().info("ProtocolLib bulunamadı veya versiyon alınamadı");
            }

            // NMS yöntemiyle deneme
            Object craftPlayer = player.getClass().getMethod("getHandle").invoke(player);
            Gamemaster.getInstance().getLogger().info("1: " + craftPlayer.getClass().getName());

            // NMS Player nesnesindeki PlayerConnection alanını bul
            Field playerConnectionField = null;
            for (Field field : craftPlayer.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                String fieldType = field.getType().getName().toLowerCase();
                if (fieldType.contains("playerconnection") ||
                    fieldType.contains("connection") ||
                    fieldType.contains("servercommon")) {
                    playerConnectionField = field;
                    Gamemaster.getInstance().getLogger().info("Potansiyel connection alanı bulundu: " + field.getName());
                    break;
                }
            }

            if (playerConnectionField != null) {
                Object playerConnection = playerConnectionField.get(craftPlayer);
                if (playerConnection != null) {
                    // NetworkManager alanını bul
                    Field networkManagerField = null;
                    for (Field field : playerConnection.getClass().getDeclaredFields()) {
                        field.setAccessible(true);
                        String fieldType = field.getType().getName().toLowerCase();
                        if (fieldType.contains("networkmanager") ||
                            fieldType.contains("network") ||
                            fieldType.contains("connection")) {
                            networkManagerField = field;
                            Gamemaster.getInstance().getLogger().info("Network manager alanı bulundu: " + field.getName());
                            break;
                        }
                    }

                    if (networkManagerField != null) {
                        Object networkManager = networkManagerField.get(playerConnection);
                        if (networkManager != null) {
                            // Protocol version field'ını bul
                            for (Field field : networkManager.getClass().getDeclaredFields()) {
                                field.setAccessible(true);
                                if (field.getType() == int.class || field.getType() == Integer.class) {
                                    String fieldName = field.getName().toLowerCase();
                                    if (fieldName.contains("protocol") || fieldName.contains("version")) {
                                        int version = field.getInt(networkManager);
                                        Gamemaster.getInstance().getLogger().info("NMS ile versiyon bulundu: " + version);
                                        return version;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            // Fallback: Sunucu protokol versiyonunu al
            return gs_protocolVersion();

        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().severe("hata -> versiyon bulunamadı: " + e.getMessage());
            e.printStackTrace();

            // Yine de bir değer dönmeye çalış
            try {
                return gs_protocolVersion();
            } catch (Exception ex) {
                // Bilinen bazı versiyon değerlerini ön tanımlı olarak dene
                return 765; // 1.20.4 için
            }
        }
    }

    private static int gs_protocolVersion() throws Exception {
        Gamemaster.getInstance().getLogger().info("sunucu protocol versiyon bulunuyo:");

        try {
            Class<?> scClass = Class.forName("net.minecraft.SharedConstants");
            Method gpvMethod = scClass.getMethod("getCurrentVersion");
            Object gameVersion = gpvMethod.invoke(null);
            Method gpMethod = gameVersion.getClass().getMethod("getProtocolVersion");
            int version = (int) gpMethod.invoke(gameVersion);
            Gamemaster.getInstance().getLogger().info("server protocol version (deneme 1): " + version);
            return version;
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 1 hata: " + e.getMessage());
        }

        // scClass = SharedConstantsClass, gpvMethod = getProtocolVersionMethod

        try {
            Class<?> scClass = Class.forName("net.minecraft.SharedConstants");
            Method gpvMethod = scClass.getMethod("getProtocolVersion");
            int version = (int) gpvMethod.invoke(null);
            Gamemaster.getInstance().getLogger().info(" server protocol version (deneme 2): " + version);
            return version;
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 2 hata: " + e.getMessage());
        }

        // SharedConstants.PROTOCOL_VERSION < 1.20.4?
        try {
            Class<?> scClass = Class.forName("net.minecraft.SharedConstants");
            Field versfield = scClass.getDeclaredField("PROTOCOL_VERSION");
            versfield.setAccessible(true);
            int version = versfield.getInt(null);
            Gamemaster.getInstance().getLogger().info("server protocol version (deneme 3): " + version);
            return version;
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 3 hata: " + e.getMessage());
        }

        try {
            Class<?> mcClazz = Class.forName("net.minecraft.server.MinecraftServer");
            Method gsm = mcClazz.getMethod("getServer");
            Object server = gsm.invoke(null);

            for (Method method : server.getClass().getMethods()) {
                String _mName = method.getName().toLowerCase();
                if ((_mName.contains("protocol") || _mName.contains("version")) &&
                    method.getParameterCount() == 0 &&
                    (method.getReturnType() == int.class || method.getReturnType() == Integer.class)) {
                    int version = (int) method.invoke(server);
                    Gamemaster.getInstance().getLogger().info("server protocol version (deneme 4): " + version);
                    return version;
                }
            }
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 4 hata: " + e.getMessage());
        }

        Gamemaster.getInstance().getLogger().info("basarisiz, 765 (1.20.4?) fallback");
        return 765;
    }

    // Comment<[email protected]>: Added for debugging, don't remove
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        Player player = (Player) sender;
        Gamemaster.getInstance().getLogger().info("protocol kontrol: " + player.getName());
        int protocolVersion = g_protocolVersion(player);

        if (protocolVersion != -1) {
            player.sendMessage("Protocol versiyon: " + protocolVersion);
            Gamemaster.getInstance().getLogger().info("oyuncu " + player.getName() + " protocol versiyonu: " + protocolVersion);
        } else {
            player.sendMessage("Protocol versiyon bulunamadı");
            Gamemaster.getInstance().getLogger().warning("protocol versiyon bulunamadı: " + player.getName());
        }

        return true;
    }
}
 
Türkiyede kullanılmayan çok özel bir yapay zeka kullanıyorum ona bu soruyu sorduğumda doğal olarak kodu diğer kodlara sahip olmadığı için bayağı değiştirdi ama kod değişikliklerinde genelde %90'a yakın bir çözüm oranı var. Belki fikir katar sana, yapay zekanın cevabını seninle paylaşıyorum.

Protokol versiyonu alamama sorununuzla ilgili birkaç olası neden bulunuyor. Log kayıtlarını incelediğimde, reflection kullanarak Minecraft sınıflarına erişmeye çalıştığınızı görüyorum, ancak bazı metotlar ve alanlar bulunamıyor.

Problem şu sebeplerden kaynaklanabilir:

  1. Erişim Sorunu: CraftBukkit/Spigot obfuscation (kod karıştırma) kullanır, yani sınıf ve metot isimleri sürüm ve dağıtıma göre değişebilir.
  2. Sürüm Uyumsuzluğu: Kodunuz belirli bir Minecraft sürümü için yazılmış olabilir, ancak farklı bir sürüm çalıştırıyor olabilirsiniz.
  3. NMS Erişimi: net.minecraft.* sınıflarına doğrudan erişim, Paper/Spigot tarzı sunucularda sınırlandırılabilir.
İyi haber şu ki, fallback mekanizmanız çalışıyor ve 765 değerini döndürüyor (1.20.4 protokol versiyonu), ancak daha sağlam bir çözüm isterseniz şu düzeltmeleri öneriyorum:

attached_assets/Pasted-import-org-bukkit-command-Command-import-org-bukkit-command-CommandExecutor-import-org-bukkit-co-1741298839801.txt
+152
-238
Bu değişiklikler şu iyileştirmeleri içeriyor:

  1. İlk olarak Bukkit API'sının Unsafe sınıfını kullanarak versiyon bilgisini almayı dener
  2. Popüler eklentiler olan ViaVersion ve ProtocolLib üzerinden versiyon bilgisi almayı dener
  3. Daha spesifik alan/metot isimleri kullanarak NMS sınıflarını aramayı dener
  4. Herhangi bir metot çalışmazsa fallback olarak 765 (1.20.4) değerine döner
Ayrıca, bu bileşenlerden herhangi birini kullanmadan protokol versiyon numarasını bulmanın başka bir yolu, ProtocolLib veya ViaVersion gibi plugin'leri projenize eklemektir. Bu plugin'leri kullanarak doğrudan protokol versiyonunu alabilirsiniz.


JavaScript:
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.UUID;

import com.hywave.etu.Gamemaster;

public class NetworkProtocolManager implements CommandExecutor {

    public static int g_protocolVersion(Player player) {
        try {
            Gamemaster.getInstance().getLogger().info("versiyon deneme " + player.getName());

            // Önce Paper/Spigot API'sinin versiyon bilgisini almayı deneyelim
            try {
                Class<?> bukkitClass = Class.forName("org.bukkit.Bukkit");
                Method getVersionMethod = bukkitClass.getMethod("getUnsafe");
                Object unsafe = getVersionMethod.invoke(null);

                try {
                    // Paper kullanıyorsa direkt protokol versiyonu alabiliriz
                    Method getProtocolVersionMethod = unsafe.getClass().getMethod("getProtocolVersion");
                    if (getProtocolVersionMethod != null) {
                        int version = (int) getProtocolVersionMethod.invoke(unsafe);
                        Gamemaster.getInstance().getLogger().info("Bukkit API ile versiyon alındı: " + version);
                        return version;
                    }
                } catch (Exception ignored) {
                    Gamemaster.getInstance().getLogger().info("Bukkit API protokol versiyon metodu bulunamadı");
                }
            } catch (Exception ignored) {
                Gamemaster.getInstance().getLogger().info("Bukkit Unsafe API'ye erişilemedi");
            }

            // ViaVersion plugin kontrolü - eğer sunucuda varsa
            try {
                Class<?> viaVersionClass = Class.forName("com.viaversion.viaversion.api.Via");
                Method getApiMethod = viaVersionClass.getMethod("getAPI");
                Object viaApi = getApiMethod.invoke(null);

                Class<?> playerVersionClass = Class.forName("com.viaversion.viaversion.api.ViaAPI");
                Method getPlayerVersionMethod = playerVersionClass.getMethod("getPlayerVersion", UUID.class);
                int version = (int) getPlayerVersionMethod.invoke(viaApi, player.getUniqueId());

                Gamemaster.getInstance().getLogger().info("ViaVersion ile versiyon alındı: " + version);
                return version;
            } catch (Exception ignored) {
                Gamemaster.getInstance().getLogger().info("ViaVersion bulunamadı veya versiyon alınamadı");
            }

            // ProtocolLib plugin kontrolü
            try {
                Class<?> protocolLibClass = Class.forName("com.comphenix.protocol.ProtocolLibrary");
                Method getManagerMethod = protocolLibClass.getMethod("getProtocolManager");
                Object protocolManager = getManagerMethod.invoke(null);

                Method getProtocolVersionMethod = protocolManager.getClass().getMethod("getProtocolVersion", Player.class);
                int version = (int) getProtocolVersionMethod.invoke(protocolManager, player);

                Gamemaster.getInstance().getLogger().info("ProtocolLib ile versiyon alındı: " + version);
                return version;
            } catch (Exception ignored) {
                Gamemaster.getInstance().getLogger().info("ProtocolLib bulunamadı veya versiyon alınamadı");
            }

            // NMS yöntemiyle deneme
            Object craftPlayer = player.getClass().getMethod("getHandle").invoke(player);
            Gamemaster.getInstance().getLogger().info("1: " + craftPlayer.getClass().getName());

            // NMS Player nesnesindeki PlayerConnection alanını bul
            Field playerConnectionField = null;
            for (Field field : craftPlayer.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                String fieldType = field.getType().getName().toLowerCase();
                if (fieldType.contains("playerconnection") ||
                    fieldType.contains("connection") ||
                    fieldType.contains("servercommon")) {
                    playerConnectionField = field;
                    Gamemaster.getInstance().getLogger().info("Potansiyel connection alanı bulundu: " + field.getName());
                    break;
                }
            }

            if (playerConnectionField != null) {
                Object playerConnection = playerConnectionField.get(craftPlayer);
                if (playerConnection != null) {
                    // NetworkManager alanını bul
                    Field networkManagerField = null;
                    for (Field field : playerConnection.getClass().getDeclaredFields()) {
                        field.setAccessible(true);
                        String fieldType = field.getType().getName().toLowerCase();
                        if (fieldType.contains("networkmanager") ||
                            fieldType.contains("network") ||
                            fieldType.contains("connection")) {
                            networkManagerField = field;
                            Gamemaster.getInstance().getLogger().info("Network manager alanı bulundu: " + field.getName());
                            break;
                        }
                    }

                    if (networkManagerField != null) {
                        Object networkManager = networkManagerField.get(playerConnection);
                        if (networkManager != null) {
                            // Protocol version field'ını bul
                            for (Field field : networkManager.getClass().getDeclaredFields()) {
                                field.setAccessible(true);
                                if (field.getType() == int.class || field.getType() == Integer.class) {
                                    String fieldName = field.getName().toLowerCase();
                                    if (fieldName.contains("protocol") || fieldName.contains("version")) {
                                        int version = field.getInt(networkManager);
                                        Gamemaster.getInstance().getLogger().info("NMS ile versiyon bulundu: " + version);
                                        return version;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            // Fallback: Sunucu protokol versiyonunu al
            return gs_protocolVersion();

        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().severe("hata -> versiyon bulunamadı: " + e.getMessage());
            e.printStackTrace();

            // Yine de bir değer dönmeye çalış
            try {
                return gs_protocolVersion();
            } catch (Exception ex) {
                // Bilinen bazı versiyon değerlerini ön tanımlı olarak dene
                return 765; // 1.20.4 için
            }
        }
    }

    private static int gs_protocolVersion() throws Exception {
        Gamemaster.getInstance().getLogger().info("sunucu protocol versiyon bulunuyo:");

        try {
            Class<?> scClass = Class.forName("net.minecraft.SharedConstants");
            Method gpvMethod = scClass.getMethod("getCurrentVersion");
            Object gameVersion = gpvMethod.invoke(null);
            Method gpMethod = gameVersion.getClass().getMethod("getProtocolVersion");
            int version = (int) gpMethod.invoke(gameVersion);
            Gamemaster.getInstance().getLogger().info("server protocol version (deneme 1): " + version);
            return version;
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 1 hata: " + e.getMessage());
        }

        // scClass = SharedConstantsClass, gpvMethod = getProtocolVersionMethod

        try {
            Class<?> scClass = Class.forName("net.minecraft.SharedConstants");
            Method gpvMethod = scClass.getMethod("getProtocolVersion");
            int version = (int) gpvMethod.invoke(null);
            Gamemaster.getInstance().getLogger().info(" server protocol version (deneme 2): " + version);
            return version;
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 2 hata: " + e.getMessage());
        }

        // SharedConstants.PROTOCOL_VERSION < 1.20.4?
        try {
            Class<?> scClass = Class.forName("net.minecraft.SharedConstants");
            Field versfield = scClass.getDeclaredField("PROTOCOL_VERSION");
            versfield.setAccessible(true);
            int version = versfield.getInt(null);
            Gamemaster.getInstance().getLogger().info("server protocol version (deneme 3): " + version);
            return version;
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 3 hata: " + e.getMessage());
        }

        try {
            Class<?> mcClazz = Class.forName("net.minecraft.server.MinecraftServer");
            Method gsm = mcClazz.getMethod("getServer");
            Object server = gsm.invoke(null);

            for (Method method : server.getClass().getMethods()) {
                String _mName = method.getName().toLowerCase();
                if ((_mName.contains("protocol") || _mName.contains("version")) &&
                    method.getParameterCount() == 0 &&
                    (method.getReturnType() == int.class || method.getReturnType() == Integer.class)) {
                    int version = (int) method.invoke(server);
                    Gamemaster.getInstance().getLogger().info("server protocol version (deneme 4): " + version);
                    return version;
                }
            }
        } catch (Exception e) {
            Gamemaster.getInstance().getLogger().warning("deneme 4 hata: " + e.getMessage());
        }

        Gamemaster.getInstance().getLogger().info("basarisiz, 765 (1.20.4?) fallback");
        return 765;
    }

    // Comment<[email protected]>: Added for debugging, don't remove
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        Player player = (Player) sender;
        Gamemaster.getInstance().getLogger().info("protocol kontrol: " + player.getName());
        int protocolVersion = g_protocolVersion(player);

        if (protocolVersion != -1) {
            player.sendMessage("Protocol versiyon: " + protocolVersion);
            Gamemaster.getInstance().getLogger().info("oyuncu " + player.getName() + " protocol versiyonu: " + protocolVersion);
        } else {
            player.sendMessage("Protocol versiyon bulunamadı");
            Gamemaster.getInstance().getLogger().warning("protocol versiyon bulunamadı: " + player.getName());
        }

        return true;
    }
}
1741299557910.webp


Ne yazık ki, zaten çok spesifik bir task olduğu için şuanda yapay zekaların yapamaması veya sorunu çözememesi acayip normal. Belki bir kaç seneye :D Teşekkür ederim yine de
 
Ekli dosyayı görüntüle 260256

Ne yazık ki, zaten çok spesifik bir task olduğu için şuanda yapay zekaların yapamaması veya sorunu çözememesi acayip normal. Belki bir kaç seneye :D Teşekkür ederim yine de
Çözüyor aslında ama kodunun tamamına sahip olması gerek ve benim üyelik bitti. Aylığı 20 dolar olan bir sistem ve üyelik bitince betaya geçiyor o da çözemiyor, yani koda sahip olsa ve üyelik olunca çözene kadar uğraşıyor. Hatta sunucu üzerinde açıp test ediyor, chatgpt gibi bir şey değil yani.
 
Çözüyor aslında ama kodunun tamamına sahip olması gerek ve benim üyelik bitti. Aylığı 20 dolar olan bir sistem ve üyelik bitince betaya geçiyor o da çözemiyor, yani koda sahip olsa ve üyelik olunca çözene kadar uğraşıyor. Hatta sunucu üzerinde açıp test ediyor, chatgpt gibi bir şey değil yani.
Claude Code'den bahsediyorsun sanırım. Verdiğim kod kodun tamamı, ilk kendi paket kütüphanem ile yaptım ancak sonrasında standalone'ye çevirdim, importlar dahil hepsi yorum satırında
 
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.

ah paper, üzümlü çöreğim :'(

yani, reflection işleri biraz karmaşıklaştırabiliyor... ama paper'in desteklediği şey cidden client protocol version mu bilmiyorum, öyle yazmışlar... tezgah ta olabilir :(

Kod:
package me.anemys.protocolversionvarmiaskim;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public final class ProtocolVersionVarmiAskim extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        // Plugin startup logic
        Bukkit.getPluginManager().registerEvents(this,this);

    }

    @EventHandler
    void playerJoinEvent(PlayerJoinEvent e) {

        for (Player p : Bukkit.getOnlinePlayers()) {
            p.sendMessage("Jinım, senin version şu: " + protocolVersionToMinecraftVersion(p.getProtocolVersion()));
        }
    }

    @Override
    public void onDisable() {
        // Plugin shutdown logic
    }

    //daha tatlı bi görünüm için part seçim
    String protocolVersionToMinecraftVersion(int protocolVersion) {

        switch (protocolVersion) {
            case 47:
                return "1.8.x";
            case 107:
                return "1.9";
            case 108:
                return "1.9.1";
            case 109:
                return "1.9.2";
            case 110:
                return "1.9.4";
            case 210:
                return "1.10.x";
            case 315:
                return "1.11";
            case 316:
                return "1.11.2";
            case 335:
                return "1.12";
            case 338:
                return "1.12.1";
            case 340:
                return "1.12.2";
            case 393:
                return "1.13";
            case 401:
                return "1.13.1";
            case 404:
                return "1.13.2";
            case 477:
                return "1.14";
            case 480:
                return "1.14.1";
            case 485:
                return "1.14.2";
            case 490:
                return "1.14.3";
            case 498:
                return "1.14.4";
            case 573:
                return "1.15";
            case 575:
                return "1.15.1";
            case 578:
                return "1.15.2";
            case 735:
                return "1.16";
            case 736:
                return "1.16.1";
            case 751:
                return "1.16.2";
            case 753:
                return "1.16.3";
            case 754:
                return "1.16.4-1.16.5";
            case 755:
                return "1.17";
            case 756:
                return "1.17.1";
            case 757:
                return "1.18-1.18.1";
            case 758:
                return "1.18.2";
            case 759:
                return "1.19";
            case 760:
                return "1.19.1-1.19.2";
            case 761:
                return "1.19.3";
            case 762:
                return "1.19.4";
            case 763:
                return "1.20-1.20.1";
            case 764:
                return "1.20.2";
            case 765:
                return "1.20.3-1.20.4";
            case 766:
                return "1.20.5";
            default:
                return "+18 argo kelime";
        }
    }
}

Edit: inanmadım, build alıp baktım fix
sadasd.webp
 
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.

ah paper, üzümlü çöreğim :'(

yani, reflection işleri biraz karmaşıklaştırabiliyor... ama paper'in desteklediği şey cidden client protocol version mu bilmiyorum, öyle yazmışlar... tezgah ta olabilir :(

Kod:
package me.anemys.protocolversionvarmiaskim;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public final class ProtocolVersionVarmiAskim extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        // Plugin startup logic
        Bukkit.getPluginManager().registerEvents(this,this);

    }

    @EventHandler
    void playerJoinEvent(PlayerJoinEvent e) {

        for (Player p : Bukkit.getOnlinePlayers()) {
            p.sendMessage("Jinım, senin version şu: " + protocolVersionToMinecraftVersion(p.getProtocolVersion()));
        }
    }

    @Override
    public void onDisable() {
        // Plugin shutdown logic
    }

    //daha tatlı bi görünüm için part seçim
    String protocolVersionToMinecraftVersion(int protocolVersion) {

        switch (protocolVersion) {
            case 47:
                return "1.8.x";
            case 107:
                return "1.9";
            case 108:
                return "1.9.1";
            case 109:
                return "1.9.2";
            case 110:
                return "1.9.4";
            case 210:
                return "1.10.x";
            case 315:
                return "1.11";
            case 316:
                return "1.11.2";
            case 335:
                return "1.12";
            case 338:
                return "1.12.1";
            case 340:
                return "1.12.2";
            case 393:
                return "1.13";
            case 401:
                return "1.13.1";
            case 404:
                return "1.13.2";
            case 477:
                return "1.14";
            case 480:
                return "1.14.1";
            case 485:
                return "1.14.2";
            case 490:
                return "1.14.3";
            case 498:
                return "1.14.4";
            case 573:
                return "1.15";
            case 575:
                return "1.15.1";
            case 578:
                return "1.15.2";
            case 735:
                return "1.16";
            case 736:
                return "1.16.1";
            case 751:
                return "1.16.2";
            case 753:
                return "1.16.3";
            case 754:
                return "1.16.4-1.16.5";
            case 755:
                return "1.17";
            case 756:
                return "1.17.1";
            case 757:
                return "1.18-1.18.1";
            case 758:
                return "1.18.2";
            case 759:
                return "1.19";
            case 760:
                return "1.19.1-1.19.2";
            case 761:
                return "1.19.3";
            case 762:
                return "1.19.4";
            case 763:
                return "1.20-1.20.1";
            case 764:
                return "1.20.2";
            case 765:
                return "1.20.3-1.20.4";
            case 766:
                return "1.20.5";
            default:
                return "+18 argo kelime";
        }
    }
}

Edit: inanmadım, build alıp baktım fix
Ekli dosyayı görüntüle 260267
Paper'a geçicem bende muhtemelen ya. Ayrıca, bu çalışabilir ama benim yapmaya çalıştığım şey protocol version'u handshakede almak (server list kısmında)

Ayrıca ProtocolLib kullanan arkadaşlar, bu şekilde farklı versiyonlar için farklı serverlist yaratabilirsiniz:
Kod:
private void initProtocol() {
        ProtocolLibrary.getProtocolManager().addPacketListener(
            new PacketAdapter(plugin, PacketType.Handshake.Client.SET_PROTOCOL,PacketType.Status.Server.SERVER_INFO) {
                @Override
                public void onPacketReceiving(PacketEvent event) {
                    int clientProtocol = event.getPacket().getIntegers().read(0);
                    isUnsupportedVersion = clientProtocol < MOTDConstants.PROTOCOL_1_20_4;
                }
            }
        );
    }

    @EventHandler
    public void onServerPing(ServerListPingEvent event) {
        StringBuilder motd = new StringBuilder();
        
        String header = isUnsupportedVersion ? MOTDConstants.HEADER_UNSUPPORTED : MOTDConstants.HEADER;
        motd.append(MOTDUtils.centerText(header)).append("\n");
        
        if (isUnsupportedVersion) {
            event.setMaxPlayers(0);
            motd.append(MOTDUtils.centerText(MOTDConstants.VERSION_MESSAGE));
        } else {
            event.setMaxPlayers(Bukkit.getOnlinePlayers().size() + 1);
            motd.append(MOTDUtils.centerText(MOTDConstants.WELCOME_MESSAGE));
        }
        
        event.setMotd(MOTDUtils.colorize(motd.toString()));
    }
 
Paper'a geçicem bende muhtemelen ya. Ayrıca, bu çalışabilir ama benim yapmaya çalıştığım şey protocol version'u handshakede almak (server list kısmında)

Ayrıca ProtocolLib kullanan arkadaşlar, bu şekilde farklı versiyonlar için farklı serverlist yaratabilirsiniz:
Kod:
private void initProtocol() {
        ProtocolLibrary.getProtocolManager().addPacketListener(
            new PacketAdapter(plugin, PacketType.Handshake.Client.SET_PROTOCOL,PacketType.Status.Server.SERVER_INFO) {
                @Override
                public void onPacketReceiving(PacketEvent event) {
                    int clientProtocol = event.getPacket().getIntegers().read(0);
                    isUnsupportedVersion = clientProtocol < MOTDConstants.PROTOCOL_1_20_4;
                }
            }
        );
    }

    @EventHandler
    public void onServerPing(ServerListPingEvent event) {
        StringBuilder motd = new StringBuilder();
       
        String header = isUnsupportedVersion ? MOTDConstants.HEADER_UNSUPPORTED : MOTDConstants.HEADER;
        motd.append(MOTDUtils.centerText(header)).append("\n");
       
        if (isUnsupportedVersion) {
            event.setMaxPlayers(0);
            motd.append(MOTDUtils.centerText(MOTDConstants.VERSION_MESSAGE));
        } else {
            event.setMaxPlayers(Bukkit.getOnlinePlayers().size() + 1);
            motd.append(MOTDUtils.centerText(MOTDConstants.WELCOME_MESSAGE));
        }
       
        event.setMotd(MOTDUtils.colorize(motd.toString()));
    }
En son spigot kullanılıyordu ama artık pek kullanan kalmadı, ben bile paper kullandığım halde hiç paper eklenti yapmıyorum xd

serverList için de bunu kullanabilirsin:
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
 
En son spigot kullanılıyordu ama artık pek kullanan kalmadı, ben bile paper kullandığım halde hiç paper eklenti yapmıyorum xd

serverList için de bunu kullanabilirsin:
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
Paper kütüphanesi kullanmadan spigot kütüphanesi üzerinden yaptığım eklentiler paper forkta sorunsuz olarak çalışıyor, hatta spigot forkta sorunlar çıkarıyor. Sizde de böyle mi bilmiyorum.
 
Paper kütüphanesi kullanmadan spigot kütüphanesi üzerinden yaptığım eklentiler paper forkta sorunsuz olarak çalışıyor, hatta spigot forkta sorunlar çıkarıyor. Sizde de böyle mi bilmiyorum.

şöyle düşünebilirsin:
NMS > BUKKIT > SPIGOT > PAPER > ve paper'ın forkları...

bukkit/spigot ile yaptığın eklenti paper'da açılır, çünkü paper, bukkit kütüphanesini içeriyor ama paper'da yaptığın eklenti, ondan önce gelen forklarda açılmaz (eğer paper'a özel kütüphaneden yararlanmışsa).

şimdi bu konudan örnek verecek olursam; paper'a ait olan getProtocolVersion() methodu, paper'dan önce gelen forklarda çalışmayacaktır çünkü onlarda bu method yok, bu yüzden hata fırlatacak. bir nevi eklentide sürüm destekleme mantığı ile aynı olaydır.
 
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