mirror of
https://github.com/GeyserMC/Geyser.git
synced 2025-12-19 14:59:27 +00:00
Fix: only use touch rotation for certain items (#5705)
This commit is contained in:
@@ -149,6 +149,7 @@ import org.geysermc.geyser.inventory.recipe.GeyserSmithingRecipe;
|
|||||||
import org.geysermc.geyser.inventory.recipe.GeyserStonecutterData;
|
import org.geysermc.geyser.inventory.recipe.GeyserStonecutterData;
|
||||||
import org.geysermc.geyser.item.Items;
|
import org.geysermc.geyser.item.Items;
|
||||||
import org.geysermc.geyser.item.type.BlockItem;
|
import org.geysermc.geyser.item.type.BlockItem;
|
||||||
|
import org.geysermc.geyser.item.type.Item;
|
||||||
import org.geysermc.geyser.level.BedrockDimension;
|
import org.geysermc.geyser.level.BedrockDimension;
|
||||||
import org.geysermc.geyser.level.JavaDimension;
|
import org.geysermc.geyser.level.JavaDimension;
|
||||||
import org.geysermc.geyser.level.physics.CollisionManager;
|
import org.geysermc.geyser.level.physics.CollisionManager;
|
||||||
@@ -1390,14 +1391,27 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convenience method to reduce amount of duplicate code. Sends ServerboundUseItemPacket.
|
* Same as useItem but always default to useTouchRotation false.
|
||||||
*/
|
*/
|
||||||
public void useItem(Hand hand) {
|
public void useItem(Hand hand) {
|
||||||
|
useItem(hand, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience method to reduce amount of duplicate code. Sends ServerboundUseItemPacket.
|
||||||
|
*/
|
||||||
|
public void useItem(Hand hand, boolean useTouchRotation) {
|
||||||
if (playerEntity.getFlag(EntityFlag.USING_ITEM)) {
|
if (playerEntity.getFlag(EntityFlag.USING_ITEM)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendDownstreamGamePacket(new ServerboundUseItemPacket(hand, worldCache.nextPredictionSequence(), playerEntity.getBedrockInteractRotation().getY(), playerEntity.getBedrockInteractRotation().getX()));
|
float yaw = playerEntity.getYaw(), pitch = playerEntity.getPitch();
|
||||||
|
if (useTouchRotation) { // Only use touch rotation when we actually needed to, resolve https://github.com/GeyserMC/Geyser/issues/5704
|
||||||
|
yaw = playerEntity.getBedrockInteractRotation().getY();
|
||||||
|
pitch = playerEntity.getBedrockInteractRotation().getX();
|
||||||
|
}
|
||||||
|
|
||||||
|
sendDownstreamGamePacket(new ServerboundUseItemPacket(hand, worldCache.nextPredictionSequence(), yaw, pitch));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void releaseItem() {
|
public void releaseItem() {
|
||||||
|
|||||||
@@ -290,7 +290,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
|||||||
if (packet.getItemInHand() != null && session.getItemMappings().getMapping(packet.getItemInHand()).getJavaItem() instanceof SpawnEggItem) {
|
if (packet.getItemInHand() != null && session.getItemMappings().getMapping(packet.getItemInHand()).getJavaItem() instanceof SpawnEggItem) {
|
||||||
if (blockState.is(Blocks.WATER) && blockState.getValue(Properties.LEVEL) == 0) {
|
if (blockState.is(Blocks.WATER) && blockState.getValue(Properties.LEVEL) == 0) {
|
||||||
// Otherwise causes multiple mobs to spawn - just send a use item packet
|
// Otherwise causes multiple mobs to spawn - just send a use item packet
|
||||||
useItem(session, packet, blockState.javaId());
|
useItem(session, packet, blockState.javaId(), false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -313,14 +313,14 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
|||||||
ItemDefinition definition = packet.getItemInHand().getDefinition();
|
ItemDefinition definition = packet.getItemInHand().getDefinition();
|
||||||
// Otherwise boats will not be able to be placed in survival and buckets, lily pads, frogspawn, and glass bottles won't work on mobile
|
// Otherwise boats will not be able to be placed in survival and buckets, lily pads, frogspawn, and glass bottles won't work on mobile
|
||||||
if (item instanceof BoatItem || item == Items.LILY_PAD || item == Items.FROGSPAWN) {
|
if (item instanceof BoatItem || item == Items.LILY_PAD || item == Items.FROGSPAWN) {
|
||||||
useItem(session, packet, blockState.javaId());
|
useItem(session, packet, blockState.javaId(), true);
|
||||||
} else if (item == Items.GLASS_BOTTLE) {
|
} else if (item == Items.GLASS_BOTTLE) {
|
||||||
Block block = blockState.block();
|
Block block = blockState.block();
|
||||||
if (!session.isSneaking() && block instanceof CauldronBlock && block != Blocks.WATER_CAULDRON) {
|
if (!session.isSneaking() && block instanceof CauldronBlock && block != Blocks.WATER_CAULDRON) {
|
||||||
// ServerboundUseItemPacket is not sent for water cauldrons and glass bottles
|
// ServerboundUseItemPacket is not sent for water cauldrons and glass bottles
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
useItem(session, packet, blockState.javaId());
|
useItem(session, packet, blockState.javaId(), false);
|
||||||
} else if (session.getItemMappings().getBuckets().contains(definition)) {
|
} else if (session.getItemMappings().getBuckets().contains(definition)) {
|
||||||
// Don't send ServerboundUseItemPacket for powder snow buckets
|
// Don't send ServerboundUseItemPacket for powder snow buckets
|
||||||
if (definition != session.getItemMappings().getStoredItems().powderSnowBucket().getBedrockDefinition()) {
|
if (definition != session.getItemMappings().getStoredItems().powderSnowBucket().getBedrockDefinition()) {
|
||||||
@@ -328,7 +328,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
|||||||
// ServerboundUseItemPacket is not sent for cauldrons and buckets
|
// ServerboundUseItemPacket is not sent for cauldrons and buckets
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
session.setPlacedBucket(useItem(session, packet, blockState.javaId()));
|
session.setPlacedBucket(useItem(session, packet, blockState.javaId(), true));
|
||||||
} else {
|
} else {
|
||||||
session.setPlacedBucket(true);
|
session.setPlacedBucket(true);
|
||||||
}
|
}
|
||||||
@@ -598,7 +598,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean useItem(GeyserSession session, InventoryTransactionPacket packet, int blockState) {
|
private boolean useItem(GeyserSession session, InventoryTransactionPacket packet, int blockState, boolean useTouchRotation) {
|
||||||
// Update the player's inventory to remove any items added by the client itself
|
// Update the player's inventory to remove any items added by the client itself
|
||||||
PlayerInventory playerInventory = session.getPlayerInventory();
|
PlayerInventory playerInventory = session.getPlayerInventory();
|
||||||
int heldItemSlot = playerInventory.getOffsetForHotbar(packet.getHotbarSlot());
|
int heldItemSlot = playerInventory.getOffsetForHotbar(packet.getHotbarSlot());
|
||||||
@@ -633,7 +633,7 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
session.useItem(Hand.MAIN_HAND);
|
session.useItem(Hand.MAIN_HAND, useTouchRotation);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user