ProjectAres/PGM/src/main/java/tc/oc/pgm/spawns/ObserverToolFactory.java

97 lines
3.3 KiB
Java

package tc.oc.pgm.spawns;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Nullable;
import javax.inject.Inject;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.configuration.Configuration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.permissions.Permissible;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import tc.oc.commons.bukkit.configuration.ConfigUtils;
import tc.oc.commons.bukkit.item.ItemBuilder;
import tc.oc.commons.bukkit.localization.Translations;
import tc.oc.commons.core.localization.LocaleMap;
import tc.oc.commons.core.logging.Loggers;
import tc.oc.pgm.kits.GlobalItemParser;
import tc.oc.pgm.xml.InvalidXMLException;
/**
* Creates some of the items for the observer hotbar
*/
public class ObserverToolFactory {
public static final String EDIT_WAND_PERMISSION = "worldedit.wand";
private final Logger logger;
private final Configuration config;
private final SAXBuilder saxBuilder;
private final GlobalItemParser itemParser;
private final LocaleMap<ItemStack> howToBooks = new LocaleMap<>();
@Inject private ObserverToolFactory(Loggers loggers, Configuration config, SAXBuilder saxBuilder, GlobalItemParser itemParser) {
this.saxBuilder = saxBuilder;
this.logger = loggers.get(getClass());
this.config = config;
this.itemParser = itemParser;
}
public ItemStack getTeleportTool(Player player) {
return new ItemBuilder()
.material(Material.COMPASS)
.name(ChatColor.BLUE.toString() + ChatColor.BOLD + Translations.get().t("teleportTool.displayName", player))
.get();
}
public ItemStack getEditWand(Player player) {
return new ItemBuilder()
.material(Material.RABBIT_FOOT)
.name(ChatColor.DARK_PURPLE.toString() + ChatColor.BOLD + Translations.get().t("editWand.displayName", player))
.get();
}
public boolean canUseEditWand(Permissible permissible) {
return permissible.hasPermission(EDIT_WAND_PERMISSION);
}
public @Nullable ItemStack getHowToBook(Player player) {
final Locale locale = player.getCurrentLocale();
ItemStack book = howToBooks.get(locale);
if(book == null) {
final Path baseFile = ConfigUtils.getPath(config, "howto-book-file", null);
if(baseFile == null) return null;
book = loadHowToBook(baseFile.resolve(locale.toLanguageTag().replace('-', '_') + ".xml"));
if(book != null) {
logger.fine("Loaded how-to book for locale " + locale);
howToBooks.put(locale, book);
}
}
return book;
}
@Nullable ItemStack loadHowToBook(Path file) {
try {
if(!Files.isRegularFile(file)) return null;
return itemParser.parseBook(saxBuilder.build(file.toFile())
.getRootElement());
}
catch(JDOMException | IOException | InvalidXMLException e) {
logger.log(Level.SEVERE, "Failed to parse how-to book from XML file " + file, e);
return null;
}
}
}