mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Remove duplicate inventory logic
This commit is contained in:
parent
5ddb0ad90a
commit
3338f5c707
3 changed files with 33 additions and 43 deletions
|
@ -25,7 +25,6 @@
|
||||||
|
|
||||||
package org.geysermc.geyser.inventory.holder;
|
package org.geysermc.geyser.inventory.holder;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
|
||||||
import com.nukkitx.math.vector.Vector3i;
|
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;
|
||||||
|
@ -35,11 +34,11 @@ import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
|
import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
|
||||||
import org.geysermc.geyser.inventory.Container;
|
import org.geysermc.geyser.inventory.Container;
|
||||||
import org.geysermc.geyser.inventory.Inventory;
|
import org.geysermc.geyser.inventory.Inventory;
|
||||||
import org.geysermc.geyser.level.BedrockDimension;
|
|
||||||
import org.geysermc.geyser.registry.BlockRegistries;
|
import org.geysermc.geyser.registry.BlockRegistries;
|
||||||
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.geysermc.geyser.util.BlockUtils;
|
import org.geysermc.geyser.util.BlockUtils;
|
||||||
|
import org.geysermc.geyser.util.InventoryUtils;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
@ -50,8 +49,6 @@ import java.util.Set;
|
||||||
* This class will attempt to use a real block first, if possible.
|
* This class will attempt to use a real block first, if possible.
|
||||||
*/
|
*/
|
||||||
public class BlockInventoryHolder extends InventoryHolder {
|
public class BlockInventoryHolder extends InventoryHolder {
|
||||||
private static final int FAKE_BLOCK_DISTANCE = 1;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default Java block ID to translate as a fake block
|
* The default Java block ID to translate as a fake block
|
||||||
*/
|
*/
|
||||||
|
@ -66,7 +63,7 @@ public class BlockInventoryHolder extends InventoryHolder {
|
||||||
Set<String> validBlocksTemp = new HashSet<>(validBlocks.length + 1);
|
Set<String> validBlocksTemp = new HashSet<>(validBlocks.length + 1);
|
||||||
Collections.addAll(validBlocksTemp, validBlocks);
|
Collections.addAll(validBlocksTemp, validBlocks);
|
||||||
validBlocksTemp.add(BlockUtils.getCleanIdentifier(javaBlockIdentifier));
|
validBlocksTemp.add(BlockUtils.getCleanIdentifier(javaBlockIdentifier));
|
||||||
this.validBlocks = ImmutableSet.copyOf(validBlocksTemp);
|
this.validBlocks = Set.copyOf(validBlocksTemp);
|
||||||
} else {
|
} else {
|
||||||
this.validBlocks = Collections.singleton(BlockUtils.getCleanIdentifier(javaBlockIdentifier));
|
this.validBlocks = Collections.singleton(BlockUtils.getCleanIdentifier(javaBlockIdentifier));
|
||||||
}
|
}
|
||||||
|
@ -91,20 +88,10 @@ public class BlockInventoryHolder extends InventoryHolder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if a fake block can be placed, either above the player or beneath.
|
Vector3i position = InventoryUtils.findAvailableWorldSpace(session);
|
||||||
BedrockDimension dimension = session.getChunkCache().getBedrockDimension();
|
if (position == null) {
|
||||||
int minY = dimension.minY(), maxY = minY + dimension.height();
|
|
||||||
Vector3i flatPlayerPosition = session.getPlayerEntity().getPosition().toInt();
|
|
||||||
Vector3i position = flatPlayerPosition.add(Vector3i.UP);
|
|
||||||
if (position.getY() < minY) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (position.getY() >= maxY) {
|
|
||||||
position = flatPlayerPosition.sub(0, 4, 0);
|
|
||||||
if (position.getY() >= maxY) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateBlockPacket blockPacket = new UpdateBlockPacket();
|
UpdateBlockPacket blockPacket = new UpdateBlockPacket();
|
||||||
blockPacket.setDataLayer(0);
|
blockPacket.setDataLayer(0);
|
||||||
|
|
|
@ -35,12 +35,12 @@ import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
|
import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
|
||||||
import org.geysermc.geyser.inventory.Container;
|
import org.geysermc.geyser.inventory.Container;
|
||||||
import org.geysermc.geyser.inventory.Inventory;
|
import org.geysermc.geyser.inventory.Inventory;
|
||||||
import org.geysermc.geyser.level.BedrockDimension;
|
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
|
||||||
import org.geysermc.geyser.level.block.BlockStateValues;
|
import org.geysermc.geyser.level.block.BlockStateValues;
|
||||||
import org.geysermc.geyser.level.block.DoubleChestValue;
|
import org.geysermc.geyser.level.block.DoubleChestValue;
|
||||||
import org.geysermc.geyser.translator.level.block.entity.DoubleChestBlockEntityTranslator;
|
|
||||||
import org.geysermc.geyser.registry.BlockRegistries;
|
import org.geysermc.geyser.registry.BlockRegistries;
|
||||||
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
import org.geysermc.geyser.translator.level.block.entity.DoubleChestBlockEntityTranslator;
|
||||||
|
import org.geysermc.geyser.util.InventoryUtils;
|
||||||
|
|
||||||
public class DoubleChestInventoryTranslator extends ChestInventoryTranslator {
|
public class DoubleChestInventoryTranslator extends ChestInventoryTranslator {
|
||||||
private final int defaultJavaBlockState;
|
private final int defaultJavaBlockState;
|
||||||
|
@ -82,19 +82,10 @@ public class DoubleChestInventoryTranslator extends ChestInventoryTranslator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if a fake block can be placed, either above the player or beneath.
|
Vector3i position = InventoryUtils.findAvailableWorldSpace(session);
|
||||||
BedrockDimension dimension = session.getChunkCache().getBedrockDimension();
|
if (position == null) {
|
||||||
int minY = dimension.minY(), maxY = minY + dimension.height();
|
|
||||||
Vector3i position = session.getPlayerEntity().getPosition().toInt().add(0, 5, 0);
|
|
||||||
if (position.getY() < minY) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (position.getY() >= maxY) {
|
|
||||||
position = session.getPlayerEntity().getPosition().toInt().sub(0, 5, 0);
|
|
||||||
if (position.getY() >= maxY) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector3i pairPosition = position.add(Vector3i.UNIT_X);
|
Vector3i pairPosition = position.add(Vector3i.UNIT_X);
|
||||||
int bedrockBlockId = session.getBlockMappings().getBedrockBlockId(defaultJavaBlockState);
|
int bedrockBlockId = session.getBlockMappings().getBedrockBlockId(defaultJavaBlockState);
|
||||||
|
|
|
@ -31,6 +31,7 @@ import com.github.steveice10.mc.protocol.data.game.recipe.Ingredient;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundPickItemPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundPickItemPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSetCreativeModeSlotPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSetCreativeModeSlotPacket;
|
||||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||||
|
import com.nukkitx.math.vector.Vector3i;
|
||||||
import com.nukkitx.nbt.NbtMap;
|
import com.nukkitx.nbt.NbtMap;
|
||||||
import com.nukkitx.nbt.NbtMapBuilder;
|
import com.nukkitx.nbt.NbtMapBuilder;
|
||||||
import com.nukkitx.nbt.NbtType;
|
import com.nukkitx.nbt.NbtType;
|
||||||
|
@ -46,6 +47,7 @@ import org.geysermc.geyser.inventory.click.Click;
|
||||||
import org.geysermc.geyser.inventory.recipe.GeyserRecipe;
|
import org.geysermc.geyser.inventory.recipe.GeyserRecipe;
|
||||||
import org.geysermc.geyser.inventory.recipe.GeyserShapedRecipe;
|
import org.geysermc.geyser.inventory.recipe.GeyserShapedRecipe;
|
||||||
import org.geysermc.geyser.inventory.recipe.GeyserShapelessRecipe;
|
import org.geysermc.geyser.inventory.recipe.GeyserShapelessRecipe;
|
||||||
|
import org.geysermc.geyser.level.BedrockDimension;
|
||||||
import org.geysermc.geyser.registry.Registries;
|
import org.geysermc.geyser.registry.Registries;
|
||||||
import org.geysermc.geyser.registry.type.ItemMapping;
|
import org.geysermc.geyser.registry.type.ItemMapping;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
@ -134,6 +136,28 @@ public class InventoryUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds a usable block space in the world to place a fake inventory block, and returns the position.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static Vector3i findAvailableWorldSpace(GeyserSession session) {
|
||||||
|
// Check if a fake block can be placed, either above the player or beneath.
|
||||||
|
BedrockDimension dimension = session.getChunkCache().getBedrockDimension();
|
||||||
|
int minY = dimension.minY(), maxY = minY + dimension.height();
|
||||||
|
Vector3i flatPlayerPosition = session.getPlayerEntity().getPosition().toInt();
|
||||||
|
Vector3i position = flatPlayerPosition.add(Vector3i.UP);
|
||||||
|
if (position.getY() < minY) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (position.getY() >= maxY) {
|
||||||
|
position = flatPlayerPosition.sub(0, 4, 0);
|
||||||
|
if (position.getY() >= maxY) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
public static void updateCursor(GeyserSession session) {
|
public static void updateCursor(GeyserSession session) {
|
||||||
InventorySlotPacket cursorPacket = new InventorySlotPacket();
|
InventorySlotPacket cursorPacket = new InventorySlotPacket();
|
||||||
cursorPacket.setContainerId(ContainerId.UI);
|
cursorPacket.setContainerId(ContainerId.UI);
|
||||||
|
@ -148,18 +172,6 @@ public class InventoryUtils {
|
||||||
return item1.getJavaId() == item2.getJavaId() && Objects.equals(item1.getNbt(), item2.getNbt());
|
return item1.getJavaId() == item2.getJavaId() && Objects.equals(item1.getNbt(), item2.getNbt());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean canStack(ItemStack item1, ItemStack item2) {
|
|
||||||
if (item1 == null || item2 == null)
|
|
||||||
return false;
|
|
||||||
return item1.getId() == item2.getId() && Objects.equals(item1.getNbt(), item2.getNbt());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean canStack(ItemData item1, ItemData item2) {
|
|
||||||
if (item1 == null || item2 == null)
|
|
||||||
return false;
|
|
||||||
return item1.equals(item2, false, true, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks to see if an item stack represents air or has no count.
|
* Checks to see if an item stack represents air or has no count.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue