diff --git a/src/de/steamwar/spectatesystem/FightserverConnection.java b/src/de/steamwar/spectatesystem/FightserverConnection.java index e551d1f..8d9b53c 100644 --- a/src/de/steamwar/spectatesystem/FightserverConnection.java +++ b/src/de/steamwar/spectatesystem/FightserverConnection.java @@ -22,6 +22,11 @@ public class FightserverConnection implements PacketSource { return inputStream.readByte(); } + @Override + public boolean rBoolean() throws IOException { + return inputStream.readBoolean(); + } + @Override public short rShort() throws IOException { return inputStream.readShort(); diff --git a/src/de/steamwar/spectatesystem/PacketProcessor.java b/src/de/steamwar/spectatesystem/PacketProcessor.java index 2d18d4d..be496eb 100644 --- a/src/de/steamwar/spectatesystem/PacketProcessor.java +++ b/src/de/steamwar/spectatesystem/PacketProcessor.java @@ -31,7 +31,6 @@ class PacketProcessor { if(user == null) throw new IOException("Unknown user " + userId); - System.out.println("Player " + user.getUserName() + " spawned!"); new RPlayer(user.getUUID(), user.getUserName(), entityId); } @@ -42,8 +41,9 @@ class PacketProcessor { double locZ = source.rDouble(); float pitch = source.rFloat(); float yaw = source.rFloat(); + byte headYaw = source.rByte(); - REntity.getEntity(entityId).move(locX, locY, locZ, yaw, pitch); + REntity.getEntity(entityId).move(locX, locY, locZ, yaw, pitch, headYaw); } private void entityDespawns() throws IOException{ @@ -52,6 +52,20 @@ class PacketProcessor { REntity.getEntity(entityId).remove(); } + private void entitySneak() throws IOException { + int entityId = source.rInt(); + boolean sneaking = source.rBoolean(); + + REntity.getEntity(entityId).sneak(sneaking); + } + + private void entityAnimation() throws IOException { + int entityId = source.rInt(); + byte animation = source.rByte(); + + REntity.getEntity(entityId).animation(animation); + } + private void send(ChatMessageType type) throws IOException { String message = source.rString(); @@ -91,6 +105,12 @@ class PacketProcessor { case 0x02: entityDespawns(); break; + case 0x03: + entitySneak(); + break; + case 0x04: + entityAnimation(); + break; case 0x30: block(); break; @@ -109,7 +129,7 @@ class PacketProcessor { } } } catch (EOFException e) { - Bukkit.getLogger().log(Level.INFO, "End of file", e); + Bukkit.getLogger().log(Level.INFO, "The FightServer is offline"); source.close(); } catch(IOException e){ Bukkit.getLogger().log(Level.WARNING, "Could not recieve packet", e); diff --git a/src/de/steamwar/spectatesystem/PacketSource.java b/src/de/steamwar/spectatesystem/PacketSource.java index 3dde6ab..4c9c695 100644 --- a/src/de/steamwar/spectatesystem/PacketSource.java +++ b/src/de/steamwar/spectatesystem/PacketSource.java @@ -5,6 +5,7 @@ import java.io.IOException; public interface PacketSource { byte rByte() throws IOException; + boolean rBoolean() throws IOException; short rShort() throws IOException; int rInt() throws IOException; long rLong() throws IOException; diff --git a/src/de/steamwar/spectatesystem/elements/REntity.java b/src/de/steamwar/spectatesystem/elements/REntity.java index c3ea614..cc9b18b 100644 --- a/src/de/steamwar/spectatesystem/elements/REntity.java +++ b/src/de/steamwar/spectatesystem/elements/REntity.java @@ -1,9 +1,6 @@ package de.steamwar.spectatesystem.elements; -import net.minecraft.server.v1_15_R1.Entity; -import net.minecraft.server.v1_15_R1.PacketPlayOutEntityDestroy; -import net.minecraft.server.v1_15_R1.PacketPlayOutEntityTeleport; -import net.minecraft.server.v1_15_R1.PlayerConnection; +import net.minecraft.server.v1_15_R1.*; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; import org.bukkit.entity.Player; @@ -39,12 +36,15 @@ public abstract class REntity { return entities.get(internalId); } - public void move(double x, double y, double z, float yaw, float pitch){ + public void move(double x, double y, double z, float yaw, float pitch, byte headYaw){ entity.setLocation(x, y, z, yaw, pitch); + entity.setHeadRotation(headYaw); PacketPlayOutEntityTeleport packet = new PacketPlayOutEntityTeleport(entity); + PacketPlayOutEntityHeadRotation packetHeadRotation = new PacketPlayOutEntityHeadRotation(entity, headYaw); for(Player player : Bukkit.getOnlinePlayers()){ PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection; connection.sendPacket(packet); + connection.sendPacket(packetHeadRotation); } } @@ -57,6 +57,23 @@ public abstract class REntity { entities.remove(internalId); } + public void sneak(boolean sneaking) { + entity.setSneaking(sneaking); + PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(0, entity.getDataWatcher(), sneaking); + for(Player player : Bukkit.getOnlinePlayers()){ + PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection; + connection.sendPacket(packet); + } + } + + public void animation(byte animation) { + PacketPlayOutAnimation packet = new PacketPlayOutAnimation(entity, animation); + for(Player player : Bukkit.getOnlinePlayers()){ + PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection; + connection.sendPacket(packet); + } + } + private void sendToPlayer(Player player){ spawnEntity(((CraftPlayer)player).getHandle().playerConnection); }