package tv.mineinthebox.essentials.events.players; import java.util.Iterator; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; import tv.mineinthebox.essentials.xEssentials; public class PlayerForceRespawnEvent implements Listener { private final xEssentials pl; public PlayerForceRespawnEvent(xEssentials pl) { this.pl = pl; } @EventHandler public void onrespawn(PlayerDeathEvent e) { Iterator<ItemStack> stacks = e.getDrops().iterator(); while(stacks.hasNext()) { ItemStack stack = stacks.next(); e.getEntity().getWorld().dropItem(e.getEntity().getLocation(), stack); stacks.remove(); } e.getEntity().setMetadata("deathReason", new FixedMetadataValue(pl, getKiller(e.getDeathMessage()))); sentPacket(e.getEntity()); } private void sentPacket(Player p) { try { Object nmsPlayer = p.getClass().getMethod("getHandle").invoke(p); Object packet = Class.forName(nmsPlayer.getClass().getPackage().getName() + ".PacketPlayInClientCommand").newInstance(); Class<?> enumClass = Class.forName(nmsPlayer.getClass().getPackage().getName() + ".EnumClientCommand"); for(Object ob : enumClass.getEnumConstants()){ if(ob.toString().equals("PERFORM_RESPAWN")){ packet = packet.getClass().getConstructor(enumClass).newInstance(ob); } } Object con = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer); con.getClass().getMethod("a", packet.getClass()).invoke(con, packet); } catch(Exception e) { e.printStackTrace(); } } public String getKiller(String message) { String[] args = message.split(" "); for(EntityType type : EntityType.values()) { for(String arg : args) { if(type.name().toLowerCase().startsWith(arg.toLowerCase()) || type.name().equalsIgnoreCase(arg)) { return type.name().toLowerCase(); } } } return "unknown"; } }