-
-
Save kumpelblase2/d77d00cd2ee5ba9e5c8d to your computer and use it in GitHub Desktop.
This is a dynamic version for forcing a respawn on a player.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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