package me.desht.scrollingmenusign.views.hologram; import com.dsh105.holoapi.HoloAPI; import com.dsh105.holoapi.api.Hologram; import com.dsh105.holoapi.api.HologramFactory; import com.dsh105.holoapi.api.touch.Action; import com.dsh105.holoapi.api.touch.TouchAction; import com.dsh105.holoapi.api.visibility.Visibility; import me.desht.dhutils.Debugger; import me.desht.dhutils.MiscUtil; import me.desht.scrollingmenusign.SMSException; import me.desht.scrollingmenusign.SMSMenu; import me.desht.scrollingmenusign.ScrollingMenuSign; import me.desht.scrollingmenusign.enums.SMSUserAction; import me.desht.scrollingmenusign.views.SMSPopup; import me.desht.scrollingmenusign.views.SMSPrivateHoloView; import me.desht.scrollingmenusign.views.SMSView; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.metadata.FixedMetadataValue; import java.util.LinkedHashMap; public class HoloPopup implements SMSPopup { private static final double POPUP_DISTANCE = 2.5; private final SMSPrivateHoloView view; private final Player player; private Hologram hologram = null; public HoloPopup(Player player, SMSPrivateHoloView view) { this.view = view; this.player = player; } @Override public SMSView getView() { return view; } public Player getPlayer() { return player; } @Override public void repaint() { String[] text = HoloUtil.buildText(view, player, (Integer) view.getAttribute(SMSPrivateHoloView.LINES)); if (text.length != hologram.getLines().length) { popdown(); // force a new hologram to be created with the new size } if (hologram == null) { hologram = buildHologram(player, text); } else { // hologram.updateLines(text); HoloAPI.getManager().setLineContent(hologram, text); } } @Override public boolean isPoppedUp() { return hologram != null; } @Override public void popup() { String[] text = HoloUtil.buildText(view, player, (Integer) view.getAttribute(SMSPrivateHoloView.LINES)); hologram = buildHologram(player, text); } @Override public void popdown() { if (hologram != null) { HoloAPI.getManager().stopTracking(hologram); hologram = null; } } public Hologram getHologram() { return hologram; } private Hologram buildHologram(Player player, String[] text) { Debugger.getInstance().debug("creating new private hologram for " + view.getName() + "/" + player.getName()); Hologram h = new HologramFactory(ScrollingMenuSign.getInstance()) .withLocation(getHologramPosition(player)) .withText(text) .withSimplicity(true) .withVisibility(new HologramVisibility(player)) .build(); h.addTouchAction(new SMSHoloTouchAction(player, view)); h.setTouchEnabled(true); return h; } private Location getHologramPosition(Player player) { return player.getEyeLocation().add(player.getLocation().getDirection().multiply(POPUP_DISTANCE)); } private class HologramVisibility implements Visibility { private final Player player; public HologramVisibility(Player player) { this.player = player; } @Override public boolean isVisibleTo(Player player, String s) { return this.player.equals(player); } @Override public String getSaveKey() { return null; } @Override public LinkedHashMap<String, Object> getDataToSave() { return null; } } private class SMSHoloTouchAction implements TouchAction { private final SMSPrivateHoloView view; private final Player player; private SMSHoloTouchAction(Player player, SMSPrivateHoloView view) { this.view = view; this.player = player; } @Override public void onTouch(Player player, Action action) { if (player.equals(this.player)) { Debugger.getInstance().debug("Hologram action: player=" + player.getName() + " action=" + action + " view = " + view.getName()); SMSUserAction ua = getAction(player, action); try { SMSMenu m = view.getActiveMenu(player); if (ua != null) { ua.execute(player, view); } player.setMetadata(HoloUtil.LAST_HOLO_INTERACTION, new FixedMetadataValue(ScrollingMenuSign.getInstance(), System.currentTimeMillis())); if (ua == SMSUserAction.EXECUTE && ((Boolean) view.getAttribute(SMSPrivateHoloView.AUTOPOPDOWN)) && view.getActiveMenu(player) == m) { view.hideGUI(player); } } catch (SMSException e) { MiscUtil.errorMessage(player, e.getMessage()); } } } @Override public String getSaveKey() { return null; } @Override public LinkedHashMap<String, Object> getDataToSave() { return null; } private SMSUserAction getAction(Player player, Action action) { StringBuilder key = new StringBuilder(); switch (action) { case RIGHT_CLICK: key.append("sms.actions.rightclick."); break; case LEFT_CLICK: key.append("sms.actions.leftclick."); break; } key.append(player.isSneaking() ? "sneak" : "normal"); String s = ScrollingMenuSign.getInstance().getConfig().getString(key.toString(), "none"); return SMSUserAction.valueOf(s.toUpperCase()); } } }