/*
* CraftZ
* Copyright (C) JangoBrick <http://jangobrick.de/>
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package craftZ.modules;
import java.util.*;
import java.util.Map.Entry;
import org.bukkit.ChatColor;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import craftZ.CraftZ;
import craftZ.Module;
import craftZ.util.ItemRenamer;
import craftZ.util.KitEditingSession;
public class Kits extends Module {
private Map<String, Kit> kits = new HashMap<String, Kit>();
private Map<UUID, KitEditingSession> editingSessions = new HashMap<UUID, KitEditingSession>();
public Kits(CraftZ craftZ) {
super(craftZ);
}
@Override
public void onLoad(boolean configReload) {
kits.clear();
ConfigurationSection kits = getConfig("kits").getConfigurationSection("Kits.kits");
if (kits != null) {
for (String name : kits.getKeys(false)) {
ConfigurationSection sec = kits.getConfigurationSection(name);
ConfigurationSection itemsSec = sec.getConfigurationSection("items");
LinkedHashMap<String, ItemStack> items = new LinkedHashMap<String, ItemStack>();
if (itemsSec != null) {
for (String slot : itemsSec.getKeys(false)) {
items.put(slot, itemsSec.getItemStack(slot));
}
}
this.kits.put(name, new Kit(this, name, sec.getBoolean("default"), sec.getString("permission"), items));
}
}
}
@Override
public void onDisable() {
for (Player p : getCraftZ().getServer().getOnlinePlayers()) {
if (isEditing(p))
stopEditing(p, false, false);
}
}
public void addKit(Kit kit) {
kits.put(kit.getName(), kit);
kit.save();
}
public void removeKit(Kit kit) {
for (Iterator<KitEditingSession> it=editingSessions.values().iterator(); it.hasNext(); ) {
KitEditingSession session = it.next();
if (session.kit == kit) {
session.stop(false);
it.remove();
}
}
kits.remove(kit.getName());
kit.delete();
}
public void setDefault(Kit defaultKit) {
for (Kit kit : kits.values()) {
kit.setDefault(false);
kit.save();
}
if (defaultKit != null) {
defaultKit.setDefault(true);
defaultKit.save();
}
}
public Kit getDefaultKit() {
Kit kit = null;
for (Entry<String, Kit> entry : kits.entrySet()) {
if (kit == null)
kit = entry.getValue();
else if (entry.getValue().isDefault())
return entry.getValue();
}
return kit;
}
public Collection<Kit> getKits() {
return kits.values();
}
public List<Kit> getAvailableKits(Player p) {
List<Kit> available = new ArrayList<Kit>();
for (Entry<String, Kit> entry : kits.entrySet()) {
Kit kit = entry.getValue();
if (kit.canUse(p))
available.add(kit);
}
return available;
}
public Kit get(String name) {
return kits.get(name);
}
public Kit match(String name) {
return kits.get(name.toLowerCase());
}
public String getSoulboundLabel() {
return ChatColor.DARK_PURPLE + getCraftZ().getPrefix() + " " + ChatColor.LIGHT_PURPLE
+ getConfig("kits").getString("Kits.settings.soulbound-label");
}
public boolean isSoulbound(ItemStack stack) {
if (stack == null || !stack.hasItemMeta())
return false;
ItemMeta meta = stack.getItemMeta();
if (!meta.hasLore())
return false;
List<String> lore = meta.getLore();
return !lore.isEmpty() && lore.get(0).equals(getSoulboundLabel());
}
public ItemStack setSoulbound(ItemStack stack) {
return stack.hasItemMeta() && stack.getItemMeta().hasLore()
? stack
: ItemRenamer.on(stack).setLore(getSoulboundLabel()).get();
}
public KitEditingSession startEditing(Player p, Kit kit) {
if (isEditing(p))
return null;
KitEditingSession session = KitEditingSession.start(p, kit);
editingSessions.put(p.getUniqueId(), session);
return session;
}
public void stopEditing(Player p, boolean message, boolean save) {
if (!isEditing(p))
return;
KitEditingSession session = getEditingSession(p);
session.stop(save);
editingSessions.remove(p.getUniqueId());
if (message) {
p.sendMessage(ChatColor.AQUA + getMsg("Messages.cmd.kitsadmin." + (save ? "kit-edited" : "kit-editing-cancelled"))
.replace("%k", session.kit.getName()));
}
}
public boolean isEditing(Player p) {
return editingSessions.containsKey(p.getUniqueId());
}
public KitEditingSession getEditingSession(Player p) {
return editingSessions.get(p.getUniqueId());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerChat(AsyncPlayerChatEvent event) {
Player p = event.getPlayer();
if (isEditing(p)) {
String msg = event.getMessage();
if (msg.equalsIgnoreCase("done")) {
stopEditing(p, true, true);
event.setCancelled(true);
} else if (msg.equalsIgnoreCase("cancel")) {
stopEditing(p, true, false);
event.setCancelled(true);
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerDropItem(PlayerDropItemEvent event) {
final Item item = event.getItemDrop();
if (isSoulbound(item.getItemStack())) {
item.remove();
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerDeath(PlayerDeathEvent event) {
final Player p = event.getEntity();
if (isWorld(p.getWorld())) {
for (Iterator<ItemStack> it=event.getDrops().iterator(); it.hasNext(); ) {
ItemStack stack = it.next();
if (stack != null && isSoulbound(stack))
it.remove();
}
}
}
}