Ir para conteúdo

[Resource] Reflections


n00bmobile

Posts Recomendados

Reflections

Reflections no bukkit, resumindo, são metodos 

que funcionam em qualquer versão do minecraft.

 

Metodos:

 

ActionBar:

 

 

Ex: ( HotbarMessager.sendHotBarMessage(Player, Message); )

 


import java.lang.reflect.*;
 
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
 
public class HotbarMessager {
 
   /**
    * These are the Class instances. Use these to get fields or methods for
    * classes.
    */
   private static Class<?> CRAFTPLAYERCLASS, PACKET_PLAYER_CHAT_CLASS,
       ICHATCOMP, CHATMESSAGE, PACKET_CLASS, CHAT_MESSAGE_TYPE_CLASS;
 
   private static Field PLAYERCONNECTION;
   private static Method GETHANDLE,SENDPACKET;
 
 
   /**
    * These are the constructors for those classes. You need these to create
    * new objects.
    */
   private static Constructor<?> PACKET_PLAYER_CHAT_CONSTRUCTOR,
       CHATMESSAGE_CONSTRUCTOR;
   /**
    * Used in 1.12+. Bytes are replaced with this enum
    */
   private static Object CHAT_MESSAGE_TYPE_ENUM_OBJECT;
 
   /**
    * This is the server version. This is how we know the server version.
    */
   private static final String SERVER_VERSION;
   static {
     // This gets the server version.     
     String name = Bukkit.getServer().getClass().getName();
     name = name.substring(name.indexOf("craftbukkit.")
         + "craftbukkit.".length());
     name = name.substring(0, name.indexOf("."));
     SERVER_VERSION = name;
 
     try {
        // This here sets the class fields.
       CRAFTPLAYERCLASS = Class.forName("org.bukkit.craftbukkit."
           + SERVER_VERSION + ".entity.CraftPlayer");
       PACKET_PLAYER_CHAT_CLASS = Class.forName("net.minecraft.server."
           + SERVER_VERSION + ".PacketPlayOutChat");
       PACKET_CLASS = Class.forName("net.minecraft.server."
           + SERVER_VERSION + ".Packet");
       ICHATCOMP = Class.forName("net.minecraft.server." + SERVER_VERSION
           + ".IChatBaseComponent");
       GETHANDLE = CRAFTPLAYERCLASS.getMethod("getHandle");
       PLAYERCONNECTION = GETHANDLE.getReturnType().getClass()
           .getField("playerConnection");
       SENDPACKET = PLAYERCONNECTION.getType().getMethod("sendPacket", PACKET_CLASS);
       try {
         PACKET_PLAYER_CHAT_CONSTRUCTOR = PACKET_PLAYER_CHAT_CLASS
             .getConstructor(ICHATCOMP, byte.class);
       } catch (NoSuchMethodException e) {
         CHAT_MESSAGE_TYPE_CLASS = Class.forName("net.minecraft.server."
             + SERVER_VERSION + ".ChatMessageType");
         CHAT_MESSAGE_TYPE_ENUM_OBJECT = CHAT_MESSAGE_TYPE_CLASS
             .getEnumConstants()[2];
 
         PACKET_PLAYER_CHAT_CONSTRUCTOR = PACKET_PLAYER_CHAT_CLASS
             .getConstructor(ICHATCOMP, CHAT_MESSAGE_TYPE_CLASS);
       }
 
       CHATMESSAGE = Class.forName("net.minecraft.server."
           + SERVER_VERSION + ".ChatMessage");
 
       CHATMESSAGE_CONSTRUCTOR = CHATMESSAGE.getConstructor(
           String.class, Object[].class);
     } catch (Exception e) {
       e.printStackTrace();
     }
   }
 
