Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 14 additions & 18 deletions core/src/main/java/org/geysermc/geyser/session/cache/FormCache.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,12 @@

import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList;
import lombok.RequiredArgsConstructor;
import org.cloudburstmc.protocol.bedrock.data.AttributeData;
import org.cloudburstmc.protocol.bedrock.packet.ClientboundCloseFormPacket;
import org.cloudburstmc.protocol.bedrock.packet.ModalFormRequestPacket;
import org.cloudburstmc.protocol.bedrock.packet.ModalFormResponsePacket;
import org.cloudburstmc.protocol.bedrock.packet.UpdateAttributesPacket;
import org.cloudburstmc.protocol.bedrock.packet.ClientboundCloseFormPacket;
import org.geysermc.cumulus.form.Form;
import org.geysermc.cumulus.form.SimpleForm;
import org.geysermc.cumulus.form.impl.FormDefinitions;
Expand All @@ -43,7 +41,6 @@
import org.geysermc.geyser.session.GeyserSession;

import java.util.Collections;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

Expand All @@ -58,15 +55,14 @@ public class FormCache {
private final FormDefinitions formDefinitions = FormDefinitions.instance();
private final AtomicInteger formIdCounter = new AtomicInteger(0);
private final Int2ObjectMap<Form> forms = new Int2ObjectOpenHashMap<>();
private final IntList sentFormIds = new IntArrayList();
private final GeyserSession session;

public boolean hasFormOpen() {
// If forms is empty it implies that there are no forms to show
// so technically this returns "has forms to show" or "has open"
// Forms are only queued in specific circumstances, such as waiting on
// previous inventories to close
return !forms.isEmpty() && !sentFormIds.isEmpty();
return !forms.isEmpty();
}

public int addForm(Form form) {
Expand All @@ -86,9 +82,6 @@ public void showForm(Form form) {
private void sendForm(int formId, Form form) {
String jsonData = formDefinitions.codecFor(form).jsonData(form);

// Store that this form has been sent
sentFormIds.add(formId);

ModalFormRequestPacket formRequestPacket = new ModalFormRequestPacket();
formRequestPacket.setFormId(formId);
formRequestPacket.setFormData(jsonData);
Expand Down Expand Up @@ -126,7 +119,6 @@ public void resendAllForms() {

public void handleResponse(ModalFormResponsePacket response) {
Form form = forms.remove(response.getFormId());
this.sentFormIds.rem(response.getFormId());
if (form == null) {
return;
}
Expand All @@ -140,16 +132,20 @@ public void handleResponse(ModalFormResponsePacket response) {
}

public void closeForms() {
if (!forms.isEmpty()) {
// Check if there are any forms that have not been sent to the client yet
for (Int2ObjectMap.Entry<Form> entry : forms.int2ObjectEntrySet()) {
if (!sentFormIds.contains(entry.getIntKey())) {
// This will send the form, but close it instantly with the packet later
// ...thereby clearing our list!
sendForm(entry.getIntKey(), entry.getValue());
if (!this.forms.isEmpty()) {
// Copy them to ensure any response handler's sent form isn't instantly cleared
Int2ObjectMap<Form> copy = new Int2ObjectOpenHashMap<>(this.forms);
this.forms.clear();
// Now close it
session.sendUpstreamPacket(new ClientboundCloseFormPacket());

for (Form form : copy.values()) {
try {
formDefinitions.definitionFor(form).handleFormResponse(form, "");
} catch (Exception e) {
GeyserImpl.getInstance().getLogger().error("Error while closing form!", e);
}
}
session.sendUpstreamPacket(new ClientboundCloseFormPacket());
}
}
}