Instant Respawn

Discussion in 'Plugin Development' started by MrLizardDogMan, Feb 26, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    MrLizardDogMan

    Hey, i want to have when a player odes to instantly respawn, with no screen. I've found this,
    Code:java
    1. @EventHandler
    2. public void onPlayerDeath(PlayerDeathEvent e) {
    3. final Player p = (Player) e.getEntity();
    4. new BukkitRunnable(){
    5. public void run(){
    6. try {
    7. Object nmsPlayer = p.getClass().getMethod("getHandle").invoke(p);
    8. Object packet = Class.forName("net.minecraft.server." + Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3] + ".Packet205ClientCommand").newInstance();
    9. packet.getClass().getField("a").set(packet, 1);
    10. Object con = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer);
    11. con.getClass().getMethod("a", packet.getClass()).invoke(con, packet);
    12. } catch (Throwable e) {
    13. e.printStackTrace();
    14. }
    15. }
    16. }.runTaskLater(this, 2L);

    but that seems to have changed in 1.7. What would be the Updated form of this?
     
  2. Offline

    Gater12

  3. Offline

    MrLizardDogMan

    With this,
    Code:java
    1. @EventHandler
    2. public void onPlayerDeath(PlayerDeathEvent e) {
    3. final Player p = (Player) e.getEntity();
    4. new BukkitRunnable(){
    5. public void run(){
    6. try {
    7. Object nmsPlayer = p.getClass().getMethod("getHandle").invoke(p);
    8. Object packet = Class.forName("net.minecraft.server." + Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3] + ".PacketPlayInClientCommand").newInstance();
    9. packet.getClass().getField("a").set(packet, 1);
    10. Object con = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer);
    11. con.getClass().getMethod("a", packet.getClass()).invoke(con, packet);
    12. } catch (Throwable e) {
    13. e.printStackTrace();
    14. }
    15. }
    16. }.runTaskLater(this, 2L);

    It doesn't work and i get this error,
    Code:java
    1.  
    2.  
    3. [04:42:15] [Server thread/WARN]: java.lang.NoSuchFieldException: a
    4. [04:42:15] [Server thread/WARN]: at java.lang.Class.getField(Unknown Source)
    5. [04:42:15] [Server thread/WARN]: at me.MrLizard.KitPvP.KitPvP$1.run(KitPvP.java:44)
    6. [04:42:15] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftTask.run(CraftTask.java:58)
    7. [04:42:15] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:345)
    8. [04:42:15] [Server thread/WARN]: at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:614)
    9. [04:42:15] [Server thread/WARN]: at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:273)
    10. [04:42:15] [Server thread/WARN]: at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:562)
    11. [04:42:15] [Server thread/WARN]: at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java:469)
    12. [04:42:15] [Server thread/WARN]: at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:617)
    13.  
    14.  
     
  4. Offline

    viper_monster

    MrLizardDogMan
    Code:java
    1. public void forceRespawn(Player player) {
    2. try {
    3. Object nmsPlayer = player.getClass().getMethod("getHandle").invoke(player);
    4. Object con = nmsPlayer.getClass().getDeclaredField("playerConnection").get(nmsPlayer);
    5.  
    6. Class<?> EntityPlayer = Class.forName(nmsPlayer.getClass().getPackage().getName() + ".EntityPlayer");
    7.  
    8. Field minecraftServer = con.getClass().getDeclaredField("minecraftServer");
    9. minecraftServer.setAccessible(true);
    10. Object mcserver = minecraftServer.get(con);
    11.  
    12. Object playerlist = mcserver.getClass().getDeclaredMethod("getPlayerList").invoke(mcserver);
    13. Method moveToWorld = playerlist.getClass().getMethod("moveToWorld", EntityPlayer, int.class, boolean.class);
    14. moveToWorld.invoke(playerlist, nmsPlayer, 0, false);
    15. } catch (Exception e) {
    16. e.printStackTrace();
    17. }
    18. }
     
  5. Offline

    ShadowLAX

    MrLizardDogMan A much simpler method than to go into packets is to just set the player's health to 20 a few ticks after they die. Works and is not that complicated. No method is perfect however, and it can contain bugs just as your method will have some as well. Just a suggestion.
     
  6. Offline

    MrLizardDogMan

    spoljo666 Ok i implemented that, and nothing happens. I might have imported the wrong library, not sure
    Code:java
    1. package me.MrLizard.KitPvP;
    2.  
    3. import java.lang.reflect.Field;
    4. import java.lang.reflect.Method;
    5.  
    6. import net.minecraft.server.v1_7_R1.NBTTagList;
    7.  
    8. import org.bukkit.Bukkit;
    9. import org.bukkit.entity.Player;
    10. import org.bukkit.event.Listener;
    11. import org.bukkit.plugin.java.JavaPlugin;
    12. import org.bukkit.ChatColor;
    13. import org.bukkit.GameMode;
    14. import org.bukkit.Location;
    15. import org.bukkit.Material;
    16. import org.bukkit.command.Command;
    17. import org.bukkit.command.CommandSender;
    18. import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
    19. import org.bukkit.inventory.ItemStack;
    20. import org.bukkit.potion.PotionEffect;
    21. import org.bukkit.potion.PotionEffectType;
    22.  
    23.  
    24. public class KitPvP extends JavaPlugin implements Listener {
    25.  
    26. public static KitPvP plugin;
    27.  
    28. @Override
    29. public void onDisable() {
    30. }
    31.  
    32. @Override
    33. public void onEnable() {
    34. Bukkit.getServer().getPluginManager().registerEvents(this, this);
    35. }
    36. public void forceRespawn(Player player) {
    37. try {
    38. Object nmsPlayer = player.getClass().getMethod("getHandle").invoke(player);
    39. Object con = nmsPlayer.getClass().getDeclaredField("playerConnection").get(nmsPlayer);
    40.  
    41. Class<?> EntityPlayer = Class.forName(nmsPlayer.getClass().getPackage().getName() + ".EntityPlayer");
    42.  
    43. Field minecraftServer = con.getClass().getDeclaredField("minecraftServer");
    44. minecraftServer.setAccessible(true);
    45. Object mcserver = minecraftServer.get(con);
    46.  
    47. Object playerlist = mcserver.getClass().getDeclaredMethod("getPlayerList").invoke(mcserver);
    48. Method moveToWorld = playerlist.getClass().getMethod("moveToWorld", EntityPlayer, int.class, boolean.class);
    49. moveToWorld.invoke(playerlist, nmsPlayer, 1, false);
    50. } catch (Exception e) {
    51. e.printStackTrace();
    52. }
    53. }
    54.  
    55. //Commands
    56. public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
    57. if (!(sender instanceof Player)) {
    58. sender.sendMessage("You cannot run this command through the console!");
    59. return false;
    60. }
    61. Player p = (Player) sender;
    62. if(cmd.getName().equalsIgnoreCase("Lobby")){
    63. //Reset Player to Default
    64. p.setFoodLevel(20);
    65. p.setMaxHealth(20.0);
    66. p.setHealth(20.0);
    67. ((CraftPlayer)p).getHandle().inventory.b(new NBTTagList());
    68. p.removePotionEffect(PotionEffectType.SPEED);
    69. p.removePotionEffect(PotionEffectType.SLOW);
    70. //Sends Player Joining Message
    71. p.sendMessage(ChatColor.GOLD + "Joining Lobby...");
    72. //Teleporting Player
    73. p.teleport(new Location(Bukkit.getWorld("world"), -785, 27, 195, 180, 2));
    74. }
    75.  
    76. //Classes
    77. else if(cmd.getName().equalsIgnoreCase("join")){
    78. if (args.length == 0){
    79. // Showing the usage of the command here would be good.
    80. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.GOLD + "Kit" + ChatColor.GRAY + "]" + ChatColor.LIGHT_PURPLE + " Usage: /join [ARENA] [CLASS]");
    81. }
    82. else if (args.length == 1 && args[0].equalsIgnoreCase("mall")){
    83. //EDIT TO CLASS LOBBY
    84. p.teleport(new Location(Bukkit.getWorld("world"), -967.5, 12, 580.5));
    85. }
    86. else if (args.length == 2 && args[0].equalsIgnoreCase("mall") && args[1].equalsIgnoreCase("knight")){
    87. //Reset
    88. p.setFoodLevel(20);
    89. p.setMaxHealth(20.0);
    90. p.setHealth(20.0);
    91. p.setGameMode(GameMode.SURVIVAL);
    92. ((CraftPlayer)p).getHandle().inventory.b(new NBTTagList());
    93. p.removePotionEffect(PotionEffectType.SPEED);
    94. p.removePotionEffect(PotionEffectType.SLOW);
    95. // Player chose knight!
    96. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.GOLD + "Kit" + ChatColor.GRAY + "]" + ChatColor.LIGHT_PURPLE + " Joining Mall As Knight");
    97. p.teleport(new Location(Bukkit.getWorld("world"), -967.5, 12, 580.5));
    98. p.setGameMode(GameMode.SURVIVAL);
    99. //Items
    100. ItemStack[] armor = new ItemStack[4];
    101. armor[0] = new ItemStack(Material.CHAINMAIL_BOOTS, 1);
    102. armor[1] = new ItemStack(Material.CHAINMAIL_LEGGINGS, 1);
    103. armor[2] = new ItemStack(Material.CHAINMAIL_CHESTPLATE, 1);
    104. armor[3] = new ItemStack(Material.CHAINMAIL_HELMET, 1);
    105. p.getInventory().setArmorContents(armor);
    106. //Items
    107. ItemStack[] items = {new ItemStack(Material.IRON_SWORD), new ItemStack(Material.COOKED_BEEF, 32)};
    108. p.getInventory().addItem(items);
    109. }
    110. else if (args.length == 2 && args[0].equalsIgnoreCase("mall") && args[1].equalsIgnoreCase("archer")){
    111. //Reset
    112. p.setFoodLevel(20);
    113. p.setMaxHealth(20.0);
    114. p.setHealth(20.0);
    115. p.setGameMode(GameMode.SURVIVAL);
    116. ((CraftPlayer)p).getHandle().inventory.b(new NBTTagList());
    117. p.removePotionEffect(PotionEffectType.SPEED);
    118. p.removePotionEffect(PotionEffectType.SLOW);
    119. // Player chose archer!
    120. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.GOLD + "Kit" + ChatColor.GRAY + "]" + ChatColor.LIGHT_PURPLE + " Joining Mall As Archer");
    121. p.teleport(new Location(Bukkit.getWorld("world"), -967.5, 12, 580.5));
    122. ItemStack[] armor = new ItemStack[4];
    123. armor[0] = new ItemStack(Material.LEATHER_BOOTS, 1);
    124. armor[1] = new ItemStack(Material.LEATHER_LEGGINGS, 1);
    125. armor[2] = new ItemStack(Material.LEATHER_CHESTPLATE, 1);
    126. armor[3] = new ItemStack(Material.LEATHER_HELMET, 1);
    127. p.getInventory().setArmorContents(armor);
    128. }
    129. else if (args.length == 2 && args[0].equalsIgnoreCase("mall") && args[1].equalsIgnoreCase("tank")){
    130. //Reset
    131. p.setFoodLevel(20);
    132. p.setMaxHealth(40.0);
    133. p.setHealth((double)40);
    134. p.setGameMode(GameMode.SURVIVAL);
    135. ((CraftPlayer)p).getHandle().inventory.b(new NBTTagList());
    136. p.removePotionEffect(PotionEffectType.SPEED);
    137. p.removePotionEffect(PotionEffectType.SLOW);
    138. // Player chose Tank!
    139. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.GOLD + "Kit" + ChatColor.GRAY + "]" + ChatColor.LIGHT_PURPLE + " Joining Mall As Tank");
    140. p.teleport(new Location(Bukkit.getWorld("world"), -967.5, 12, 580.5));
    141. p.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 100000000, 2));
    142. ItemStack[] armor = new ItemStack[4];
    143. armor[0] = new ItemStack(Material.CHAINMAIL_BOOTS, 1);
    144. armor[1] = new ItemStack(Material.CHAINMAIL_LEGGINGS, 1);
    145. armor[2] = new ItemStack(Material.CHAINMAIL_CHESTPLATE, 1);
    146. armor[3] = new ItemStack(Material.CHAINMAIL_HELMET, 1);
    147. p.getInventory().setArmorContents(armor);;
    148. ItemStack[] items = {new ItemStack(Material.IRON_SWORD), new ItemStack(Material.COOKED_BEEF, 32)};
    149. p.getInventory().addItem(items);
    150. }
    151. else if (args.length == 2 && args[0].equalsIgnoreCase("mall") && args[1].equalsIgnoreCase("scout")){
    152. //Reset
    153. ((CraftPlayer)p).getHandle().inventory.b(new NBTTagList());
    154. p.removePotionEffect(PotionEffectType.SPEED);
    155. p.removePotionEffect(PotionEffectType.SLOW);
    156. p.setMaxHealth(10.0);
    157. p.setHealth(10.0);
    158. p.setFoodLevel(20);
    159. p.setGameMode(GameMode.SURVIVAL);
    160. // Player chose Scout!
    161. p.sendMessage(ChatColor.GRAY + "[" + ChatColor.GOLD + "Kit" + ChatColor.GRAY + "]" + ChatColor.LIGHT_PURPLE + " Joining Mall As Scout");
    162. p.teleport(new Location(Bukkit.getWorld("world"), -967.5, 12, 580.5));
    163. p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 100000000, 1));
    164. ItemStack[] armor = new ItemStack[4];
    165. armor[0] = new ItemStack(Material.LEATHER_BOOTS, 1);
    166. armor[1] = new ItemStack(Material.LEATHER_LEGGINGS, 1);
    167. armor[2] = new ItemStack(Material.LEATHER_CHESTPLATE, 1);
    168. armor[3] = new ItemStack(Material.LEATHER_HELMET, 1);
    169. p.getInventory().setArmorContents(armor);
    170. ItemStack[] items = {new ItemStack(Material.STONE_SWORD), new ItemStack(Material.APPLE, 16)};
    171. p.getInventory().addItem(items);
    172. }
    173. }
    174. return false;
    175. }
    176. }
    177.  
    178.  
    179.  
     
  7. Offline

    SuperOmegaCow

    MrLizardDogMan
    Code:java
    1. Player p = event.getEntity();
    2. try {
    3. Object nmsPlayer = p.getClass().getMethod("getHandle").invoke(p);
    4. Object packet = Class.forName(nmsPlayer.getClass().getPackage().getName() + ".PacketPlayInClientCommand").newInstance();
    5. Class<?> enumClass = Class.forName(nmsPlayer.getClass().getPackage().getName() + ".EnumClientCommand");
    6.  
    7. for (Object ob : enumClass.getEnumConstants()) {
    8. if (ob.toString().equals("PERFORM_RESPAWN")) {
    9. packet = packet.getClass().getConstructor(enumClass).newInstance(ob);
    10. }
    11. }
    12.  
    13. Object con = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer);
    14. con.getClass().getMethod("a", packet.getClass()).invoke(con, packet);
    15. } catch (Throwable t) {
    16. t.printStackTrace();
    17. }
     
  8. Offline

    viper_monster

    MrLizardDogMan You have to call that method somewhere (in the PlayerDeathEvent)
    PHP:
            @EventHandler
            
    public void onPlayerDeath(PlayerDeathEvent event) {
                final 
    Player player event.getPlayer();
                
    Bukkit.getServer().getScheduler().runTaskLater(this, new BukkitRunnable() {
                    public 
    void run() {
                        
    forceRespawn(player);
                    }
                }, 
    2L);
            }
     
  9. Offline

    calebbfmv

    Or.
    Code:
    @EventHandler
    public void onDeathWithNoNMS(EntityDeathEvent event){
      //checks for player and nulls
      event.setCancelled(true);
      <playervar>.teleport(spot);
     
  10. Offline

    SuperOmegaCow

    calebbfmv
    That would break basically every plugin in existence
     
  11. Offline

    calebbfmv

    SuperOmegaCow
    No it wouldn't, wait, it would? Doesn't for me.
     
  12. Offline

    97WaterPolo

    MrLizardDogMan

    Code:java
    1. @EventHandler (priority=EventPriority.HIGH)
    2. public void onDeath(PlayerDeathEvent event)
    3. {
    4. if (event.getEntity() instanceof Player)
    5. {
    6. final Player player = event.getEntity(); //gets the player
    7. final EntityPlayer ep = ((CraftPlayer) player).getHandle();
    8.  
    9. Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() //delayed task
    10. {
    11. @Override
    12. public void run() {
    13. PacketPlayInClientCommand in = new PacketPlayInClientCommand(EnumClientCommand.PERFORM_RESPAWN); // Gets the packet class
    14. ep.playerConnection.a(in);
    15. }
    16. }, 5L); //delay in ticks
    17. }
    18. }


    Hope this helps! Make sure you add craftbukkit as an external jar!
     
  13. Offline

    Agentleader1

    You want it to work?

    Try the following code:
    Code:java
    1. Bukkit.getScheduler().scheduleSyncDelayedTask(KitPVP.getInstance(), new Runnable(){
    2. public void run(){
    3. ((CraftPlayer)e.getEntity()).getHandle().playerConnection.a(new PacketPlayInClientCommand(EnumClientCommand.PERFORM_RESPAWN));
    4. Player player = e.getEntity();
    5. player.setFireTicks(0);
    6. player.setFireTicks(0);
    7. player.setHealth(20);
    8. player.setFoodLevel(20);
    9. player.setVelocity(new Vector(0, 0, 0)); //required to remove knockback, cause when you instant respawn from getting killed, you still hold knockback
    10. }
    11. }, 1);
     
  14. Offline

    fireblast709

    calebbfmv gj cancelling an event which doesn't implement Cancellable
     
    glen3b likes this.
  15. Offline

    22vortex22



    This code is so flawed (You couldn't cancel it in the first place) it ruined mcpvp's gamemode smash. With this code the player can store items in their crafting space and they wouldn't lose them on death. For instant respawn this is what I use:


    Code:java
    1. @EventHandler
    2. public void onDeathEvent(PlayerDeathEvent event){
    3. Player p = event.getEntity();
    4. PacketPlayInClientCommand in = new PacketPlayInClientCommand(EnumClientCommand.PERFORM_RESPAWN); // Gets the packet class
    5. EntityPlayer cPlayer = ((CraftPlayer)p).getHandle(); // Gets the EntityPlayer class
    6. cPlayer.playerConnection.a(in); // Handles the rest of it
    7. }
     
  16. Offline

    Agentleader1

  17. Offline

    22vortex22


    My code works too? I've used it multiple times.
     
  18. Offline

    Agentleader1

    ok lol, i just want you to consider it, don't push things too hardcore man
     
Thread Status:
Not open for further replies.

Share This Page