3
0
Mirror von https://github.com/GeyserMC/Geyser.git synchronisiert 2024-07-31 17:48:08 +02:00

Handle correct internal slot for swapping from inventory

Dieser Commit ist enthalten in:
Camotoy 2022-01-16 14:42:17 -05:00
Ursprung 6d577a3f4e
Commit f702fb45b4
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 7EEFB66FE798081F
10 geänderte Dateien mit 38 neuen und 26 gelöschten Zeilen

Datei anzeigen

@ -26,10 +26,6 @@
package org.geysermc.geyser.inventory; package org.geysermc.geyser.inventory;
import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType; import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType;
import lombok.Value;
@Value public record BedrockContainerSlot(ContainerSlotType container, int slot) {
public class BedrockContainerSlot {
ContainerSlotType container;
int slot;
} }

Datei anzeigen

@ -30,6 +30,7 @@ import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.translator.inventory.InventoryTranslator;
import org.jetbrains.annotations.Range;
/** /**
* Combination of {@link Inventory} and {@link PlayerInventory} * Combination of {@link Inventory} and {@link PlayerInventory}
@ -59,6 +60,11 @@ public class Container extends Inventory {
} }
} }
@Override
public int getOffsetForHotbar(@Range(from = 0, to = 8) int slot) {
return playerInventory.getOffsetForHotbar(slot) - InventoryTranslator.PLAYER_INVENTORY_OFFSET + this.size;
}
@Override @Override
public void setItem(int slot, @NonNull GeyserItemStack newItem, GeyserSession session) { public void setItem(int slot, @NonNull GeyserItemStack newItem, GeyserSession session) {
if (slot < this.size) { if (slot < this.size) {

Datei anzeigen

@ -36,11 +36,12 @@ import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.jetbrains.annotations.Range;
import java.util.Arrays; import java.util.Arrays;
@ToString @ToString
public class Inventory { public abstract class Inventory {
@Getter @Getter
protected final int id; protected final int id;
@ -110,6 +111,8 @@ public class Inventory {
return items[slot]; return items[slot];
} }
public abstract int getOffsetForHotbar(@Range(from = 0, to = 8) int slot);
public void setItem(int slot, @NonNull GeyserItemStack newItem, GeyserSession session) { public void setItem(int slot, @NonNull GeyserItemStack newItem, GeyserSession session) {
if (slot > this.size) { if (slot > this.size) {
session.getGeyser().getLogger().debug("Tried to set an item out of bounds! " + this); session.getGeyser().getLogger().debug("Tried to set an item out of bounds! " + this);

Datei anzeigen

@ -26,10 +26,12 @@
package org.geysermc.geyser.inventory; package org.geysermc.geyser.inventory;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull;
import lombok.Setter; import lombok.Setter;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.jetbrains.annotations.Range;
import javax.annotation.Nonnull;
public class PlayerInventory extends Inventory { public class PlayerInventory extends Inventory {
/** /**
@ -41,7 +43,7 @@ public class PlayerInventory extends Inventory {
private int heldItemSlot; private int heldItemSlot;
@Getter @Getter
@NonNull @Nonnull
private GeyserItemStack cursor = GeyserItemStack.EMPTY; private GeyserItemStack cursor = GeyserItemStack.EMPTY;
public PlayerInventory() { public PlayerInventory() {
@ -49,7 +51,12 @@ public class PlayerInventory extends Inventory {
heldItemSlot = 0; heldItemSlot = 0;
} }
public void setCursor(@NonNull GeyserItemStack newCursor, GeyserSession session) { @Override
public int getOffsetForHotbar(@Range(from = 0, to = 8) int slot) {
return slot + 36;
}
public void setCursor(@Nonnull GeyserItemStack newCursor, GeyserSession session) {
updateItemNetId(cursor, newCursor, session); updateItemNetId(cursor, newCursor, session);
cursor = newCursor; cursor = newCursor;
} }
@ -62,7 +69,7 @@ public class PlayerInventory extends Inventory {
return items[36 + heldItemSlot]; return items[36 + heldItemSlot];
} }
public void setItemInHand(@NonNull GeyserItemStack item) { public void setItemInHand(@Nonnull GeyserItemStack item) {
if (36 + heldItemSlot > this.size) { if (36 + heldItemSlot > this.size) {
GeyserImpl.getInstance().getLogger().debug("Held item slot was larger than expected!"); GeyserImpl.getInstance().getLogger().debug("Held item slot was larger than expected!");
return; return;

Datei anzeigen

@ -234,31 +234,31 @@ public class ClickPlan {
} }
break; break;
case SWAP_TO_HOTBAR_1: case SWAP_TO_HOTBAR_1:
swap(action.slot, 36, clicked); swap(action.slot, inventory.getOffsetForHotbar(0), clicked);
break; break;
case SWAP_TO_HOTBAR_2: case SWAP_TO_HOTBAR_2:
swap(action.slot, 37, clicked); swap(action.slot, inventory.getOffsetForHotbar(1), clicked);
break; break;
case SWAP_TO_HOTBAR_3: case SWAP_TO_HOTBAR_3:
swap(action.slot, 38, clicked); swap(action.slot, inventory.getOffsetForHotbar(2), clicked);
break; break;
case SWAP_TO_HOTBAR_4: case SWAP_TO_HOTBAR_4:
swap(action.slot, 39, clicked); swap(action.slot, inventory.getOffsetForHotbar(3), clicked);
break; break;
case SWAP_TO_HOTBAR_5: case SWAP_TO_HOTBAR_5:
swap(action.slot, 40, clicked); swap(action.slot, inventory.getOffsetForHotbar(4), clicked);
break; break;
case SWAP_TO_HOTBAR_6: case SWAP_TO_HOTBAR_6:
swap(action.slot, 41, clicked); swap(action.slot, inventory.getOffsetForHotbar(5), clicked);
break; break;
case SWAP_TO_HOTBAR_7: case SWAP_TO_HOTBAR_7:
swap(action.slot, 42, clicked); swap(action.slot, inventory.getOffsetForHotbar(6), clicked);
break; break;
case SWAP_TO_HOTBAR_8: case SWAP_TO_HOTBAR_8:
swap(action.slot, 43, clicked); swap(action.slot, inventory.getOffsetForHotbar(7), clicked);
break; break;
case SWAP_TO_HOTBAR_9: case SWAP_TO_HOTBAR_9:
swap(action.slot, 44, clicked); swap(action.slot, inventory.getOffsetForHotbar(8), clicked);
break; break;
case LEFT_SHIFT: case LEFT_SHIFT:
//TODO //TODO

Datei anzeigen

@ -104,7 +104,7 @@ public class BeaconInventoryTranslator extends AbstractBlockInventoryTranslator
} }
@Override @Override
public boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { protected boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) {
return action.getType() == StackRequestActionType.BEACON_PAYMENT; return action.getType() == StackRequestActionType.BEACON_PAYMENT;
} }

Datei anzeigen

@ -104,7 +104,7 @@ public class EnchantingInventoryTranslator extends AbstractBlockInventoryTransla
} }
@Override @Override
public boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { protected boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) {
return action.getType() == StackRequestActionType.CRAFT_RECIPE; return action.getType() == StackRequestActionType.CRAFT_RECIPE;
} }

Datei anzeigen

@ -136,7 +136,7 @@ public abstract class InventoryTranslator {
* Should be overrided if this request matches a certain criteria and shouldn't be treated normally. * Should be overrided if this request matches a certain criteria and shouldn't be treated normally.
* E.G. anvil renaming or enchanting * E.G. anvil renaming or enchanting
*/ */
public boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { protected boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) {
return false; return false;
} }
@ -864,8 +864,8 @@ public abstract class InventoryTranslator {
Map<ContainerSlotType, List<ItemStackResponsePacket.ItemEntry>> containerMap = new HashMap<>(); Map<ContainerSlotType, List<ItemStackResponsePacket.ItemEntry>> containerMap = new HashMap<>();
for (int slot : affectedSlots) { for (int slot : affectedSlots) {
BedrockContainerSlot bedrockSlot = javaSlotToBedrockContainer(slot); BedrockContainerSlot bedrockSlot = javaSlotToBedrockContainer(slot);
List<ItemStackResponsePacket.ItemEntry> list = containerMap.computeIfAbsent(bedrockSlot.getContainer(), k -> new ArrayList<>()); List<ItemStackResponsePacket.ItemEntry> list = containerMap.computeIfAbsent(bedrockSlot.container(), k -> new ArrayList<>());
list.add(makeItemEntry(session, bedrockSlot.getSlot(), inventory.getItem(slot))); list.add(makeItemEntry(session, bedrockSlot.slot(), inventory.getItem(slot)));
} }
List<ItemStackResponsePacket.ContainerEntry> containerEntries = new ArrayList<>(); List<ItemStackResponsePacket.ContainerEntry> containerEntries = new ArrayList<>();

Datei anzeigen

@ -117,7 +117,7 @@ public class LoomInventoryTranslator extends AbstractBlockInventoryTranslator {
} }
@Override @Override
public boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { protected boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) {
// If the LOOM_MATERIAL slot is not empty, we are crafting a pattern that does not come from an item // If the LOOM_MATERIAL slot is not empty, we are crafting a pattern that does not come from an item
// Remove the CRAFT_NON_IMPLEMENTED_DEPRECATED when 1.17.30 is dropped // Remove the CRAFT_NON_IMPLEMENTED_DEPRECATED when 1.17.30 is dropped
return (action.getType() == StackRequestActionType.CRAFT_NON_IMPLEMENTED_DEPRECATED || action.getType() == StackRequestActionType.CRAFT_LOOM) return (action.getType() == StackRequestActionType.CRAFT_NON_IMPLEMENTED_DEPRECATED || action.getType() == StackRequestActionType.CRAFT_LOOM)

Datei anzeigen

@ -52,7 +52,7 @@ public class StonecutterInventoryTranslator extends AbstractBlockInventoryTransl
} }
@Override @Override
public boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) { protected boolean shouldHandleRequestFirst(StackRequestActionData action, Inventory inventory) {
// First is pre-1.18. TODO remove after 1.17.40 support is dropped and refactor stonecutter support to use CraftRecipeStackRequestActionData's recipe ID // First is pre-1.18. TODO remove after 1.17.40 support is dropped and refactor stonecutter support to use CraftRecipeStackRequestActionData's recipe ID
return action.getType() == StackRequestActionType.CRAFT_NON_IMPLEMENTED_DEPRECATED || action.getType() == StackRequestActionType.CRAFT_RECIPE; return action.getType() == StackRequestActionType.CRAFT_NON_IMPLEMENTED_DEPRECATED || action.getType() == StackRequestActionType.CRAFT_RECIPE;
} }