Skip to content
Open

Dialogs #1079

Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion core/src/main/java/com/nisovin/magicspells/Spell.java
Original file line number Diff line number Diff line change
Expand Up @@ -942,7 +942,7 @@ protected ConfigData<BlockData> getConfigDataBlockData(String key, BlockData def
}

protected <T extends Keyed> ConfigData<T> getConfigDataRegistryEntry(@NotNull String key, @NotNull RegistryKey<T> registryKey, @Nullable T def) {
return ConfigDataUtil.getRegistryEntry(config.getMainConfig(), internalKey + key, RegistryAccess.registryAccess().getRegistry(registryKey), def);
return ConfigDataUtil.getRegistryEntry(config.getMainConfig(), internalKey + key, registryKey, def);
}

protected <T extends Keyed> ConfigData<T> getConfigDataRegistryEntry(@NotNull String key, @NotNull Registry<T> registry, @Nullable T def) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.nisovin.magicspells.spells.instant;

import org.bukkit.entity.Player;

import io.papermc.paper.dialog.Dialog;

import com.nisovin.magicspells.util.*;
import com.nisovin.magicspells.MagicSpells;
import com.nisovin.magicspells.spells.InstantSpell;
import com.nisovin.magicspells.util.config.ConfigData;
import com.nisovin.magicspells.spells.TargetedEntitySpell;
import com.nisovin.magicspells.util.config.dialog.DialogBuilder;

