diff --git a/connector/pom.xml b/connector/pom.xml
index 6d56fbcad..a5cf6f292 100644
--- a/connector/pom.xml
+++ b/connector/pom.xml
@@ -48,6 +48,18 @@
8.1.1
compile
+
+ com.nukkitx.fastutil
+ fastutil-int-double-maps
+ 8.3.1
+ compile
+
+
+ com.nukkitx.fastutil
+ fastutil-int-boolean-maps
+ 8.3.1
+ compile
+
com.github.steveice10
opennbt
diff --git a/connector/src/main/java/org/geysermc/connector/inventory/PlayerInventory.java b/connector/src/main/java/org/geysermc/connector/inventory/PlayerInventory.java
index a11ce856b..52fb786bc 100644
--- a/connector/src/main/java/org/geysermc/connector/inventory/PlayerInventory.java
+++ b/connector/src/main/java/org/geysermc/connector/inventory/PlayerInventory.java
@@ -50,6 +50,6 @@ public class PlayerInventory extends Inventory {
}
public ItemStack getItemInHand() {
- return items[heldItemSlot];
+ return items[36 + heldItemSlot];
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java
index 18ac3e6dc..330987615 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/block/BlockTranslator.java
@@ -52,6 +52,13 @@ public class BlockTranslator {
private static final IntSet WATERLOGGED = new IntOpenHashSet();
private static final Map JAVA_ID_TO_BLOCK_ENTITY_MAP = new HashMap<>();
+ public static final Int2DoubleMap JAVA_RUNTIME_ID_TO_HARDNESS = new Int2DoubleOpenHashMap();
+ public static final Int2BooleanMap JAVA_RUNTIME_ID_TO_CAN_BREAK_WITH_HAND = new Int2BooleanOpenHashMap();
+ public static final Int2ObjectMap JAVA_RUNTIME_ID_TO_TOOL_TYPE = new Int2ObjectOpenHashMap<>();
+
+ // For block breaking animation math
+ public static final List JAVA_RUNTIME_WOOL_IDS = new ArrayList<>();
+ public static final int JAVA_RUNTIME_COBWEB_ID;
private static final int BLOCK_STATE_VERSION = 17760256;
@@ -87,6 +94,7 @@ public class BlockTranslator {
int waterRuntimeId = -1;
int javaRuntimeId = -1;
int bedrockRuntimeId = 0;
+ int cobwebRuntimeId = -1;
Iterator> blocksIterator = blocks.fields();
while (blocksIterator.hasNext()) {
javaRuntimeId++;
@@ -95,6 +103,28 @@ public class BlockTranslator {
BlockState javaBlockState = new BlockState(javaRuntimeId);
CompoundTag blockTag = buildBedrockState(entry.getValue());
+ // TODO fix this, (no block should have a null hardness)
+ JsonNode hardnessNode = entry.getValue().get("block_hardness");
+ if (hardnessNode != null) {
+ JAVA_RUNTIME_ID_TO_HARDNESS.put(javaRuntimeId, hardnessNode.doubleValue());
+ }
+
+ JAVA_RUNTIME_ID_TO_CAN_BREAK_WITH_HAND.put(javaRuntimeId, entry.getValue().get("can_break_with_hand").booleanValue());
+
+ JsonNode toolTypeNode = entry.getValue().get("tool_type");
+ if (toolTypeNode != null) {
+ JAVA_RUNTIME_ID_TO_TOOL_TYPE.put(javaRuntimeId, toolTypeNode.textValue());
+ }
+
+ if (javaId.contains("wool")) {
+ JAVA_RUNTIME_WOOL_IDS.add(javaRuntimeId);
+ }
+
+
+ if (javaId.contains("cobweb")) {
+ cobwebRuntimeId = javaRuntimeId;
+ }
+
JAVA_ID_BLOCK_MAP.put(javaId, javaBlockState);
if (javaId.contains("sign[")) {
@@ -131,6 +161,11 @@ public class BlockTranslator {
bedrockRuntimeId++;
}
+ if (cobwebRuntimeId == -1) {
+ throw new AssertionError("Unable to find cobwebs in palette");
+ }
+ JAVA_RUNTIME_COBWEB_ID = cobwebRuntimeId;
+
if (waterRuntimeId == -1) {
throw new AssertionError("Unable to find water in palette");
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemEntry.java b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemEntry.java
index fd4f0b020..b5a9eb42c 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemEntry.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemEntry.java
@@ -32,7 +32,7 @@ import lombok.Getter;
@AllArgsConstructor
public class ItemEntry {
- public static ItemEntry AIR = new ItemEntry("minecraft:air", 0, 0, 0);
+ public static ItemEntry AIR = new ItemEntry("minecraft:air", 0, 0, 0, "none", "none");
private String javaIdentifier;
private int javaId;
@@ -40,6 +40,9 @@ public class ItemEntry {
private int bedrockId;
private int bedrockData;
+ private String toolType;
+ private String toolTier;
+
@Override
public boolean equals(Object obj) {
return obj == this || (obj instanceof ItemEntry && ((ItemEntry) obj).getBedrockId() == this.getBedrockId() && ((ItemEntry) obj).getJavaIdentifier().equals(this.getJavaIdentifier()));
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerActionAckTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerActionAckTranslator.java
index 451081a1a..34b1646ad 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerActionAckTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerActionAckTranslator.java
@@ -25,9 +25,17 @@
package org.geysermc.connector.network.translators.java.entity.player;
+import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerActionAckPacket;
+import com.nukkitx.math.vector.Vector3f;
+import com.nukkitx.protocol.bedrock.data.LevelEventType;
+import com.nukkitx.protocol.bedrock.packet.LevelEventPacket;
+import org.geysermc.connector.inventory.PlayerInventory;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.PacketTranslator;
+import org.geysermc.connector.network.translators.TranslatorsInit;
+import org.geysermc.connector.network.translators.block.BlockTranslator;
+import org.geysermc.connector.network.translators.item.ItemEntry;
import org.geysermc.connector.utils.ChunkUtils;
public class JavaPlayerActionAckTranslator extends PacketTranslator {
@@ -38,6 +46,142 @@ public class JavaPlayerActionAckTranslator extends PacketTranslator l >= 1).orElse(false);
+ //boolean outOfWaterButNotOnGround = (!player.isInsideOfWater()) && (!player.isOnGround());
+ //return breakTime0(blockHardness, correctTool, canHarvestWithHand, blockId, itemToolType, itemTier,
+ // efficiencyLoreLevel, hasteEffectLevel, insideOfWaterWithoutAquaAffinity, outOfWaterButNotOnGround);
+ double returnValue = breakTime0(blockHardness, toolTier, canHarvestWithHand, correctTool, toolType, isWoolBlock, isCobweb);
+ System.out.println("returnValue = " + returnValue);
+ return returnValue;
+ }
}
+
+
diff --git a/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java b/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java
index 9601b5819..ee4917c74 100644
--- a/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java
+++ b/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java
@@ -103,8 +103,12 @@ public class Toolbox {
Iterator> iterator = items.fields();
while (iterator.hasNext()) {
Map.Entry entry = iterator.next();
- ITEM_ENTRIES.put(itemIndex, new ItemEntry(entry.getKey(), itemIndex,
- entry.getValue().get("bedrock_id").intValue(), entry.getValue().get("bedrock_data").intValue()));
+ ITEM_ENTRIES.put(itemIndex, new ItemEntry(
+ entry.getKey(), itemIndex,
+ entry.getValue().get("bedrock_id").intValue(),
+ entry.getValue().get("bedrock_data").intValue(),
+ entry.getValue().get("tool_type").textValue(),
+ entry.getValue().get("tool_tier").textValue()));
itemIndex++;
}