   /**
    * Sends the hotbar message 'message' to the player 'player'
    *
    * @param player
    * @param message
    */
   public static void sendHotBarMessage(Player player, String message) {
     try {
       // This creates the IChatComponentBase instance
       Object icb = CHATMESSAGE_CONSTRUCTOR.newInstance(message,
           new Object[0]);
       // This creates the packet
       Object packet;
       try {
         packet = PACKET_PLAYER_CHAT_CONSTRUCTOR.newInstance(icb,
             (byte) 2);
       } catch (Exception e) {
         packet = PACKET_PLAYER_CHAT_CONSTRUCTOR.newInstance(icb,
             CHAT_MESSAGE_TYPE_ENUM_OBJECT);
       }
       // This casts the player to a craftplayer
       Object craftplayerInst = CRAFTPLAYERCLASS.cast(player);
       // This invokes the method above.
       Object methodhHandle = GETHANDLE.invoke(craftplayerInst);
       // This gets the player's connection
       Object playerConnection = PLAYERCONNECTION.get(methodhHandle);
       // This sends the packet.
       SENDPACKET
           .invoke(playerConnection, packet);
     } catch (Exception e) {
       e.printStackTrace();
     }
   }
}
 
 

 

 

Titles:

 

 

(Ex: SendTitle.sendFullTitle(Player player, final Integer fadeIn, Integer stay,Integer fadeOut,String title, String subtitle) )

import org.bukkit.entity.*;
import org.bukkit.*;
import java.lang.reflect.*;

public class SendTitle
{
       
    public static void setTible(final Player player, final Integer fadeIn, final Integer stay, final Integer fadeOut, final String title, final String subtitle) {
        sendTitle(player, fadeIn, stay, fadeOut, title, subtitle);
    }
    
    public static void sendSubtitle(final Player player, final Integer fadeIn, final Integer stay, final Integer fadeOut, final String message) {
        sendTitle(player, fadeIn, stay, fadeOut, null, message);
    }
    
    public static void sendFullTitle(final Player player, final Integer fadeIn, final Integer stay, final Integer fadeOut, final String title, final String subtitle) {
        sendTitle(player, fadeIn, stay, fadeOut, title, subtitle);
    }
    
