Package com.wimbli.WorldBorder

Source Code of com.wimbli.WorldBorder.DynMapFeatures

package com.wimbli.WorldBorder;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.bukkit.World;

import org.dynmap.DynmapAPI;
import org.dynmap.markers.AreaMarker;
import org.dynmap.markers.CircleMarker;
import org.dynmap.markers.MarkerAPI;
import org.dynmap.markers.MarkerSet;


public class DynMapFeatures
{
  private static DynmapAPI api;
  private static MarkerAPI markApi;
  private static MarkerSet markSet;
  private static int lineWeight = 3;
  private static double lineOpacity = 1.0;
  private static int lineColor = 0xFF0000;

  // Whether re-rendering functionality is available
  public static boolean renderEnabled()
  {
    return api != null;
  }

  // Whether circular border markers are available
  public static boolean borderEnabled()
  {
    return markApi != null;
  }

  public static void setup()
  {
    Plugin test = Bukkit.getServer().getPluginManager().getPlugin("dynmap");
    if (test == null || !test.isEnabled()) return;

    api = (DynmapAPI)test;

    // make sure DynMap version is new enough to include circular markers
    try
    {
      Class.forName("org.dynmap.markers.CircleMarker");

      // for version 0.35 of DynMap, CircleMarkers had just been introduced and were bugged (center position always 0,0)
      if (api.getDynmapVersion().startsWith("0.35-"))
        throw new ClassNotFoundException();
    }
    catch (ClassNotFoundException ex)
    {
      Config.logConfig("DynMap is available, but border display is currently disabled: you need DynMap v0.36 or newer.");
      return;
    }
    catch (NullPointerException ex)
    {
      Config.logConfig("DynMap is present, but an NPE (type 1) was encountered while trying to integrate. Border display disabled.");
      return;
    }

    try
    {
      markApi = api.getMarkerAPI();
      if (markApi == null) return;
    }
    catch (NullPointerException ex)
    {
      Config.logConfig("DynMap is present, but an NPE (type 2) was encountered while trying to integrate. Border display disabled.");
      return;
    }

    // go ahead and show borders for all worlds
    showAllBorders();

    Config.logConfig("Successfully hooked into DynMap for the ability to display borders.");
  }


  /*
   * Re-rendering methods, used for updating trimmed chunks to show them as gone
   * Sadly, not currently working. Might not even be possible to make it work.
   */

  public static void renderRegion(String worldName, CoordXZ coord)
  {
    if (!renderEnabled()) return;

    World world = Bukkit.getWorld(worldName);
    int y = (world != null) ? world.getMaxHeight() : 255;
    int x = CoordXZ.regionToBlock(coord.x);
    int z = CoordXZ.regionToBlock(coord.z);
    api.triggerRenderOfVolume(worldName, x, 0, z, x+511, y, z+511);
  }

  public static void renderChunks(String worldName, List<CoordXZ> coords)
  {
    if (!renderEnabled()) return;

    World world = Bukkit.getWorld(worldName);
    int y = (world != null) ? world.getMaxHeight() : 255;

    for (CoordXZ coord : coords)
    {
      renderChunk(worldName, coord, y);
    }
  }

  public static void renderChunk(String worldName, CoordXZ coord, int maxY)
  {
    if (!renderEnabled()) return;

    int x = CoordXZ.chunkToBlock(coord.x);
    int z = CoordXZ.chunkToBlock(coord.z);
    api.triggerRenderOfVolume(worldName, x, 0, z, x+15, maxY, z+15);
  }


  /*
   * Methods for displaying our borders on DynMap's world maps
   */

    private static Map<String, CircleMarker> roundBorders = new HashMap<String, CircleMarker>();
    private static Map<String, AreaMarker> squareBorders = new HashMap<String, AreaMarker>();

  public static void showAllBorders()
  {
    if (!borderEnabled()) return;

    // in case any borders are already shown
    removeAllBorders();

    if (!Config.DynmapBorderEnabled())
    {
      // don't want to show the marker set in DynMap if our integration is disabled
      if (markSet != null)
        markSet.deleteMarkerSet();
      markSet = null;
      return;
    }

    // make sure the marker set is initialized
    markSet = markApi.getMarkerSet("worldborder.markerset");
    if(markSet == null)
      markSet = markApi.createMarkerSet("worldborder.markerset", "WorldBorder", null, false);
    else
      markSet.setMarkerSetLabel("WorldBorder");

    Map<String, BorderData> borders = Config.getBorders();
    for(Entry<String, BorderData> stringBorderDataEntry : borders.entrySet())
    {
      Entry wdata = stringBorderDataEntry;
      String worldName = ((String)wdata.getKey());
      BorderData border = (BorderData)wdata.getValue();
      showBorder(worldName, border);
    }
  }

  public static void showBorder(String worldName, BorderData border)
  {
    if (!borderEnabled()) return;

    if (!Config.DynmapBorderEnabled()) return;

    if ((border.getShape() == null) ? Config.ShapeRound() : border.getShape())
      showRoundBorder(worldName, border);
    else
      showSquareBorder(worldName, border);
  }

  private static void showRoundBorder(String worldName, BorderData border)
  {
    if (squareBorders.containsKey(worldName))
      removeBorder(worldName);

    CircleMarker marker = roundBorders.get(worldName);
    if (marker == null)
    {
      marker = markSet.createCircleMarker("worldborder_"+worldName, Config.DynmapMessage(), false, worldName, border.getX(), 64.0, border.getZ(), border.getRadiusX(), border.getRadiusZ(), true);
      marker.setLineStyle(lineWeight, lineOpacity, lineColor);
      marker.setFillStyle(0.0, 0x000000);
      roundBorders.put(worldName, marker);
    }
    else
    {
      marker.setCenter(worldName, border.getX(), 64.0, border.getZ());
      marker.setRadius(border.getRadiusX(), border.getRadiusZ());
    }
  }

  private static void showSquareBorder(String worldName, BorderData border)
  {
    if (roundBorders.containsKey(worldName))
      removeBorder(worldName);

    // corners of the square border
    double[] xVals = {border.getX() - border.getRadiusX(), border.getX() + border.getRadiusX()};
    double[] zVals = {border.getZ() - border.getRadiusZ(), border.getZ() + border.getRadiusZ()};

    AreaMarker marker = squareBorders.get(worldName);
    if (marker == null)
    {
      marker = markSet.createAreaMarker("worldborder_"+worldName, Config.DynmapMessage(), false, worldName, xVals, zVals, true);
      marker.setLineStyle(3, 1.0, 0xFF0000);
      marker.setFillStyle(0.0, 0x000000);
      squareBorders.put(worldName, marker);
    }
    else
    {
      marker.setCornerLocations(xVals, zVals);
    }
  }

  public static void removeAllBorders()
  {
    if (!borderEnabled()) return;

    for(CircleMarker marker : roundBorders.values())
    {
      marker.deleteMarker();
    }
    roundBorders.clear();

    for(AreaMarker marker : squareBorders.values())
    {
      marker.deleteMarker();
    }
    squareBorders.clear();
  }

  public static void removeBorder(String worldName)
  {
    if (!borderEnabled()) return;

    CircleMarker marker = roundBorders.remove(worldName);
    if (marker != null)
      marker.deleteMarker();

    AreaMarker marker2 = squareBorders.remove(worldName);
    if (marker2 != null)
      marker2.deleteMarker();
  }
}
TOP

Related Classes of com.wimbli.WorldBorder.DynMapFeatures

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.