package me.desht.scrollingmenusign.enums;
import me.desht.dhutils.PermissionUtils;
import me.desht.scrollingmenusign.SMSException;
import me.desht.scrollingmenusign.SMSMenu;
import me.desht.scrollingmenusign.SMSMenuItem;
import me.desht.scrollingmenusign.ScrollingMenuSign;
import me.desht.scrollingmenusign.views.SMSScrollableView;
import me.desht.scrollingmenusign.views.SMSView;
import me.desht.scrollingmenusign.views.action.ScrollAction;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.player.PlayerAnimationEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
public enum SMSUserAction {
NONE, SCROLLDOWN, SCROLLUP, EXECUTE;
public static SMSUserAction getAction(PlayerInteractEvent event) {
StringBuilder key;
switch (event.getAction()) {
case RIGHT_CLICK_BLOCK:
case RIGHT_CLICK_AIR:
key = new StringBuilder("sms.actions.rightclick.");
break;
case LEFT_CLICK_BLOCK:
case LEFT_CLICK_AIR:
key = new StringBuilder("sms.actions.leftclick.");
break;
default:
return NONE;
}
return _makeAction(event.getPlayer(), key);
}
public static SMSUserAction getAction(PlayerItemHeldEvent event) {
int delta = event.getNewSlot() - event.getPreviousSlot();
StringBuilder key;
if (delta == 0) {
return NONE;
} else if (delta >= 6) {
delta -= 9;
} else if (delta <= -6) {
delta += 9;
}
key = delta < 0 ? new StringBuilder("sms.actions.wheelup.") : new StringBuilder("sms.actions.wheeldown.");
return _makeAction(event.getPlayer(), key);
}
public static SMSUserAction getAction(PlayerAnimationEvent event) {
switch (event.getAnimationType()) {
case ARM_SWING:
StringBuilder key = new StringBuilder("sms.actions.leftclick.");
return _makeAction(event.getPlayer(), key);
default:
return NONE;
}
}
public static SMSUserAction getAction(PlayerInteractEntityEvent event) {
return _makeAction(event.getPlayer(), new StringBuilder("sms.actions.rightclick."));
}
public static SMSUserAction getAction(HangingBreakByEntityEvent event) {
return _makeAction((Player) event.getRemover(), new StringBuilder("sms.actions.leftclick."));
}
public static SMSUserAction getAction(EntityDamageByEntityEvent event) {
return _makeAction((Player) event.getDamager(), new StringBuilder("sms.actions.leftclick."));
}
private static SMSUserAction _makeAction(Player player, StringBuilder key) {
if (player.isSneaking())
key.append("sneak");
else
key.append("normal");
String s = ScrollingMenuSign.getInstance().getConfig().getString(key.toString(), "none");
return SMSUserAction.valueOf(s.toUpperCase());
}
public void execute(Player player, SMSView view) throws SMSException {
if (this == NONE)
return;
if (!(view instanceof SMSScrollableView)) {
// this method only makes sense for scrollable views
return;
}
if (player != null) {
view.ensureAllowedToUse(player);
PermissionUtils.requirePerms(player, getPermissionNode());
}
SMSScrollableView sview = (SMSScrollableView) view;
SMSMenu menu = sview.getActiveMenu(player);
switch (this) {
case EXECUTE:
SMSMenuItem item = sview.getActiveMenuItemAt(player, sview.getScrollPos(player));
if (item != null) {
item.executeCommand(player, view, player.isSneaking());
item.feedbackMessage(player);
view.onExecuted(player);
}
break;
case SCROLLDOWN:
sview.scrollDown(player);
sview.update(menu, new ScrollAction(player, ScrollAction.ScrollDirection.DOWN));
sview.onScrolled(player, SCROLLDOWN);
break;
case SCROLLUP:
sview.scrollUp(player);
sview.update(menu, new ScrollAction(player, ScrollAction.ScrollDirection.UP));
sview.onScrolled(player, SCROLLUP);
break;
default:
break;
}
}
public String getPermissionNode() {
switch (this) {
case EXECUTE:
return "scrollingmenusign.execute";
case SCROLLDOWN:
case SCROLLUP:
return "scrollingmenusign.scroll";
default:
return null;
}
}
public String getShortDesc() {
switch (this) {
case EXECUTE:
return "X";
case SCROLLUP:
return "U";
case SCROLLDOWN:
return "D";
default:
return "N";
}
}
}