Mirror von
https://github.com/GeyserMC/Geyser.git
synchronisiert 2024-09-08 20:43:04 +02:00
A bunch of fixes
Dieser Commit ist enthalten in:
Ursprung
605201afc0
Commit
f849a5b9f9
@ -36,7 +36,7 @@ import java.util.Arrays;
|
|||||||
public class Inventory {
|
public class Inventory {
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
protected int id;
|
protected final int id;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
protected final int size;
|
protected final int size;
|
||||||
@ -96,4 +96,17 @@ public class Inventory {
|
|||||||
public short getNextTransactionId() {
|
public short getNextTransactionId() {
|
||||||
return ++transactionId;
|
return ++transactionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Inventory{" +
|
||||||
|
"id=" + id +
|
||||||
|
", size=" + size +
|
||||||
|
", title='" + title + '\'' +
|
||||||
|
", items=" + Arrays.toString(items) +
|
||||||
|
", holderPosition=" + holderPosition +
|
||||||
|
", holderId=" + holderId +
|
||||||
|
", transactionId=" + transactionId +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,7 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean translateAndDefault(BedrockPacket packet) {
|
private boolean translateAndDefault(BedrockPacket packet) {
|
||||||
|
System.out.println(packet.toString());
|
||||||
return PacketTranslatorRegistry.BEDROCK_TRANSLATOR.translate(packet.getClass(), packet, session);
|
return PacketTranslatorRegistry.BEDROCK_TRANSLATOR.translate(packet.getClass(), packet, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +144,7 @@ public class GeyserSession implements CommandSender {
|
|||||||
* Use {@link #getNextItemNetId()} instead for consistency
|
* Use {@link #getNextItemNetId()} instead for consistency
|
||||||
*/
|
*/
|
||||||
@Getter(AccessLevel.NONE)
|
@Getter(AccessLevel.NONE)
|
||||||
private final AtomicInteger itemNetId = new AtomicInteger(1);
|
private final AtomicInteger itemNetId = new AtomicInteger(2);
|
||||||
|
|
||||||
@Getter(AccessLevel.NONE)
|
@Getter(AccessLevel.NONE)
|
||||||
private final Object inventoryLock = new Object();
|
private final Object inventoryLock = new Object();
|
||||||
|
@ -85,6 +85,8 @@ public abstract class InventoryTranslator {
|
|||||||
put(WindowType.CARTOGRAPHY, new CartographyInventoryTranslator());
|
put(WindowType.CARTOGRAPHY, new CartographyInventoryTranslator());
|
||||||
put(WindowType.CRAFTING, new CraftingInventoryTranslator());
|
put(WindowType.CRAFTING, new CraftingInventoryTranslator());
|
||||||
put(WindowType.ENCHANTMENT, new EnchantingInventoryTranslator());
|
put(WindowType.ENCHANTMENT, new EnchantingInventoryTranslator());
|
||||||
|
put(WindowType.HOPPER, new HopperInventoryTranslator());
|
||||||
|
put(WindowType.GENERIC_3X3, new Generic3X3InventoryTranslator());
|
||||||
put(WindowType.GRINDSTONE, new GrindstoneInventoryTranslator());
|
put(WindowType.GRINDSTONE, new GrindstoneInventoryTranslator());
|
||||||
put(WindowType.LOOM, new LoomInventoryTranslator());
|
put(WindowType.LOOM, new LoomInventoryTranslator());
|
||||||
put(WindowType.MERCHANT, new MerchantInventoryTranslator());
|
put(WindowType.MERCHANT, new MerchantInventoryTranslator());
|
||||||
@ -92,10 +94,6 @@ public abstract class InventoryTranslator {
|
|||||||
put(WindowType.SMITHING, new SmithingInventoryTranslator());
|
put(WindowType.SMITHING, new SmithingInventoryTranslator());
|
||||||
put(WindowType.STONECUTTER, new StonecutterInventoryTranslator());
|
put(WindowType.STONECUTTER, new StonecutterInventoryTranslator());
|
||||||
|
|
||||||
/* Generics */
|
|
||||||
put(WindowType.GENERIC_3X3, new Generic3X3InventoryTranslator());
|
|
||||||
put(WindowType.HOPPER, new HopperInventoryTranslator());
|
|
||||||
|
|
||||||
/* Lectern */
|
/* Lectern */
|
||||||
put(WindowType.LECTERN, new LecternInventoryTranslator());
|
put(WindowType.LECTERN, new LecternInventoryTranslator());
|
||||||
}
|
}
|
||||||
@ -195,9 +193,11 @@ public abstract class InventoryTranslator {
|
|||||||
transferAction.getSource().getSlot() >= 28 && transferAction.getSource().getSlot() <= 31) {
|
transferAction.getSource().getSlot() >= 28 && transferAction.getSource().getSlot() <= 31) {
|
||||||
return rejectRequest(request, false);
|
return rejectRequest(request, false);
|
||||||
}
|
}
|
||||||
session.getConnector().getLogger().error("DEBUG: About to reject request made by " + session.getName());
|
session.getConnector().getLogger().error("DEBUG: About to reject TAKE/PLACE request made by " + session.getName());
|
||||||
session.getConnector().getLogger().error("Source: " + transferAction.getSource().toString() + " Result: " + checkNetId(session, inventory, transferAction.getSource()));
|
session.getConnector().getLogger().error("Source: " + transferAction.getSource().toString() + " Result: " + checkNetId(session, inventory, transferAction.getSource()));
|
||||||
session.getConnector().getLogger().error("Destination: " + transferAction.getDestination().toString() + " Result: " + checkNetId(session, inventory, transferAction.getDestination()));
|
session.getConnector().getLogger().error("Destination: " + transferAction.getDestination().toString() + " Result: " + checkNetId(session, inventory, transferAction.getDestination()));
|
||||||
|
session.getConnector().getLogger().error("Geyser's record of source slot: " + inventory.getItem(bedrockSlotToJava(transferAction.getSource())));
|
||||||
|
session.getConnector().getLogger().error("Geyser's record of destination slot: " + inventory.getItem(bedrockSlotToJava(transferAction.getDestination())));
|
||||||
return rejectRequest(request);
|
return rejectRequest(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -278,8 +278,14 @@ public abstract class InventoryTranslator {
|
|||||||
}
|
}
|
||||||
case SWAP: { //TODO
|
case SWAP: { //TODO
|
||||||
SwapStackRequestActionData swapAction = (SwapStackRequestActionData) action;
|
SwapStackRequestActionData swapAction = (SwapStackRequestActionData) action;
|
||||||
if (!(checkNetId(session, inventory, swapAction.getSource()) && checkNetId(session, inventory, swapAction.getDestination())))
|
if (!(checkNetId(session, inventory, swapAction.getSource()) && checkNetId(session, inventory, swapAction.getDestination()))) {
|
||||||
|
session.getConnector().getLogger().error("DEBUG: About to reject SWAP request made by " + session.getName());
|
||||||
|
session.getConnector().getLogger().error("Source: " + swapAction.getSource().toString() + " Result: " + checkNetId(session, inventory, swapAction.getSource()));
|
||||||
|
session.getConnector().getLogger().error("Destination: " + swapAction.getDestination().toString() + " Result: " + checkNetId(session, inventory, swapAction.getDestination()));
|
||||||
|
session.getConnector().getLogger().error("Geyser's record of source slot: " + inventory.getItem(bedrockSlotToJava(swapAction.getSource())));
|
||||||
|
session.getConnector().getLogger().error("Geyser's record of destination slot: " + inventory.getItem(bedrockSlotToJava(swapAction.getDestination())));
|
||||||
return rejectRequest(request);
|
return rejectRequest(request);
|
||||||
|
}
|
||||||
|
|
||||||
if (isCursor(swapAction.getSource()) && isCursor(swapAction.getDestination())) { //???
|
if (isCursor(swapAction.getSource()) && isCursor(swapAction.getDestination())) { //???
|
||||||
return rejectRequest(request);
|
return rejectRequest(request);
|
||||||
@ -361,14 +367,9 @@ public abstract class InventoryTranslator {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CRAFT_NON_IMPLEMENTED_DEPRECATED: {
|
case CRAFT_NON_IMPLEMENTED_DEPRECATED:
|
||||||
break;
|
case CRAFT_RESULTS_DEPRECATED:
|
||||||
}
|
case CRAFT_RECIPE_OPTIONAL: { // Anvils and cartography tables will handle this
|
||||||
case CRAFT_RESULTS_DEPRECATED: {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CRAFT_RECIPE_OPTIONAL: {
|
|
||||||
// Anvils and cartography tables will handle this
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -381,9 +382,8 @@ public abstract class InventoryTranslator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ItemStackResponsePacket.Response translateCraftingRequest(GeyserSession session, Inventory inventory, ItemStackRequest request) {
|
public ItemStackResponsePacket.Response translateCraftingRequest(GeyserSession session, Inventory inventory, ItemStackRequest request) {
|
||||||
int recipeId = 0;
|
|
||||||
int resultSize = 0;
|
int resultSize = 0;
|
||||||
int timesCrafted = 0;
|
int timesCrafted;
|
||||||
CraftState craftState = CraftState.START;
|
CraftState craftState = CraftState.START;
|
||||||
|
|
||||||
int leftover = 0;
|
int leftover = 0;
|
||||||
@ -396,7 +396,6 @@ public abstract class InventoryTranslator {
|
|||||||
return rejectRequest(request);
|
return rejectRequest(request);
|
||||||
}
|
}
|
||||||
craftState = CraftState.RECIPE_ID;
|
craftState = CraftState.RECIPE_ID;
|
||||||
recipeId = craftAction.getRecipeNetworkId();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CRAFT_RESULTS_DEPRECATED: {
|
case CRAFT_RESULTS_DEPRECATED: {
|
||||||
@ -417,7 +416,6 @@ public abstract class InventoryTranslator {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CONSUME: {
|
case CONSUME: {
|
||||||
ConsumeStackRequestActionData consumeAction = (ConsumeStackRequestActionData) action;
|
|
||||||
if (craftState != CraftState.DEPRECATED && craftState != CraftState.INGREDIENTS) {
|
if (craftState != CraftState.DEPRECATED && craftState != CraftState.INGREDIENTS) {
|
||||||
return rejectRequest(request);
|
return rejectRequest(request);
|
||||||
}
|
}
|
||||||
@ -507,9 +505,7 @@ public abstract class InventoryTranslator {
|
|||||||
|
|
||||||
Int2IntMap consumedSlots = new Int2IntOpenHashMap();
|
Int2IntMap consumedSlots = new Int2IntOpenHashMap();
|
||||||
int prioritySlot = -1;
|
int prioritySlot = -1;
|
||||||
int secondarySlot = -1;
|
int tempSlot;
|
||||||
int tempSlot = -1;
|
|
||||||
boolean intoCursor = false;
|
|
||||||
|
|
||||||
int resultSize;
|
int resultSize;
|
||||||
int timesCrafted = 0;
|
int timesCrafted = 0;
|
||||||
@ -626,7 +622,6 @@ public abstract class InventoryTranslator {
|
|||||||
|
|
||||||
int javaSlot = bedrockSlotToJava(transferAction.getDestination());
|
int javaSlot = bedrockSlotToJava(transferAction.getDestination());
|
||||||
if (isCursor(transferAction.getDestination())) { //TODO
|
if (isCursor(transferAction.getDestination())) { //TODO
|
||||||
intoCursor = true;
|
|
||||||
if (timesCrafted > 1) {
|
if (timesCrafted > 1) {
|
||||||
tempSlot = findTempSlot(inventory, GeyserItemStack.from(output), true);
|
tempSlot = findTempSlot(inventory, GeyserItemStack.from(output), true);
|
||||||
if (tempSlot == -1) {
|
if (tempSlot == -1) {
|
||||||
@ -735,6 +730,8 @@ public abstract class InventoryTranslator {
|
|||||||
|
|
||||||
public boolean checkNetId(GeyserSession session, Inventory inventory, StackRequestSlotInfoData slotInfoData) {
|
public boolean checkNetId(GeyserSession session, Inventory inventory, StackRequestSlotInfoData slotInfoData) {
|
||||||
int netId = slotInfoData.getStackNetworkId();
|
int netId = slotInfoData.getStackNetworkId();
|
||||||
|
// "In my testing, sometimes the client thinks the netId of an item in the crafting grid is 1, even though we never said it was.
|
||||||
|
// I think it only happens when we manually set the grid but that was my quick fix"
|
||||||
if (netId < 0 || netId == 1)
|
if (netId < 0 || netId == 1)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ import com.nukkitx.math.vector.Vector3i;
|
|||||||
import com.nukkitx.nbt.NbtMap;
|
import com.nukkitx.nbt.NbtMap;
|
||||||
import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
|
import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
|
||||||
import com.nukkitx.protocol.bedrock.packet.BlockEntityDataPacket;
|
import com.nukkitx.protocol.bedrock.packet.BlockEntityDataPacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.ContainerClosePacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket;
|
import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
|
import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
|
||||||
import org.geysermc.connector.inventory.Container;
|
import org.geysermc.connector.inventory.Container;
|
||||||
@ -76,11 +77,11 @@ public class BlockInventoryHolder extends InventoryHolder {
|
|||||||
if (session.getLastInteractionPlayerPosition().equals(session.getPlayerEntity().getPosition())) {
|
if (session.getLastInteractionPlayerPosition().equals(session.getPlayerEntity().getPosition())) {
|
||||||
// Then, check to see if the interacted block is valid for this inventory by ensuring the block state identifier is valid
|
// Then, check to see if the interacted block is valid for this inventory by ensuring the block state identifier is valid
|
||||||
int javaBlockId = session.getConnector().getWorldManager().getBlockAt(session, session.getLastInteractionBlockPosition());
|
int javaBlockId = session.getConnector().getWorldManager().getBlockAt(session, session.getLastInteractionBlockPosition());
|
||||||
String javaBlockString = BlockTranslator.getJavaIdBlockMap().inverse().getOrDefault(javaBlockId, "minecraft:air").split("\\[")[0];
|
String[] javaBlockString = BlockTranslator.getJavaIdBlockMap().inverse().getOrDefault(javaBlockId, "minecraft:air").split("\\[");
|
||||||
if (this.validBlocks.contains(javaBlockString)) {
|
if (isValidBlock(javaBlockString)) {
|
||||||
// We can safely use this block
|
// We can safely use this block
|
||||||
inventory.setHolderPosition(session.getLastInteractionBlockPosition());
|
inventory.setHolderPosition(session.getLastInteractionBlockPosition());
|
||||||
((Container) inventory).setUsingRealBlock(true, javaBlockString);
|
((Container) inventory).setUsingRealBlock(true, javaBlockString[0]);
|
||||||
setCustomName(session, session.getLastInteractionBlockPosition(), inventory);
|
setCustomName(session, session.getLastInteractionBlockPosition(), inventory);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -100,6 +101,13 @@ public class BlockInventoryHolder extends InventoryHolder {
|
|||||||
setCustomName(session, position, inventory);
|
setCustomName(session, position, inventory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if this Java block ID can be used for player inventory.
|
||||||
|
*/
|
||||||
|
protected boolean isValidBlock(String[] javaBlockString) {
|
||||||
|
return this.validBlocks.contains(javaBlockString[0]);
|
||||||
|
}
|
||||||
|
|
||||||
protected void setCustomName(GeyserSession session, Vector3i position, Inventory inventory) {
|
protected void setCustomName(GeyserSession session, Vector3i position, Inventory inventory) {
|
||||||
NbtMap tag = NbtMap.builder()
|
NbtMap tag = NbtMap.builder()
|
||||||
.putInt("x", position.getX())
|
.putInt("x", position.getX())
|
||||||
@ -126,6 +134,11 @@ public class BlockInventoryHolder extends InventoryHolder {
|
|||||||
public void closeInventory(InventoryTranslator translator, GeyserSession session, Inventory inventory) {
|
public void closeInventory(InventoryTranslator translator, GeyserSession session, Inventory inventory) {
|
||||||
if (((Container) inventory).isUsingRealBlock()) {
|
if (((Container) inventory).isUsingRealBlock()) {
|
||||||
// No need to reset a block since we didn't change any blocks
|
// No need to reset a block since we didn't change any blocks
|
||||||
|
// But send a container close packet because we aren't destroying the original.
|
||||||
|
ContainerClosePacket packet = new ContainerClosePacket();
|
||||||
|
packet.setId((byte) inventory.getId());
|
||||||
|
packet.setUnknownBool0(true); //TODO needs to be changed in Protocol to "server-side" or something
|
||||||
|
session.sendUpstreamPacket(packet);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,18 @@ public class SingleChestInventoryTranslator extends ChestInventoryTranslator {
|
|||||||
public SingleChestInventoryTranslator(int size) {
|
public SingleChestInventoryTranslator(int size) {
|
||||||
super(size, 27);
|
super(size, 27);
|
||||||
this.holder = new BlockInventoryHolder("minecraft:chest[facing=north,type=single,waterlogged=false]", ContainerType.CONTAINER,
|
this.holder = new BlockInventoryHolder("minecraft:chest[facing=north,type=single,waterlogged=false]", ContainerType.CONTAINER,
|
||||||
"minecraft:ender_chest", "minecraft:trapped_chest");
|
"minecraft:ender_chest", "minecraft:trapped_chest") {
|
||||||
|
@Override
|
||||||
|
protected boolean isValidBlock(String[] javaBlockString) {
|
||||||
|
if (javaBlockString[0].equals("minecraft:ender_chest")) {
|
||||||
|
// Can't have double ender chests
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add provision to ensure this isn't a double chest
|
||||||
|
return super.isValidBlock(javaBlockString) && (javaBlockString.length > 1 && javaBlockString[1].contains("type=single"));
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -36,6 +36,9 @@ public class JavaCloseWindowTranslator extends PacketTranslator<ServerCloseWindo
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void translate(ServerCloseWindowPacket packet, GeyserSession session) {
|
public void translate(ServerCloseWindowPacket packet, GeyserSession session) {
|
||||||
session.addInventoryTask(() -> InventoryUtils.closeInventory(session, packet.getWindowId()));
|
session.addInventoryTask(() -> {
|
||||||
|
session.getConnector().getLogger().info("Closing window ID " + packet.getWindowId());
|
||||||
|
InventoryUtils.closeInventory(session, packet.getWindowId());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,7 @@ public class JavaOpenWindowTranslator extends PacketTranslator<ServerOpenWindowP
|
|||||||
if (packet.getWindowId() == 0) {
|
if (packet.getWindowId() == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
session.getConnector().getLogger().info("Opening window ID " + packet.getWindowId());
|
||||||
|
|
||||||
InventoryTranslator newTranslator = InventoryTranslator.INVENTORY_TRANSLATORS.get(packet.getType());
|
InventoryTranslator newTranslator = InventoryTranslator.INVENTORY_TRANSLATORS.get(packet.getType());
|
||||||
Inventory openInventory = session.getOpenInventory();
|
Inventory openInventory = session.getOpenInventory();
|
||||||
@ -63,10 +64,7 @@ public class JavaOpenWindowTranslator extends PacketTranslator<ServerOpenWindowP
|
|||||||
|
|
||||||
Inventory newInventory = newTranslator.createInventory(name, packet.getWindowId(), packet.getType(), session.getPlayerInventory());
|
Inventory newInventory = newTranslator.createInventory(name, packet.getWindowId(), packet.getType(), session.getPlayerInventory());
|
||||||
if (openInventory != null) {
|
if (openInventory != null) {
|
||||||
InventoryTranslator openTranslator = session.getInventoryTranslator();
|
InventoryUtils.closeInventory(session, openInventory.getId());
|
||||||
if (!openTranslator.getClass().equals(newTranslator.getClass())) {
|
|
||||||
InventoryUtils.closeInventory(session, openInventory.getId());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
session.setInventoryTranslator(newTranslator);
|
session.setInventoryTranslator(newTranslator);
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren