Mirror von
https://github.com/GeyserMC/Geyser.git
synchronisiert 2024-12-27 00:23:03 +01:00
Villager fixes + other stuff
- Consoles trading with villagers should work better - Villagers closing their inventory work now
Dieser Commit ist enthalten in:
Ursprung
255c7ac0d2
Commit
0727008881
@ -28,10 +28,10 @@ package org.geysermc.connector.network.translators.bedrock;
|
|||||||
import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientCloseWindowPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientCloseWindowPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.ContainerClosePacket;
|
import com.nukkitx.protocol.bedrock.packet.ContainerClosePacket;
|
||||||
import org.geysermc.connector.inventory.Inventory;
|
import org.geysermc.connector.inventory.Inventory;
|
||||||
|
import org.geysermc.connector.inventory.MerchantContainer;
|
||||||
import org.geysermc.connector.network.session.GeyserSession;
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
import org.geysermc.connector.network.translators.PacketTranslator;
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
import org.geysermc.connector.network.translators.Translator;
|
import org.geysermc.connector.network.translators.Translator;
|
||||||
import org.geysermc.connector.network.translators.inventory.InventoryTranslator;
|
|
||||||
import org.geysermc.connector.utils.InventoryUtils;
|
import org.geysermc.connector.utils.InventoryUtils;
|
||||||
|
|
||||||
@Translator(packet = ContainerClosePacket.class)
|
@Translator(packet = ContainerClosePacket.class)
|
||||||
@ -47,6 +47,11 @@ public class BedrockContainerCloseTranslator extends PacketTranslator<ContainerC
|
|||||||
session.sendUpstreamPacket(packet);
|
session.sendUpstreamPacket(packet);
|
||||||
session.setClosingInventory(false);
|
session.setClosingInventory(false);
|
||||||
|
|
||||||
|
if (windowId == -1 && session.getOpenInventory() instanceof MerchantContainer) {
|
||||||
|
// 1.16.200 - window ID is always -1 sent from Bedrock
|
||||||
|
windowId = (byte) session.getOpenInventory().getId();
|
||||||
|
}
|
||||||
|
|
||||||
Inventory openInventory = session.getOpenInventory();
|
Inventory openInventory = session.getOpenInventory();
|
||||||
if (openInventory != null) {
|
if (openInventory != null) {
|
||||||
if (windowId == openInventory.getId()) {
|
if (windowId == openInventory.getId()) {
|
||||||
|
@ -39,10 +39,7 @@ import com.nukkitx.protocol.bedrock.data.inventory.stackrequestactions.*;
|
|||||||
import com.nukkitx.protocol.bedrock.packet.ItemStackResponsePacket;
|
import com.nukkitx.protocol.bedrock.packet.ItemStackResponsePacket;
|
||||||
import it.unimi.dsi.fastutil.ints.*;
|
import it.unimi.dsi.fastutil.ints.*;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import org.geysermc.connector.inventory.CartographyContainer;
|
import org.geysermc.connector.inventory.*;
|
||||||
import org.geysermc.connector.inventory.GeyserItemStack;
|
|
||||||
import org.geysermc.connector.inventory.Inventory;
|
|
||||||
import org.geysermc.connector.inventory.PlayerInventory;
|
|
||||||
import org.geysermc.connector.network.session.GeyserSession;
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
import org.geysermc.connector.network.translators.inventory.click.Click;
|
import org.geysermc.connector.network.translators.inventory.click.Click;
|
||||||
import org.geysermc.connector.network.translators.inventory.click.ClickPlan;
|
import org.geysermc.connector.network.translators.inventory.click.ClickPlan;
|
||||||
@ -101,7 +98,7 @@ public abstract class InventoryTranslator {
|
|||||||
|
|
||||||
public static final int PLAYER_INVENTORY_SIZE = 36;
|
public static final int PLAYER_INVENTORY_SIZE = 36;
|
||||||
public static final int PLAYER_INVENTORY_OFFSET = 9;
|
public static final int PLAYER_INVENTORY_OFFSET = 9;
|
||||||
private static final int MAX_ITEM_STACK_SIZE = 64;
|
|
||||||
public final int size;
|
public final int size;
|
||||||
|
|
||||||
public abstract void prepareInventory(GeyserSession session, Inventory inventory);
|
public abstract void prepareInventory(GeyserSession session, Inventory inventory);
|
||||||
@ -346,8 +343,7 @@ public abstract class InventoryTranslator {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// The following three tend to be called for UI inventories
|
case CONSUME: { // Tends to be called for UI inventories
|
||||||
case CONSUME: {
|
|
||||||
if (inventory instanceof CartographyContainer) {
|
if (inventory instanceof CartographyContainer) {
|
||||||
// TODO add this for more inventories? Only seems to glitch out the cartography table, though.
|
// TODO add this for more inventories? Only seems to glitch out the cartography table, though.
|
||||||
ConsumeStackRequestActionData consumeData = (ConsumeStackRequestActionData) action;
|
ConsumeStackRequestActionData consumeData = (ConsumeStackRequestActionData) action;
|
||||||
@ -367,8 +363,9 @@ public abstract class InventoryTranslator {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CRAFT_NON_IMPLEMENTED_DEPRECATED:
|
case CRAFT_RECIPE_AUTO: // Called by villagers
|
||||||
case CRAFT_RESULTS_DEPRECATED:
|
case CRAFT_NON_IMPLEMENTED_DEPRECATED: // Tends to be called for UI inventories
|
||||||
|
case CRAFT_RESULTS_DEPRECATED: // Tends to be called for UI inventories
|
||||||
case CRAFT_RECIPE_OPTIONAL: { // Anvils and cartography tables will handle this
|
case CRAFT_RECIPE_OPTIONAL: { // Anvils and cartography tables will handle this
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -391,7 +388,6 @@ public abstract class InventoryTranslator {
|
|||||||
for (StackRequestActionData action : request.getActions()) {
|
for (StackRequestActionData action : request.getActions()) {
|
||||||
switch (action.getType()) {
|
switch (action.getType()) {
|
||||||
case CRAFT_RECIPE: {
|
case CRAFT_RECIPE: {
|
||||||
CraftRecipeStackRequestActionData craftAction = (CraftRecipeStackRequestActionData) action;
|
|
||||||
if (craftState != CraftState.START) {
|
if (craftState != CraftState.START) {
|
||||||
return rejectRequest(request);
|
return rejectRequest(request);
|
||||||
}
|
}
|
||||||
@ -716,10 +712,19 @@ public abstract class InventoryTranslator {
|
|||||||
return new ItemStackResponsePacket.Response(ItemStackResponsePacket.ResponseStatus.OK, request.getRequestId(), containerEntries);
|
return new ItemStackResponsePacket.Response(ItemStackResponsePacket.ResponseStatus.OK, request.getRequestId(), containerEntries);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reject an incorrect ItemStackRequest.
|
||||||
|
*/
|
||||||
public static ItemStackResponsePacket.Response rejectRequest(ItemStackRequest request) {
|
public static ItemStackResponsePacket.Response rejectRequest(ItemStackRequest request) {
|
||||||
return rejectRequest(request, true);
|
return rejectRequest(request, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reject an incorrect ItemStackRequest.
|
||||||
|
*
|
||||||
|
* @param throwError whether this request was truly erroneous (true), or known as an outcome and should not be treated
|
||||||
|
* as bad (false).
|
||||||
|
*/
|
||||||
public static ItemStackResponsePacket.Response rejectRequest(ItemStackRequest request, boolean throwError) {
|
public static ItemStackResponsePacket.Response rejectRequest(ItemStackRequest request, boolean throwError) {
|
||||||
if (throwError) {
|
if (throwError) {
|
||||||
// Currently for debugging, but might be worth it to keep in the future if something goes terribly wrong.
|
// Currently for debugging, but might be worth it to keep in the future if something goes terribly wrong.
|
||||||
|
@ -31,6 +31,7 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityData;
|
|||||||
import com.nukkitx.protocol.bedrock.data.entity.EntityDataMap;
|
import com.nukkitx.protocol.bedrock.data.entity.EntityDataMap;
|
||||||
import com.nukkitx.protocol.bedrock.data.entity.EntityLinkData;
|
import com.nukkitx.protocol.bedrock.data.entity.EntityLinkData;
|
||||||
import com.nukkitx.protocol.bedrock.data.inventory.*;
|
import com.nukkitx.protocol.bedrock.data.inventory.*;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.ItemStackResponsePacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.SetEntityLinkPacket;
|
import com.nukkitx.protocol.bedrock.packet.SetEntityLinkPacket;
|
||||||
import org.geysermc.connector.entity.Entity;
|
import org.geysermc.connector.entity.Entity;
|
||||||
import org.geysermc.connector.entity.type.EntityType;
|
import org.geysermc.connector.entity.type.EntityType;
|
||||||
@ -137,6 +138,13 @@ public class MerchantInventoryTranslator extends BaseInventoryTranslator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStackResponsePacket.Response translateAutoCraftingRequest(GeyserSession session, Inventory inventory, ItemStackRequest request) {
|
||||||
|
// We're not crafting here
|
||||||
|
// Called at least by consoles when pressing a trade option button
|
||||||
|
return translateRequest(session, inventory, request);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateInventory(GeyserSession session, Inventory inventory) {
|
public void updateInventory(GeyserSession session, Inventory inventory) {
|
||||||
updater.updateInventory(this, session, inventory);
|
updater.updateInventory(this, session, inventory);
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren