Skip to content

Instantly share code, notes, and snippets.

@kumpelblase2
Last active December 19, 2015 17:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kumpelblase2/d77d00cd2ee5ba9e5c8d to your computer and use it in GitHub Desktop.
Save kumpelblase2/d77d00cd2ee5ba9e5c8d to your computer and use it in GitHub Desktop.
This is a dynamic version for forcing a respawn on a player.
package de.kumpelblase2.forcerespawn;
import java.lang.reflect.*;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.*;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.plugin.Plugin;
import com.chaseoes.forcerespawn.event.ForceRespawnEvent;
public class ForceRespawn implements Listener
{
private static ForceRespawn s_instance;
private final Plugin m_plugin;
private String m_craftbukkitPackage;
private String m_nmsPackage;
private Method m_getHandleMethod;
private Class m_minecraftPlayerClass;
private Field m_connectionField;
private Method m_sendMethod;
private Class m_packetClass;
private Field m_packetValueField;
private ForceRespawn(Plugin inPlugin)
{
s_instance = this;
this.m_plugin = inPlugin;
Bukkit.getPluginManager().registerEvents(this, this.m_plugin);
try
{
this.m_craftbukkitPackage = Bukkit.getServer().getClass().getPackage().getName();
this.m_nmsPackage = "net.minecraft.server";
String[] split = this.m_craftbukkitPackage.split("\\.");
if(split.length > 3)
this.m_nmsPackage += "." + split[3];
Class craftPlayerClass = Class.forName(this.m_craftbukkitPackage + ".entity.CraftPlayer");
this.m_getHandleMethod = craftPlayerClass.getMethod("getHandle");
this.m_minecraftPlayerClass = Class.forName(this.m_nmsPackage + ".EntityPlayer");
this.m_packetClass = Class.forName(this.m_nmsPackage + ".Packet205ClientCommand");
this.m_packetValueField = this.m_packetClass.getDeclaredField("a");
for(Field f : this.m_minecraftPlayerClass.getDeclaredFields())
{
for(Method m : f.getType().getDeclaredMethods())
{
Class<?>[] parameters = m.getParameterTypes();
if(parameters.length == 1)
{
if(parameters[0].getName().equals(this.m_nmsPackage + ".Packet"))
{
try
{
f.getType().getSuperclass().getMethod(m.getName(), parameters);
}
catch(NoSuchMethodException e)
{
this.m_sendMethod = m;
this.m_connectionField = f;
return;
}
}
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static ForceRespawn getInstance()
{
return s_instance;
}
public static ForceRespawn create(Plugin inPlugin)
{
return new ForceRespawn(inPlugin);
}
public void forceRespawnOn(Player inPlayer)
{
try
{
Object nmsPlayer = this.m_getHandleMethod.invoke(inPlayer);
Object connection = this.m_connectionField.get(nmsPlayer);
Object packet = this.m_packetClass.newInstance();
this.m_packetValueField.set(packet, 1);
this.m_sendMethod.invoke(connection, packet);
}
catch(Exception e)
{
e.printStackTrace();
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerDeath(final PlayerDeathEvent event)
{
Bukkit.getScheduler().scheduleSyncDelayedTask(this.m_plugin, new Runnable()
{
@Override
public void run()
{
ForceRespawnEvent respawnEvent = new ForceRespawnEvent(event.getEntity());
Bukkit.getPluginManager().callEvent(respawnEvent);
if(respawnEvent.shouldForce())
ForceRespawn.this.forceRespawnOn(respawnEvent.getPlayer());
}
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment