mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Start on 1.20.5 mod platform support - NeoForge (temporarily) excluded
Also fixes lecterns, and block break speed calculations
This commit is contained in:
parent
c34f0f2c3b
commit
6a5efa3c9d
15 changed files with 110 additions and 179 deletions
|
@ -26,10 +26,11 @@
|
|||
package org.geysermc.geyser.translator.inventory;
|
||||
|
||||
import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType;
|
||||
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
|
||||
import com.github.steveice10.mc.protocol.data.game.item.component.WritableBookContent;
|
||||
import com.github.steveice10.mc.protocol.data.game.item.component.WrittenBookContent;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundContainerButtonClickPacket;
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundContainerClosePacket;
|
||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||
import com.github.steveice10.opennbt.tag.builtin.ListTag;
|
||||
import org.cloudburstmc.math.vector.Vector3i;
|
||||
import org.cloudburstmc.nbt.NbtMap;
|
||||
import org.cloudburstmc.nbt.NbtMapBuilder;
|
||||
|
@ -152,7 +153,6 @@ public class LecternInventoryTranslator extends AbstractBlockInventoryTranslator
|
|||
session.setDroppingLecternBook(false);
|
||||
InventoryUtils.closeInventory(session, inventory.getJavaId(), false);
|
||||
} else if (lecternContainer.getBlockEntityTag() == null) {
|
||||
CompoundTag tag = book.getNbt();
|
||||
Vector3i position = lecternContainer.isUsingRealBlock() ? session.getLastInteractionBlockPosition() : inventory.getHolderPosition();
|
||||
|
||||
// If shouldExpectLecternHandled returns true, this is already handled for us
|
||||
|
@ -163,10 +163,20 @@ public class LecternInventoryTranslator extends AbstractBlockInventoryTranslator
|
|||
&& !GameProtocol.is1_20_60orHigher(session.getUpstream().getProtocolVersion());
|
||||
|
||||
NbtMap blockEntityTag;
|
||||
if (tag != null) {
|
||||
int pagesSize = ((ListTag) tag.get("pages")).size();
|
||||
if (book.getComponents() != null) {
|
||||
int pages = 0;
|
||||
WrittenBookContent writtenBookComponents = book.getComponents().get(DataComponentType.WRITTEN_BOOK_CONTENT);
|
||||
if (writtenBookComponents != null) {
|
||||
pages = writtenBookComponents.getPages().size();
|
||||
} else {
|
||||
WritableBookContent writableBookComponents = book.getComponents().get(DataComponentType.WRITABLE_BOOK_CONTENT);
|
||||
if (writableBookComponents != null) {
|
||||
pages = writableBookComponents.getPages().size();
|
||||
}
|
||||
}
|
||||
|
||||
ItemData itemData = book.getItemData(session);
|
||||
NbtMapBuilder lecternTag = LecternUtils.getBaseLecternTag(position.getX(), position.getY(), position.getZ(), pagesSize);
|
||||
NbtMapBuilder lecternTag = LecternUtils.getBaseLecternTag(position.getX(), position.getY(), position.getZ(), pages);
|
||||
lecternTag.putCompound("book", NbtMap.builder()
|
||||
.putByte("Count", (byte) itemData.getCount())
|
||||
.putShort("Damage", (short) 0)
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
package org.geysermc.geyser.translator.protocol.java.level;
|
||||
|
||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundBlockDestructionPacket;
|
||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||
import org.cloudburstmc.protocol.bedrock.data.LevelEvent;
|
||||
import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket;
|
||||
import org.geysermc.geyser.registry.BlockRegistries;
|
||||
|
@ -43,7 +42,7 @@ public class JavaBlockDestructionTranslator extends PacketTranslator<Clientbound
|
|||
@Override
|
||||
public void translate(GeyserSession session, ClientboundBlockDestructionPacket packet) {
|
||||
int state = session.getGeyser().getWorldManager().getBlockAt(session, packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ());
|
||||
int breakTime = (int) (65535 / Math.ceil(BlockUtils.getBreakTime(session, BlockRegistries.JAVA_BLOCKS.getOrDefault(state, BlockMapping.DEFAULT), ItemMapping.AIR, new CompoundTag(""), false) * 20));
|
||||
int breakTime = (int) (65535 / Math.ceil(BlockUtils.getBreakTime(session, BlockRegistries.JAVA_BLOCKS.getOrDefault(state, BlockMapping.DEFAULT), ItemMapping.AIR, null, false) * 20));
|
||||
LevelEventPacket levelEventPacket = new LevelEventPacket();
|
||||
levelEventPacket.setPosition(packet.getPosition().toFloat());
|
||||
levelEventPacket.setType(LevelEvent.BLOCK_START_BREAK);
|
||||
|
|
|
@ -25,11 +25,12 @@
|
|||
|
||||
package org.geysermc.geyser.util;
|
||||
|
||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
import org.cloudburstmc.math.vector.Vector3i;
|
||||
import org.geysermc.geyser.inventory.GeyserItemStack;
|
||||
import org.geysermc.geyser.inventory.PlayerInventory;
|
||||
import org.geysermc.geyser.inventory.item.Enchantment;
|
||||
import org.geysermc.geyser.level.block.BlockStateValues;
|
||||
import org.geysermc.geyser.registry.BlockRegistries;
|
||||
import org.geysermc.geyser.registry.type.BlockMapping;
|
||||
|
@ -40,28 +41,23 @@ import org.geysermc.geyser.translator.collision.BlockCollision;
|
|||
public final class BlockUtils {
|
||||
|
||||
private static boolean correctTool(GeyserSession session, BlockMapping blockMapping, String itemToolType) {
|
||||
switch (itemToolType) {
|
||||
case "axe":
|
||||
return session.getTagCache().isAxeEffective(blockMapping);
|
||||
case "hoe":
|
||||
return session.getTagCache().isHoeEffective(blockMapping);
|
||||
case "pickaxe":
|
||||
return session.getTagCache().isPickaxeEffective(blockMapping);
|
||||
case "shears":
|
||||
return session.getTagCache().isShearsEffective(blockMapping);
|
||||
case "shovel":
|
||||
return session.getTagCache().isShovelEffective(blockMapping);
|
||||
case "sword":
|
||||
return blockMapping.getJavaBlockId() == BlockStateValues.JAVA_COBWEB_ID;
|
||||
default:
|
||||
return switch (itemToolType) {
|
||||
case "axe" -> session.getTagCache().isAxeEffective(blockMapping);
|
||||
case "hoe" -> session.getTagCache().isHoeEffective(blockMapping);
|
||||
case "pickaxe" -> session.getTagCache().isPickaxeEffective(blockMapping);
|
||||
case "shears" -> session.getTagCache().isShearsEffective(blockMapping);
|
||||
case "shovel" -> session.getTagCache().isShovelEffective(blockMapping);
|
||||
case "sword" -> blockMapping.getJavaBlockId() == BlockStateValues.JAVA_COBWEB_ID;
|
||||
default -> {
|
||||
session.getGeyser().getLogger().warning("Unknown tool type: " + itemToolType);
|
||||
return false;
|
||||
}
|
||||
yield false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static double toolBreakTimeBonus(String toolType, String toolTier, boolean isShearsEffective) {
|
||||
if (toolType.equals("shears")) return isShearsEffective ? 5.0 : 15.0;
|
||||
if (toolType.equals("")) return 1.0;
|
||||
if (toolType.isEmpty()) return 1.0;
|
||||
return switch (toolTier) {
|
||||
// https://minecraft.wiki/w/Breaking#Speed
|
||||
case "wooden" -> 2.0;
|
||||
|
@ -134,7 +130,7 @@ public final class BlockUtils {
|
|||
return 1.0 / speed;
|
||||
}
|
||||
|
||||
public static double getBreakTime(GeyserSession session, BlockMapping blockMapping, ItemMapping item, @Nullable CompoundTag nbtData, boolean isSessionPlayer) {
|
||||
public static double getBreakTime(GeyserSession session, BlockMapping blockMapping, ItemMapping item, @Nullable DataComponents components, boolean isSessionPlayer) {
|
||||
boolean isShearsEffective = session.getTagCache().isShearsEffective(blockMapping); //TODO called twice
|
||||
boolean canHarvestWithHand = blockMapping.isCanBreakWithHand();
|
||||
String toolType = "";
|
||||
|
@ -147,7 +143,8 @@ public final class BlockUtils {
|
|||
correctTool = correctTool(session, blockMapping, toolType);
|
||||
toolCanBreak = canToolTierBreakBlock(session, blockMapping, toolTier);
|
||||
}
|
||||
int toolEfficiencyLevel = ItemUtils.getEnchantmentLevel(nbtData, "minecraft:efficiency");
|
||||
|
||||
int toolEfficiencyLevel = ItemUtils.getEnchantmentLevel(components, Enchantment.JavaEnchantment.EFFICIENCY.ordinal());
|
||||
int hasteLevel = 0;
|
||||
int miningFatigueLevel = 0;
|
||||
|
||||
|
@ -162,7 +159,7 @@ public final class BlockUtils {
|
|||
|
||||
boolean waterInEyes = session.getCollisionManager().isWaterInEyes();
|
||||
boolean insideOfWaterWithoutAquaAffinity = waterInEyes &&
|
||||
ItemUtils.getEnchantmentLevel(session.getPlayerInventory().getItem(5).getNbt(), "minecraft:aqua_affinity") < 1;
|
||||
ItemUtils.getEnchantmentLevel(session.getPlayerInventory().getItem(5).getComponents(), Enchantment.JavaEnchantment.AQUA_AFFINITY.ordinal()) < 1;
|
||||
|
||||
return calculateBreakTime(blockMapping.getHardness(), toolTier, canHarvestWithHand, correctTool, toolCanBreak, toolType, isShearsEffective,
|
||||
toolEfficiencyLevel, hasteLevel, miningFatigueLevel, insideOfWaterWithoutAquaAffinity, session.getPlayerEntity().isOnGround());
|
||||
|
@ -172,12 +169,12 @@ public final class BlockUtils {
|
|||
PlayerInventory inventory = session.getPlayerInventory();
|
||||
GeyserItemStack item = inventory.getItemInHand();
|
||||
ItemMapping mapping = ItemMapping.AIR;
|
||||
CompoundTag nbtData = null;
|
||||
DataComponents components = null;
|
||||
if (item != null) {
|
||||
mapping = item.getMapping(session);
|
||||
nbtData = item.getNbt();
|
||||
components = item.getComponents();
|
||||
}
|
||||
return getBreakTime(session, blockMapping, mapping, nbtData, true);
|
||||
return getBreakTime(session, blockMapping, mapping, components, true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -27,10 +27,7 @@ package org.geysermc.geyser.util;
|
|||
|
||||
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
|
||||
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
|
||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||
import com.github.steveice10.opennbt.tag.builtin.ListTag;
|
||||
import com.github.steveice10.opennbt.tag.builtin.StringTag;
|
||||
import com.github.steveice10.opennbt.tag.builtin.Tag;
|
||||
import com.github.steveice10.mc.protocol.data.game.item.component.ItemEnchantments;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
import org.geysermc.geyser.item.Items;
|
||||
|
@ -39,24 +36,17 @@ import org.geysermc.geyser.item.type.Item;
|
|||
|
||||
public class ItemUtils {
|
||||
|
||||
public static int getEnchantmentLevel(@Nullable CompoundTag itemNBTData, String enchantmentId) {
|
||||
if (itemNBTData == null) {
|
||||
public static int getEnchantmentLevel(@Nullable DataComponents components, int enchantmentId) {
|
||||
if (components == null) {
|
||||
return 0;
|
||||
}
|
||||
ListTag enchantments = itemNBTData.get("Enchantments");
|
||||
if (enchantments != null) {
|
||||
for (Tag tag : enchantments) {
|
||||
CompoundTag enchantment = (CompoundTag) tag;
|
||||
StringTag enchantId = enchantment.get("id");
|
||||
if (enchantId.getValue().equals(enchantmentId)) {
|
||||
Tag lvl = enchantment.get("lvl");
|
||||
if (lvl != null && lvl.getValue() instanceof Number number) {
|
||||
return number.intValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ItemEnchantments enchantmentData = components.get(DataComponentType.ENCHANTMENTS);
|
||||
if (enchantmentData == null) {
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
||||
return enchantmentData.getEnchantments().getOrDefault(enchantmentId, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue