Spielerleichen spawnen Neu

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Registriere dich um viele Vorteile zu genießen! Weniger Werbung, bessere Kommunikation und vieles mehr!

  • Erklärt wie man Spielerleichen in der Minecraft v1.11.1 spawnt
    Leichen für MC v1.11.1
    Ich erkläre hier wie man für die MC v1.11.1 sogenannte Spielerleichen spawnen kann. Jemand in einem anderen Forum hatte danach gefragt und dann dachte ich mir, dass ich das hier auch noch reinstellen kann.

    Ein Beispiel einer Spielerleiche
    image.prntscr.com/image/b3bad7a071d64e7dac6534b4b51fb83d.png


    Anleitung

    Insgesamt muss man 5 verschiedene Packets versenden. Das sind folgende:

    • PacketPlayOutPlayerInfo
    • PacketPlayOutNamedEntitySpawn
    • PacketPlayOutBlockChange
    • PacketPlayOutBed
    • PacketPlayOutEntityTeleport


    Das erste Packet(PacketPlayOutPlayerInfo) wird benutzt um den Spieler der Tablist hinzuzufügen. Wenn man das nicht macht, dann wird der Spieler dem Clienten nicht angezeigt werden, das zweite Packet(PacketPlayOutNamedEntitySpawn) wird dafür benötigt um den eigentlichen Spieler zu spawnen, das dritte Packet(PacketPlayOutBlockChange) um dem Client zu sagen das an einer bestimmten Stelle ein Bett steht, ansonsten wird der Spieler nicht so aussehen, als ob er schlafen würde. Das vierte Packet(PacketPlayOutBed) wird dazu benutzt um ihn schlafen zu legen und das fünfte Packet(PacketPlayOutEntityTeleport) um ihn letztendlich an die gewünschte Stelle zu teleportieren.

    Auf was man achten muss
    Wenn ihr den Spieler spawnt, dann müsst ihr ihn vorher erst an einem anderen Ort spawnen und später teleportieren. Wenn ihr das nicht machen würdet, dann würde an dem Ort, wo die Leiche später liegen soll, ein Bett stehen. In meinem Code habe ich aber schon darauf geachtet, dass man die Leiche am Ende nicht nochmal teleportieren muss.

    Code

    Java-Quellcode

    1. import java.util.Arrays;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import java.util.Random;
    5. import java.util.UUID;
    6. import org.bukkit.Bukkit;
    7. import org.bukkit.Location;
    8. import org.bukkit.Material;
    9. import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
    10. import org.bukkit.craftbukkit.v1_11_R1.util.CraftMagicNumbers;
    11. import com.google.common.collect.Lists;
    12. import com.mojang.authlib.GameProfile;
    13. import net.minecraft.server.v1_11_R1.BlockPosition;
    14. import net.minecraft.server.v1_11_R1.DataWatcher;
    15. import net.minecraft.server.v1_11_R1.EnumGamemode;
    16. import net.minecraft.server.v1_11_R1.Packet;
    17. import net.minecraft.server.v1_11_R1.PacketPlayOutBed;
    18. import net.minecraft.server.v1_11_R1.PacketPlayOutBlockChange;
    19. import net.minecraft.server.v1_11_R1.PacketPlayOutEntityDestroy;
    20. import net.minecraft.server.v1_11_R1.PacketPlayOutEntityTeleport;
    21. import net.minecraft.server.v1_11_R1.PacketPlayOutNamedEntitySpawn;
    22. import net.minecraft.server.v1_11_R1.PacketPlayOutPlayerInfo;
    23. import net.minecraft.server.v1_11_R1.IChatBaseComponent.ChatSerializer;
    24. import net.minecraft.server.v1_11_R1.PacketPlayOutPlayerInfo.EnumPlayerInfoAction;
    25. public class Corpse {
    26. private static final int ENTITY_ID = 1000 + new Random().nextInt(500);
    27. private UUID uuid;
    28. private String name;
    29. private Location location;
    30. public Corpse() {}
    31. public Corpse(String name, Location location) {
    32. this.uuid = UUID.randomUUID();
    33. this.name = name;
    34. this.location = location;
    35. }
    36. public String getName() {
    37. return name;
    38. }
    39. public Location getLocation() {
    40. return location;
    41. }
    42. public void setName(String name) {
    43. this.name = name;
    44. }
    45. public void setLocation(Location location) {
    46. this.location = location;
    47. }
    48. public void spawn() {
    49. sendPackets(new Packet<?>[]{new PacketBuilder(new PacketPlayOutPlayerInfo()).set("a", EnumPlayerInfoAction.ADD_PLAYER).set("b", Lists.newArrayList(new PacketPlayOutPlayerInfo().new PlayerInfoData(new GameProfile(uuid, name), 0, EnumGamemode.NOT_SET, ChatSerializer.b(name)))).build(), new PacketBuilder(new PacketPlayOutNamedEntitySpawn()).set("a", ENTITY_ID).set("b", uuid).set("c", location.getX()).set("d", location.getY()+100.0D).set("e", location.getZ()).set("f", (byte) (int) (location.getYaw() * 256.0F / 360.0F)).set("g", (byte) (int) (location.getPitch() * 256.0F / 360.0F)).set("h", new DataWatcher(null)).build(), new PacketBuilder(new PacketPlayOutBlockChange()).set("a", new BlockPosition(location.getX(), location.getY()+100.0D, location.getZ())).set("block", CraftMagicNumbers.getBlock(Material.BED_BLOCK).fromLegacyData(0)).build(), new PacketBuilder(new PacketPlayOutBed()).set("a", ENTITY_ID).set("b", new BlockPosition(location.getX(), location.getY()+100.0D, location.getZ())).build(), new PacketBuilder(new PacketPlayOutEntityTeleport()).set("a", ENTITY_ID).set("b", location.getX()).set("c", location.getY()).set("d", location.getZ()).set("e", (byte) (int) (location.getYaw() * 256.0F / 360.0F)).set("f", (byte) (int) (location.getPitch() * 256.0F / 360.0F)).set("g", false).build()});
    50. }
    51. public void destroy() {
    52. sendPackets(new Packet<?>[]{new PacketBuilder(new PacketPlayOutPlayerInfo()).set("a", EnumPlayerInfoAction.REMOVE_PLAYER).set("b", Lists.newArrayList(new PacketPlayOutPlayerInfo().new PlayerInfoData(new GameProfile(uuid, name), 0, EnumGamemode.NOT_SET, ChatSerializer.b(name)))).build(), new PacketBuilder(new PacketPlayOutEntityDestroy()).set("a", new int[]{ENTITY_ID}).build()});
    53. }
    54. private void sendPacket(Packet<?> packet) {
    55. Bukkit.getOnlinePlayers().forEach(player -> ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet));
    56. }
    57. private void sendPackets(Packet<?>[] packets) {
    58. Arrays.asList(packets).forEach(packet -> sendPacket(packet));
    59. }
    60. public class PacketBuilder {
    61. private Packet<?> packet;
    62. private Map<String, Object> fieldsAndValues;
    63. public PacketBuilder(Packet<?> packet) {
    64. this.packet = packet;
    65. fieldsAndValues = new HashMap<>();
    66. }
    67. public PacketBuilder set(String field, Object value) {
    68. fieldsAndValues.put(field, value);
    69. return this;
    70. }
    71. public Packet<?> build() {
    72. Packet<?> packet = (Packet<?>) ReflectionHelper.newInstance(this.packet.getClass());
    73. fieldsAndValues.keySet().forEach(fieldName -> ReflectionHelper.setValue(ReflectionHelper.getField(packet.getClass(), fieldName), packet, fieldsAndValues.get(fieldName)));
    74. return packet;
    75. }
    76. }
    77. }
    Alles anzeigen


    Java-Quellcode

    1. import java.lang.reflect.Field;
    2. import java.lang.reflect.InvocationTargetException;
    3. import java.lang.reflect.Method;
    4. public class ReflectionHelper {
    5. public static Class<?> getClass(String name) {
    6. try {
    7. return Class.forName(name);
    8. } catch (ClassNotFoundException e) {
    9. e.printStackTrace();
    10. }
    11. return null;
    12. }
    13. public static Method getMethod(Class<?> target, String name, Class<?>...parameterTypes) {
    14. Method method = null;
    15. try {
    16. method = target.getDeclaredMethod(name, parameterTypes);
    17. method.setAccessible(true);
    18. } catch (NoSuchMethodException e) {
    19. e.printStackTrace();
    20. }
    21. return method;
    22. }
    23. public static Object invoke(Method method, Object target, Object...args) {
    24. Object object = null;
    25. try {
    26. object = method.invoke(target, args);
    27. } catch (IllegalAccessException e) {
    28. e.printStackTrace();
    29. } catch (InvocationTargetException e) {
    30. e.printStackTrace();
    31. }
    32. return object;
    33. }
    34. public static Field getField(Class<?> target, String name) {
    35. Field field = null;
    36. try {
    37. field = target.getDeclaredField(name);
    38. field.setAccessible(true);
    39. } catch (NoSuchFieldException e) {
    40. e.printStackTrace();
    41. }
    42. return field;
    43. }
    44. public static Object get(Field field, Object target) {
    45. try {
    46. return field.get(target);
    47. } catch (IllegalAccessException e) {
    48. e.printStackTrace();
    49. }
    50. return null;
    51. }
    52. public static Object newInstance(Class<?> target) {
    53. try {
    54. return target.newInstance();
    55. } catch (InstantiationException e) {
    56. e.printStackTrace();
    57. } catch (IllegalAccessException e) {
    58. e.printStackTrace();
    59. }
    60. return null;
    61. }
    62. public static void setValue(Field field, Object target, Object value) {
    63. try {
    64. field.set(target, value);
    65. } catch (IllegalAccessException e) {
    66. e.printStackTrace();
    67. }
    68. }
    69. }
    Alles anzeigen


    Nutzung
    So kann man eine Leiche spawnen

    Java-Quellcode

    1. new Corpse("Spielerleiche", new Location(Bukkit.getWorld("world"), 0.0D, 0.0D, 0.0D)).spawn();


    Ende
    Ich wünsche euch viel Spaß damit. Eventuell hat das ja irgendwem geholfen oder findet noch andere Sachen wie den PacketBuilder den ich da benutze interessant. Ich persönliche finde ihn auf jeden Fall sehr hilfreich :saint: <3

    120 mal gelesen

Kommentare 1

  • Skyleiger -

    Hallo,
    Ich finde es generell toll, dass du dies hier reinstellst, und ich möchte jetzt direkt nicht sagen, dass dies schlecht war. Doch leider ist dies hier nur ein fertiger Code, und so lernt der Nutzer nichts. Beim nächsten mal könnte man es vielleicht so machen, dass der Code einzeln mit Erklärung zusammengesetzt wird.

    Mit freundlichen Grüßen,
    Skyleiger