diff --git a/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyC.java b/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyC.java index 5003f0c..3202d58 100644 --- a/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyC.java +++ b/src/main/java/dev/brighten/ac/check/impl/movement/fly/FlyC.java @@ -3,6 +3,7 @@ package dev.brighten.ac.check.impl.movement.fly; import dev.brighten.ac.check.Check; import dev.brighten.ac.check.WAction; import dev.brighten.ac.data.APlayer; +import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutEntityVelocity; public class FlyC extends Check { @@ -10,7 +11,7 @@ public class FlyC extends Check { super(player); } - WAction action = packet -> { - if(packet.getEntityId() != player.getBukkitPlayer().getEntityId()) return; + WAction flyingAction = packet -> { + boolean ground = }; } diff --git a/src/main/java/dev/brighten/ac/data/APlayer.java b/src/main/java/dev/brighten/ac/data/APlayer.java index 720961d..3401c98 100644 --- a/src/main/java/dev/brighten/ac/data/APlayer.java +++ b/src/main/java/dev/brighten/ac/data/APlayer.java @@ -12,6 +12,7 @@ import dev.brighten.ac.data.obj.NormalAction; import dev.brighten.ac.data.obj.TimedActionStore; import dev.brighten.ac.handler.EntityLocationHandler; import dev.brighten.ac.handler.PotionHandler; +import dev.brighten.ac.handler.VelocityHandler; import dev.brighten.ac.handler.block.BlockUpdateHandler; import dev.brighten.ac.handler.keepalive.KeepAlive; import dev.brighten.ac.handler.protocolsupport.ProtocolAPI; @@ -49,6 +50,10 @@ public class APlayer { private MovementHandler movement; @Getter private PotionHandler potionHandler; + + @Getter + private VelocityHandler velocityHandler; + @Getter private EntityLocationHandler entityLocationHandler; @@ -119,6 +124,7 @@ public class APlayer { } this.movement = new MovementHandler(this); this.potionHandler = new PotionHandler(this); + this.velocityHandler = new VelocityHandler(this); this.entityLocationHandler = new EntityLocationHandler(this); this.blockUpdateHandler = new BlockUpdateHandler(this); this.info = new GeneralInformation(); diff --git a/src/main/java/dev/brighten/ac/handler/PacketHandler.java b/src/main/java/dev/brighten/ac/handler/PacketHandler.java index 9eb096a..47c6f22 100644 --- a/src/main/java/dev/brighten/ac/handler/PacketHandler.java +++ b/src/main/java/dev/brighten/ac/handler/PacketHandler.java @@ -158,6 +158,9 @@ public class PacketHandler { player.getInfo().setDoingVelocity(true); player.runInstantAction(ka -> { + if(!ka.isEnd()) { + player.getVelocityHandler().onPre(packet); + } else player.getVelocityHandler().onPost(packet); if(ka.isEnd() && player.getInfo().getVelocityHistory().contains(velocity)) { player.getOnVelocityTasks().forEach(task -> task.accept(velocity)); player.getInfo().setDoingVelocity(false); @@ -305,6 +308,7 @@ public class PacketHandler { // Post flying settings if(type.equals(PacketType.FLYING)) { + player.getVelocityHandler().onFlyingPost((WPacketPlayInFlying)packetObject); player.getInfo().lsneaking = player.getInfo().sneaking; } } diff --git a/src/main/java/dev/brighten/ac/handler/VelocityHandler.java b/src/main/java/dev/brighten/ac/handler/VelocityHandler.java index df941c3..6481a7e 100644 --- a/src/main/java/dev/brighten/ac/handler/VelocityHandler.java +++ b/src/main/java/dev/brighten/ac/handler/VelocityHandler.java @@ -1,15 +1,65 @@ package dev.brighten.ac.handler; import dev.brighten.ac.data.APlayer; +import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; import dev.brighten.ac.packet.wrapper.out.WPacketPlayOutEntityVelocity; import lombok.RequiredArgsConstructor; +import lombok.val; +import org.bukkit.util.Consumer; +import org.bukkit.util.Vector; + +import java.util.*; @RequiredArgsConstructor public class VelocityHandler { - private APlayer player; + private final APlayer player; + + private Map velocities = new HashMap<>(); + private Set> accurateVelocityTasks = new HashSet<>(); + + + + /* + * I want to be able to verify velocity when the pre packet comes back an the post packet comes back + * So essentially I want to only take out the velocity from possibilities after the post flying comes back. + */ public void onPre(WPacketPlayOutEntityVelocity packet) { if(packet.getEntityId() != player.getBukkitPlayer().getEntityId()) return; + + velocities.put(new Vector(packet.getDeltaX(), packet.getDeltaY(), packet.getDeltaZ()), false); } + + public void onPost(WPacketPlayOutEntityVelocity packet) { + if(packet.getEntityId() != player.getBukkitPlayer().getEntityId()) return; + + velocities.computeIfPresent(new Vector(packet.getDeltaX(), packet.getDeltaY(), packet.getDeltaZ()), + (velocity, queuedToRemove) -> true); + } + + public Set getPossibleVectors() { + return velocities.keySet(); + } + + public void onAccurateVelocity(Consumer task) { + accurateVelocityTasks.add(task); + } + + public void onFlyingPost(WPacketPlayInFlying packet) { + val iterator = velocities.entrySet().iterator(); + while(iterator.hasNext()) { + val value = iterator.next(); + + // Velocity definitely occurred, run task. + if(Math.abs(value.getKey().getY() - packet.getY()) < 1E-6) { + accurateVelocityTasks.forEach(vel -> vel.accept(value.getKey())); + } + + if(value.getValue()) + iterator.remove(); + } + } + + }