Use chunk cache and fix ChunkPosition

getChunkBlock() in ChunkPosition returned incorrect values when negative numbers were inputted.

ChunkPosition did not function correctly when used as a key for maps because it did not override equals() and hashCode()
This commit is contained in:
AJ Ferguson 2019-10-19 23:54:30 -08:00
parent 46107df0f8
commit 3067c72746
5 changed files with 28 additions and 11 deletions

View File

@ -40,6 +40,7 @@ public class JavaPlayerActionAckTranslator extends PacketTranslator<ServerPlayer
public void translate(ServerPlayerActionAckPacket packet, GeyserSession session) { public void translate(ServerPlayerActionAckPacket packet, GeyserSession session) {
switch (packet.getAction()) { switch (packet.getAction()) {
case FINISH_DIGGING: case FINISH_DIGGING:
session.getChunkCache().updateBlock(packet.getPosition(), packet.getNewState());
UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket(); UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket();
updateBlockPacket.setDataLayer(0); updateBlockPacket.setDataLayer(0);
updateBlockPacket.setBlockPosition(Vector3i.from( updateBlockPacket.setBlockPosition(Vector3i.from(

View File

@ -1,5 +1,6 @@
package org.geysermc.connector.network.translators.java.world; package org.geysermc.connector.network.translators.java.world;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position;
import com.github.steveice10.mc.protocol.data.game.world.block.BlockChangeRecord; import com.github.steveice10.mc.protocol.data.game.world.block.BlockChangeRecord;
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerBlockChangePacket; import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerBlockChangePacket;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
@ -13,8 +14,9 @@ import org.geysermc.connector.world.GlobalBlockPalette;
public class JavaBlockChangeTranslator extends PacketTranslator<ServerBlockChangePacket> { public class JavaBlockChangeTranslator extends PacketTranslator<ServerBlockChangePacket> {
@Override @Override
public void translate(ServerBlockChangePacket packet, GeyserSession session) { public void translate(ServerBlockChangePacket packet, GeyserSession session) {
UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket();
BlockChangeRecord record = packet.getRecord(); BlockChangeRecord record = packet.getRecord();
session.getChunkCache().updateBlock(record.getPosition(), record.getBlock());
UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket();
updateBlockPacket.setDataLayer(0); updateBlockPacket.setDataLayer(0);
updateBlockPacket.setBlockPosition(Vector3i.from( updateBlockPacket.setBlockPosition(Vector3i.from(
record.getPosition().getX(), record.getPosition().getX(),

View File

@ -18,6 +18,7 @@ public class JavaChunkDataTranslator extends PacketTranslator<ServerChunkDataPac
@Override @Override
public void translate(ServerChunkDataPacket packet, GeyserSession session) { public void translate(ServerChunkDataPacket packet, GeyserSession session) {
session.getChunkCache().addToCache(packet.getColumn());
// Not sure if this is safe or not, however without this the client usually times out // Not sure if this is safe or not, however without this the client usually times out
Geyser.getConnector().getGeneralThreadPool().execute(() -> { Geyser.getConnector().getGeneralThreadPool().execute(() -> {
Vector2i chunkPos = session.getLastChunkPosition(); Vector2i chunkPos = session.getLastChunkPosition();

View File

@ -40,6 +40,7 @@ public class JavaMultiBlockChangeTranslator extends PacketTranslator<ServerMulti
@Override @Override
public void translate(ServerMultiBlockChangePacket packet, GeyserSession session) { public void translate(ServerMultiBlockChangePacket packet, GeyserSession session) {
for (BlockChangeRecord record : packet.getRecords()) { for (BlockChangeRecord record : packet.getRecords()) {
session.getChunkCache().updateBlock(record.getPosition(), record.getBlock());
UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket(); UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket();
updateBlockPacket.setDataLayer(0); updateBlockPacket.setDataLayer(0);
updateBlockPacket.setBlockPosition(Vector3i.from( updateBlockPacket.setBlockPosition(Vector3i.from(

View File

@ -5,6 +5,8 @@ import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.util.Objects;
@Getter @Getter
@Setter @Setter
@AllArgsConstructor @AllArgsConstructor
@ -18,17 +20,27 @@ public class ChunkPosition {
} }
public Position getChunkBlock(int x, int y, int z) { public Position getChunkBlock(int x, int y, int z) {
int chunkX = x % 16; int chunkX = x & 15;
int chunkY = y % 16; int chunkY = y & 15;
int chunkZ = z % 16; int chunkZ = z & 15;
if (chunkX < 0)
chunkX = -chunkX;
if (chunkY < 0)
chunkY = -chunkY;
if (chunkZ < 0)
chunkZ = -chunkZ;
return new Position(chunkX, chunkY, chunkZ); return new Position(chunkX, chunkY, chunkZ);
} }
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj == null)
return false;
if (!(obj instanceof ChunkPosition))
return false;
ChunkPosition other = (ChunkPosition)obj;
return x == other.x && z == other.z;
}
@Override
public int hashCode() {
return Objects.hash(x, z);
}
} }