diff --git a/BauSystem_Main/pom.xml b/BauSystem_Main/pom.xml index 3aa54e7..62e4e51 100644 --- a/BauSystem_Main/pom.xml +++ b/BauSystem_Main/pom.xml @@ -79,5 +79,12 @@ system ${main.basedir}/lib/WorldEdit-1.15.jar + + steamwar + ProtocolLib + 1.0 + system + ${main.basedir}/lib/ProtocolLib.jar + diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiter.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiter.java index 8365aa7..0d91d83 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiter.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTPSLimiter.java @@ -19,6 +19,12 @@ package de.steamwar.bausystem.commands; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketEvent; +import com.comphenix.protocol.reflect.StructureModifier; +import com.comphenix.protocol.wrappers.WrappedWatchableObject; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.world.Welt; @@ -34,11 +40,14 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftTNTPrimed; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; import org.bukkit.scheduler.BukkitTask; +import java.util.List; + public class CommandTPSLimiter implements CommandExecutor { private static int currentTPSLimit = 20; @@ -49,43 +58,71 @@ public class CommandTPSLimiter implements CommandExecutor { private BukkitTask tpsLimiter = null; public CommandTPSLimiter() { - Bukkit.getScheduler().runTaskTimer(BauSystem.getPlugin(), () -> { - if (currentTPSLimit == 20) { - return; + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(BauSystem.getPlugin(), PacketType.Play.Server.ENTITY_METADATA) { + @Override + public void onPacketSending(PacketEvent event) { + // if (tpsLimiterNotActive()) return; + if (event.getPacket().getEntityModifier(world).read(0) == null) return; + if (!(event.getPacket().getEntityModifier(world).read(0) instanceof CraftTNTPrimed)) return; + System.out.println("META: " + event.getPacket().getIntegers().read(0)); + List dataWatcherObjectList = event.getPacket().getWatchableCollectionModifier().read(0); + getByIndex(dataWatcherObjectList, 5).setValue(true); + getByIndex(dataWatcherObjectList, 7).setValue((int) ((20.0 / currentTPSLimit) * 80)); + System.out.println(dataWatcherObjectList); + event.getPacket().getWatchableCollectionModifier().write(0, dataWatcherObjectList); } - world.getEntities().stream().filter(entity -> entity instanceof TNTPrimed).forEach(entity -> { - /*DataWatcher dataWatcher = new DataWatcher(entity); - System.out.println("Let " + entity.getName() + " sneak " + sneaking); - dataWatcher.register(new DataWatcherObject<>(0, DataWatcherRegistry.a), sneaking ? (byte)0x02 : (byte)0x40); - PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entity.getId(), dataWatcher, false); + }); + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(BauSystem.getPlugin(), PacketType.Play.Server.REL_ENTITY_MOVE) { + @Override + public void onPacketSending(PacketEvent event) { + if (tpsLimiterNotActive()) return; + if (event.getPacket().getEntityModifier(world).read(0) == null) return; + if (!(event.getPacket().getEntityModifier(world).read(0) instanceof CraftTNTPrimed)) return; + System.out.println(event.getPacket().getIntegers().read(0)); + StructureModifier structureModifier = event.getPacket().getIntegers(); + // structureModifier.write(1, 0); + // structureModifier.write(2, 0); + // structureModifier.write(3, 0); - for(Player player : Bukkit.getOnlinePlayers()){ - ((CraftPlayer)player).getHandle().playerConnection.sendPacket(packet); - }*/ + Entity entity = event.getPacket().getEntityModifier(world).read(0); + System.out.println(entity.getLocation()); + net.minecraft.server.v1_15_R1.Entity serverEntity = ((CraftEntity) entity).getHandle(); - net.minecraft.server.v1_15_R1.Entity serverEntitiy = ((CraftEntity) entity).getHandle(); + PacketPlayOutEntityTeleport packetPlayOutEntityTeleport = new PacketPlayOutEntityTeleport(serverEntity); + sendPlayers(packetPlayOutEntityTeleport); - PacketPlayOutEntityVelocity packet1 = new PacketPlayOutEntityVelocity(entity.getEntityId(), new Vec3D(0, 0, 0)); + PacketPlayOutEntityMetadata packetPlayOutEntityMetadata = new PacketPlayOutEntityMetadata(serverEntity.getId(), serverEntity.getDataWatcher(), true); + sendPlayers(packetPlayOutEntityMetadata); - PacketPlayOutEntityTeleport packet2 = new PacketPlayOutEntityTeleport(serverEntitiy); + Vec3D vec3D = serverEntity.getMot(); + PacketPlayOutEntityVelocity packetPlayOutEntityVelocity = new PacketPlayOutEntityVelocity(serverEntity.getId(), new Vec3D(vec3D.x / (20 - currentTPSLimit), vec3D.y / (20 - currentTPSLimit), vec3D.z / (20 - currentTPSLimit))); + sendPlayers(packetPlayOutEntityVelocity); + } + }); + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(BauSystem.getPlugin(), PacketType.Play.Server.ENTITY_VELOCITY) { + @Override + public void onPacketSending(PacketEvent event) { - DataWatcher dataWatcher = new DataWatcher(serverEntitiy); - dataWatcher.register(new DataWatcherObject<>(5, DataWatcherRegistry.i), true); - dataWatcher.register(new DataWatcherObject<>(7, DataWatcherRegistry.b), 80); - PacketPlayOutEntityMetadata packet3 = new PacketPlayOutEntityMetadata(serverEntitiy.getId(), dataWatcher, false); + } + }); + } - Bukkit.getOnlinePlayers().forEach(player -> { - PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection; - connection.sendPacket(packet1); - connection.sendPacket(packet2); - connection.sendPacket(packet3); - }); - }); - world.getEntities().stream().filter(entity -> entity instanceof TNTPrimed).forEach(entity -> { - Location location = entity.getLocation(); - world.spawnParticle(Particle.BARRIER, location.getX(), location.getY() + 0.49, location.getZ(), 1); - }); - }, 0, 1); + private boolean tpsLimiterNotActive() { + return currentTPSLimit == 20; + } + + private void sendPlayers(Packet packet) { + Bukkit.getOnlinePlayers().forEach(player -> { + PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection; + connection.sendPacket(packet); + }); + } + + private WrappedWatchableObject getByIndex(List wrappedWatchableObjects, int index) { + for (WrappedWatchableObject wrappedWatchableObject : wrappedWatchableObjects) { + if (wrappedWatchableObject.getIndex() == index) return wrappedWatchableObject; + } + return null; } private boolean permissionCheck(Player player) {