Skip to content

Commit

Permalink
UPDATE StructuresPayload StructuresPacket and permanently enable the …
Browse files Browse the repository at this point in the history
…PayloadSplitter method for STRUCTURES_DATA
  • Loading branch information
sakura-ryoko committed Jun 12, 2024
1 parent 8f1bb40 commit 1f725dd
Show file tree
Hide file tree
Showing 8 changed files with 508 additions and 79 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ author = masa
mod_file_name = servux-fabric

# Current mod version
mod_version = 0.1.999-sakura.7
mod_version = 0.1.999-sakura.8

# The Minecraft version that gets set in the built file name
minecraft_version_out = 1.20.6
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import net.minecraft.world.gen.structure.Structure;
import fi.dy.masa.servux.Reference;
import fi.dy.masa.servux.network.handler.ServuxStructuresHandler;
import fi.dy.masa.servux.network.handler.ServuxStructuresPayload;
import fi.dy.masa.servux.network.handler.ServuxStructuresPacket;
import fi.dy.masa.servux.network.server.IPluginServerPlayHandler;
import fi.dy.masa.servux.network.server.ServerPlayHandler;
import fi.dy.masa.servux.util.PlayerDimensionPosition;
Expand All @@ -33,18 +33,16 @@ public class StructureDataProvider extends DataProviderBase
{
public static final StructureDataProvider INSTANCE = new StructureDataProvider();

protected final static ServuxStructuresHandler<ServuxStructuresPayload> HANDLER = ServuxStructuresHandler.getInstance();
//protected final static ServuxStructuresHandlerOld<ServuxStructuresPayloadOld> OLD_HANDLER = ServuxStructuresHandlerOld.getInstance();
protected final static ServuxStructuresHandler<ServuxStructuresPacket.Payload> HANDLER = ServuxStructuresHandler.getInstance();
protected final Map<UUID, PlayerDimensionPosition> registeredPlayers = new HashMap<>();
protected final Map<UUID, Map<ChunkPos, Timeout>> timeouts = new HashMap<>();
protected final NbtCompound metadata = new NbtCompound();
protected int timeout = 30 * 20;
protected int updateInterval = 40;
protected int retainDistance;
protected final int MAX_STRUCTURE_SIZE = 1572864;
//protected final int MAX_STRUCTURE_SIZE = 1572864;
// Maximum structure size of one Nbt packet (2097152)
// 2097152 = 2048 x 1024
// 1572864 = 1536 x 1024 ~halfway
// 1048576 = 1024 x 1024

// FIXME --> Move out of structures channel in the future
private BlockPos spawnPos = BlockPos.ORIGIN;
Expand All @@ -55,7 +53,7 @@ protected StructureDataProvider()
{
super("structure_bounding_boxes",
ServuxStructuresHandler.CHANNEL_ID,
ServuxStructuresHandler.PROTOCOL_VERSION,
ServuxStructuresPacket.PROTOCOL_VERSION,
"Structure Bounding Boxes data for structures such as Witch Huts, Ocean Monuments, Nether Fortresses etc.");

this.metadata.putString("name", this.getName());
Expand All @@ -80,20 +78,27 @@ public void setEnabled(boolean toggle)
@Override
public void registerHandler()
{
//ServerPlayHandler.getInstance().registerServerPlayHandler(OLD_HANDLER);
//OLD_HANDLER.registerPlayPayload(ServuxStructuresPayloadOld.TYPE, ServuxStructuresPayloadOld.CODEC, IPluginServerPlayHandler.BOTH_SERVER);
//OLD_HANDLER.registerPlayReceiver(ServuxStructuresPayloadOld.TYPE, OLD_HANDLER::receivePlayPayload);

ServerPlayHandler.getInstance().registerServerPlayHandler(HANDLER);
HANDLER.registerPlayPayload(ServuxStructuresPayload.TYPE, ServuxStructuresPayload.CODEC, IPluginServerPlayHandler.BOTH_SERVER);
HANDLER.registerPlayReceiver(ServuxStructuresPayload.TYPE, HANDLER::receivePlayPayload);
HANDLER.registerPlayPayload(ServuxStructuresPacket.Payload.ID, ServuxStructuresPacket.Payload.CODEC, IPluginServerPlayHandler.BOTH_SERVER);
HANDLER.registerPlayReceiver(ServuxStructuresPacket.Payload.ID, HANDLER::receivePlayPayload);
}

@Override
public void unregisterHandler()
{
//OLD_HANDLER.unregisterPlayReceiver();
//ServerPlayHandler.getInstance().unregisterServerPlayHandler(OLD_HANDLER);

HANDLER.unregisterPlayReceiver();
ServerPlayHandler.getInstance().unregisterServerPlayHandler(HANDLER);
}

@Override
public IPluginServerPlayHandler<ServuxStructuresPayload> getPacketHandler()
public IPluginServerPlayHandler<ServuxStructuresPacket.Payload> getPacketHandler()
{
return HANDLER;
}
Expand Down Expand Up @@ -191,12 +196,13 @@ public boolean register(ServerPlayerEntity player)
{
NbtCompound nbt = new NbtCompound();
nbt.copyFrom(this.metadata);
nbt.putInt("packetType", ServuxStructuresHandler.PACKET_S2C_METADATA);
//nbt.putInt("packetType", ServuxStructuresHandlerOld.PACKET_S2C_METADATA);

// Using the networkHandler method allows this to work
HANDLER.sendPlayPayload(handler, new ServuxStructuresPayload(nbt));
//OLD_HANDLER.sendPlayPayload(handler, new ServuxStructuresPayloadOld(nbt));

this.initialSyncStructuresToPlayerWithinRange(player, player.getServer().getPlayerManager().getViewDistance(), tickCounter);
HANDLER.sendPlayPayload(handler, new ServuxStructuresPacket.Payload(new ServuxStructuresPacket(ServuxStructuresPacket.Type.PACKET_S2C_METADATA, nbt)));
this.initialSyncStructuresToPlayerWithinRange(player, player.getServer().getPlayerManager().getViewDistance()+2, tickCounter);
}

registered = true;
Expand All @@ -208,6 +214,7 @@ public boolean register(ServerPlayerEntity player)
public boolean unregister(ServerPlayerEntity player)
{
// System.out.printf("unregister\n");
//OLD_HANDLER.resetFailures(this.getNetworkChannel(), player);
HANDLER.resetFailures(this.getNetworkChannel(), player);

return this.registeredPlayers.remove(player.getUuid()) != null;
Expand Down Expand Up @@ -473,6 +480,12 @@ protected void sendStructures(ServerPlayerEntity player,

if (this.registeredPlayers.containsKey(player.getUuid()))
{
NbtCompound test = new NbtCompound();
//test.putInt("packetType", ServuxStructuresHandlerOld.PACKET_S2C_STRUCTURE_DATA);
test.put("Structures", structureList.copy());
HANDLER.encodeStructuresPacket(player, new ServuxStructuresPacket(ServuxStructuresPacket.Type.PACKET_S2C_STRUCTURE_DATA_START, test));

/*
NbtList splitList = new NbtList();
for (int i = 0; i < structureList.size(); i++)
Expand All @@ -497,27 +510,30 @@ protected void sendStructures(ServerPlayerEntity player,
{
this.sendStructurePacket(player, splitList, useApi);
}
*/
}
}
}

/*
private void sendStructurePacket(ServerPlayerEntity player, NbtList structureList, boolean useApi)
{
//Servux.logger.warn("sendStructurePacket(): count [{}], listSize {}", structureList.size(), structureList.getSizeInBytes());
NbtCompound tag = new NbtCompound();
tag.put("Structures", structureList);
tag.putInt("packetType", ServuxStructuresHandler.PACKET_S2C_STRUCTURE_DATA);
tag.putInt("packetType", ServuxStructuresHandlerOld.PACKET_S2C_STRUCTURE_DATA);
if (useApi)
{
HANDLER.encodeNbtCompound(player, tag);
OLD_HANDLER.encodeNbtCompound(player, tag);
}
else
{
HANDLER.sendPlayPayload(player.networkHandler, new ServuxStructuresPayload(tag));
OLD_HANDLER.sendPlayPayload(player.networkHandler, new ServuxStructuresPayloadOld(tag));
}
}
*/

protected NbtList getStructureList(Map<ChunkPos, StructureStart> structures, ServerWorld world)
{
Expand All @@ -539,15 +555,16 @@ public void refreshSpawnMetadata(ServerPlayerEntity player, @Nullable NbtCompoun
NbtCompound nbt = new NbtCompound();
BlockPos spawnPos = StructureDataProvider.INSTANCE.getSpawnPos();

nbt.putInt("packetType", ServuxStructuresHandler.PACKET_S2C_SPAWN_METADATA);
//nbt.putInt("packetType", ServuxStructuresHandlerOld.PACKET_S2C_SPAWN_METADATA);
nbt.putString("id", getNetworkChannel().toString());
nbt.putString("servux", Reference.MOD_STRING);
nbt.putInt("spawnPosX", spawnPos.getX());
nbt.putInt("spawnPosY", spawnPos.getY());
nbt.putInt("spawnPosZ", spawnPos.getZ());
nbt.putInt("spawnChunkRadius", StructureDataProvider.INSTANCE.getSpawnChunkRadius());

HANDLER.encodeNbtCompound(player, nbt);
//OLD_HANDLER.encodeNbtCompound(player, nbt);
HANDLER.encodeStructuresPacket(player, new ServuxStructuresPacket(ServuxStructuresPacket.Type.PACKET_S2C_SPAWN_METADATA, nbt));
}

public BlockPos getSpawnPos()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,37 @@
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import io.netty.buffer.Unpooled;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.packet.CustomPayload;
import net.minecraft.server.network.ServerPlayNetworkHandler;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier;
import fi.dy.masa.servux.Servux;
import fi.dy.masa.servux.dataproviders.StructureDataProvider;
import fi.dy.masa.servux.network.server.IPluginServerPlayHandler;
import fi.dy.masa.servux.network.server.PayloadSplitter;

@Environment(EnvType.SERVER)
public abstract class ServuxStructuresHandler<T extends CustomPayload> implements IPluginServerPlayHandler<T>
{
private static final ServuxStructuresHandler<ServuxStructuresPayload> INSTANCE = new ServuxStructuresHandler<>() {
private static final ServuxStructuresHandler<ServuxStructuresPacket.Payload> INSTANCE = new ServuxStructuresHandler<>() {
@Override
public void receive(ServuxStructuresPayload payload, ServerPlayNetworking.Context context)
public void receive(ServuxStructuresPacket.Payload payload, ServerPlayNetworking.Context context)
{
ServuxStructuresHandler.INSTANCE.receivePlayPayload(payload, context);
}
};
public static ServuxStructuresHandler<ServuxStructuresPayload> getInstance() { return INSTANCE; }
public static ServuxStructuresHandler<ServuxStructuresPacket.Payload> getInstance() { return INSTANCE; }

public static final Identifier CHANNEL_ID = Identifier.of("servux", "structures");
public static final int PROTOCOL_VERSION = 2;
public static final int PACKET_S2C_METADATA = 1;
public static final int PACKET_S2C_STRUCTURE_DATA = 2;
public static final int PACKET_C2S_STRUCTURES_REGISTER = 3;
public static final int PACKET_C2S_STRUCTURES_UNREGISTER = 4;
public static final int PACKET_S2C_SPAWN_METADATA = 10;
public static final int PACKET_C2S_REQUEST_SPAWN_METADATA = 11;

private boolean payloadRegistered = false;
private final Map<UUID, Integer> failures = new HashMap<>();
private static final int MAX_FAILURES = 3;
// Tracks PacketSend failures until MAX_FAILURES
private static final int MAX_FAILURES = 4;

@Override
public Identifier getPayloadChannel() { return CHANNEL_ID; }
Expand All @@ -61,27 +58,31 @@ public void setPlayRegistered(Identifier channel)
}
}

@Override
public void decodeNbtCompound(Identifier channel, ServerPlayerEntity player, NbtCompound data)
public void decodeStructuresPacket(Identifier channel, ServerPlayerEntity player, ServuxStructuresPacket packet)
{
if (channel.equals(CHANNEL_ID) == false)
{
return;
}
switch (data.getInt("packetType"))
//Servux.logger.error("decodeStructuresPacket(): received packet from {}, of packetType {} // size in bytes [{}]", player.getName().getLiteralString(), packet.getPacketType(), packet.getTotalSize());

switch (packet.getType())
{
// Only NBT type packets are received from MiniHUD, not using PayloadSplitter
case PACKET_C2S_STRUCTURES_REGISTER ->
{
//Servux.logger.warn("decodeStructuresPacket(): received Structures Register from player {}", player.getName().getLiteralString());
StructureDataProvider.INSTANCE.unregister(player);
StructureDataProvider.INSTANCE.register(player);
}
case PACKET_C2S_REQUEST_SPAWN_METADATA -> StructureDataProvider.INSTANCE.refreshSpawnMetadata(player, data);
case PACKET_C2S_REQUEST_SPAWN_METADATA -> StructureDataProvider.INSTANCE.refreshSpawnMetadata(player, packet.getCompound());
case PACKET_C2S_STRUCTURES_UNREGISTER ->
{
//Servux.logger.warn("decodeStructuresPacket(): received Structures Un-Register from player {}", player.getName().getLiteralString());
StructureDataProvider.INSTANCE.unregister(player);
StructureDataProvider.INSTANCE.refreshSpawnMetadata(player, data);
StructureDataProvider.INSTANCE.refreshSpawnMetadata(player, packet.getCompound());
}
default -> Servux.logger.warn("ServuxStructuresHandler#decodeC2SNbtCompound(): Invalid packetType from player: {}, of size in bytes: {}.", player.getName(), data.getSizeInBytes());
default -> Servux.logger.warn("decodeStructuresPacket(): Invalid packetType '{}' from player: {}, of size in bytes: {}.", packet.getPacketType(), player.getName().getLiteralString(), packet.getTotalSize());
}
}

Expand All @@ -107,20 +108,28 @@ public void receivePlayPayload(T payload, ServerPlayNetworking.Context ctx)
{
if (payload.getId().id().equals(CHANNEL_ID))
{
ServuxStructuresHandler.INSTANCE.decodeNbtCompound(CHANNEL_ID, ctx.player(), ((ServuxStructuresPayload) payload).data());
ServerPlayerEntity player = ctx.player();
ServuxStructuresHandler.INSTANCE.decodeStructuresPacket(CHANNEL_ID, player, ((ServuxStructuresPacket.Payload) payload).data());
}
}

@Override
public void encodeWithSplitter(ServerPlayerEntity player, PacketByteBuf buf)
public void encodeWithSplitter(ServerPlayerEntity player, PacketByteBuf buffer, ServerPlayNetworkHandler networkHandler)
{
// NO-OP
// Send each PayloadSplitter buffer slice
ServuxStructuresHandler.INSTANCE.encodeStructuresPacket(player, new ServuxStructuresPacket(ServuxStructuresPacket.Type.PACKET_S2C_STRUCTURE_DATA, buffer));
}

@Override
public void encodeNbtCompound(ServerPlayerEntity player, NbtCompound data)
public void encodeStructuresPacket(ServerPlayerEntity player, ServuxStructuresPacket packet)
{
if (ServuxStructuresHandler.INSTANCE.sendPlayPayload(player, new ServuxStructuresPayload(data)) == false)
if (packet.getType().equals(ServuxStructuresPacket.Type.PACKET_S2C_STRUCTURE_DATA_START))
{
// Send Structure Data via Packet Splitter
PacketByteBuf buffer = new PacketByteBuf(Unpooled.buffer());
buffer.writeNbt(packet.getCompound());
PayloadSplitter.send(this, buffer, player, player.networkHandler);
}
else if (ServuxStructuresHandler.INSTANCE.sendPlayPayload(player, new ServuxStructuresPacket.Payload(packet)) == false)
{
// Packet failure tracking
UUID id = player.getUuid();
Expand Down
Loading

0 comments on commit 1f725dd

Please sign in to comment.