package com.nisovin.magicspells.spells.command;
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.SpellLearnEvent;
import com.nisovin.magicspells.events.SpellLearnEvent.LearnSource;
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 TeachSpell extends CommandSpell {
private boolean requireKnownSpell;
private String strUsage;
private String strNoTarget;
private String strNoSpell;
private String strCantTeach;
private String strCantLearn;
private String strAlreadyKnown;
private String strCastTarget;
public TeachSpell(MagicConfig config, String spellName) {
super(config, spellName);
requireKnownSpell = getConfigBoolean("require-known-spell", true);
strUsage = getConfigString("str-usage", "Usage: /cast teach <target> <spell>");
strNoTarget = getConfigString("str-no-target", "No such player.");
strNoSpell = getConfigString("str-no-spell", "You do not know a spell by that name.");
strCantTeach = getConfigString("str-cant-teach", "You can't teach that spell.");
strCantLearn = getConfigString("str-cant-learn", "That person cannot learn that spell.");
strAlreadyKnown = getConfigString("str-already-known", "That person already knows that spell.");
strCastTarget = getConfigString("str-cast-target", "%a has taught you the %s spell.");
}
@Override
public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) {
if (state == SpellCastState.NORMAL) {
if (args == null || args.length != 2) {
// fail: missing args
sendMessage(player, strUsage);
} else {
List<Player> players = MagicSpells.plugin.getServer().matchPlayer(args[0]);
if (players.size() != 1) {
// fail: no player match
sendMessage(player, strNoTarget);
} else {
Spell spell = MagicSpells.getSpellByInGameName(args[1]);
Player target = players.get(0);
if (spell == null) {
// fail: no spell match
sendMessage(player, strNoSpell);
} else {
Spellbook spellbook = MagicSpells.getSpellbook(player);
if (spellbook == null || (!spellbook.hasSpell(spell) && requireKnownSpell)) {
// fail: player doesn't have spell
sendMessage(player, strNoSpell);
} else if (!spellbook.canTeach(spell)) {
// fail: cannot teach
sendMessage(player, strCantTeach);
} else {
// yay! can learn!
Spellbook targetSpellbook = MagicSpells.getSpellbook(target);
if (targetSpellbook == null || !targetSpellbook.canLearn(spell)) {
// fail: no spellbook for some reason or can't learn the spell
sendMessage(player, strCantLearn);
} else if (targetSpellbook.hasSpell(spell)) {
// fail: target already knows spell
sendMessage(player, strAlreadyKnown);
} else {
// call event
boolean cancelled = callEvent(spell, target, player);
if (cancelled) {
// fail: plugin cancelled it
sendMessage(player, strCantLearn);
} else {
targetSpellbook.addSpell(spell);
targetSpellbook.save();
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);
return PostCastAction.NO_MESSAGES;
}
}
}
}
}
}
return PostCastAction.ALREADY_HANDLED;
}
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 {
List<Player> players = MagicSpells.plugin.getServer().matchPlayer(args[0]);
if (players.size() != 1) {
// fail: no player match
sender.sendMessage(strNoTarget);
} else {
Spell spell = MagicSpells.getSpellByInGameName(args[1]);
if (spell == null) {
// fail: no spell match
sender.sendMessage(strNoSpell);
} else {
// yay! can learn!
Spellbook targetSpellbook = MagicSpells.getSpellbook(players.get(0));
if (targetSpellbook == null || !targetSpellbook.canLearn(spell)) {
// fail: no spellbook for some reason or can't learn the spell
sender.sendMessage(strCantLearn);
} else if (targetSpellbook.hasSpell(spell)) {
// fail: target already knows spell
sender.sendMessage(strAlreadyKnown);
} else {
// call event
boolean cancelled = callEvent(spell, players.get(0), sender);
if (cancelled) {
// fail: cancelled by plugin
sender.sendMessage(strCantLearn);
} else {
targetSpellbook.addSpell(spell);
targetSpellbook.save();
sendMessage(players.get(0), formatMessage(strCastTarget, "%a", getConsoleName(), "%s", spell.getName(), "%t", players.get(0).getDisplayName()));
sender.sendMessage(formatMessage(strCastSelf, "%a", getConsoleName(), "%s", spell.getName(), "%t", players.get(0).getDisplayName()));
}
}
}
}
}
return true;
}
@Override
public List<String> tabComplete(CommandSender sender, String partial) {
String[] args = Util.splitParams(partial);
if (args.length == 1) {
// matching player name
return tabCompletePlayerName(sender, args[0]);
} else if (args.length == 2) {
// matching spell name
return tabCompleteSpellName(sender, args[1]);
}
return null;
}
private boolean callEvent(Spell spell, Player learner, Object teacher) {
SpellLearnEvent event = new SpellLearnEvent(spell, learner, LearnSource.TEACH, teacher);
Bukkit.getServer().getPluginManager().callEvent(event);
return event.isCancelled();
}
}