package com.nisovin.magicspells.spells.command;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.nisovin.magicspells.MagicSpells;
import com.nisovin.magicspells.Spell;
import com.nisovin.magicspells.Spellbook;
import com.nisovin.magicspells.events.SpellForgetEvent;
import com.nisovin.magicspells.spelleffects.EffectPosition;
import com.nisovin.magicspells.spells.CommandSpell;
import com.nisovin.magicspells.util.MagicConfig;
import com.nisovin.magicspells.util.Util;
public class ForgetSpell extends CommandSpell {
private boolean allowSelfForget;
private String strUsage;
private String strNoTarget;
private String strNoSpell;
private String strDoesntKnow;
private String strCastTarget;
private String strCastSelfTarget;
private String strResetTarget;
private String strResetSelf;
public ForgetSpell(MagicConfig config, String spellName) {
super(config, spellName);
allowSelfForget = getConfigBoolean("allow-self-forget", true);
strUsage = getConfigString("str-usage", "Usage: /cast forget <target> <spell>");
strNoTarget = getConfigString("str-no-target", "No such player.");
strNoSpell = getConfigString("str-no-spell", "You do not know a spell by that name.");
strDoesntKnow = getConfigString("str-doesnt-know", "That person does not know that spell.");
strCastTarget = getConfigString("str-cast-target", "%a has made you forget the %s spell.");
strCastSelfTarget = getConfigString("str-cast-self-target", "You have forgotten the %s spell.");
strResetTarget = getConfigString("str-reset-target", "You have reset %t's spellbook.");
strResetSelf = getConfigString("str-reset-self", "You have forgotten all of your spells.");
}
@Override
public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) {
if (state == SpellCastState.NORMAL) {
if (args == null || args.length == 0 || args.length > 2) {
// fail: missing args
sendMessage(player, strUsage);
return PostCastAction.ALREADY_HANDLED;
}
// get caster spellbook
Spellbook casterSpellbook = MagicSpells.getSpellbook(player);
// get target
Player target = null;
if (args.length == 1 && allowSelfForget) {
target = player;
} else if (args.length == 2 && casterSpellbook.hasAdvancedPerm("forget")) {
List<Player> players = MagicSpells.plugin.getServer().matchPlayer(args[0]);
if (players.size() != 1) {
// fail: no player match
sendMessage(player, strNoTarget);
return PostCastAction.ALREADY_HANDLED;
} else {
target = players.get(0);
}
} else {
// fail: missing args
sendMessage(player, strUsage);
return PostCastAction.ALREADY_HANDLED;
}
// get spell
String spellName = args.length == 1 ? args[0] : args[1];
boolean all = false;
Spell spell = null;
if (spellName.equals("*")) {
all = true;
} else {
spell = MagicSpells.getSpellByInGameName(spellName);
}
if (spell == null && !all) {
// fail: no spell match
sendMessage(player, strNoSpell);
return PostCastAction.ALREADY_HANDLED;
}
// check if caster has spell
if (!all && !casterSpellbook.hasSpell(spell)) {
// fail: caster doesn't have spell
sendMessage(player, strNoSpell);
return PostCastAction.ALREADY_HANDLED;
}
// get target spellbook and perform checks
Spellbook targetSpellbook = MagicSpells.getSpellbook(target);
if (targetSpellbook == null || (!all && !targetSpellbook.hasSpell(spell))) {
// fail: error
sendMessage(player, strDoesntKnow);
return PostCastAction.ALREADY_HANDLED;
}
// remove spell(s)
if (!all) {
targetSpellbook.removeSpell(spell);
targetSpellbook.save();
if (!player.equals(target)) {
sendMessage(target, formatMessage(strCastTarget, "%a", player.getDisplayName(), "%s", spell.getName(), "%t", target.getDisplayName()));
sendMessage(player, formatMessage(strCastSelf, "%a", player.getDisplayName(), "%s", spell.getName(), "%t", target.getDisplayName()));
playSpellEffects(EffectPosition.CASTER, player);
playSpellEffects(EffectPosition.TARGET, target);
} else {
sendMessage(player, strCastSelfTarget, "%s", spell.getName());
playSpellEffects(EffectPosition.CASTER, player);
}
return PostCastAction.NO_MESSAGES;
} else if (all) {
targetSpellbook.removeAllSpells();
targetSpellbook.addGrantedSpells();
targetSpellbook.save();
if (!player.equals(target)) {
sendMessage(player, strResetTarget, "%t", target.getDisplayName());
playSpellEffects(EffectPosition.CASTER, player);
playSpellEffects(EffectPosition.TARGET, target);
} else {
sendMessage(player, strResetSelf);
playSpellEffects(EffectPosition.CASTER, player);
}
return PostCastAction.NO_MESSAGES;
}
}
return PostCastAction.HANDLE_NORMALLY;
}
@Override
public boolean castFromConsole(CommandSender sender, String[] args) {
if (args == null || args.length != 2) {
// fail: missing args
sender.sendMessage(strUsage);
} else {
Player target = Bukkit.getPlayer(args[0]);
if (target == null) {
// fail: no player match
sender.sendMessage(strNoTarget);
} else {
Spell spell = null;
boolean all = false;
if (args[1].equals("*")) {
all = true;
} else {
spell = MagicSpells.getSpellByInGameName(args[1]);
}
if (spell == null && !all) {
// fail: no spell match
sender.sendMessage(strNoSpell);
} else {
Spellbook targetSpellbook = MagicSpells.getSpellbook(target);
if (targetSpellbook == null || (!all && !targetSpellbook.hasSpell(spell))) {
// fail: no spellbook for some reason or can't learn the spell
sender.sendMessage(strDoesntKnow);
} else {
SpellForgetEvent forgetEvent = new SpellForgetEvent(spell, target);
Bukkit.getPluginManager().callEvent(forgetEvent);
if (!forgetEvent.isCancelled()) {
if (!all) {
targetSpellbook.removeSpell(spell);
targetSpellbook.save();
sendMessage(target, formatMessage(strCastTarget, "%a", getConsoleName(), "%s", spell.getName(), "%t", target.getDisplayName()));
sender.sendMessage(formatMessage(strCastSelf, "%a", getConsoleName(), "%s", spell.getName(), "%t", target.getDisplayName()));
} else {
targetSpellbook.removeAllSpells();
targetSpellbook.addGrantedSpells();
targetSpellbook.save();
sender.sendMessage(formatMessage(strResetTarget, "%t", target.getDisplayName()));
}
}
}
}
}
}
return true;
}
@Override
public List<String> tabComplete(CommandSender sender, String partial) {
String[] args = Util.splitParams(partial);
if (args.length == 1) {
// matching player name or spell name
List<String> options = new ArrayList<String>();
List<String> players = tabCompletePlayerName(sender, args[0]);
List<String> spells = tabCompleteSpellName(sender, args[0]);
if (players != null) {
options.addAll(players);
}
if (spells != null) {
options.addAll(spells);
}
if (options.size() > 0) {
return options;
}
} else if (args.length == 2) {
// matching spell name
return tabCompleteSpellName(sender, args[1]);
}
return null;
}
}