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,133 @@
package com.nisovin.magicspells.spells.instant;

import java.util.Map;
import java.util.HashMap;
import java.util.HashSet;

import net.kyori.adventure.text.Component;

import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.MenuType;
import org.bukkit.event.EventHandler;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.view.AnvilView;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;

import com.nisovin.magicspells.Subspell;
import com.nisovin.magicspells.MagicSpells;
import com.nisovin.magicspells.util.SpellData;
import com.nisovin.magicspells.util.CastResult;
import com.nisovin.magicspells.util.MagicConfig;
import com.nisovin.magicspells.variables.Variable;
import com.nisovin.magicspells.spells.InstantSpell;
import com.nisovin.magicspells.util.config.ConfigData;
import com.nisovin.magicspells.spells.TargetedEntitySpell;
import com.nisovin.magicspells.variables.variabletypes.GlobalStringVariable;
import com.nisovin.magicspells.variables.variabletypes.PlayerStringVariable;

@SuppressWarnings("UnstableApiUsage")
public class AnvilInputSpell extends InstantSpell implements TargetedEntitySpell {

private static final ItemStack PAPER = ItemStack.of(Material.PAPER);
static {
PAPER.editMeta(meta -> meta.customName(Component.empty()));
}

private final Map<Player, AnvilView> open = new HashMap<>();

private final ConfigData<Component> title;

private Variable variable;
private Subspell spellOnClose;

public AnvilInputSpell(MagicConfig config, String spellName) {
super(config, spellName);

title = getConfigDataComponent("title", null);
}

@Override
public void initializeVariables() {
super.initializeVariables();

String variableName = getConfigString("variable-name", null);
Variable variable = MagicSpells.getVariableManager().getVariable(variableName);
if (variable instanceof PlayerStringVariable || variable instanceof GlobalStringVariable) {
this.variable = variable;
return;
}
MagicSpells.error("AnvilInputSpell '" + internalName + "' has an invalid 'variable-name' defined!");
}

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

spellOnClose = initSubspell(
getConfigString("spell-on-close", null),
"AnvilInputSpell " + internalName + " has an invalid 'spell-on-close' defined!",
true
);
}

@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);

AnvilView anvil = MenuType.ANVIL.create(player, title.get(data));
anvil.setMaximumRepairCost(0);
anvil.setItem(0, PAPER);
anvil.open();

open.put(player, anvil);

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

@Override
protected void turnOff() {
for (AnvilView anvil : new HashSet<>(open.values())) anvil.close();
open.clear();
}

@EventHandler
private void onClick(InventoryClickEvent event) {
if (!(event.getWhoClicked() instanceof Player player)) return;

AnvilView anvil = open.get(player);
if (anvil == null) return;

event.setCancelled(true);

if (!event.getClick().isMouseClick()) return;
if (event.getSlotType() != InventoryType.SlotType.RESULT) return;

if (variable != null) variable.parseAndSet(player, anvil.getRenameText());

anvil.close();
}

@EventHandler
private void onClose(InventoryCloseEvent event) {
if (!(event.getPlayer() instanceof Player player)) return;

AnvilView anvil = open.get(player);
if (anvil == null) return;

anvil.setItem(0, null);

if (spellOnClose != null) spellOnClose.subcast(new SpellData(player));

open.remove(player);
}

}
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);
}

}
29 changes: 3 additions & 26 deletions core/src/main/java/com/nisovin/magicspells/util/EntityData.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,7 @@
import com.nisovin.magicspells.util.ai.CustomGoal;
import com.nisovin.magicspells.util.config.ConfigData;
import com.nisovin.magicspells.util.config.FunctionData;
import com.nisovin.magicspells.util.magicitems.MagicItem;
import com.nisovin.magicspells.util.config.ConfigDataUtil;
import com.nisovin.magicspells.util.magicitems.MagicItems;
import com.nisovin.magicspells.util.itemreader.AttributeHandler;

public class EntityData {
Expand Down Expand Up @@ -1015,31 +1013,10 @@ private <T> ConfigData<BlockData> addOptBlockData(Multimap<Class<?>, Transformer
}

private <T> ConfigData<ItemStack> addOptItemStack(Multimap<Class<?>, Transformer<?>> transformers, ConfigurationSection config, String name, Class<T> type, BiConsumer<T, ItemStack> setter) {
ConfigData<String> supplier = ConfigDataUtil.getString(config, name, null);
if (supplier.isConstant()) {
ItemStack item = getItemStack(supplier.get());
if (item == null) return data -> null;

transformers.put(type, new TransformerImpl<>(data -> item, setter, true));
return data -> item;
}

ConfigData<ItemStack> itemSupplier = data -> getItemStack(supplier.get(data));
transformers.put(type, new TransformerImpl<>(itemSupplier, setter, true));

return itemSupplier;
}

private ItemStack getItemStack(String string) {
if (string == null) return null;

try {
return Bukkit.getItemFactory().createItemStack(string);
} catch (IllegalArgumentException ignored) {
}
ConfigData<ItemStack> supplier = ConfigDataUtil.getItemStack(config, name, null);
transformers.put(type, new TransformerImpl<>(supplier, setter, true));

MagicItem magicItem = MagicItems.getMagicItemFromString(string);
return magicItem == null ? null : magicItem.getItemStack();
return supplier;
}

private void addOptEquipment(Multimap<Class<?>, Transformer<?>> transformers, ConfigurationSection config, String name, EquipmentSlot slot) {
Expand Down
Loading
Loading