Skip to content
This repository was archived by the owner on Apr 7, 2021. It is now read-only.

Commit b31a67d

Browse files
committed
Properly implement basic block breaking. Everything works, but it doesn't take into account effects or enchantments
1 parent 2f1ecf4 commit b31a67d

File tree

13 files changed

+9174
-1048
lines changed

13 files changed

+9174
-1048
lines changed

proxy/src/main/java/org/dragonet/proxy/DragonProxy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,8 @@ private void initialize() throws IOException {
165165
sessionManager = new SessionManager();
166166

167167
new PacketTranslatorRegistry();
168-
new ItemTranslatorRegistry();
169168
new BlockTranslator();
169+
new ItemTranslatorRegistry();
170170
new SkinUtils();
171171
new MinecraftLanguage();
172172
new MapDataUtils();
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.dragonet.proxy.data.item;
2+
3+
public enum ToolTier {
4+
WOODEN,
5+
STONE,
6+
GOLDEN,
7+
IRON,
8+
DIAMOND
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.dragonet.proxy.data.item;
2+
3+
public enum ToolType {
4+
SWORD,
5+
SHOVEL,
6+
AXE,
7+
HOE,
8+
PICKAXE,
9+
SHEARS
10+
}

proxy/src/main/java/org/dragonet/proxy/network/session/ProxySession.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import com.nukkitx.math.vector.Vector2f;
3737
import com.nukkitx.math.vector.Vector3f;
3838
import com.nukkitx.math.vector.Vector3i;
39-
import com.nukkitx.nbt.tag.CompoundTag;
4039
import com.nukkitx.network.util.DisconnectReason;
4140
import com.nukkitx.protocol.PlayerSession;
4241
import com.nukkitx.protocol.bedrock.BedrockPacket;
@@ -64,7 +63,6 @@
6463
import org.dragonet.proxy.util.TextFormat;
6564

6665
import javax.annotation.Nonnull;
67-
import java.awt.*;
6866
import java.nio.charset.StandardCharsets;
6967
import java.util.*;
7068
import java.util.concurrent.CompletableFuture;

proxy/src/main/java/org/dragonet/proxy/network/translator/ItemTranslatorRegistry.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,15 @@
1919
package org.dragonet.proxy.network.translator;
2020

2121
import com.fasterxml.jackson.annotation.JsonProperty;
22-
import com.fasterxml.jackson.core.type.TypeReference;
2322
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
24-
import com.github.steveice10.mc.protocol.data.message.Message;
2523
import com.github.steveice10.opennbt.tag.builtin.*;
2624
import com.nukkitx.nbt.CompoundTagBuilder;
2725
import com.nukkitx.protocol.bedrock.data.ItemData;
28-
import com.nukkitx.protocol.util.Int2ObjectBiMap;
2926
import it.unimi.dsi.fastutil.ints.*;
3027
import lombok.Getter;
3128
import lombok.extern.log4j.Log4j2;
32-
import org.dragonet.proxy.DragonProxy;
29+
import org.dragonet.proxy.data.item.ToolTier;
30+
import org.dragonet.proxy.data.item.ToolType;
3331
import org.dragonet.proxy.network.translator.misc.IItemTranslator;
3432
import org.dragonet.proxy.network.translator.misc.MessageTranslator;
3533
import org.dragonet.proxy.network.translator.misc.item.ItemEntry;
@@ -40,11 +38,8 @@
4038
import org.dragonet.proxy.util.registry.MappingEntry;
4139
import org.dragonet.proxy.util.registry.Registry;
4240

43-
import java.io.IOException;
44-
import java.io.InputStream;
4541
import java.util.ArrayList;
4642
import java.util.List;
47-
import java.util.Map;
4843
import java.util.concurrent.atomic.AtomicInteger;
4944

5045
@Log4j2
@@ -57,7 +52,9 @@ public class ItemTranslatorRegistry extends Registry {
5752

5853
// Java to Bedrock and vice versa
5954
private static final Int2ObjectMap<ItemEntry> javaToBedrockMap = new Int2ObjectLinkedOpenHashMap<>();
60-
private static final Int2ObjectMap<ItemEntry> bedrockToJavaMap = new Int2ObjectLinkedOpenHashMap<>();
55+
56+
// TODO: HACK: THIS SHOULD BE PRIVATE
57+
public static final Int2ObjectMap<ItemEntry> bedrockToJavaMap = new Int2ObjectLinkedOpenHashMap<>();
6158

6259
// The mappings are generated sequentially starting from air (id 0)
6360
// This counter is increment for every item we loop over
@@ -79,8 +76,10 @@ public class ItemTranslatorRegistry extends Registry {
7976
ItemMappingEntry itemMappingEntry = (ItemMappingEntry) value;
8077
int javaProtocolId = javaIdAllocator.getAndIncrement(); // Entries are loaded sequentially in the mapping file
8178

82-
javaToBedrockMap.put(javaProtocolId, new ItemEntry(key, javaProtocolId, itemMappingEntry.getBedrockId(), itemMappingEntry.getBedrockData()));
83-
bedrockToJavaMap.put(itemMappingEntry.getBedrockId(), new ItemEntry(key, javaProtocolId, itemMappingEntry.getBedrockId(), itemMappingEntry.getBedrockData()));
79+
ItemEntry entry = new ItemEntry(key, javaProtocolId, itemMappingEntry.getBedrockId(), itemMappingEntry.getBedrockData(), itemMappingEntry.getToolType(), itemMappingEntry.getToolTier());
80+
81+
javaToBedrockMap.put(javaProtocolId, entry);
82+
bedrockToJavaMap.put(itemMappingEntry.getBedrockId(), entry);
8483
});
8584
});
8685

