package com.nisovin.magicspells.spells.instant;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;
import com.nisovin.magicspells.spells.InstantSpell;
import com.nisovin.magicspells.spells.TargetedLocationSpell;
import com.nisovin.magicspells.util.MagicConfig;
import com.nisovin.magicspells.util.Util;
public class ConjureBookSpell extends InstantSpell implements TargetedLocationSpell {
boolean addToInventory;
ItemStack book;
public ConjureBookSpell(MagicConfig config, String spellName) {
super(config, spellName);
addToInventory = getConfigBoolean("add-to-inventory", true);
String title = getConfigString("title", "Book");
String author = getConfigString("author", "Steve");
List<String> pages = getConfigStringList("pages", null);
List<String> lore = getConfigStringList("lore", null);
book = new ItemStack(Material.WRITTEN_BOOK);
BookMeta meta = (BookMeta)book.getItemMeta();
meta.setTitle(ChatColor.translateAlternateColorCodes('&', title));
meta.setAuthor(ChatColor.translateAlternateColorCodes('&', author));
if (pages != null) {
for (int i = 0; i < pages.size(); i++) {
pages.set(i, ChatColor.translateAlternateColorCodes('&', pages.get(i)));
}
meta.setPages(pages);
}
if (lore != null) {
for (int i = 0; i < lore.size(); i++) {
lore.set(i, ChatColor.translateAlternateColorCodes('&', lore.get(i)));
}
meta.setLore(lore);
}
book.setItemMeta(meta);
}
private ItemStack getBook(Player player, String[] args) {
ItemStack item = book.clone();
BookMeta meta = (BookMeta)item.getItemMeta();
String title = meta.getTitle();
String author = meta.getAuthor();
List<String> lore = meta.getLore();
List<String> pages = meta.getPages();
if (player != null) {
title = title.replace("{{name}}", player.getName()).replace("{{disp}}", player.getDisplayName());
author = author.replace("{{name}}", player.getName()).replace("{{disp}}", player.getDisplayName());
if (lore != null && lore.size() > 0) {
for (int l = 0; l < lore.size(); l++) {
lore.set(l, lore.get(l).replace("{{name}}", player.getName()).replace("{{disp}}", player.getDisplayName()));
}
}
if (pages != null && pages.size() > 0) {
for (int p = 0; p < pages.size(); p++) {
pages.set(p, pages.get(p).replace("{{name}}", player.getName()).replace("{{disp}}", player.getDisplayName()));
}
}
}
if (args != null) {
for (int i = 0; i < args.length; i++) {
title = title.replace("{{"+i+"}}", args[i]);
author = author.replace("{{"+i+"}}", args[i]);
if (lore != null && lore.size() > 0) {
for (int l = 0; l < lore.size(); l++) {
lore.set(l, lore.get(l).replace("{{"+i+"}}", args[i]));
}
}
if (pages != null && pages.size() > 0) {
for (int p = 0; p < pages.size(); p++) {
pages.set(p, pages.get(p).replace("{{"+i+"}}", args[i]));
}
}
}
}
meta.setTitle(title);
meta.setAuthor(author);
meta.setLore(lore);
meta.setPages(pages);
item.setItemMeta(meta);
return item;
}
@Override
public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) {
if (state == SpellCastState.NORMAL) {
boolean added = false;
ItemStack item = getBook(player, args);
if (addToInventory) {
if (player.getItemInHand() == null || player.getItemInHand().getType() == Material.AIR) {
player.setItemInHand(item);
added = true;
} else {
added = Util.addToInventory(player.getInventory(), item, false, false);
}
}
if (!added) {
player.getWorld().dropItem(player.getLocation(), item).setItemStack(item);
}
}
return PostCastAction.HANDLE_NORMALLY;
}
@Override
public boolean castAtLocation(Player caster, Location target, float power) {
return castAtLocation(target, power);
}
@Override
public boolean castAtLocation(Location target, float power) {
ItemStack item = book.clone();
target.getWorld().dropItem(target, item).setItemStack(item);
return true;
}
}