    public static void sendPacket(final Player player, final Object packet) {
        try {
            final Object handle = player.getClass().getMethod("getHandle", (Class<?>[])new Class[0]).invoke(player, new Object[0]);
            final Object playerConnection = handle.getClass().getField("playerConnection").get(handle);
            playerConnection.getClass().getMethod("sendPacket", getNMSClass("Packet")).invoke(playerConnection, packet);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static Class<?> getNMSClass(final String name) {
        final String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
        try {
            return Class.forName("net.minecraft.server." + version + "." + name);
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    public static void sendTitle(final Player player, final Integer fadeIn, final Integer stay, final Integer fadeOut, String title, String subtitle) {
        try {
            if (title != null) {
                title = ChatColor.translateAlternateColorCodes('&', title);
                title = title.replaceAll("%player%", player.getDisplayName());
                final Object enumTitle = getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0].getField("TITLE").get(null);
                final Object chatTitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", String.class).invoke(null, "{\"text\":\"" + title + "\"}");
                final Constructor<?> titleConstructor = getNMSClass("PacketPlayOutTitle").getConstructor(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), Integer.TYPE, Integer.TYPE, Integer.TYPE);
                final Object titlePacket = titleConstructor.newInstance(enumTitle, chatTitle, fadeIn, stay, fadeOut);
                sendPacket(player, titlePacket);
            }
            if (subtitle != null) {
                subtitle = ChatColor.translateAlternateColorCodes('&', subtitle);
                subtitle = subtitle.replaceAll("%player%", player.getDisplayName());
                final Object enumSubtitle = getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0].getField("SUBTITLE").get(null);
                final Object chatSubtitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", String.class).invoke(null, "{\"text\":\"" + subtitle + "\"}");
                final Constructor<?> subtitleConstructor = getNMSClass("PacketPlayOutTitle").getConstructor(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), Integer.TYPE, Integer.TYPE, Integer.TYPE);
                final Object subtitlePacket = subtitleConstructor.newInstance(enumSubtitle, chatSubtitle, fadeIn, stay, fadeOut);
                sendPacket(player, subtitlePacket);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void sendTabTitle(final Player player, String header, String footer) {
        if (header == null) {
            header = "";
        }
        header = ChatColor.translateAlternateColorCodes('&', header);
        if (footer == null) {
            footer = "";
        }
        footer = ChatColor.translateAlternateColorCodes('&', footer);
        header = header.replaceAll("%player%", player.getDisplayName());
        footer = footer.replaceAll("%player%", player.getDisplayName());
        try {
            final Object tabHeader = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", String.class).invoke(null, "{\"text\":\"" + header + "\"}");
            final Object tabFooter = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", String.class).invoke(null, "{\"text\":\"" + footer + "\"}");
            final Constructor<?> titleConstructor = getNMSClass("PacketPlayOutPlayerListHeaderFooter").getConstructor(getNMSClass("IChatBaseComponent"));
            final Object packet = titleConstructor.newInstance(tabHeader);
            final Field field = packet.getClass().getDeclaredField("b");
            field.setAccessible(true);
            field.set(packet, tabFooter);
            sendPacket(player, packet);
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

 

 

 

 
 

Hologramas:

 

 

(Ex:

for (Player p : Bukkit.getOnlinePlayers()){

List<String> textos = new ArrayList<>();

textos.add("§eHey, "+p.getName());

Hologram holo = new Hologram(e.getBlock().getLocation(), textos);

holo.display(p);

}

 )

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
 
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
 
 
public class Hologram {
   
    private List<String> lines;
    private Location loc;
    private static final double ABS = 0.23D;
    private static String path;
    private static String version;
   
   
    static {
        path = Bukkit.getServer().getClass().getPackage().getName();
        version = path.substring(path.lastIndexOf(".")+1, path.length());
    }
 
    public Hologram(Location loc, List<String> lines) {
        this.lines = lines;
        this.loc = loc;
    }
   
    // Boolean successfully
    public boolean display(Player p) {
        Location displayLoc = loc.clone().add(0, (ABS * lines.size()) - 1.97D, 0);
        for (int i = 0; i < lines.size(); i++) {
            Object packet = this.getPacket(this.loc.getWorld(), displayLoc.getX(), displayLoc.getY(), displayLoc.getZ(), this.lines.get(i));
            if (packet == null) return false;
            this.sendPacket(p, packet);
            displayLoc.add(0, -ABS, 0);
        }
       
        return true;
    }
   
    public Object getPacket(World w, double x, double y, double z, String text) {
        try {
            Class<?> armorStand = Class.forName("net.minecraft.server." + version + ".EntityArmorStand");
            Class<?> worldClass = Class.forName("net.minecraft.server." + version + ".World");
            Class<?> nmsEntity = Class.forName("net.minecraft.server." + version + ".Entity");
            Class<?> craftWorld = Class.forName("org.bukkit.craftbukkit." + version + ".CraftWorld");
            Class<?> packetClass = Class.forName("net.minecraft.server." + version + ".PacketPlayOutSpawnEntityLiving");
            Class<?> entityLivingClass = Class.forName("net.minecraft.server." + version + ".EntityLiving");
            Constructor<?> cww = armorStand.getConstructor(new Class<?>[] { worldClass });
            Object craftWorldObj = craftWorld.cast(w);
            Method getHandleMethod = craftWorldObj.getClass().getMethod("getHandle", new Class<?>[0]);
            Object entityObject = cww.newInstance(new Object[] { getHandleMethod.invoke(craftWorldObj, new Object[0]) });
            Method setCustomName = entityObject.getClass().getMethod("setCustomName", new Class<?>[] { String.class });
            setCustomName.invoke(entityObject, new Object[] { text });
            Method setCustomNameVisible = nmsEntity.getMethod("setCustomNameVisible", new Class[] { boolean.class });
            setCustomNameVisible.invoke(entityObject, new Object[] { true });
            Method setGravity = entityObject.getClass().getMethod("setGravity", new Class<?>[] { boolean.class });
            setGravity.invoke(entityObject, new Object[] { false });
            Method setLocation = entityObject.getClass().getMethod("setLocation", new Class<?>[] { double.class, double.class, double.class, float.class, float.class });
            setLocation.invoke(entityObject, new Object[] { x, y, z, 0.0F, 0.0F });
            Method setInvisible = entityObject.getClass().getMethod("setInvisible", new Class<?>[] { boolean.class });
            setInvisible.invoke(entityObject, new Object[] { true });
            Constructor<?> cw = packetClass.getConstructor(new Class<?>[] { entityLivingClass });
            Object packetObject = cw.newInstance(new Object[] { entityObject });
            return packetObject;
        } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            e.printStackTrace();
        }
        return null;
    }
   
    private void sendPacket(Player p, Object packet) {
        String path = Bukkit.getServer().getClass().getPackage().getName();
        String version = path.substring(path.lastIndexOf(".") + 1, path.length());
        try {
           Method getHandle = p.getClass().getMethod("getHandle");
           Object entityPlayer = getHandle.invoke(p);
           Object pConnection = entityPlayer.getClass().getField("playerConnection").get(entityPlayer);
           Class<?> packetClass = Class.forName("net.minecraft.server." + version + ".Packet");
           Method sendMethod = pConnection.getClass().getMethod("sendPacket", new Class[] { packetClass });
           sendMethod.invoke(pConnection, new Object[] { packet });
        } catch (Exception e) {
           e.printStackTrace();
        }
     }
 
}

 
 

 

Pegar ping:

 

 

Ex: Ping.getPing(p);

public class Ping {
    private static Method getHandleMethod;
    private static Field pingField;

    public static int getPing(Player player) {
        try {
            if (getHandleMethod == null) {
                getHandleMethod = player.getClass().getDeclaredMethod("getHandle");
                getHandleMethod.setAccessible(true);
            }
            Object entityPlayer = getHandleMethod.invoke(player);
            if (pingField == null) {
                pingField = entityPlayer.getClass().getDeclaredField("ping");
                pingField.setAccessible(true);
            }
            int ping = pingField.getInt(entityPlayer);

            return ping > 0 ? ping : 0;
        } catch (Exception e) {
            return 1;
        }
    }
}
  

 


 

Ativar/Desativar IA

 

 

(Ex: NoAI.setAIEnabled(npc, false) )

import java.lang.reflect.Method;

import org.bukkit.Bukkit;
import org.bukkit.entity.Entity;

public class NoAI {

    private static String serverVersion;
    private static Method getHandle;
    private static Method getNBTTag;
    private static Class<?> nmsEntityClass;
    private static Class<?> nbtTagClass;
    private static Method c;
    private static Method setInt;
    private static Method f;

    public static void setAiEnabled(Entity entity, boolean enabled) {
        try {
            if (serverVersion == null) {
                String name = Bukkit.getServer().getClass().getName();
                String[] parts = name.split("\\.");
                serverVersion = parts[3];
            }
            if (getHandle == null) {
                Class<?> craftEntity = Class.forName("org.bukkit.craftbukkit." + serverVersion + ".entity.CraftEntity");
                getHandle = craftEntity.getDeclaredMethod("getHandle");
                getHandle.setAccessible(true);
            }
            Object nmsEntity = getHandle.invoke(entity);
            if (nmsEntityClass == null) {
                nmsEntityClass = Class.forName("net.minecraft.server." + serverVersion + ".Entity");
            }
            if (getNBTTag == null) {
                getNBTTag = nmsEntityClass.getDeclaredMethod("getNBTTag");
                getNBTTag.setAccessible(true);
            }
            Object tag = getNBTTag.invoke(nmsEntity);
            if (nbtTagClass == null) {
                nbtTagClass = Class.forName("net.minecraft.server." + serverVersion + ".NBTTagCompound");
            }
            if (tag == null) {
                tag = nbtTagClass.newInstance();
            }
            if (c == null) {
                c = nmsEntityClass.getDeclaredMethod("c", nbtTagClass);
                c.setAccessible(true);
            }
            c.invoke(nmsEntity, tag);
            if (setInt == null) {
                setInt = nbtTagClass.getDeclaredMethod("setInt", String.class, Integer.TYPE);
                setInt.setAccessible(true);
            }
            int value = enabled ? 0 : 1;
            setInt.invoke(tag, "NoAI", value);
            if (f == null) {
                f = nmsEntityClass.getDeclaredMethod("f", nbtTagClass);
                f.setAccessible(true);
            }
            f.invoke(nmsEntity, tag);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
	
}

 Quer adicionar um novo metodo?

Só me chamar  :v

Nenhum dos metodos é meu.

Gostou? Foi útil? Deixa o like.

 

 

 

 

Editado por n00bmobile
Link para o comentário
Compartilhar em outros sites

Participe da Conversa

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, a class='ipsType_brandedLink' href='https://gamersboard.com.br/login/' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title='Sign In Now'>acesse agora para postar com sua conta.
Observação: sua postagem exigirá aprovação do moderador antes de ficar visível.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

Processando...
×
×
  • Criar Novo...