@@ -203,5 +202,11 @@ private static class ItemMappingEntry implements MappingEntry {
203202

204203
@JsonProperty("bedrock_data")
205204
private int bedrockData;
205+
206+
@JsonProperty("tool_type")
207+
private ToolType toolType;
208+
209+
@JsonProperty("tool_tier")
210+
private ToolTier toolTier;
206211
}
207212
}

proxy/src/main/java/org/dragonet/proxy/network/translator/bedrock/player/PEMobEquipmentTranslator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class PEMobEquipmentTranslator extends PacketTranslator<MobEquipmentPacke
3232
@Override
3333
public void translate(ProxySession session, MobEquipmentPacket packet) {
3434
if(packet.getContainerId() == 0) {
35+
session.getCachedEntity().setMainHand(packet.getItem());
3536
session.getCachedEntity().setSelectedHotbarSlot(packet.getHotbarSlot());
3637
session.sendRemotePacket(new ClientPlayerChangeHeldItemPacket(packet.getHotbarSlot()));
3738
}

proxy/src/main/java/org/dragonet/proxy/network/translator/java/entity/PCEntityEquipmentTranslator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.dragonet.proxy.network.translator.java.entity;
2020

21+
import com.github.steveice10.mc.protocol.data.game.entity.EquipmentSlot;
2122
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityEquipmentPacket;
2223
import com.nukkitx.protocol.bedrock.packet.MobEquipmentPacket;
2324
import lombok.extern.log4j.Log4j2;

proxy/src/main/java/org/dragonet/proxy/network/translator/java/player/PCPlayerActionAckTranslator.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
import com.nukkitx.protocol.bedrock.packet.LevelEventPacket;
2525
import lombok.extern.log4j.Log4j2;
2626
import org.dragonet.proxy.network.session.ProxySession;
27+
import org.dragonet.proxy.network.translator.misc.BlockTranslator;
2728
import org.dragonet.proxy.network.translator.misc.PacketTranslator;
29+
import org.dragonet.proxy.util.BlockUtils;
2830
import org.dragonet.proxy.util.registry.PacketRegisterInfo;
2931
import org.dragonet.proxy.util.TextFormat;
3032

@@ -44,10 +46,11 @@ public void translate(ProxySession session, ServerPlayerActionAckPacket packet)
4446

4547
switch(packet.getAction()) {
4648
case START_DIGGING:
47-
// TODO: ServerBlockBreakAnimPacket?
49+
double breakTime = Math.ceil(BlockUtils.getBreakTime(session.getCachedEntity().getMainHand(), BlockTranslator.translateToBedrock(packet.getNewState())) * 20);
50+
4851
levelEventPacket.setType(LevelEventType.BLOCK_START_BREAK);
4952
levelEventPacket.setPosition(position);
50-
levelEventPacket.setData((int) (65535 / Math.ceil(0.5 * 20))); // TODO: break times
53+
levelEventPacket.setData((int) (65535 / breakTime));
5154
break;
5255
case CANCEL_DIGGING:
5356
levelEventPacket.setType(LevelEventType.BLOCK_STOP_BREAK);

proxy/src/main/java/org/dragonet/proxy/network/translator/misc/BlockTranslator.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,15 @@
2626
import com.nukkitx.nbt.stream.NBTInputStream;
2727
import com.nukkitx.nbt.tag.CompoundTag;
2828
import com.nukkitx.nbt.tag.ListTag;
29-
import it.unimi.dsi.fastutil.ints.Int2IntMap;
30-
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
31-
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
32-
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
29+
import it.unimi.dsi.fastutil.ints.*;
3330
import it.unimi.dsi.fastutil.objects.Object2IntMap;
3431
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
35-
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
3632
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
3733
import lombok.AllArgsConstructor;
3834
import lombok.Getter;
3935
import lombok.extern.log4j.Log4j2;
4036
import org.dragonet.proxy.DragonProxy;
37+
import org.dragonet.proxy.data.item.ToolType;
4138
import org.dragonet.proxy.util.FileUtils;
4239

4340
import java.io.IOException;
@@ -72,6 +69,10 @@ public class BlockTranslator {
7269

7370
private static Object2IntMap<String> bedrockId2RuntimeMap = new Object2IntOpenHashMap<>();
7471
private static Int2ObjectMap<String> bedrockRuntime2IdMap = new Int2ObjectOpenHashMap<>();
72+
73+
// TOOD: HACK
74+
public static Int2ObjectMap<BlockMappingEntry> ID_TO_ENTRY = new Int2ObjectLinkedOpenHashMap<>();
75+
7576
@Getter
7677
private static Int2IntMap beds = new Int2IntOpenHashMap();
7778

@@ -150,6 +151,9 @@ public class BlockTranslator {
150151
bedrockRuntime2IdMap.put(bedrockRuntimeId, bedrockIdentifier);
151152
java2BedrockMap.put(javaProtocolId, bedrockRuntimeId);
152153

154+
// TODO: HACK
155+
ID_TO_ENTRY.put(bedrockRuntimeId, blockMappingEntry);
156+
153157
bedrockIdAllocator.incrementAndGet();
154158
});
155159

@@ -203,12 +207,15 @@ public static boolean isWaterlogged(BlockState state) {
203207
}
204208

205209
@Getter
206-
private static class BlockMappingEntry {
210+
public static class BlockMappingEntry {
207211
@JsonProperty("bedrock_identifier")
208212
private String bedrockIdentifier;
209213

210-
@JsonProperty("block_hardness")
211214
private double hardness;
215+
216+
@JsonProperty("tool_type")
217+
private ToolType toolType;
218+
212219
private boolean waterlogged;
213220
private List<BlockStateEntry> bedrockStates = new ArrayList<>();
214221

@@ -220,7 +227,7 @@ private void loadBedrockStates(Map<String, Object> map) {
220227

221228
@Getter
222229
@AllArgsConstructor
223-
private static class BlockStateEntry {
230+
public static class BlockStateEntry {
224231
private String name;
225232
private Object value;
226233
}

proxy/src/main/java/org/dragonet/proxy/network/translator/misc/item/ItemEntry.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,22 @@
1818
*/
1919
package org.dragonet.proxy.network.translator.misc.item;
2020

21-
import com.fasterxml.jackson.annotation.JsonProperty;
2221
import com.nukkitx.nbt.tag.CompoundTag;
2322
import com.nukkitx.protocol.bedrock.data.ItemData;
2423
import lombok.AllArgsConstructor;
2524
import lombok.Getter;
25+
import org.dragonet.proxy.data.item.ToolTier;
26+
import org.dragonet.proxy.data.item.ToolType;
2627

2728
@Getter
2829
@AllArgsConstructor
2930
public class ItemEntry {
30-
@JsonProperty
3131
private String javaIdentifier;
32-
@JsonProperty("javaId")
3332
private int javaProtocolId;
34-
35-
// TODO: add back support for bedrock identifier, as the geyser mappings dont include it
36-
//private String bedrockIdentifier;
37-
@JsonProperty("bedrockId")
3833
private int bedrockRuntimeId;
39-
@JsonProperty
4034
private int bedrockData;
35+
private ToolType toolType;
36+
private ToolTier toolTier;
4137

4238
public ItemData toItemData(int amount) {
4339
return ItemData.of(bedrockRuntimeId, (short) bedrockData, amount);

0 commit comments

Comments
 (0)