Skip to content

Commit 665c51e

Browse files
committed
- Memory Optimizations
- Thread safety
1 parent 64f259b commit 665c51e

5 files changed

Lines changed: 28 additions & 46 deletions

File tree

src/main/java/com/manwe/dsl/dedicatedServer/proxy/back/packets/ProxyBoundContainerPacket.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.manwe.dsl.dedicatedServer.InternalPacketTypes;
44
import com.manwe.dsl.dedicatedServer.proxy.back.listeners.ProxyListener;
5-
import io.netty.channel.embedded.EmbeddedChannel;
65
import net.minecraft.core.RegistryAccess;
76
import net.minecraft.network.*;
87
import net.minecraft.network.codec.StreamCodec;
@@ -46,10 +45,8 @@ public ProxyBoundContainerPacket(FriendlyByteBuf buf) {
4645

4746
this.playerId = buf.readUUID();
4847

49-
// 1. Leemos el resto de datos como un buffer aparte
5048
FriendlyByteBuf payloadBuf = new FriendlyByteBuf(buf.readBytes(buf.readableBytes()));
5149

52-
// 2. Los convertimos a paquetes PLAY
5350
List<Packet<? super ClientGamePacketListener>> list = new ArrayList<>();
5451
while (payloadBuf.isReadable()) {
5552
Packet<?> p = proto.codec().decode(payloadBuf);
@@ -71,9 +68,6 @@ private void write(FriendlyByteBuf buf) {
7168

7269
buf.writeUUID(playerId);
7370

74-
EmbeddedChannel ch = new EmbeddedChannel();
75-
Connection.configureInMemoryPipeline(ch.pipeline(), PacketFlow.CLIENTBOUND);
76-
7771
ProtocolInfo<ClientGamePacketListener> proto = GameProtocols.CLIENTBOUND_TEMPLATE.bind(RegistryFriendlyByteBuf.decorator(currentServer.registryAccess(), ConnectionType.OTHER));
7872

7973
// Serializamos el/los paquetes directamente con el codec de PLAY

src/main/java/com/manwe/dsl/dedicatedServer/worker/FakePlayerConnection.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,9 @@ public void send(Packet<?> pPacket, @Nullable PacketSendListener pListener, bool
154154
DistributedServerLevels.LOGGER.warn("Worker tried to send an unknown packet", e);
155155
}
156156
}
157+
158+
@Override
159+
public void handleDisconnection() {
160+
super.handleDisconnection();
161+
}
157162
}

src/main/java/com/manwe/dsl/dedicatedServer/worker/listeners/WorkerGamePacketListenerImpl.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ public void updateFakePlayers(){
101101
private boolean testOutsideWorkerBounds(ServerPlayer player) {
102102
int id = RegionRouter.computeWorkerId(player.getX(),player.getZ());
103103
if(id != DSLServerConfigs.WORKER_ID.get()){ //Transfer
104-
//player.absMoveTo(nextX,nextY,nextZ,fY,fX); //Possible malicious client packets, no checks
105104
workerListener.setTransfering(player.getUUID());
106105
workerListener.send(new ProxyBoundPlayerTransferPacket(player, id, preloadedWorkers));
107106
DistributedServerLevels.LOGGER.info("Transfer in progress block all incoming packets from ["+ player.getUUID()+"] to this worker");

src/main/java/com/manwe/dsl/dedicatedServer/worker/listeners/WorkerListenerImpl.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ private Connection generateFakePlayerConnection(ServerPlayer player, CommonListe
220220
*/
221221
@Override
222222
public void handlePlayerDisconnect(WorkerBoundPlayerDisconnectPacket packet) {
223-
//System.out.println("Player Disconnect Requested By Proxy Handling in worker");
223+
System.out.println("Player Disconnect Requested By Proxy Handling in worker");
224224
UUID playerId = packet.getPlayerID();
225225
boolean fakePlayer = packet.isFakePlayer();
226226

@@ -260,21 +260,25 @@ public void handlePlayerEndTransfer(WorkerBoundPlayerEndTransferPacket packet) {
260260

261261
@Override
262262
public void handleFakePlayerMove(WorkerBoundFakePlayerMovePacket packet) {
263-
ServerPlayer serverPlayer = server.getPlayerList().getPlayer(packet.getPlayerId());
264-
if(serverPlayer instanceof ChunkLoadingFakePlayer fakePlayer){
265-
fakePlayer.absMoveTo(packet.getPos().x,packet.getPos().y,packet.getPos().z);
266-
//System.out.println("Fake Player absMoveTo: " + fakePlayer.position());
267-
}
263+
server.execute(()->{
264+
ServerPlayer serverPlayer = server.getPlayerList().getPlayer(packet.getPlayerId());
265+
if(serverPlayer instanceof ChunkLoadingFakePlayer fakePlayer){
266+
fakePlayer.absMoveTo(packet.getPos().x,packet.getPos().y,packet.getPos().z);
267+
//System.out.println("Fake Player absMoveTo: " + fakePlayer.position());
268+
}
269+
});
268270
}
269271

270272
@Override
271273
public void handleFakePlayerInformation(WorkerBoundFakePlayerInformationPacket packet) {
272-
ServerPlayer player = server.getPlayerList().getPlayer(packet.getPlayerId());
273-
if(player instanceof ChunkLoadingFakePlayer fakePlayer){
274-
fakePlayer.setFakePlayerRequestedViewDistance(packet.getViewDistance());
275-
} else {
276-
DistributedServerLevels.LOGGER.error("Tried to set view distance to a fake player that does not exists");
277-
}
274+
server.execute(()-> {
275+
ServerPlayer player = server.getPlayerList().getPlayer(packet.getPlayerId());
276+
if (player instanceof ChunkLoadingFakePlayer fakePlayer) {
277+
fakePlayer.setFakePlayerRequestedViewDistance(packet.getViewDistance());
278+
} else {
279+
DistributedServerLevels.LOGGER.error("Tried to set view distance to a fake player that does not exists");
280+
}
281+
});
278282
}
279283

280284
@Override
@@ -284,7 +288,9 @@ public void handleLevelInformation(WorkerBoundRequestLevelInformationPacket pack
284288

285289
@Override
286290
public void handleEntityTransfer(WorkerBoundEntityTransferPacket packet) {
287-
packet.placeEntity(server); //Add entity to level
291+
server.execute(()-> {
292+
packet.placeEntity(server); //Add entity to level
293+
});
288294
}
289295

290296
@Override

src/main/java/com/manwe/dsl/dedicatedServer/worker/packets/WorkerBoundContainerPacket.java

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22

33
import com.manwe.dsl.dedicatedServer.InternalPacketTypes;
44
import com.manwe.dsl.dedicatedServer.worker.listeners.WorkerListener;
5-
import io.netty.buffer.ByteBuf;
6-
import io.netty.channel.embedded.EmbeddedChannel;
7-
import io.netty.handler.flow.FlowControlHandler;
85
import net.minecraft.network.*;
96
import net.minecraft.network.codec.StreamCodec;
107
import net.minecraft.network.protocol.Packet;
@@ -35,23 +32,13 @@ public WorkerBoundContainerPacket(UUID playerId, Packet<? extends ServerCommonPa
3532
private WorkerBoundContainerPacket(FriendlyByteBuf buf) {
3633
this.playerId = buf.readUUID();
3734

38-
int length = buf.readableBytes();
39-
ByteBuf payloadRaw = buf.readBytes(length);
40-
4135
MinecraftServer currentServer = ServerLifecycleHooks.getCurrentServer();
4236
if(currentServer == null) throw new RuntimeException("MinecraftServer is null");
4337
ProtocolInfo<ServerGamePacketListener> protocolInfo = GameProtocols.SERVERBOUND_TEMPLATE.bind(RegistryFriendlyByteBuf.decorator(currentServer.registryAccess(), ConnectionType.OTHER));
4438

45-
//TODO si se puede crear una sola instancia del EmbeddedChannel en vez de una por serialización y deserialización
46-
EmbeddedChannel channel = new EmbeddedChannel(
47-
new Varint21FrameDecoder(null),
48-
new FlowControlHandler(),
49-
new PacketDecoder<>(protocolInfo)
50-
);
51-
channel.writeInbound(payloadRaw);
52-
this.payload = channel.readInbound();
53-
if(payload == null) throw new RuntimeException("P->W Decode: Payload is null");
54-
channel.finish();
39+
FriendlyByteBuf payloadBuf = new FriendlyByteBuf(buf.readBytes(buf.readableBytes()));
40+
this.payload = (Packet<? extends ServerCommonPacketListener>) protocolInfo.codec().decode(payloadBuf);
41+
5542
}
5643

5744
private void write(FriendlyByteBuf buf) {
@@ -61,16 +48,7 @@ private void write(FriendlyByteBuf buf) {
6148
if(currentServer == null) throw new RuntimeException("MinecraftServer is null");
6249
ProtocolInfo<ServerGamePacketListener> protocolInfo = GameProtocols.SERVERBOUND_TEMPLATE.bind(RegistryFriendlyByteBuf.decorator(currentServer.registryAccess(), ConnectionType.OTHER));
6350

64-
//TODO si se puede crear una sola instancia del EmbeddedChannel en vez de una por serialización y deserialización
65-
EmbeddedChannel channel = new EmbeddedChannel(
66-
new Varint21LengthFieldPrepender(),
67-
new PacketEncoder<>(protocolInfo)
68-
);
69-
channel.writeOutbound(this.payload);
70-
if(payload == null) throw new RuntimeException("P->W Encode: Payload is null");
71-
ByteBuf encoded = channel.readOutbound();
72-
buf.writeBytes(encoded);
73-
channel.finish();
51+
protocolInfo.codec().encode(buf, (Packet<? super ServerGamePacketListener>) this.payload);
7452
}
7553

7654
public Packet<? extends ServerCommonPacketListener> getPayload(){

0 commit comments

Comments
 (0)