From 00d536710a9e58f88f7546fa5755a4c94d101e88 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 29 Jan 2019 18:16:20 +0300 Subject: [PATCH] optimize --- .../main/java/mc/world/anvil/AnvilBlock.java | 10 +---- .../mc/world/anvil/AnvilChunkSection.java | 3 +- .../main/java/mc/core/utils/NibbleArray.java | 4 -- .../java/mc/core/world/block/BlockType.java | 37 +++++++++++-------- proto_1.12.2/build.gradle | 1 - .../proto_1_12_2/packets/ChunkDataPacket.java | 26 +++++-------- 6 files changed, 34 insertions(+), 47 deletions(-) diff --git a/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java b/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java index 990e6e9..0bdf259 100644 --- a/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java +++ b/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java @@ -31,15 +31,7 @@ public class AnvilBlock implements Block { public BlockType getType() { final byte id = chunkSection.getBlocks().get((location.getY() << 8) + (location.getZ() << 4) + location.getX()); final int meta = chunkSection.getBlocksMeta().get(location); - BlockType type = BlockType.getByIdMeta(id & 0xFF, meta); - if (type.equals(BlockType.BEDROCK) && id != 7) { - log.warn("ChunkSection: {},{},{} | Block: {}", - chunkSection.getParent().getX(), - chunkSection.getY(), - chunkSection.getParent().getZ(), - location.toString()); - } - return type; + return BlockType.getByIdMeta(id & 0xFF, meta); } @Override diff --git a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java b/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java index 1892e57..c4115ce 100644 --- a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java +++ b/anvil-loader/src/main/java/mc/world/anvil/AnvilChunkSection.java @@ -1,6 +1,7 @@ package mc.world.anvil; import gnu.trove.list.TByteList; +import gnu.trove.list.array.TByteArrayList; import gnu.trove.list.linked.TByteLinkedList; import lombok.Getter; import lombok.Setter; @@ -17,7 +18,7 @@ public class AnvilChunkSection implements ChunkSection { @Setter private int y; - private TByteList blocks = new TByteLinkedList(); + private TByteList blocks = new TByteArrayList(); @Setter private NibbleArray blocksMeta; @Setter diff --git a/core/src/main/java/mc/core/utils/NibbleArray.java b/core/src/main/java/mc/core/utils/NibbleArray.java index e8514f7..63b936d 100644 --- a/core/src/main/java/mc/core/utils/NibbleArray.java +++ b/core/src/main/java/mc/core/utils/NibbleArray.java @@ -41,10 +41,6 @@ public class NibbleArray { return isLowerNibble(idx) ? this.data[ni] & 0x0F : this.data[ni] >> 4 & 0x0F; } - public void set(BlockLocation location, int value) { - set(location.getX(), location.getY(), location.getZ(), value); - } - public void set(int x, int y, int z, int value) { if (value < 0) value = 0; else if (value > 15) value = 15; diff --git a/core/src/main/java/mc/core/world/block/BlockType.java b/core/src/main/java/mc/core/world/block/BlockType.java index 13eb1e6..2eecead 100644 --- a/core/src/main/java/mc/core/world/block/BlockType.java +++ b/core/src/main/java/mc/core/world/block/BlockType.java @@ -1,10 +1,13 @@ package mc.core.world.block; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.util.Arrays; +import java.util.Optional; import java.util.stream.Stream; @Slf4j @@ -491,25 +494,29 @@ public enum BlockType { this.namedId = null; } - public static BlockType getByIdMeta(int id, int meta) { - if (id < 0) { - log.warn("Incorrect id \"{}\"", id); - return BEDROCK; - } - - Stream stream = Arrays.stream(BlockType.values()); - return stream.filter(blockType -> blockType.id == id && blockType.meta == meta) - .findFirst() - .orElseGet(() -> { - log.warn("Unknow block type: {}:{}", id, meta); - return BEDROCK; - }); - } - @Getter private final int id; @Getter private final int meta; @Getter private final String namedId; + + private static final Table typeTable = HashBasedTable.create(); + + static { + Arrays.stream(BlockType.values()) + .forEach(blockType -> typeTable.put(blockType.id, blockType.meta, blockType)); + } + + public static BlockType getByIdMeta(int id, int meta) { + if (id < 0) { + log.warn("Incorrect id \"{}\"", id); + return BEDROCK; + } + + return Optional.ofNullable(typeTable.get(id, meta)).orElseGet(() -> { + log.warn("Unknow block type: {}:{}", id, meta); + return BEDROCK; + }); + } } diff --git a/proto_1.12.2/build.gradle b/proto_1.12.2/build.gradle index 7c71711..8e3a7e2 100644 --- a/proto_1.12.2/build.gradle +++ b/proto_1.12.2/build.gradle @@ -6,5 +6,4 @@ dependencies { /* Components */ compile (group: 'com.google.code.gson', name: 'gson', version: '2.8.5') - compile (group: 'net.sf.trove4j', name: 'trove4j', version: '3.0.3') } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java index 9be81ac..9f19bf1 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java @@ -1,8 +1,6 @@ package mc.core.network.proto_1_12_2.packets; import com.flowpowered.nbt.CompoundTag; -import gnu.trove.list.TIntList; -import gnu.trove.list.array.TIntArrayList; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -11,7 +9,6 @@ import mc.core.network.SCPacket; import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; import mc.core.utils.NibbleArray; import mc.core.world.block.Block; -import mc.core.world.block.BlockLocation; import mc.core.world.block.BlockType; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; @@ -208,15 +205,11 @@ public class ChunkDataPacket implements SCPacket { } private class PalettedChunkSection { - private TIntList palette = new TIntArrayList(); + private List palette = new ArrayList<>(); private byte[] blocks = new byte[4096]; private NibbleArray blockLight = new NibbleArray(); private NibbleArray skyLight = new NibbleArray(); - private int coordsToIndex(BlockLocation location) { - return coordsToIndex(location.getX(), location.getY(), location.getZ()); - } - private int coordsToIndex(int x, int y, int z) { return y << 8 | z << 4 | x; } @@ -238,14 +231,13 @@ public class ChunkDataPacket implements SCPacket { } void addBlock(Block block, int skyLight) { - BlockLocation location = new BlockLocation( - block.getLocation().getX() - ((block.getLocation().getX() >> 4) << 4), - block.getLocation().getY() - ((block.getLocation().getY() >> 4) << 4), - block.getLocation().getZ() - ((block.getLocation().getZ() >> 4) << 4) - ); - blocks[coordsToIndex(location)] = addBlockType(block.getType()); - blockLight.set(location, block.getLight()); - this.skyLight.set(location, skyLight); + final int bx = block.getLocation().getX() - ((block.getLocation().getX() >> 4) << 4); + final int by = block.getLocation().getY() - ((block.getLocation().getY() >> 4) << 4); + final int bz = block.getLocation().getZ() - ((block.getLocation().getZ() >> 4) << 4); + + blocks[coordsToIndex(bx, by, bz)] = addBlockType(block.getType()); + blockLight.set(bx, by, bz, block.getLight()); + this.skyLight.set(bx, by, bz, skyLight); } void writeToNetStream(final NetOutputStream netOutputStream) { @@ -264,7 +256,7 @@ public class ChunkDataPacket implements SCPacket { // netOutputStream.writeUnsignedByte(bitsPerBlock); // Bits Per Block netOutputStream.writeVarInt(palette.size()); // Size of palette - palette.forEach(value -> { netOutputStream.writeVarInt(value); return true; }); // Palette + palette.forEach(netOutputStream::writeVarInt); // Palette // // final int dataLength = (4096/*16*16*16*/ * bitsPerBlock) / 64/*size of long in bits*/;