Files
artloglaby/java/org/artisanlogiciel/games/minetest/MapBlock.java
philippe lhardy 9792b79c56 MaimMim Man in the middle minetest interceptor
- prototype
- between client and server, allow to capture all exchanges and potentially change them
- created to capture server maps in laby
- first test get only MapBlock, support version serialization version 28
  - prepartion for 29 with zstd but untested.

# Conflicts:
#	fetch_dependencies.sh
2023-07-30 10:18:45 +02:00

98 lines
3.2 KiB
Java

package org.artisanlogiciel.games.minetest;
import com.github.luben.zstd.Zstd;
import org.artisanlogiciel.games.minetest.core.Constant;
import org.artisanlogiciel.games.minetest.core.PacketException;
import org.artisanlogiciel.games.minetest.core.Serialize;
import java.nio.ByteBuffer;
import java.util.ArrayList;
/**
* A block of nodes of MAP_BLOCKSIZE in any x,y,z direction
*/
public class MapBlock {
final static int nodecount = Constant.MAP_BLOCKSIZE * Constant.MAP_BLOCKSIZE * Constant.MAP_BLOCKSIZE;
int m_lighting_complete;
ArrayList<MapNode> nodes;
ArrayList<MapNode> getNodes()
{
if ( nodes == null )
{
nodes = new ArrayList<>(nodecount);
}
return nodes;
}
// in memory case
public void deSerialize(ByteBuffer buffer, int version)
throws PacketException
{
int flags = 0;
int content_width = 0;
int params_width = 0;
if ( version >= 29) {
// ByteBuffer byteBuffer = ByteBuffer.wrap(networkPacket.getBuffer(),offset,networkPacket.getLength() - offset);
/*
// force to have a direct buffer.
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(networkPacket.getLength());
byteBuffer.put(networkPacket.getBuffer());
byteBuffer.position(networkPacket.getOffset());
//System.arraycopy(networkPacket.getBuffer(), 0, byteBuffer.array(), 0, length);
// zstd compression
// FIXME, can we know original size ? somehow related to BLOCKSIZE³
long originalSizeMax = Zstd.decompressedSize(byteBuffer);
System.out.println(String.format("originalSizeMax=%d", originalSizeMax));
ByteBuffer decompressed = Zstd.decompress(byteBuffer,(int) originalSizeMax);
*/
byte out[] = new byte[16386];
long outLength = Zstd.decompressByteArray(out, 0, out.length, buffer.array(), buffer.arrayOffset(), buffer.limit());
// Should be a MapBlock
MapBlock block = new MapBlock();
ByteBuffer decompressed = ByteBuffer.wrap(out, 0, (int) outLength);
buffer = decompressed;
}
flags = Serialize.readU8(buffer);
if ( version >= 27 ) {
m_lighting_complete = Serialize.readU16(buffer);
}
content_width = Serialize.readU8(buffer);
params_width = Serialize.readU8(buffer);
System.out.println(String.format(" flags %x lightning_complete %d content_witd %d params_width %d ",flags, m_lighting_complete, content_width, params_width));
if (( version < 29 ) && ( version >= 11 ))
{
// ZLib decompression
try {
byte decompressed[] = Serialize.decompress(buffer);
buffer = ByteBuffer.wrap(decompressed);
}
catch ( Exception e)
{
// TODO
System.err.println(e);
e.printStackTrace(System.err);
return;
}
}
nodes = getNodes();
MapNode.deSerializeBulk(buffer,version, nodes,nodecount,content_width,params_width);
//m_node_metadata.deSerialize(is, m_gamedef->idef());
}
}