Mirror von
https://github.com/GeyserMC/Geyser.git
synchronisiert 2024-11-20 06:50:09 +01:00
A cleaner error on illegal set slot packet
Dieser Commit ist enthalten in:
Ursprung
4d0952c224
Commit
fa726092e3
@ -33,6 +33,7 @@ import com.nukkitx.protocol.bedrock.data.inventory.CraftingData;
|
|||||||
import com.nukkitx.protocol.bedrock.data.inventory.ItemData;
|
import com.nukkitx.protocol.bedrock.data.inventory.ItemData;
|
||||||
import com.nukkitx.protocol.bedrock.packet.CraftingDataPacket;
|
import com.nukkitx.protocol.bedrock.packet.CraftingDataPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.InventorySlotPacket;
|
import com.nukkitx.protocol.bedrock.packet.InventorySlotPacket;
|
||||||
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
import org.geysermc.geyser.inventory.GeyserItemStack;
|
import org.geysermc.geyser.inventory.GeyserItemStack;
|
||||||
import org.geysermc.geyser.inventory.Inventory;
|
import org.geysermc.geyser.inventory.Inventory;
|
||||||
import org.geysermc.geyser.inventory.recipe.GeyserShapedRecipe;
|
import org.geysermc.geyser.inventory.recipe.GeyserShapedRecipe;
|
||||||
@ -66,27 +67,41 @@ public class JavaContainerSetSlotTranslator extends PacketTranslator<Clientbound
|
|||||||
if (inventory == null)
|
if (inventory == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Intentional behavior here below the cursor; Minecraft 1.18.1 also does this.
|
|
||||||
int stateId = packet.getStateId();
|
|
||||||
session.setEmulatePost1_16Logic(stateId > 0 || stateId != inventory.getStateId());
|
|
||||||
inventory.setStateId(stateId);
|
|
||||||
|
|
||||||
InventoryTranslator translator = session.getInventoryTranslator();
|
InventoryTranslator translator = session.getInventoryTranslator();
|
||||||
if (translator != null) {
|
if (translator != null) {
|
||||||
if (session.getCraftingGridFuture() != null) {
|
if (session.getCraftingGridFuture() != null) {
|
||||||
session.getCraftingGridFuture().cancel(false);
|
session.getCraftingGridFuture().cancel(false);
|
||||||
}
|
}
|
||||||
updateCraftingGrid(session, packet.getSlot(), packet.getItem(), inventory, translator);
|
|
||||||
|
int slot = packet.getSlot();
|
||||||
|
if (slot >= inventory.getSize()) {
|
||||||
|
GeyserImpl geyser = session.getGeyser();
|
||||||
|
geyser.getLogger().warning("ClientboundContainerSetSlotPacket sent to " + session.name()
|
||||||
|
+ " that exceeds inventory size!");
|
||||||
|
if (geyser.getConfig().isDebugMode()) {
|
||||||
|
geyser.getLogger().debug(packet);
|
||||||
|
geyser.getLogger().debug(inventory);
|
||||||
|
}
|
||||||
|
// 1.19.0 behavior: the state ID will not be set due to exception
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateCraftingGrid(session, slot, packet.getItem(), inventory, translator);
|
||||||
|
|
||||||
GeyserItemStack newItem = GeyserItemStack.from(packet.getItem());
|
GeyserItemStack newItem = GeyserItemStack.from(packet.getItem());
|
||||||
if (packet.getContainerId() == 0 && !(translator instanceof PlayerInventoryTranslator)) {
|
if (packet.getContainerId() == 0 && !(translator instanceof PlayerInventoryTranslator)) {
|
||||||
// In rare cases, the window ID can still be 0 but Java treats it as valid
|
// In rare cases, the window ID can still be 0 but Java treats it as valid
|
||||||
session.getPlayerInventory().setItem(packet.getSlot(), newItem, session);
|
session.getPlayerInventory().setItem(slot, newItem, session);
|
||||||
InventoryTranslator.PLAYER_INVENTORY_TRANSLATOR.updateSlot(session, session.getPlayerInventory(), packet.getSlot());
|
InventoryTranslator.PLAYER_INVENTORY_TRANSLATOR.updateSlot(session, session.getPlayerInventory(), slot);
|
||||||
} else {
|
} else {
|
||||||
inventory.setItem(packet.getSlot(), newItem, session);
|
inventory.setItem(slot, newItem, session);
|
||||||
translator.updateSlot(session, inventory, packet.getSlot());
|
translator.updateSlot(session, inventory, slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Intentional behavior here below the cursor; Minecraft 1.18.1 also does this.
|
||||||
|
int stateId = packet.getStateId();
|
||||||
|
session.setEmulatePost1_16Logic(stateId > 0 || stateId != inventory.getStateId());
|
||||||
|
inventory.setStateId(stateId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren