mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Add swap support for creative mode; start on cartography table
This commit is contained in:
parent
3d0b0a1076
commit
c7fade295e
3 changed files with 145 additions and 11 deletions
|
@ -82,6 +82,7 @@ public abstract class InventoryTranslator {
|
||||||
put(WindowType.ANVIL, new AnvilInventoryTranslator());
|
put(WindowType.ANVIL, new AnvilInventoryTranslator());
|
||||||
put(WindowType.BEACON, new BeaconInventoryTranslator());
|
put(WindowType.BEACON, new BeaconInventoryTranslator());
|
||||||
put(WindowType.BREWING_STAND, new BrewingInventoryTranslator());
|
put(WindowType.BREWING_STAND, new BrewingInventoryTranslator());
|
||||||
|
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.GRINDSTONE, new GrindstoneInventoryTranslator());
|
put(WindowType.GRINDSTONE, new GrindstoneInventoryTranslator());
|
||||||
|
@ -96,7 +97,6 @@ public abstract class InventoryTranslator {
|
||||||
put(WindowType.HOPPER, new GenericBlockInventoryTranslator(5, "minecraft:hopper[enabled=false,facing=down]", ContainerType.HOPPER));
|
put(WindowType.HOPPER, new GenericBlockInventoryTranslator(5, "minecraft:hopper[enabled=false,facing=down]", ContainerType.HOPPER));
|
||||||
|
|
||||||
/* todo */
|
/* todo */
|
||||||
//put(WindowType.CARTOGRAPHY
|
|
||||||
// horse
|
// horse
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -122,9 +122,11 @@ public abstract class InventoryTranslator {
|
||||||
* Should be overwritten in cases where specific inventories should reject an item being in a specific spot.
|
* Should be overwritten in cases where specific inventories should reject an item being in a specific spot.
|
||||||
* For examples, looms use this to reject items that are dyes in Bedrock but not in Java.
|
* For examples, looms use this to reject items that are dyes in Bedrock but not in Java.
|
||||||
*
|
*
|
||||||
|
* javaSourceSlot will be -1 if the cursor is the source
|
||||||
|
*
|
||||||
* @return true if this transfer should be rejected
|
* @return true if this transfer should be rejected
|
||||||
*/
|
*/
|
||||||
public boolean shouldRejectItemPlace(GeyserSession session, Inventory inventory, int javaDestinationSlot) {
|
public boolean shouldRejectItemPlace(GeyserSession session, Inventory inventory, int javaSourceSlot, int javaDestinationSlot) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,9 +190,10 @@ public abstract class InventoryTranslator {
|
||||||
return rejectRequest(request);
|
return rejectRequest(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sourceSlot = bedrockSlotToJava(transferAction.getSource());
|
||||||
int destSlot = bedrockSlotToJava(transferAction.getDestination());
|
int destSlot = bedrockSlotToJava(transferAction.getDestination());
|
||||||
|
|
||||||
if (shouldRejectItemPlace(session, inventory, destSlot)) {
|
if (shouldRejectItemPlace(session, inventory, isCursor(transferAction.getSource()) ? -1 :sourceSlot, destSlot)) {
|
||||||
// This item would not be here in Java
|
// This item would not be here in Java
|
||||||
return rejectRequest(request, false);
|
return rejectRequest(request, false);
|
||||||
}
|
}
|
||||||
|
@ -199,7 +202,6 @@ public abstract class InventoryTranslator {
|
||||||
return rejectRequest(request);
|
return rejectRequest(request);
|
||||||
} else if (session.getGameMode().equals(GameMode.CREATIVE) && inventory instanceof PlayerInventory) { // TODO: does the Java server use this stuff all the time in creative?
|
} else if (session.getGameMode().equals(GameMode.CREATIVE) && inventory instanceof PlayerInventory) { // TODO: does the Java server use this stuff all the time in creative?
|
||||||
// Creative acts a little differently because it just edits slots
|
// Creative acts a little differently because it just edits slots
|
||||||
int sourceSlot = bedrockSlotToJava(transferAction.getSource());
|
|
||||||
boolean sourceIsCursor = isCursor(transferAction.getSource());
|
boolean sourceIsCursor = isCursor(transferAction.getSource());
|
||||||
boolean destIsCursor = isCursor(transferAction.getDestination());
|
boolean destIsCursor = isCursor(transferAction.getDestination());
|
||||||
|
|
||||||
|
@ -228,6 +230,15 @@ public abstract class InventoryTranslator {
|
||||||
affectedSlots.add(destSlot);
|
affectedSlots.add(destSlot);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// Delete the source since we're moving it
|
||||||
|
inventory.setItem(sourceSlot, GeyserItemStack.EMPTY);
|
||||||
|
ClientCreativeInventoryActionPacket creativeActionPacket = new ClientCreativeInventoryActionPacket(
|
||||||
|
sourceSlot,
|
||||||
|
new ItemStack(0)
|
||||||
|
);
|
||||||
|
session.sendDownstreamPacket(creativeActionPacket);
|
||||||
|
affectedSlots.add(sourceSlot);
|
||||||
}
|
}
|
||||||
// Update the item count with however much the client took
|
// Update the item count with however much the client took
|
||||||
newItem.setAmount(transferAction.getCount());
|
newItem.setAmount(transferAction.getCount());
|
||||||
|
@ -273,7 +284,6 @@ public abstract class InventoryTranslator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (isCursor(transferAction.getDestination())) { //picking up into cursor
|
} else if (isCursor(transferAction.getDestination())) { //picking up into cursor
|
||||||
int sourceSlot = bedrockSlotToJava(transferAction.getSource());
|
|
||||||
GeyserItemStack sourceItem = plan.getItem(sourceSlot);
|
GeyserItemStack sourceItem = plan.getItem(sourceSlot);
|
||||||
int sourceAmount = sourceItem.getAmount();
|
int sourceAmount = sourceItem.getAmount();
|
||||||
if (cursor.isEmpty()) { //picking up into empty cursor
|
if (cursor.isEmpty()) { //picking up into empty cursor
|
||||||
|
@ -303,7 +313,6 @@ public abstract class InventoryTranslator {
|
||||||
if (!cursor.isEmpty()) { //TODO: handle slot transfer when cursor is already in use (temp slot)
|
if (!cursor.isEmpty()) { //TODO: handle slot transfer when cursor is already in use (temp slot)
|
||||||
return rejectRequest(request);
|
return rejectRequest(request);
|
||||||
}
|
}
|
||||||
int sourceSlot = bedrockSlotToJava(transferAction.getSource());
|
|
||||||
int sourceAmount = plan.getItem(sourceSlot).getAmount();
|
int sourceAmount = plan.getItem(sourceSlot).getAmount();
|
||||||
if (transferAction.getCount() == sourceAmount) { //transfer all
|
if (transferAction.getCount() == sourceAmount) { //transfer all
|
||||||
plan.add(Click.LEFT, sourceSlot); //pickup source
|
plan.add(Click.LEFT, sourceSlot); //pickup source
|
||||||
|
@ -339,7 +348,37 @@ public abstract class InventoryTranslator {
|
||||||
if (!(checkNetId(session, inventory, swapAction.getSource()) && checkNetId(session, inventory, swapAction.getDestination())))
|
if (!(checkNetId(session, inventory, swapAction.getSource()) && checkNetId(session, inventory, swapAction.getDestination())))
|
||||||
return rejectRequest(request);
|
return rejectRequest(request);
|
||||||
|
|
||||||
if (isCursor(swapAction.getSource()) && isCursor(swapAction.getDestination())) { //???
|
if (session.getGameMode().equals(GameMode.CREATIVE) && inventory instanceof PlayerInventory) {
|
||||||
|
int destSlot = bedrockSlotToJava(swapAction.getDestination());
|
||||||
|
GeyserItemStack oldSourceItem;
|
||||||
|
GeyserItemStack oldDestinationItem = inventory.getItem(destSlot);
|
||||||
|
if (isCursor(swapAction.getSource())) {
|
||||||
|
oldSourceItem = session.getPlayerInventory().getCursor();
|
||||||
|
session.getPlayerInventory().setCursor(oldDestinationItem);
|
||||||
|
} else {
|
||||||
|
int sourceSlot = bedrockSlotToJava(swapAction.getSource());
|
||||||
|
oldSourceItem = inventory.getItem(sourceSlot);
|
||||||
|
ClientCreativeInventoryActionPacket creativeActionPacket = new ClientCreativeInventoryActionPacket(
|
||||||
|
sourceSlot,
|
||||||
|
oldDestinationItem.isEmpty() ? new ItemStack(0) : oldDestinationItem.getItemStack() // isEmpty check... just in case
|
||||||
|
);
|
||||||
|
System.out.println(creativeActionPacket);
|
||||||
|
session.sendDownstreamPacket(creativeActionPacket);
|
||||||
|
inventory.setItem(sourceSlot, oldDestinationItem);
|
||||||
|
}
|
||||||
|
if (isCursor(swapAction.getDestination())) {
|
||||||
|
session.getPlayerInventory().setCursor(oldSourceItem);
|
||||||
|
} else {
|
||||||
|
ClientCreativeInventoryActionPacket creativeActionPacket = new ClientCreativeInventoryActionPacket(
|
||||||
|
destSlot,
|
||||||
|
oldSourceItem.isEmpty() ? new ItemStack(0) : oldSourceItem.getItemStack()
|
||||||
|
);
|
||||||
|
System.out.println(creativeActionPacket);
|
||||||
|
session.sendDownstreamPacket(creativeActionPacket);
|
||||||
|
inventory.setItem(destSlot, oldSourceItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (isCursor(swapAction.getSource()) && isCursor(swapAction.getDestination())) { //???
|
||||||
return rejectRequest(request);
|
return rejectRequest(request);
|
||||||
} else if (isCursor(swapAction.getSource())) { //swap cursor
|
} else if (isCursor(swapAction.getSource())) { //swap cursor
|
||||||
int destSlot = bedrockSlotToJava(swapAction.getDestination());
|
int destSlot = bedrockSlotToJava(swapAction.getDestination());
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.connector.network.translators.inventory.translators;
|
||||||
|
|
||||||
|
import com.nukkitx.protocol.bedrock.data.inventory.ContainerSlotType;
|
||||||
|
import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
|
||||||
|
import com.nukkitx.protocol.bedrock.data.inventory.StackRequestSlotInfoData;
|
||||||
|
import org.geysermc.connector.inventory.GeyserItemStack;
|
||||||
|
import org.geysermc.connector.inventory.Inventory;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.inventory.BedrockContainerSlot;
|
||||||
|
import org.geysermc.connector.network.translators.inventory.updater.UIInventoryUpdater;
|
||||||
|
import org.geysermc.connector.network.translators.item.ItemRegistry;
|
||||||
|
|
||||||
|
public class CartographyInventoryTranslator extends AbstractBlockInventoryTranslator {
|
||||||
|
public CartographyInventoryTranslator() {
|
||||||
|
super(3, "minecraft:cartography_table", ContainerType.CARTOGRAPHY, UIInventoryUpdater.INSTANCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldRejectItemPlace(GeyserSession session, Inventory inventory, int javaSourceSlot, int javaDestinationSlot) {
|
||||||
|
if (javaDestinationSlot == 1) {
|
||||||
|
// Bedrock Edition can use a compass to create locator maps in the ADDITIONAL slot
|
||||||
|
GeyserItemStack itemStack = javaSourceSlot == -1 ? session.getPlayerInventory().getCursor() : inventory.getItem(javaSourceSlot);
|
||||||
|
return ItemRegistry.getItem(itemStack.getItemStack()).getJavaIdentifier().equals("minecraft:compass");
|
||||||
|
} else if (javaSourceSlot == 2) {
|
||||||
|
// Java doesn't allow an item to be renamed; this is why CARTOGRAPHY_ADDITIONAL could remain empty for Bedrock
|
||||||
|
return inventory.getItem(1).isEmpty();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int bedrockSlotToJava(StackRequestSlotInfoData slotInfoData) {
|
||||||
|
if (slotInfoData.getContainer() == ContainerSlotType.CARTOGRAPHY_INPUT) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (slotInfoData.getContainer() == ContainerSlotType.CARTOGRAPHY_ADDITIONAL) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (slotInfoData.getContainer() == ContainerSlotType.CARTOGRAPHY_RESULT || slotInfoData.getContainer() == ContainerSlotType.CREATIVE_OUTPUT) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
return super.bedrockSlotToJava(slotInfoData);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BedrockContainerSlot javaSlotToBedrockContainer(int slot) {
|
||||||
|
switch (slot) {
|
||||||
|
case 0:
|
||||||
|
return new BedrockContainerSlot(ContainerSlotType.CARTOGRAPHY_INPUT, 12);
|
||||||
|
case 1:
|
||||||
|
return new BedrockContainerSlot(ContainerSlotType.CARTOGRAPHY_ADDITIONAL, 13);
|
||||||
|
case 2:
|
||||||
|
return new BedrockContainerSlot(ContainerSlotType.CARTOGRAPHY_RESULT, 50);
|
||||||
|
}
|
||||||
|
return super.javaSlotToBedrockContainer(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int javaSlotToBedrock(int slot) {
|
||||||
|
switch (slot) {
|
||||||
|
case 0:
|
||||||
|
return 12;
|
||||||
|
case 1:
|
||||||
|
return 13;
|
||||||
|
case 2:
|
||||||
|
return 50;
|
||||||
|
}
|
||||||
|
return super.javaSlotToBedrock(slot);
|
||||||
|
}
|
||||||
|
}
|
|
@ -101,11 +101,11 @@ public class LoomInventoryTranslator extends AbstractBlockInventoryTranslator {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldRejectItemPlace(GeyserSession session, Inventory inventory, int javaDestinationSlot) {
|
public boolean shouldRejectItemPlace(GeyserSession session, Inventory inventory, int javaSourceSlot, int javaDestinationSlot) {
|
||||||
if (javaDestinationSlot != 1) {
|
if (javaDestinationSlot != 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
GeyserItemStack itemStack = session.getPlayerInventory().getCursor();
|
GeyserItemStack itemStack = javaSourceSlot == -1 ? session.getPlayerInventory().getCursor() : inventory.getItem(javaSourceSlot);
|
||||||
if (itemStack.isEmpty()) {
|
if (itemStack.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -129,9 +129,9 @@ public class LoomInventoryTranslator extends AbstractBlockInventoryTranslator {
|
||||||
}
|
}
|
||||||
CraftResultsDeprecatedStackRequestActionData craftData = (CraftResultsDeprecatedStackRequestActionData) data;
|
CraftResultsDeprecatedStackRequestActionData craftData = (CraftResultsDeprecatedStackRequestActionData) data;
|
||||||
// Get the patterns compound tag
|
// Get the patterns compound tag
|
||||||
List<NbtMap> newblockEntityTag = craftData.getResultItems()[0].getTag().getList("Patterns", NbtType.COMPOUND);
|
List<NbtMap> newBlockEntityTag = craftData.getResultItems()[0].getTag().getList("Patterns", NbtType.COMPOUND);
|
||||||
// Get the pattern that the Bedrock client requests - the last pattern in the Patterns list
|
// Get the pattern that the Bedrock client requests - the last pattern in the Patterns list
|
||||||
NbtMap pattern = newblockEntityTag.get(newblockEntityTag.size() - 1);
|
NbtMap pattern = newBlockEntityTag.get(newBlockEntityTag.size() - 1);
|
||||||
// Get the Java index of this pattern
|
// Get the Java index of this pattern
|
||||||
int index = PATTERN_TO_INDEX.getOrDefault(pattern.getString("Pattern"), -1);
|
int index = PATTERN_TO_INDEX.getOrDefault(pattern.getString("Pattern"), -1);
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
|
|
Loading…
Reference in a new issue