Skip to content

Commit

Permalink
Merge pull request #1469 from ManInMyVan/actually-fix-switchitem
Browse files Browse the repository at this point in the history
actually fix switchitem
  • Loading branch information
AoElite committed Jul 17, 2024
2 parents 5410e1d + 98362ef commit ea917c3
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY) {
WrapperPlayClientInteractEntity interactEntity = new WrapperPlayClientInteractEntity(event);
if (interactEntity.getAction() != WrapperPlayClientInteractEntity.InteractAction.ATTACK) return;
if (!player.packetStateData.slowedByUsingItem) return;
if (!player.packetStateData.isSlowedByUsingItem()) return;
ItemStack itemInUse = player.getInventory().getItemInHand(player.packetStateData.eatingHand);
if (flagAndAlert("UseItem=" + itemInUse.getType().getName().getKey()) && shouldModifyPackets()) {
event.setCancelled(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public void onPredictionComplete(final PredictionComplete predictionComplete) {
if (!predictionComplete.isChecked()) return;

// If the player was using an item for certain, and their predicted velocity had a flipped item
if (player.packetStateData.slowedByUsingItem) {
if (player.packetStateData.isSlowedByUsingItem()) {
// 1.8 users are not slowed the first tick they use an item, strangely
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8) && didSlotChangeLastTick) {
didSlotChangeLastTick = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,8 +190,8 @@ public void onPacketSend(PacketSendEvent event) {
if (status.getStatus() == 9) {
if (status.getEntityId() != player.entityID) return;

player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get(), () -> player.packetStateData.slowedByUsingItem = false);
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get() + 1, () -> player.packetStateData.slowedByUsingItem = false);
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get(), () -> player.packetStateData.setSlowedByUsingItem(false));
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get() + 1, () -> player.packetStateData.setSlowedByUsingItem(false));
}

if (status.getStatus() == 31) {
Expand All @@ -217,13 +217,13 @@ public void onPacketSend(PacketSendEvent event) {
if (slot.getWindowId() == 0) {
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get(), () -> {
if (slot.getSlot() - 36 == player.packetStateData.lastSlotSelected) {
player.packetStateData.slowedByUsingItem = false;
player.packetStateData.setSlowedByUsingItem(false);
}
});

player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get() + 1, () -> {
if (slot.getSlot() - 36 == player.packetStateData.lastSlotSelected) {
player.packetStateData.slowedByUsingItem = false;
player.packetStateData.setSlowedByUsingItem(false);
}
});
}
Expand All @@ -233,19 +233,19 @@ public void onPacketSend(PacketSendEvent event) {
WrapperPlayServerWindowItems items = new WrapperPlayServerWindowItems(event);

if (items.getWindowId() == 0) { // Player inventory
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get(), () -> player.packetStateData.slowedByUsingItem = false);
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get() + 1, () -> player.packetStateData.slowedByUsingItem = false);
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get(), () -> player.packetStateData.setSlowedByUsingItem(false));
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get() + 1, () -> player.packetStateData.setSlowedByUsingItem(false));
}
}

// 1.8 clients fail to send the RELEASE_USE_ITEM packet when a window is opened client sided while using an item
if (event.getPacketType() == PacketType.Play.Server.OPEN_WINDOW) {
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get(), () -> player.packetStateData.slowedByUsingItem = false);
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get() + 1, () -> player.packetStateData.slowedByUsingItem = false);
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get(), () -> player.packetStateData.setSlowedByUsingItem(false));
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get() + 1, () -> player.packetStateData.setSlowedByUsingItem(false));
}
if (event.getPacketType() == PacketType.Play.Server.OPEN_HORSE_WINDOW) {
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get(), () -> player.packetStateData.slowedByUsingItem = false);
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get() + 1, () -> player.packetStateData.slowedByUsingItem = false);
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get(), () -> player.packetStateData.setSlowedByUsingItem(false));
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get() + 1, () -> player.packetStateData.setSlowedByUsingItem(false));
}

if (event.getPacketType() == PacketType.Play.Server.SET_PASSENGERS) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public void onPacketReceive(PacketReceiveEvent event) {
// You don't get a release use item with block hitting with a sword?
if (heldItem != null && player.getClientVersion().isOlderThan(ClientVersion.V_1_9)) {
if (heldItem.getType().hasAttribute(ItemTypes.ItemAttribute.SWORD))
player.packetStateData.slowedByUsingItem = false;
player.packetStateData.setSlowedByUsingItem(false);
}

if (entity != null && (!(entity.isLivingEntity()) || entity.getType() == EntityTypes.PLAYER)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,26 +32,26 @@ public PacketPlayerDigging() {

public static void handleUseItem(GrimPlayer player, ItemStack item, InteractionHand hand) {
if (item == null) {
player.packetStateData.slowedByUsingItem = false;
player.packetStateData.setSlowedByUsingItem(false);
return;
}

final ItemType material = item.getType();

if (player.checkManager.getCompensatedCooldown().hasMaterial(material)) {
player.packetStateData.slowedByUsingItem = false; // resync, not required
player.packetStateData.setSlowedByUsingItem(false); // resync, not required
return; // The player has a cooldown, and therefore cannot use this item!
}

// Check for data component stuff on 1.20.5+
final FoodProperties foodComponent = item.getComponentOr(ComponentTypes.FOOD, null);
if (player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_20_5) && foodComponent != null) {
if (foodComponent.isCanAlwaysEat() || player.food < 20 || player.gamemode == GameMode.CREATIVE) {
player.packetStateData.slowedByUsingItem = true;
player.packetStateData.setSlowedByUsingItem(true);
player.packetStateData.eatingHand = hand;
return;
} else {
player.packetStateData.slowedByUsingItem = false;
player.packetStateData.setSlowedByUsingItem(false);
}
}

Expand All @@ -73,38 +73,38 @@ public static void handleUseItem(GrimPlayer player, ItemStack item, InteractionH
|| material == ItemTypes.GOLDEN_APPLE || material == ItemTypes.ENCHANTED_GOLDEN_APPLE
|| material == ItemTypes.HONEY_BOTTLE || material == ItemTypes.SUSPICIOUS_STEW ||
material == ItemTypes.CHORUS_FRUIT) {
player.packetStateData.slowedByUsingItem = true;
player.packetStateData.setSlowedByUsingItem(true);
player.packetStateData.eatingHand = hand;
return;
}

// The other items that do require it
if (item.getType().hasAttribute(ItemTypes.ItemAttribute.EDIBLE) && ((player.bukkitPlayer != null && player.food < 20) || player.gamemode == GameMode.CREATIVE)) {
player.packetStateData.slowedByUsingItem = true;
player.packetStateData.setSlowedByUsingItem(true);
player.packetStateData.eatingHand = hand;
return;
}

// The player cannot eat this item, resync use status
player.packetStateData.slowedByUsingItem = false;
player.packetStateData.setSlowedByUsingItem(false);
}

if (material == ItemTypes.SHIELD && player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_9)) {
player.packetStateData.slowedByUsingItem = true;
player.packetStateData.setSlowedByUsingItem(true);
player.packetStateData.eatingHand = hand;
return;
}

// Avoid releasing crossbow as being seen as slowing player
final NBTCompound nbt = item.getNBT(); // How can this be null?
if (material == ItemTypes.CROSSBOW && nbt != null && nbt.getBoolean("Charged")) {
player.packetStateData.slowedByUsingItem = false; // TODO: Fix this
player.packetStateData.setSlowedByUsingItem(false); // TODO: Fix this
return;
}

// The client and server don't agree on trident status because mojang is incompetent at netcode.
if (material == ItemTypes.TRIDENT) {
player.packetStateData.slowedByUsingItem = item.getEnchantmentLevel(EnchantmentTypes.RIPTIDE, PacketEvents.getAPI().getServerManager().getVersion().toClientVersion()) <= 0;
player.packetStateData.setSlowedByUsingItem(item.getEnchantmentLevel(EnchantmentTypes.RIPTIDE, PacketEvents.getAPI().getServerManager().getVersion().toClientVersion()) <= 0);
player.packetStateData.eatingHand = hand;
}

Expand All @@ -121,7 +121,7 @@ public static void handleUseItem(GrimPlayer player, ItemStack item, InteractionH
// On 1.8, it wouldn't be too bad to handle bows correctly
// But on 1.9+, no idle packet and clients/servers don't agree on bow status
// Mojang pls fix
player.packetStateData.slowedByUsingItem = false;
player.packetStateData.setSlowedByUsingItem(false);
}

if (material == ItemTypes.SPYGLASS && player.getClientVersion().isNewerThanOrEquals(ClientVersion.V_1_17)) {
Expand All @@ -137,9 +137,9 @@ public static void handleUseItem(GrimPlayer player, ItemStack item, InteractionH
// Only 1.8 and below players can block with swords
if (material.hasAttribute(ItemTypes.ItemAttribute.SWORD)) {
if (player.getClientVersion().isOlderThanOrEquals(ClientVersion.V_1_8))
player.packetStateData.slowedByUsingItem = true;
player.packetStateData.setSlowedByUsingItem(true);
else if (PacketEvents.getAPI().getServerManager().getVersion().isOlderThan(ServerVersion.V_1_9)) // ViaVersion stuff
player.packetStateData.slowedByUsingItem = false;
player.packetStateData.setSlowedByUsingItem(false);
}
}

Expand All @@ -152,7 +152,7 @@ public void onPacketReceive(PacketReceiveEvent event) {
final GrimPlayer player = GrimAPI.INSTANCE.getPlayerDataManager().getPlayer(event.getUser());
if (player == null) return;

player.packetStateData.slowedByUsingItem = false;
player.packetStateData.setSlowedByUsingItem(false);
player.packetStateData.slowedByUsingItemTransaction = player.lastTransactionReceived.get();

if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_13)) {
Expand All @@ -171,7 +171,10 @@ public void onPacketReceive(PacketReceiveEvent event) {
if (player == null) return;

if (!player.packetStateData.lastPacketWasTeleport && !player.packetStateData.lastPacketWasOnePointSeventeenDuplicate) {
player.packetStateData.wasSlowedByUsingItem = player.packetStateData.slowedByUsingItem;
if (player.packetStateData.isSlowedByUsingItem() && player.packetStateData.slowedByUsingItemSlot != player.packetStateData.lastSlotSelected) {
player.packetStateData.setSlowedByUsingItem(false);
player.checkManager.getPostPredictionCheck(NoSlowA.class).didSlotChangeLastTick = true;
}
}
}

Expand All @@ -188,13 +191,9 @@ public void onPacketReceive(PacketReceiveEvent event) {
CheckManagerListener.handleQueuedPlaces(player, false, 0, 0, System.currentTimeMillis());

if (player.packetStateData.lastSlotSelected != slot) {
if (player.packetStateData.slowedByUsingItemSlot != slot || (!player.isTickingReliablyFor(3) && player.skippedTickInActualMovement)) {
player.packetStateData.wasSlowedByUsingItem = player.packetStateData.slowedByUsingItem;
player.packetStateData.slowedByUsingItem = false;
player.checkManager.getPostPredictionCheck(NoSlowA.class).didSlotChangeLastTick = true;
} else if (player.packetStateData.wasSlowedByUsingItem) {
player.packetStateData.slowedByUsingItem = true;
player.checkManager.getPostPredictionCheck(NoSlowA.class).didSlotChangeLastTick = false;
// just assume they tick after this
if (!player.isTickingReliablyFor(3) && player.skippedTickInActualMovement) {
player.packetStateData.setSlowedByUsingItem(false);
}
}
player.packetStateData.lastSlotSelected = slot;
Expand All @@ -213,7 +212,6 @@ public void onPacketReceive(PacketReceiveEvent event) {
return;

player.packetStateData.slowedByUsingItemTransaction = player.lastTransactionReceived.get();
player.packetStateData.slowedByUsingItemSlot = player.packetStateData.lastSlotSelected;

final ItemStack item = hand == InteractionHand.MAIN_HAND ?
player.getInventory().getHeldItem() : player.getInventory().getOffHand();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ public void onPacketSend(PacketSendEvent event) {

// Player might have gotten this packet
player.latencyUtils.addRealTimeTask(player.lastTransactionSent.get(),
() -> player.packetStateData.slowedByUsingItem = false);
() -> player.packetStateData.setSlowedByUsingItem(false));

int markedTransaction = player.lastTransactionSent.get();

Expand All @@ -205,7 +205,7 @@ public void onPacketSend(PacketSendEvent event) {
if (player.packetStateData.slowedByUsingItemTransaction < markedTransaction) {
PacketPlayerDigging.handleUseItem(player, item, isOffhand ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND);
// The above line is a hack to fake activate use item
player.packetStateData.slowedByUsingItem = isActive;
player.packetStateData.setSlowedByUsingItem(isActive);

player.checkManager.getPostPredictionCheck(NoSlowD.class).startedSprintingBeforeUse = player.packetStateData.slowedByUsingItem && player.isSprinting;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import ac.grim.grimac.utils.collisions.datatypes.SimpleCollisionBox;
import ac.grim.grimac.utils.data.Pair;
import ac.grim.grimac.utils.data.VectorData;
import ac.grim.grimac.utils.math.GrimMath;
import ac.grim.grimac.utils.math.VectorUtils;
import ac.grim.grimac.utils.nmsutil.Collisions;
import ac.grim.grimac.utils.nmsutil.GetBoundingBox;
Expand Down Expand Up @@ -38,7 +37,7 @@ public static Vector transformInputsToVector(GrimPlayer player, Vector theoretic
bestPossibleZ = Math.min(Math.max(-1f, Math.round(theoreticalInput.getZ())), 1f);
}

if (player.packetStateData.slowedByUsingItem) {
if (player.packetStateData.isSlowedByUsingItem()) {
bestPossibleX *= 0.2F;
bestPossibleZ *= 0.2F;
}
Expand Down Expand Up @@ -170,7 +169,7 @@ private void doPredictions(GrimPlayer player, List<VectorData> possibleVelocitie
// Whatever, if someone uses phase or something they will get caught by everything else...
// Unlike knockback/explosions, there is no reason to force collisions to run to check it.
// As not flipping item is preferred... it gets ran before any other options
if (player.packetStateData.slowedByUsingItem && !clientVelAfterInput.isFlipItem()) {
if (player.packetStateData.isSlowedByUsingItem() && !clientVelAfterInput.isFlipItem()) {
player.checkManager.getNoSlow().handlePredictionAnalysis(Math.sqrt(player.uncertaintyHandler.reduceOffset(resultAccuracy)));
}

Expand Down Expand Up @@ -725,7 +724,7 @@ private void loopVectors(GrimPlayer player, Set<VectorData> possibleVectors, flo
}
}

player.packetStateData.slowedByUsingItem = !player.packetStateData.slowedByUsingItem;
player.packetStateData.setSlowedByUsingItem(!player.packetStateData.isSlowedByUsingItem());
}
// TODO: Secure this? Do we care about minor 1.9-1.18.1 (not 1.18.2+!) bypasses that no client exploits yet?
// I personally don't care because 1.8 and 1.18.2 are much more popular than any weird version
Expand Down
8 changes: 7 additions & 1 deletion src/main/java/ac/grim/grimac/utils/data/PacketStateData.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.github.retrooper.packetevents.protocol.player.InteractionHand;
import com.github.retrooper.packetevents.util.Vector3d;
import lombok.Getter;

// This is to keep all the packet data out of the main player class
// Helps clean up the player class and makes devs aware they are sync'd to the netty thread
Expand All @@ -14,7 +15,8 @@ public class PacketStateData {
public InteractionHand eatingHand = InteractionHand.MAIN_HAND;
public long lastRiptide = 0;
public boolean tryingToRiptide = false;
public boolean slowedByUsingItem, wasSlowedByUsingItem = false;
@Getter
private boolean slowedByUsingItem;
public int slowedByUsingItemTransaction, slowedByUsingItemSlot = Integer.MIN_VALUE;
public boolean receivedSteerVehicle = false;
// This works on 1.8 only
Expand All @@ -26,4 +28,8 @@ public class PacketStateData {
public int lastFood;
public boolean lastServerTransWasValid = false;

public void setSlowedByUsingItem(boolean slowedByUsingItem) {
this.slowedByUsingItem = slowedByUsingItem;
slowedByUsingItemSlot = slowedByUsingItem ? lastSlotSelected : Integer.MIN_VALUE;
}
}

0 comments on commit ea917c3

Please sign in to comment.