package eu.univento.core.api; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.UUID; /** * * @author janhektor * */ public class Blackscreen { private static Object packetObject; private static Class packetClass; private static String VERSION; private static Map ticksLeft = new HashMap(); static { String path = Bukkit.getServer().getClass().getPackage().getName(); VERSION = path.substring(path.lastIndexOf(".") + 1, path.length()); try { packetClass = Class.forName("net.minecraft.server." + VERSION + ".Packet"); Class packetGameStateClass = Class.forName("net.minecraft.server." + VERSION + ".PacketPlayOutGameStateChange"); packetObject = packetGameStateClass.getConstructor(new Class[] { Integer.TYPE, Float.TYPE }).newInstance(new Object[] { Integer.valueOf(4), Integer.valueOf(0) }); } catch (Exception ex) { ex.printStackTrace(); } } public static void setupUtil(Plugin instance) { setupUtil(instance, 2); } public static void setupUtil(Plugin instance, int repeatingTicks) { Bukkit.getScheduler().runTaskTimer(instance, new Runnable() { public void run() { for (UUID uuid : Blackscreen.ticksLeft.keySet()) { Player p = Bukkit.getPlayer(uuid); if (p == null) { Blackscreen.ticksLeft.remove(uuid); } else if (((Integer)Blackscreen.ticksLeft.get(uuid)).intValue() > 0) { Blackscreen.ticksLeft.put(uuid, Integer.valueOf(((Integer)Blackscreen.ticksLeft.get(uuid)).intValue() - 2)); Blackscreen.access(p); } else { Blackscreen.ticksLeft.remove(uuid); } } } } , 0L, repeatingTicks); } protected static void access(Player p) { } private static void sendPacket(Player p) { try { Object nmsPlayer = p.getClass().getMethod("getHandle", new Class[0]).invoke(p, new Object[0]); Field playerConnectionField = nmsPlayer.getClass().getField("playerConnection"); Object pConnection = playerConnectionField.get(nmsPlayer); Method sendPacket = pConnection.getClass().getMethod("sendPacket", new Class[] { packetClass }); sendPacket.invoke(pConnection, new Object[] { packetObject }); } catch (Exception ex) { ex.printStackTrace(); } } public static void setBlack(Player p, int seconds) { ticksLeft.put(p.getUniqueId(), Integer.valueOf(seconds * 20)); sendPacket(p); } }