add optional pack detection code

This commit is contained in:
Ethan 2024-06-27 20:35:16 +08:00
parent ca2312c7f6
commit 1c0f7c06af
2 changed files with 29 additions and 4 deletions

View file

@ -84,6 +84,7 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
private final Deque<String> packsToSent = new ArrayDeque<>();
private final CompressionStrategy compressionStrategy;
private boolean optionalPackLoaded = false;
private SessionLoadResourcePacksEventImpl resourcePackLoadEvent;
public UpstreamPacketHandler(GeyserImpl geyser, GeyserSession session) {
@ -218,10 +219,21 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
return PacketSignal.HANDLED;
}
private boolean sendPacksRequested = false;
private boolean haveAllPacksRequested = false;
@Override
public PacketSignal handle(ResourcePackClientResponsePacket packet) {
switch (packet.getStatus()) {
case COMPLETED:
if (!sendPacksRequested && haveAllPacksRequested && GeyserImpl.getInstance().getConfig().isForceResourcePacks()) {
session.setRequestedPacks(true);
}
if (session.isRequestedPacks()) {
session.setOptionalPackLoaded(this.optionalPackLoaded);
}
geyser.getLogger().debug("Geyser Optional Pack loaded: " + (session.isOptionalPackLoaded() ? "Yes" : "No"));
if (geyser.getConfig().getRemote().authType() != AuthType.ONLINE) {
session.authenticate(session.getAuthData().name());
} else if (!couldLoginUserByName(session.getAuthData().name())) {
@ -232,11 +244,14 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
break;
case SEND_PACKS:
sendPacksRequested = true;
session.setRequestedPacks(true);
packsToSent.addAll(packet.getPackIds());
sendPackDataInfo(packsToSent.pop());
break;
case HAVE_ALL_PACKS:
haveAllPacksRequested = true;
ResourcePackStackPacket stackPacket = new ResourcePackStackPacket();
stackPacket.setExperimentsPreviouslyToggled(false);
stackPacket.setForcedToAccept(false); // Leaving this as false allows the player to choose to download or not
@ -245,6 +260,9 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
for (ResourcePack pack : this.resourcePackLoadEvent.resourcePacks()) {
ResourcePackManifest.Header header = pack.manifest().header();
stackPacket.getResourcePacks().add(new ResourcePackStackPacket.Entry(header.uuid().toString(), header.version().toString(), ""));
if (pack.manifest().header().uuid().toString().equals("e5f5c938-a701-11eb-b2a3-047d7bb283ba")) {
this.optionalPackLoaded = true;
}
}
if (GeyserImpl.getInstance().getConfig().isAddNonBedrockItems()) {
@ -308,10 +326,10 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
@Override
public PacketSignal handle(ResourcePackChunkRequestPacket packet) {
session.setRequestedPacks(true);
ResourcePackChunkDataPacket data = new ResourcePackChunkDataPacket();
ResourcePack pack = this.resourcePackLoadEvent.getPacks().get(packet.getPackId().toString());
PackCodec codec = pack.codec();
data.setChunkIndex(packet.getChunkIndex());
data.setProgress((long) packet.getChunkIndex() * GeyserResourcePack.CHUNK_SIZE);
data.setPackVersion(packet.getPackVersion());
@ -346,7 +364,9 @@ public class UpstreamPacketHandler extends LoggingPacketHandler {
ResourcePack pack = this.resourcePackLoadEvent.getPacks().get(packID[0]);
PackCodec codec = pack.codec();
ResourcePackManifest.Header header = pack.manifest().header();
if (header.uuid().toString().equals("e5f5c938-a701-11eb-b2a3-047d7bb283ba")) {
this.optionalPackLoaded = true;
}
data.setPackId(header.uuid());
int chunkCount = (int) Math.ceil(codec.size() / (double) GeyserResourcePack.CHUNK_SIZE);
data.setChunkCount(chunkCount);

View file

@ -487,6 +487,11 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
@Setter
private float walkSpeed;
@Setter
private boolean requestedPacks = false;
@Setter
private boolean optionalPackLoaded = false;
/**
* Caches current rain status.
*/