package de.tobiyas.racesandclasses.hotkeys;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.ItemStack;
import de.tobiyas.racesandclasses.RacesAndClasses;
import de.tobiyas.racesandclasses.commands.bind.CommandExecutor_BindTrait;
import de.tobiyas.racesandclasses.configuration.global.GeneralConfig;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayerManager;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.Trait;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.TraitWithRestrictions;
import de.tobiyas.racesandclasses.util.consts.PermissionNode;
import de.tobiyas.util.inventorymenu.BasicSelectionInterface;
public class HotKeyView extends BasicSelectionInterface {
/**
* The RaC Player that contains this.
*/
private final RaCPlayer racPlayer;
/**
* The Map of quickslot items.
*/
private final Map<Integer,ItemStack> emptyItems = new HashMap<Integer, ItemStack>();
/**
* The Currently selected Trait.
*/
private Trait selectedTrait = null;
/**
* If the player was in Skillmode before opening.
*/
private final boolean skillModeBefore;
public HotKeyView(Player player) {
this(RaCPlayerManager.get().getPlayer(player));
}
public HotKeyView(RaCPlayer player) {
super(player.getPlayer(), null, "Your skills", "All Skills", RacesAndClasses.getPlugin());
this.skillModeBefore = player.getHotkeyInventory().isInSkillMode();
player.getHotkeyInventory().changeToBuildInv();
GeneralConfig config = RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig();
Set<Integer> disabled = config.getConfig_disabledHotkeySlots();
//Add Permissions based:
if(config.isConfig_use_permissions_for_hotkeys()){
for(int i = 0; i < 9; i++){
if(!disabled.contains(i) && !RacesAndClasses.getPlugin().getPermissionManager().checkPermissionsSilent(player.getRealPlayer(), PermissionNode.hotkeyPre + i)){
disabled.add(i);
}
}
}
for(int i = 0; i < 9; i ++){
ItemStack item = null;
if(disabled.contains(i)){
item = generateItem(Material.ARROW, ChatColor.RED + "DISABLED", "This slot is disabled!");
}else{
item = generateItem(Material.WOOL, ChatColor.GREEN + "EMPTY Slot" , "slot:" + i);
}
emptyItems.put(i, item);
}
this.racPlayer = player;
redraw();
}
/**
* Redraws the View.
*/
private void redraw(){
GeneralConfig config = RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig();
Set<Integer> disabled = config.getConfig_disabledHotkeySlots();
//Add Permissions based:
if(config.isConfig_use_permissions_for_hotkeys()){
for(int i = 0; i < 9; i++){
if(!disabled.contains(i) && !RacesAndClasses.getPlugin().getPermissionManager().checkPermissionsSilent(player, PermissionNode.hotkeyPre + i)){
disabled.add(i);
}
}
}
this.getTopInventory().clear();
this.getBottomInventory().clear();
//first get the traits we may use.
List<Trait> traits = racPlayer.getTraits();
Iterator<Trait> it = traits.iterator();
while(it.hasNext()){
Trait trait = it.next();
if(!trait.isBindable()) {
it.remove();
continue;
}
if(trait instanceof TraitWithRestrictions){
TraitWithRestrictions restrictions = (TraitWithRestrictions) trait;
int playerLevel = racPlayer.getLevelManager().getCurrentLevel();
if(!restrictions.isInLevelRange(playerLevel)){
it.remove();
continue;
}
}
}
//now sort.
Collections.sort(traits, new Comparator<Trait>() {
@Override
public int compare(Trait o1, Trait o2) {
return o1.getDisplayName().compareTo(o2.getDisplayName());
}
});
//pin on Window.
for(int i = 0; i < 27; i++){
if( i >= traits.size() ) break;
Trait trait = traits.get(i);
ItemStack item = CommandExecutor_BindTrait.generate(trait);
getTopInventory().setItem(i, item);
}
//post empty Items first so they can be overdrawn.
for(Entry<Integer,ItemStack> entry : emptyItems.entrySet()){
int index = entry.getKey();
ItemStack item = entry.getValue().clone();
getBottomInventory().setItem(index, item);
}
//post current Traits.
for(Entry<Integer, Trait> entry : racPlayer.getHotkeyInventory().getBindings().entrySet()){
int slot = entry.getKey();
if(disabled.contains(slot)) continue;
Trait bound = entry.getValue();
getBottomInventory().setItem(slot, CommandExecutor_BindTrait.generate(bound));
}
this.setCursor(selectedTrait == null ? null : CommandExecutor_BindTrait.generate(selectedTrait));
}
@Override
protected boolean onBackPressed() {
return true;
}
@Override
protected void onAcceptPressed() {
}
@Override
protected void onSelectionItemPressed(ItemStack item) {
Trait trait = Listener_HotKey.getBoundTrait(item, racPlayer);
if(trait != null){
setCursor(item.clone());
selectedTrait = trait;
}
redraw();
}
@EventHandler
@Override
public void onInterfaceInteract(InventoryClickEvent event) {
if(event.getView() != this) return;
//block all SHIFT clicks. Just to be sure...
if(event.isShiftClick()){
event.setCancelled(true);
redraw();
return;
}
super.onInterfaceInteract(event);
}
@EventHandler
@Override
public void onInventoryClose(InventoryCloseEvent event) {
if(event.getView() != this) return;
this.setCursor(null);
super.onInventoryClose(event);
if(skillModeBefore){
HotKeyInventory inv = racPlayer.getHotkeyInventory();
inv.changeToSkillInv();
}
}
@Override
protected void onControlItemPressed(ItemStack item) {
int index = -1;
GeneralConfig config = RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig();
Set<Integer> disabled = config.getConfig_disabledHotkeySlots();
//Add Permissions based:
if(config.isConfig_use_permissions_for_hotkeys()){
for(int i = 0; i < 9; i++){
if(!disabled.contains(i) && !RacesAndClasses.getPlugin().getPermissionManager().checkPermissionsSilent(player, PermissionNode.hotkeyPre + i)){
disabled.add(i);
}
}
}
for(int i = 0; i < 9; i++){
ItemStack toCheck = getBottomInventory().getItem(i);
if(toCheck.isSimilar(item) && !disabled.contains(i)){
index = i;
}
}
//We can have index 0-8.
if( index >= 0 ){
racPlayer.getHotkeyInventory().clearSlot(index);
if(selectedTrait != null) racPlayer.getHotkeyInventory().bindTrait(index, selectedTrait);
selectedTrait = null;
setCursor(null);
}
redraw();
}
@Override
protected void scheduleOpeningOfParent() {
racPlayer.getHotkeyInventory().forceUpdateOfInv();
super.scheduleOpeningOfParent();
}
}