public class DialogSpell extends InstantSpell implements TargetedEntitySpell {

private ConfigData<Dialog> dialog;

public DialogSpell(MagicConfig config, String spellName) {
super(config, spellName);
}

@Override
protected void initialize() {
super.initialize();

String error = "DialogSpell '" + internalName + "' reports - ";
dialog = DialogBuilder.create(
getConfigSection(""),
extra -> MagicSpells.error(error + extra),
extra -> MagicSpells.debug(" " + error + extra)
);
}

@Override
public CastResult cast(SpellData data) {
return castAtEntity(data.target(data.caster()));
}

@Override
public CastResult castAtEntity(SpellData data) {
if (!(data.target() instanceof Player player)) return noTarget(data);

Dialog dialog = this.dialog.get(data);
if (dialog == null) return new CastResult(PostCastAction.ALREADY_HANDLED, data);

player.showDialog(dialog);

playSpellEffects(data);
return new CastResult(PostCastAction.HANDLE_NORMALLY, data);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.nisovin.magicspells.spells.targeted;

import org.bukkit.entity.Player;

import com.nisovin.magicspells.util.*;
import com.nisovin.magicspells.spells.TargetedSpell;
import com.nisovin.magicspells.spells.TargetedEntitySpell;

public class CloseDialogSpell extends TargetedSpell implements TargetedEntitySpell {

public CloseDialogSpell(MagicConfig config, String spellName) {
super(config, spellName);
}

@Override
public CastResult cast(SpellData data) {
TargetInfo<Player> info = getTargetedPlayer(data);
if (info.noTarget()) return noTarget(info);

return close(info.target(), info.spellData());
}

@Override
public CastResult castAtEntity(SpellData data) {
if (!(data.target() instanceof Player target)) return noTarget(data);
return close(target, data);
}

private CastResult close(Player target, SpellData data) {
target.closeDialog();

playSpellEffects(data);
return new CastResult(PostCastAction.HANDLE_NORMALLY, data);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,17 @@ public CloseInventorySpell(MagicConfig config, String spellName) {
public CastResult cast(SpellData data) {
TargetInfo<Player> info = getTargetedPlayer(data);
if (info.noTarget()) return noTarget(info);
data = info.spellData();

close(info.target(), data);
return new CastResult(PostCastAction.HANDLE_NORMALLY, data);
return close(info.target(), info.spellData());
}

@Override
public CastResult castAtEntity(SpellData data) {
if (!(data.target() instanceof Player target)) return noTarget(data);
close(target, data);
return new CastResult(PostCastAction.HANDLE_NORMALLY, data);
return close(target, data);
}

private void close(Player target, SpellData data) {
private CastResult close(Player target, SpellData data) {
int delay = this.delay.get(data);

if (delay > 0) {
Expand All @@ -46,6 +43,8 @@ private void close(Player target, SpellData data) {
target.closeInventory();
playSpellEffects(data);
}

return new CastResult(PostCastAction.HANDLE_NORMALLY, data);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.RegistryAccess;

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;

Expand Down Expand Up @@ -730,6 +733,10 @@ public boolean isConstant() {
}
}

public static <T extends Keyed> ConfigData<T> getRegistryEntry(@NotNull ConfigurationSection config, @NotNull String path, @NotNull RegistryKey<T> registryKey, @Nullable T def) {
return getRegistryEntry(config, path, RegistryAccess.registryAccess().getRegistry(registryKey), def);
}

public static <T extends Keyed> ConfigData<T> getRegistryEntry(@NotNull ConfigurationSection config, @NotNull String path, @NotNull Registry<T> registry, @Nullable T def) {
String value = config.getString(path);
if (value == null) return data -> def;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.nisovin.magicspells.util.config.dialog;

import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import java.util.function.BiFunction;

import org.jetbrains.annotations.NotNull;

import org.apache.commons.lang3.function.TriFunction;

import org.bukkit.configuration.ConfigurationSection;

import com.nisovin.magicspells.util.ConfigReaderUtil;
import com.nisovin.magicspells.util.config.ConfigData;

public abstract class BuildContext<T> {

protected final Debugger debugger;

protected BuildContext(Debugger debugger) {
this.debugger = debugger;
}

@NotNull
protected abstract NullConfigData<T> build();

@NotNull
protected <E> NullConfigData<E> required(
TriFunction<ConfigurationSection, String, E, ConfigData<E>> configDataFun,
ConfigurationSection config,
String basePath,
String subPath
) {
String error = "Missing '%s' at '%s'.".formatted(subPath, basePath);

ConfigData<E> configData = configDataFun.apply(config, subPath, null);
if (configData.isNull()) {
debugger.config(error);
return _ -> null;
}

return data -> {
E object = configData.get(data);
if (object == null) debugger.cast(error);
return object;
};
}

protected static <E> ConfigData<List<E>> configDataList(
ConfigurationSection config,
String basePath,
String subPath,
BiFunction<ConfigurationSection, String, ConfigData<? extends E>> configDataFun
) {
List<ConfigData<? extends E>> list = new ArrayList<>();
List<?> configList = config.getList(subPath, List.of());
for (int i = 0; i < configList.size(); i++) {
if (!(configList.get(i) instanceof Map<?, ?> map)) continue;
ConfigurationSection section = ConfigReaderUtil.mapToSection(map);

String path = "%s.%s[%d]".formatted(basePath, subPath, i);

list.add(configDataFun.apply(section, path));
}

return data -> {
List<E> result = new ArrayList<>();

for (ConfigData<? extends E> element : list) {
E item = element.get(data);
if (item == null) continue;
result.add(item);
}

return result;
};
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.nisovin.magicspells.util.config.dialog;

import java.util.function.Consumer;

public final class Debugger {

private final Consumer<String> config;
private final Consumer<String> cast;

public Debugger(Consumer<String> config, Consumer<String> cast) {
this.config = config;
this.cast = cast;
}

public void config(String text) {
config.accept(text);
}

public void cast(String text) {
cast.accept(text);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.nisovin.magicspells.util.config.dialog;

import java.util.function.Consumer;

import org.jetbrains.annotations.NotNull;

import net.kyori.adventure.key.Key;

import org.bukkit.NamespacedKey;
import org.bukkit.configuration.ConfigurationSection;

import io.papermc.paper.dialog.Dialog;
import io.papermc.paper.registry.TypedKey;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.data.dialog.DialogBase;
import io.papermc.paper.registry.data.dialog.type.DialogType;
import io.papermc.paper.registry.data.dialog.DialogRegistryEntry;

import com.nisovin.magicspells.util.config.ConfigData;
import com.nisovin.magicspells.util.config.ConfigDataUtil;
import com.nisovin.magicspells.util.config.dialog.base.BaseBuilder;
import com.nisovin.magicspells.util.config.dialog.types.TypeBuilder;

@SuppressWarnings("UnstableApiUsage")
public class DialogBuilder extends BuildContext<Dialog> {

private final ConfigurationSection config;

public static NullConfigData<Dialog> create(ConfigurationSection config, Consumer<String> debugConfig, Consumer<String> debugCast) {
Debugger debugger = new Debugger(debugConfig, debugCast);
return new DialogBuilder(debugger, config).build();
}

private DialogBuilder(Debugger debugger, ConfigurationSection config) {
super(debugger);
this.config = config;
}

@Override
protected @NotNull NullConfigData<Dialog> build() {
ConfigData<NamespacedKey> copyFromData = ConfigDataUtil.getNamespacedKey(config, "copy-from", null);

ConfigData<DialogBase> baseData = BaseBuilder.create(debugger, config);
ConfigData<DialogType> typeData = TypeBuilder.create(debugger, config);

return data -> {
DialogBase base = baseData.get(data);
DialogType type = typeData.get(data);
if (base == null || type == null) return null;

Key copyFrom = copyFromData.get(data);

return Dialog.create(factory -> {
DialogRegistryEntry.Builder builder;

if (copyFrom == null) builder = factory.empty();
else {
try {
builder = factory.copyFrom(TypedKey.create(RegistryKey.DIALOG, copyFrom));
} catch (IllegalArgumentException e) {
debugger.cast("Invalid 'copy-from': " + e.getMessage());
return;
}
}

builder.base(base).type(type);
});
};
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.nisovin.magicspells.util.config.dialog;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import com.nisovin.magicspells.util.SpellData;
import com.nisovin.magicspells.util.config.ConfigData;

public interface NullConfigData<T> extends ConfigData<T> {

@Override
@Nullable
T get(@NotNull SpellData data);

}
Loading
Loading