Skip to content

Commit

Permalink
Cache more packets
Browse files Browse the repository at this point in the history
  • Loading branch information
wode490390 committed Sep 22, 2024
1 parent 905e8af commit 7f7199f
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 5 deletions.
23 changes: 18 additions & 5 deletions src/main/java/cn/nukkit/entity/Entity.java
Original file line number Diff line number Diff line change
Expand Up @@ -1167,7 +1167,16 @@ public void sendData(Player player) {
public void sendData(Player player, EntityMetadata data) {
SetEntityDataPacket pk = new SetEntityDataPacket();
pk.eid = this.getId();
pk.metadata = data == null ? this.dataProperties : data;
if (data == null) {
pk.metadata = this.dataProperties.copy();
} else {
pk.metadata = data;

EntityData<?> nukkitFlags = this.dataProperties.get(DATA_NUKKIT_FLAGS);
if (nukkitFlags != null) {
data.put(nukkitFlags);
}
}
player.dataPacket(pk);
}

Expand All @@ -1178,11 +1187,15 @@ public void sendData(Player[] players) {
public void sendData(Player[] players, EntityMetadata data) {
SetEntityDataPacket pk = new SetEntityDataPacket();
pk.eid = this.getId();
pk.metadata = data == null ? this.dataProperties : data;
if (data == null) {
pk.metadata = this.dataProperties.copy();
} else {
pk.metadata = data;

EntityData<?> nukkitFlags = this.dataProperties.get(DATA_NUKKIT_FLAGS);
if (nukkitFlags != null) {
pk.metadata.put(nukkitFlags);
EntityData<?> nukkitFlags = this.dataProperties.get(DATA_NUKKIT_FLAGS);
if (nukkitFlags != null) {
data.put(nukkitFlags);
}
}

for (Player player : players) {
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/cn/nukkit/entity/data/EntityMetadata.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ public class EntityMetadata {

private final Int2ObjectMap<EntityData> map = new Int2ObjectOpenHashMap<>();

public EntityMetadata() {
}

public EntityMetadata(EntityMetadata copy) {
map.putAll(copy.map);
}

@Nullable
public EntityData get(int id) {
return this.getOrDefault(id, null);
Expand Down Expand Up @@ -187,7 +194,15 @@ public Int2ObjectMap<EntityData> getMap() {
return new Int2ObjectOpenHashMap<>(map);
}

public Int2ObjectMap<EntityData> getMapUnsafe() {
return map;
}

public boolean isEmpty() {
return this.map.isEmpty();
}

public EntityMetadata copy() {
return new EntityMetadata(this);
}
}
42 changes: 42 additions & 0 deletions src/main/java/cn/nukkit/network/protocol/BatchPacket.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package cn.nukkit.network.protocol;

import cn.nukkit.Server;
import cn.nukkit.network.Network;
import cn.nukkit.utils.Binary;
import cn.nukkit.utils.Zlib;
import lombok.ToString;

import javax.annotation.Nullable;
Expand Down Expand Up @@ -36,6 +40,44 @@ public void trim() {
setBuffer(null);
}

public static BatchPacket compress(DataPacket... packets) {
return compress(false, packets);
}

public static BatchPacket compress(boolean zlibRaw, DataPacket... packets) {
return compress(Server.getInstance().networkCompressionLevel, zlibRaw, packets);
}

public static BatchPacket compress(int compressionLevel, DataPacket... packets) {
return compress(compressionLevel, false, packets);
}

public static BatchPacket compress(int compressionLevel, boolean zlibRaw, DataPacket... packets) {
int count = packets.length;
Track[] tracks = new Track[count];

byte[][] payload = new byte[2 * count][];
for (int i = 0; i < count; i++) {
DataPacket packet = packets[i];
packet.tryEncode();
byte[] buffer = packet.getBuffer();
int index = 2 * i;
payload[index] = Binary.writeUnsignedVarInt(buffer.length);
payload[index + 1] = buffer;

tracks[i] = new Track(packet.pid(), packet.getCount());
}

BatchPacket batch = new BatchPacket();
try {
batch.payload = zlibRaw ? Network.deflateRaw(payload, compressionLevel) : Zlib.deflate(payload, compressionLevel);
} catch (Exception e) {
throw new RuntimeException(e);
}
batch.tracks = tracks;
return batch;
}

@ToString
public static class Track {
public final int packetId;
Expand Down

0 comments on commit 7f7199f

Please sign in to comment.