package com.nisovin.magicspells.spells.instant;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Scanner;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import com.nisovin.magicspells.MagicSpells;
import com.nisovin.magicspells.spelleffects.EffectPosition;
import com.nisovin.magicspells.spells.InstantSpell;
import com.nisovin.magicspells.util.MagicConfig;
import com.nisovin.magicspells.util.MagicLocation;
public class MarkSpell extends InstantSpell {
private boolean permanentMarks;
private boolean useAsRespawnLocation;
private HashMap<String,MagicLocation> marks;
public MarkSpell(MagicConfig config, String spellName) {
super(config, spellName);
permanentMarks = getConfigBoolean("permanent-marks", true);
useAsRespawnLocation = getConfigBoolean("use-as-respawn-location", false);
marks = new HashMap<String,MagicLocation>();
if (permanentMarks) {
loadMarks();
}
}
@Override
public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) {
if (state == SpellCastState.NORMAL) {
marks.put(player.getName().toLowerCase(), new MagicLocation(player.getLocation()));
if (permanentMarks) {
saveMarks();
}
playSpellEffects(EffectPosition.CASTER, player);
}
return PostCastAction.HANDLE_NORMALLY;
}
@EventHandler(priority=EventPriority.MONITOR)
public void onPlayerQuit(PlayerQuitEvent event) {
if (!permanentMarks) {
marks.remove(event.getPlayer().getName().toLowerCase());
}
}
@EventHandler
public void onPlayerRespawn(PlayerRespawnEvent event) {
if (useAsRespawnLocation) {
MagicLocation loc = marks.get(event.getPlayer().getName().toLowerCase());
if (loc != null) {
event.setRespawnLocation(loc.getLocation());
}
}
}
public HashMap<String,MagicLocation> getMarks() {
return marks;
}
public void setMarks(HashMap<String,MagicLocation> marks) {
this.marks = marks;
if (permanentMarks) {
saveMarks();
}
}
private void loadMarks() {
try {
Scanner scanner = new Scanner(new File(MagicSpells.plugin.getDataFolder(), "marks-" + internalName + ".txt"));
while (scanner.hasNext()) {
String line = scanner.nextLine();
if (!line.equals("")) {
try {
String[] data = line.split(":");
MagicLocation loc = new MagicLocation(data[1], Double.parseDouble(data[2]), Double.parseDouble(data[3]), Double.parseDouble(data[4]), Float.parseFloat(data[5]), Float.parseFloat(data[6]));
marks.put(data[0].toLowerCase(), loc);
} catch (Exception e) {
MagicSpells.plugin.getServer().getLogger().severe("MagicSpells: Failed to load mark: " + line);
}
}
}
scanner.close();
} catch (Exception e) {
}
}
private void saveMarks() {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(new File(MagicSpells.plugin.getDataFolder(), "marks-" + internalName + ".txt"), false));
for (String name : marks.keySet()) {
MagicLocation loc = marks.get(name);
writer.append(name + ":" + loc.getWorld() + ":" + loc.getX() + ":" + loc.getY() + ":" + loc.getZ() + ":" + loc.getYaw() + ":" + loc.getPitch());
writer.newLine();
}
writer.close();
} catch (Exception e) {
MagicSpells.plugin.getServer().getLogger().severe("MagicSpells: Error saving marks");
}
}
}