package amidst.gui.main.viewer.widget; import java.awt.Point; import java.util.Arrays; import java.util.List; import amidst.documentation.AmidstThread; import amidst.documentation.CalledOnlyBy; import amidst.documentation.NotThreadSafe; import amidst.fragment.Fragment; import amidst.fragment.FragmentGraph; import amidst.gui.main.viewer.FragmentGraphToScreenTranslator; import amidst.logging.AmidstLogger; import amidst.logging.AmidstMessageBox; import amidst.mojangapi.world.Dimension; import amidst.mojangapi.world.biome.Biome; import amidst.mojangapi.world.biome.UnknownBiomeIndexException; import amidst.mojangapi.world.coordinates.CoordinatesInWorld; import amidst.mojangapi.world.coordinates.Resolution; import amidst.settings.Setting; @NotThreadSafe public class CursorInformationWidget extends TextWidget { private static final String UNKNOWN_BIOME_NAME = "Unknown"; private final FragmentGraph graph; private final FragmentGraphToScreenTranslator translator; private final Setting dimensionSetting; @CalledOnlyBy(AmidstThread.EDT) public CursorInformationWidget( CornerAnchorPoint anchor, FragmentGraph graph, FragmentGraphToScreenTranslator translator, Setting dimensionSetting) { super(anchor); this.graph = graph; this.translator = translator; this.dimensionSetting = dimensionSetting; } @CalledOnlyBy(AmidstThread.EDT) @Override protected List updateTextLines() { Point mousePosition = getMousePosition(); if (mousePosition != null) { CoordinatesInWorld coordinates = translator.screenToWorld(mousePosition); String biomeName = getBiomeNameAt(coordinates); return Arrays.asList(biomeName + " " + coordinates.toString()); } else { return null; } } @CalledOnlyBy(AmidstThread.EDT) private String getBiomeNameAt(CoordinatesInWorld coordinates) { Dimension dimension = dimensionSetting.get(); if (dimension.equals(Dimension.OVERWORLD)) { return getOverworldBiomeNameAt(coordinates); } else if (dimension.equals(Dimension.END)) { return Biome.theEnd.getName(); } else { AmidstLogger.warn("unsupported dimension"); return UNKNOWN_BIOME_NAME; } } @CalledOnlyBy(AmidstThread.EDT) private String getOverworldBiomeNameAt(CoordinatesInWorld coordinates) { Fragment fragment = graph.getFragmentAt(coordinates); if (fragment != null && fragment.isLoaded()) { long x = coordinates.getXRelativeToFragmentAs(Resolution.QUARTER); long y = coordinates.getYRelativeToFragmentAs(Resolution.QUARTER); short biome = fragment.getBiomeIndexAt((int) x, (int) y); try { return Biome.getByIndex(biome).getName(); } catch (UnknownBiomeIndexException e) { AmidstLogger.error(e); AmidstMessageBox.displayError("Error", e); return UNKNOWN_BIOME_NAME; } } else { return UNKNOWN_BIOME_NAME; } } }