/*
* This file is part of Libelula Minecraft Edition Project.
*
* Libelula Minecraft Edition is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Libelula Minecraft Edition is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Libelula Minecraft Edition.
* If not, see <http://www.gnu.org/licenses/>.
*
*/
package me.libelula.capturethewool;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;
/**
*
* @author Diego D'Onofrio <ddonofrio@member.fsf.org>
* @version 1.0
*
*/
public final class LangManager {
private final Main plugin;
private final YamlConfiguration lang;
private final String messagePrefix;
private final int minVersion = 4;
public LangManager(Main plugin) {
this.plugin = plugin;
lang = new YamlConfiguration();
File langFile = new File(plugin.getDataFolder(), plugin.getConfig().getString("lang-file"));
if (!langFile.exists()) {
saveDefaultLangFiles();
}
if (langFile.exists()) {
try {
lang.load(langFile);
} catch (IOException | InvalidConfigurationException ex) {
plugin.getLogger().severe(ex.toString());
}
int langVersion = lang.getInt("version", 0);
if (langVersion < minVersion && (langFile.getName().equals("spanish.yml")
|| langFile.getName().equals("english.yml"))
|| langFile.getName().equals("italian.yml")) { // Texts must be updated.
File backUpFile = new File(langFile.getParent(), langFile.getName() + "-" + langVersion + ".bak");
langFile.renameTo(backUpFile);
plugin.saveResource(langFile.getName(), true);
try {
lang.load(langFile);
} catch (IOException | InvalidConfigurationException ex) {
plugin.getLogger().severe(ex.toString());
}
}
} else {
plugin.getLogger().severe("Configured language file does not exists: ".concat(langFile.getAbsolutePath()));
}
messagePrefix = ChatColor.translateAlternateColorCodes('&', lang.getString("message-prefix"));
}
public void saveDefaultLangFiles() {
File defaultLangFile;
defaultLangFile = new File(plugin.getDataFolder(), "spanish.yml");
if (!defaultLangFile.exists()) {
plugin.saveResource(defaultLangFile.getName(), false);
}
defaultLangFile = new File(plugin.getDataFolder(), "english.yml");
if (!defaultLangFile.exists()) {
plugin.saveResource(defaultLangFile.getName(), false);
}
defaultLangFile = new File(plugin.getDataFolder(), "italian.yml");
if (!defaultLangFile.exists()) {
plugin.saveResource(defaultLangFile.getName(), false);
}
}
public String getText(String label) {
String text = lang.getString(label);
if (text == null) {
text = label;
} else {
text = ChatColor.translateAlternateColorCodes('&', text);
}
return text;
}
public String getMessage(String label) {
return messagePrefix + " " + getText(label);
}
public void sendMessage(String label, Player player) {
player.sendMessage(getMessage(label));
}
public void sendMessage(String label, CommandSender cs) {
cs.sendMessage(getMessage(label));
}
public String getMessagePrefix() {
return messagePrefix;
}
public void sendText(String baseLabel, Player player) {
if (lang.getString(baseLabel) == null) {
sendMessage(baseLabel, player);
return;
}
for (String label : lang.getConfigurationSection(baseLabel).getKeys(false)) {
sendMessage(baseLabel + "." + label, player);
}
}
public ItemStack getHelpBook() {
List<String> bookPages = new ArrayList<>();
for (String page : lang.getConfigurationSection("help-book.pages").getKeys(false)) {
try {
Integer.parseInt(page);
} catch (NumberFormatException ex) {
continue;
}
String textPage = "";
for (String line : lang.getConfigurationSection("help-book.pages." + page).getKeys(false)) {
if (line != null) {
String text = ChatColor.translateAlternateColorCodes('&', lang.getString("help-book.pages." + page + "." + line));
textPage = textPage.concat(text).concat("\n");
}
}
bookPages.add(textPage);
}
ItemStack book = new ItemStack(Material.WRITTEN_BOOK, 1);
BookMeta bm = (BookMeta) book.getItemMeta();
bm.setDisplayName(ChatColor.translateAlternateColorCodes('&', lang.getString("help-book.title")));
bm.setAuthor(ChatColor.translateAlternateColorCodes('&', lang.getString("help-book.author")));
bm.setTitle(ChatColor.translateAlternateColorCodes('&', lang.getString("help-book.title")));
bm.setPages(bookPages);
bm.addEnchant(Enchantment.LUCK, 1, true);
book.setItemMeta(bm);
return book;
}
public void sendVerbatimTextToWorld(String text, World world, Player filter) {
for (Player receiver : world.getPlayers()) {
if (filter != null && receiver.getName().equals(filter.getName())) {
continue;
}
receiver.sendMessage(messagePrefix + " " + text);
}
}
public void sendMessageToWorld(String label, World world, Player filter) {
String text = getText(label);
for (Player receiver : world.getPlayers()) {
if (filter != null && receiver.getName().equals(filter.getName())) {
continue;
}
receiver.sendMessage(messagePrefix + " " + text);
}
}
public void sendMessageToTeam(String label, Player player) {
sendVerbatimMessageToTeam(getText(label), player);
}
public void sendVerbatimMessageToTeam(String message, Player player) {
TeamManager.TeamId playerTeam = plugin.pm.getTeamId(player);
for (Player receiver : player.getWorld().getPlayers()) {
if (playerTeam == plugin.pm.getTeamId(receiver)) {
receiver.sendMessage(messagePrefix + " " + message);
}
}
}
public String getMurderText(Player player, Player killer, ItemStack is) {
String ret = ChatColor.translateAlternateColorCodes('&',
lang.getString("death-events.by-player.message"));
ret = ret.replace("%KILLER%", killer.getName());
ret = ret.replace("%KILLED%", player.getName());
ret = ret.replace("%KILLER_COLOR%", plugin.pm.getChatColor(killer) + "");
ret = ret.replace("%KILLED_COLOR%", plugin.pm.getChatColor(player) + "");
String how;
if (is != null) {
how = lang.getString("death-events.by-player.melee.".concat(is.getType().name()));
if (how == null) {
how = lang.getString("death-events.by-player.melee._OTHER_");
}
} else {
how = lang.getString("death-events.by-player.melee.PULL");
}
ret = ret.replace("%HOW%", how);
return ret;
}
public String getRangeMurderText(Player player, Player killer, int distance, boolean headshoot) {
String ret = ChatColor.translateAlternateColorCodes('&',
lang.getString("death-events.by-player.message"));
ret = ret.replace("%KILLER%", killer.getName());
ret = ret.replace("%KILLED%", player.getName());
ret = ret.replace("%KILLER_COLOR%", plugin.pm.getChatColor(killer) + "");
ret = ret.replace("%KILLED_COLOR%", plugin.pm.getChatColor(player) + "");
if (headshoot) {
ret = ret.replace("%HOW%", lang.getString("death-events.by-player.range.HEADSHOT"));
} else {
ret = ret.replace("%HOW%", lang.getString("death-events.by-player.range.BODYSHOT"));
}
ret = ret.replace("%DISTANCE%", distance + "");
return ret;
}
public String getNaturalDeathText(Player player, EntityDamageEvent.DamageCause cause) {
String ret = ChatColor.translateAlternateColorCodes('&',
lang.getString("death-events.natural.message"));
ret = ret.replace("%KILLED%", player.getName());
ret = ret.replace("%KILLED_COLOR%", plugin.pm.getChatColor(player) + "");
String how = lang.getString("death-events.natural.cause.".concat(cause.name()));
if (how == null) {
how = lang.getString("death-events.natural.cause._OTHER_");
}
ret = ret.replace("%HOW%", how);
return ret;
}
}