Core/src/eu/univento/core/api/Blackscreen.java

85 lines
2.7 KiB
Java

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<UUID, Integer> ticksLeft = new HashMap<UUID, Integer>();
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);
}
}