1
0
mirror of https://github.com/GeyserMC/Geyser.git synced 2026-01-06 15:41:50 +00:00

The other dialog inputs, too

This commit is contained in:
Eclipse
2025-06-02 20:12:40 +00:00
parent 779d54812b
commit 71cf2ce254
5 changed files with 274 additions and 1 deletions

View File

@@ -67,7 +67,7 @@ public class BooleanInput extends DialogInput<Boolean> {
@Override
public void addToMap(NbtMapBuilder builder, Boolean value) {
builder.put(key, value);
builder.putBoolean(key, value);
}
@Override

View File

@@ -59,6 +59,12 @@ public abstract class DialogInput<T> {
Key type = MinecraftKey.key(tag.getString("type"));
if (type.equals(BooleanInput.TYPE)) {
return new BooleanInput(session, tag);
} else if (type.equals(NumberRangeInput.TYPE)) {
return new NumberRangeInput(session, tag);
} else if (type.equals(SingleOptionInput.TYPE)) {
return new SingleOptionInput(session, tag);
} else if (type.equals(TextInput.TYPE)) {
return new TextInput(session, tag);
}
throw new UnsupportedOperationException("Unknown dialog input type " + type);

View File

@@ -0,0 +1,81 @@
/*
* Copyright (c) 2025 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.session.dialog.input;
import net.kyori.adventure.key.Key;
import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.nbt.NbtMapBuilder;
import org.geysermc.cumulus.form.CustomForm;
import org.geysermc.cumulus.response.CustomFormResponse;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.MinecraftKey;
import java.util.Optional;
public class NumberRangeInput extends DialogInput<Float> {
public static final Key TYPE = MinecraftKey.key("number_range");
private final float start;
private final float end;
private final float initial;
private final float step;
public NumberRangeInput(GeyserSession session, NbtMap map) {
super(session, map);
start = map.getFloat("start");
end = map.getFloat("end");
initial = map.getFloat("initial", start + (end - start) / 2.0F);
step = map.getFloat("step", 1.0F);
}
@Override
public void addComponent(CustomForm.Builder builder, Optional<Float> restored) {
// Note: Java uses live labels which change as you change the slider, showing the value. This is what the "label_format" key is for. This is not supported on bedrock.
builder.slider(label, start, end, step, restored.orElse(initial));
}
@Override
public Float read(CustomFormResponse response) {
return response.asSlider();
}
@Override
public String asSubstitution(Float value) {
int rounded = value.intValue();
return (float) rounded == value ? Integer.toString(rounded) : Float.toString(value);
}
@Override
public void addToMap(NbtMapBuilder builder, Float value) {
builder.putFloat(key, value);
}
@Override
public Float defaultValue() {
return initial;
}
}

View File

@@ -0,0 +1,106 @@
/*
* Copyright (c) 2025 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.session.dialog.input;
import net.kyori.adventure.key.Key;
import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.nbt.NbtMapBuilder;
import org.cloudburstmc.nbt.NbtType;
import org.geysermc.cumulus.form.CustomForm;
import org.geysermc.cumulus.response.CustomFormResponse;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.text.MessageTranslator;
import org.geysermc.geyser.util.MinecraftKey;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class SingleOptionInput extends DialogInput<String> {
public static final Key TYPE = MinecraftKey.key("single_option");
private final boolean labelVisible;
private final List<Entry> entries = new ArrayList<>();
private final int initial;
public SingleOptionInput(GeyserSession session, NbtMap map) {
super(session, map);
labelVisible = map.getBoolean("label_visible", true);
List<NbtMap> entriesTag = map.getList("options", NbtType.COMPOUND);
int temp = 0;
for (int i = 0; i < entriesTag.size(); i++) {
NbtMap entry = entriesTag.get(i);
entries.add(new Entry(entry.getString("id"), Optional.ofNullable(MessageTranslator.convertFromNullableNbtTag(session, entry.get("display")))));
if (entry.getBoolean("initial")) {
temp = i;
}
}
initial = temp;
}
@Override
public void addComponent(CustomForm.Builder builder, Optional<String> restored) {
int defaultOption = initial;
if (restored.isPresent()) {
for (int i = 0; i < entries.size(); i++) {
if (entries.get(i).id().equals(restored.get())) {
defaultOption = i;
break;
}
}
}
builder.dropdown(labelVisible ? label : "", entries.stream().map(Entry::label).toList(), defaultOption);
}
@Override
public String read(CustomFormResponse response) {
return entries.get(response.asDropdown()).id();
}
@Override
public String asSubstitution(String value) {
return value;
}
@Override
public void addToMap(NbtMapBuilder builder, String value) {
builder.putString(key, value);
}
@Override
public String defaultValue() {
return entries.get(initial).id();
}
private record Entry(String id, Optional<String> fancyLabel) {
public String label() {
return fancyLabel.orElse(id);
}
}
}

View File

@@ -0,0 +1,80 @@
/*
* Copyright (c) 2025 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.session.dialog.input;
import net.kyori.adventure.key.Key;
import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.nbt.NbtMapBuilder;
import org.geysermc.cumulus.form.CustomForm;
import org.geysermc.cumulus.response.CustomFormResponse;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.MinecraftKey;
import java.util.Optional;
public class TextInput extends DialogInput<String> {
public static final Key TYPE = MinecraftKey.key("text");
private final boolean labelVisible;
private final String initial;
private final int maxLength;
public TextInput(GeyserSession session, NbtMap map) {
super(session, map);
labelVisible = map.getBoolean("label_visible", true);
initial = map.getString("initial", "");
maxLength = map.getInt("max_length", 32);
}
@Override
public void addComponent(CustomForm.Builder builder, Optional<String> restored) {
builder.input(labelVisible ? label : "", "", restored.orElse(initial));
}
@Override
public String read(CustomFormResponse response) {
String raw = response.asInput();
assert raw != null;
// Bedrock doesn't support setting a max length, so we just cut it off to not have the server complain
return raw.substring(0, Math.min(raw.length(), maxLength));
}
@Override
public String asSubstitution(String value) {
return value;
}
@Override
public void addToMap(NbtMapBuilder builder, String value) {
builder.putString(key, value);
}
@Override
public String defaultValue() {
return initial;
}
}