Skip to content

Commit d5847f7

Browse files
committed
Replace Bukkit Vector with new Vector impl
1 parent 4e5e202 commit d5847f7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+601
-427
lines changed

src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java

+9-6
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import ac.grim.grimac.utils.data.packetentity.PacketEntity;
2525
import ac.grim.grimac.utils.data.packetentity.dragon.PacketEntityEnderDragonPart;
2626
import ac.grim.grimac.utils.nmsutil.ReachUtils;
27+
import ac.grim.grimac.utils.vector.Vector3D;
2728
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
2829
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
2930
import com.github.retrooper.packetevents.protocol.entity.type.EntityType;
@@ -36,10 +37,12 @@
3637
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerFlying;
3738
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
3839
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
39-
import org.bukkit.util.Vector;
40+
import ac.grim.grimac.utils.vector.Vector3D;
4041

4142
import java.util.*;
4243

44+
import static ac.grim.grimac.utils.vector.VectorFactory.newVector3D;
45+
4346
// You may not copy the check unless you are licensed under GPL
4447
@CheckData(name = "Reach", configName = "Reach", setback = 10)
4548
public class Reach extends Check implements PacketCheck {
@@ -185,7 +188,7 @@ private String checkReach(PacketEntity reachEntity, Vector3d from, boolean isPre
185188
double minDistance = Double.MAX_VALUE;
186189

187190
// https://bugs.mojang.com/browse/MC-67665
188-
List<Vector> possibleLookDirs = new ArrayList<>(Collections.singletonList(ReachUtils.getLook(player, player.xRot, player.yRot)));
191+
List<Vector3D> possibleLookDirs = new ArrayList<>(Collections.singletonList(ReachUtils.getLook(player, player.xRot, player.yRot)));
189192

190193
// If we are a tick behind, we don't know their next look so don't bother doing this
191194
if (!isPrediction) {
@@ -205,12 +208,12 @@ private String checkReach(PacketEntity reachEntity, Vector3d from, boolean isPre
205208
// +3 would be 3 + 3 = 6, which is the pre-1.20.5 behaviour, preventing "Missed Hitbox"
206209
final double distance = player.compensatedEntities.getSelf().getAttributeValue(Attributes.PLAYER_ENTITY_INTERACTION_RANGE) + 3;
207210
final double[] possibleEyeHeights = player.getPossibleEyeHeights();
208-
for (Vector lookVec : possibleLookDirs) {
211+
for (Vector3D lookVec : possibleLookDirs) {
209212
for (double eye : possibleEyeHeights) {
210-
Vector eyePos = new Vector(from.getX(), from.getY() + eye, from.getZ());
211-
Vector endReachPos = eyePos.clone().add(new Vector(lookVec.getX() * distance, lookVec.getY() * distance, lookVec.getZ() * distance));
213+
ac.grim.grimac.utils.vector.Vector3D eyePos = newVector3D(from.getX(), from.getY() + eye, from.getZ());
214+
ac.grim.grimac.utils.vector.Vector3D endReachPos = eyePos.clone().add(newVector3D(lookVec.getX() * distance, lookVec.getY() * distance, lookVec.getZ() * distance));
212215

213-
Vector intercept = ReachUtils.calculateIntercept(targetBox, eyePos, endReachPos).first();
216+
Vector3D intercept = ReachUtils.calculateIntercept(targetBox, eyePos, endReachPos).first();
214217

215218
if (ReachUtils.isVecInside(targetBox, eyePos)) {
216219
minDistance = 0;

src/main/java/ac/grim/grimac/checks/impl/prediction/DebugHandler.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import ac.grim.grimac.utils.lists.EvictingQueue;
1010
import org.bukkit.ChatColor;
1111
import org.bukkit.entity.Player;
12-
import org.bukkit.util.Vector;
12+
import ac.grim.grimac.utils.vector.Vector3D;
1313

1414
import java.util.HashSet;
1515
import java.util.Set;
@@ -45,8 +45,8 @@ public void onPredictionComplete(final PredictionComplete predictionComplete) {
4545

4646
ChatColor color = pickColor(offset, offset);
4747

48-
Vector predicted = player.predictedVelocity.vector;
49-
Vector actually = player.actualMovement;
48+
Vector3D predicted = player.predictedVelocity.vector;
49+
Vector3D actually = player.actualMovement;
5050

5151
ChatColor xColor = pickColor(Math.abs(predicted.getX() - actually.getX()), offset);
5252
ChatColor yColor = pickColor(Math.abs(predicted.getY() - actually.getY()), offset);

src/main/java/ac/grim/grimac/checks/impl/scaffolding/FarPlace.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
1010
import com.github.retrooper.packetevents.protocol.world.states.type.StateTypes;
1111
import com.github.retrooper.packetevents.util.Vector3i;
12-
import org.bukkit.util.Vector;
12+
import ac.grim.grimac.utils.vector.Vector3D;
13+
14+
import static ac.grim.grimac.utils.vector.VectorFactory.newVector3D;
1315

1416
@CheckData(name = "FarPlace")
1517
public class FarPlace extends BlockPlaceCheck {
@@ -27,8 +29,8 @@ public void onBlockPlace(final BlockPlace place) {
2729
final double[] possibleEyeHeights = player.getPossibleEyeHeights();
2830
for (double d : possibleEyeHeights) {
2931
SimpleCollisionBox box = new SimpleCollisionBox(blockPos);
30-
Vector eyes = new Vector(player.x, player.y + d, player.z);
31-
Vector best = VectorUtils.cutBoxToVector(eyes, box);
32+
Vector3D eyes = newVector3D(player.x, player.y + d, player.z);
33+
Vector3D best = VectorUtils.cutBoxToVector(eyes, box);
3234
min = Math.min(min, eyes.distanceSquared(best));
3335
}
3436

src/main/java/ac/grim/grimac/checks/impl/velocity/ExplosionHandler.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
import com.github.retrooper.packetevents.util.Vector3i;
2020
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerExplosion;
2121
import lombok.Getter;
22-
import org.bukkit.util.Vector;
22+
import ac.grim.grimac.utils.vector.Vector3D;
2323
import org.jetbrains.annotations.Nullable;
2424

2525
import java.util.Deque;
2626
import java.util.LinkedList;
2727

28+
import static ac.grim.grimac.utils.vector.VectorFactory.newVector3D;
29+
2830
@CheckData(name = "AntiExplosion", configName = "Explosion", setback = 10)
2931
public class ExplosionHandler extends Check implements PostPredictionCheck {
3032
Deque<VelocityData> firstBreadMap = new LinkedList<>();
@@ -121,7 +123,7 @@ public boolean wouldFlag() {
121123
}
122124

123125
public void addPlayerExplosion(int breadOne, Vector3f explosion) {
124-
firstBreadMap.add(new VelocityData(-1, breadOne, player.getSetbackTeleportUtil().isSendingSetback, new Vector(explosion.getX(), explosion.getY(), explosion.getZ())));
126+
firstBreadMap.add(new VelocityData(-1, breadOne, player.getSetbackTeleportUtil().isSendingSetback, newVector3D(explosion.getX(), explosion.getY(), explosion.getZ())));
125127
}
126128

127129
public void setPointThree(boolean isPointThree) {

src/main/java/ac/grim/grimac/checks/impl/velocity/KnockbackHandler.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
import com.github.retrooper.packetevents.util.Vector3d;
1616
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityVelocity;
1717
import lombok.Getter;
18-
import org.bukkit.util.Vector;
18+
import ac.grim.grimac.utils.vector.Vector3D;
1919
import org.jetbrains.annotations.NotNull;
2020

2121
import java.util.Deque;
2222
import java.util.LinkedList;
2323

24+
import static ac.grim.grimac.utils.vector.VectorFactory.newVector3D;
25+
2426
// We are making a velocity sandwich between two pieces of transaction packets (bread)
2527
@CheckData(name = "AntiKB", alternativeName = "AntiKnockback", configName = "Knockback", setback = 10, decay = 0.025)
2628
public class KnockbackHandler extends Check implements PostPredictionCheck {
@@ -71,12 +73,12 @@ public void onPacketSend(final PacketSendEvent event) {
7173

7274
// Wrap velocity between two transactions
7375
player.sendTransaction();
74-
addPlayerKnockback(entityId, player.lastTransactionSent.get(), new Vector(playerVelocity.getX(), playerVelocity.getY(), playerVelocity.getZ()));
76+
addPlayerKnockback(entityId, player.lastTransactionSent.get(), newVector3D(playerVelocity.getX(), playerVelocity.getY(), playerVelocity.getZ()));
7577
event.getTasksAfterSend().add(player::sendTransaction);
7678
}
7779
}
7880

79-
@NotNull public Pair<VelocityData, Vector> getFutureKnockback() {
81+
@NotNull public Pair<VelocityData, Vector3D> getFutureKnockback() {
8082
// Chronologically in the future
8183
if (firstBreadMap.size() > 0) {
8284
VelocityData data = firstBreadMap.peek();
@@ -98,7 +100,7 @@ public void onPacketSend(final PacketSendEvent event) {
98100
return new Pair<>(null, null);
99101
}
100102

101-
private void addPlayerKnockback(int entityID, int breadOne, Vector knockback) {
103+
private void addPlayerKnockback(int entityID, int breadOne, Vector3D knockback) {
102104
firstBreadMap.add(new VelocityData(entityID, breadOne, player.getSetbackTeleportUtil().isSendingSetback, knockback));
103105
}
104106

src/main/java/ac/grim/grimac/events/packets/PacketPlayerRespawn.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerJoinGame;
2020
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerRespawn;
2121
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerUpdateHealth;
22-
import org.bukkit.util.Vector;
22+
import ac.grim.grimac.utils.vector.Vector3D;
2323

2424
import java.util.List;
2525
import java.util.Objects;
2626

27+
import static ac.grim.grimac.utils.vector.VectorFactory.newVector3D;
28+
2729
/**
2830
* PlayerRespawnS2CPacket info (1.20.2+):
2931
* If the world is different (check via registry key), world is recreated (all entities etc destroyed).
@@ -185,7 +187,7 @@ public void onPacketSend(PacketSendEvent event) {
185187
player.compensatedEntities.hasSprintingAttributeEnabled = false;
186188
}
187189
player.pose = Pose.STANDING;
188-
player.clientVelocity = new Vector();
190+
player.clientVelocity = newVector3D();
189191
player.gamemode = respawn.getGameMode();
190192
if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_17)) {
191193
player.compensatedWorld.setDimension(respawn.getDimensionType(), event.getUser());

src/main/java/ac/grim/grimac/manager/SetbackTeleportUtil.java

+13-10
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import ac.grim.grimac.utils.nmsutil.Collisions;
2020
import ac.grim.grimac.utils.nmsutil.GetBoundingBox;
2121
import ac.grim.grimac.utils.nmsutil.ReachUtils;
22+
import ac.grim.grimac.utils.vector.Vector3D;
2223
import com.github.retrooper.packetevents.PacketEvents;
2324
import com.github.retrooper.packetevents.manager.server.ServerVersion;
2425
import com.github.retrooper.packetevents.protocol.player.GameMode;
@@ -31,13 +32,15 @@
3132
import lombok.Setter;
3233
import org.bukkit.Location;
3334
import org.bukkit.entity.Entity;
34-
import org.bukkit.util.Vector;
35+
import ac.grim.grimac.utils.vector.Vector3D;
3536

3637
import java.util.Collections;
3738
import java.util.HashSet;
3839
import java.util.Random;
3940
import java.util.concurrent.ConcurrentLinkedQueue;
4041

42+
import static ac.grim.grimac.utils.vector.VectorFactory.newVector3D;
43+
4144
public class SetbackTeleportUtil extends Check implements PostPredictionCheck {
4245
// Sync to netty
4346
public final ConcurrentLinkedQueue<TeleportData> pendingTeleports = new ConcurrentLinkedQueue<>();
@@ -65,7 +68,7 @@ public SetbackTeleportUtil(GrimPlayer player) {
6568
@Override
6669
public void onPredictionComplete(final PredictionComplete predictionComplete) {
6770
// Grab friction now when we know player on ground and other variables
68-
Vector afterTickFriction = player.clientVelocity.clone();
71+
Vector3D afterTickFriction = player.clientVelocity.clone();
6972

7073
// We must first check if the player has accepted their setback
7174
// If the setback isn't complete, then this position is illegitimate
@@ -115,17 +118,17 @@ private boolean isExempt() {
115118
return false;
116119
}
117120

118-
private void simulateFriction(Vector vector) {
121+
private void simulateFriction(Vector3D vector) {
119122
// We must always do this before simulating positions, as this is the last actual (safe) movement
120123
// We must not do this for knockback or explosions, as they are at the start of the tick
121124
if (player.wasTouchingWater) {
122125
PredictionEngineWater.staticVectorEndOfTick(player, vector, 0.8F, player.gravity, true);
123126
} else if (player.wasTouchingLava) {
124127
vector.multiply(0.5D);
125128
if (player.hasGravity)
126-
vector.add(new Vector(0.0D, -player.gravity / 4.0D, 0.0D));
129+
vector.add(newVector3D(0.0D, -player.gravity / 4.0D, 0.0D));
127130
} else if (player.isGliding) {
128-
PredictionEngineElytra.getElytraMovement(player, vector, ReachUtils.getLook(player, player.xRot, player.yRot)).multiply(player.stuckSpeedMultiplier).multiply(new Vector(0.99F, 0.98F, 0.99F));
131+
PredictionEngineElytra.getElytraMovement(player, vector, ReachUtils.getLook(player, player.xRot, player.yRot)).multiply(player.stuckSpeedMultiplier).multiply(newVector3D(0.99F, 0.98F, 0.99F));
129132
vector.setY(vector.getY() - 0.05); // Make the player fall a bit
130133
} else { // Gliding doesn't have friction, we handle it differently
131134
PredictionEngineNormal.staticVectorEndOfTick(player, vector); // Lava and normal movement
@@ -147,9 +150,9 @@ private void blockMovementsUntilResync(boolean simulateNextTickPosition, boolean
147150
lastWorldResync = System.currentTimeMillis();
148151
}
149152

150-
Vector clientVel = lastKnownGoodPosition.vector.clone();
153+
Vector3D clientVel = lastKnownGoodPosition.vector.clone();
151154

152-
Pair<VelocityData, Vector> futureKb = player.checkManager.getKnockbackHandler().getFutureKnockback();
155+
Pair<VelocityData, Vector3D> futureKb = player.checkManager.getKnockbackHandler().getFutureKnockback();
153156
VelocityData futureExplosion = player.checkManager.getExplosionHandler().getFutureExplosion();
154157

155158
// Velocity sets
@@ -169,7 +172,7 @@ private void blockMovementsUntilResync(boolean simulateNextTickPosition, boolean
169172

170173
// Mini prediction engine - simulate collisions
171174
if (simulateNextTickPosition) {
172-
Vector collide = Collisions.collide(player, clientVel.getX(), clientVel.getY(), clientVel.getZ());
175+
Vector3D collide = Collisions.collide(player, clientVel.getX(), clientVel.getY(), clientVel.getZ());
173176

174177
position = position.withX(position.getX() + collide.getX());
175178
// 1.8 players need the collision epsilon to not phase into blocks when being setback
@@ -412,14 +415,14 @@ public void addSentTeleport(Location position, int transaction, RelativeFlag fla
412415
data = new TeleportData(safePosition, flags, transaction, teleportId);
413416
requiredSetBack = new SetBackData(data, player.xRot, player.yRot, null, false, plugin);
414417

415-
this.lastKnownGoodPosition = new SetbackPosWithVector(safePosition, new Vector());
418+
this.lastKnownGoodPosition = new SetbackPosWithVector(safePosition, newVector3D());
416419
}
417420

418421
@AllArgsConstructor
419422
@Getter
420423
@Setter
421424
public static class SetbackPosWithVector {
422425
private Vector3d pos;
423-
private Vector vector;
426+
private Vector3D vector;
424427
}
425428
}

src/main/java/ac/grim/grimac/manager/init/start/SuperDebug.java

+19-16
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,29 @@
1010
import ac.grim.grimac.utils.data.VectorData;
1111
import ac.grim.grimac.utils.lists.EvictingQueue;
1212
import ac.grim.grimac.utils.math.GrimMath;
13+
import ac.grim.grimac.utils.vector.Vector3D;
1314
import com.github.retrooper.packetevents.PacketEvents;
1415
import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState;
16+
import com.github.retrooper.packetevents.util.Vector3d;
1517
import it.unimi.dsi.fastutil.objects.Object2IntMap;
1618
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
1719
import lombok.AllArgsConstructor;
18-
import org.bukkit.util.Vector;
1920

2021
import java.util.*;
2122

23+
import static ac.grim.grimac.utils.vector.VectorFactory.newVector3D;
24+
2225
public final class SuperDebug extends Check implements PostPredictionCheck {
2326
private static final StringBuilder[] flags = new StringBuilder[256]; // 17 MB of logs in memory
2427

2528
Object2IntMap<StringBuilder> continuedDebug = new Object2IntOpenHashMap<>();
2629

2730
List<VectorData> predicted = new EvictingQueue<>(60);
28-
List<Vector> actually = new EvictingQueue<>(60);
31+
List<Vector3D> actually = new EvictingQueue<>(60);
2932
List<Location> locations = new EvictingQueue<>(60);
30-
List<Vector> startTickClientVel = new EvictingQueue<>(60);
31-
List<Vector> baseTickAddition = new EvictingQueue<>(60);
32-
List<Vector> baseTickWater = new EvictingQueue<>(60);
33+
List<Vector3D> startTickClientVel = new EvictingQueue<>(60);
34+
List<Vector3D> baseTickAddition = new EvictingQueue<>(60);
35+
List<Vector3D> baseTickWater = new EvictingQueue<>(60);
3336

3437
public SuperDebug(GrimPlayer player) {
3538
super(player);
@@ -80,11 +83,11 @@ public void onPredictionComplete(final PredictionComplete predictionComplete) {
8083

8184
for (int i = 0; i < predicted.size(); i++) {
8285
VectorData predict = predicted.get(i);
83-
Vector actual = actually.get(i);
86+
Vector3D actual = actually.get(i);
8487
Location loc = locations.get(i);
85-
Vector startTickVel = startTickClientVel.get(i);
86-
Vector addition = baseTickAddition.get(i);
87-
Vector water = baseTickWater.get(i);
88+
Vector3D startTickVel = startTickClientVel.get(i);
89+
Vector3D addition = baseTickAddition.get(i);
90+
Vector3D water = baseTickWater.get(i);
8891
appendDebug(sb, predict, actual, loc, startTickVel, addition, water);
8992
}
9093

@@ -189,7 +192,7 @@ public void onPredictionComplete(final PredictionComplete predictionComplete) {
189192
continuedDebug.put(sb, 40);
190193
}
191194

192-
private void appendDebug(StringBuilder sb, VectorData predict, Vector actual, Location location, Vector startTick, Vector addition, Vector water) {
195+
private void appendDebug(StringBuilder sb, VectorData predict, Vector3D actual, Location location, Vector3D startTick, Vector3D addition, Vector3D water) {
193196
if (predict.isZeroPointZeroThree()) {
194197
sb.append("Movement threshold/tick skipping\n");
195198
}
@@ -225,11 +228,11 @@ private void appendDebug(StringBuilder sb, VectorData predict, Vector actual, Lo
225228
// Apply 0.003/0.005 to make numbers more accurate
226229
Set<VectorData> set = new HashSet<>(Collections.singletonList(new VectorData(startTick.clone(), VectorData.VectorType.BestVelPicked)));
227230
new PredictionEngine().applyMovementThreshold(player, set);
228-
Vector trueStartVel = ((VectorData) set.toArray()[0]).vector;
231+
Vector3D trueStartVel = ((VectorData) set.toArray()[0]).vector;
229232

230-
Vector clientMovement = getPlayerMathMovement(player, actual.clone().subtract(trueStartVel), location.xRot);
231-
Vector simulatedMovement = getPlayerMathMovement(player, predict.vector.clone().subtract(trueStartVel), location.xRot);
232-
Vector offset = actual.clone().subtract(predict.vector);
233+
Vector3D clientMovement = getPlayerMathMovement(player, actual.clone().subtract(trueStartVel), location.xRot);
234+
Vector3D simulatedMovement = getPlayerMathMovement(player, predict.vector.clone().subtract(trueStartVel), location.xRot);
235+
Vector3D offset = actual.clone().subtract(predict.vector);
233236
trueStartVel.add(addition);
234237
trueStartVel.add(water);
235238

@@ -268,14 +271,14 @@ private void appendDebug(StringBuilder sb, VectorData predict, Vector actual, Lo
268271
sb.append("\n\n");
269272
}
270273

271-
private Vector getPlayerMathMovement(GrimPlayer player, Vector wantedMovement, float f2) {
274+
private Vector3D getPlayerMathMovement(GrimPlayer player, Vector3D wantedMovement, float f2) {
272275
float f3 = player.trigHandler.sin(f2 * 0.017453292f);
273276
float f4 = player.trigHandler.cos(f2 * 0.017453292f);
274277

275278
float bestTheoreticalX = (float) (f3 * wantedMovement.getZ() + f4 * wantedMovement.getX()) / (f3 * f3 + f4 * f4);
276279
float bestTheoreticalZ = (float) (-f3 * wantedMovement.getX() + f4 * wantedMovement.getZ()) / (f3 * f3 + f4 * f4);
277280

278-
return new Vector(bestTheoreticalX, 0, bestTheoreticalZ);
281+
return newVector3D(bestTheoreticalX, 0, bestTheoreticalZ);
279282
}
280283

281284
@AllArgsConstructor

0 commit comments

Comments
 (0)