diff --git a/lib/dynmap-2.0.0.jar b/lib/dynmap-2.0.0.jar deleted file mode 100644 index 18b5a7ec..00000000 Binary files a/lib/dynmap-2.0.0.jar and /dev/null differ diff --git a/pom.xml b/pom.xml index 99817800..f8febc1c 100644 --- a/pom.xml +++ b/pom.xml @@ -46,13 +46,6 @@ MassiveCore LATEST - - org.dynmap - dynmap - 2.0.0 - system - ${project.basedir}/lib/dynmap-2.0.0.jar - org.dthielke HeroChat diff --git a/src/main/java/com/massivecraft/factions/Factions.java b/src/main/java/com/massivecraft/factions/Factions.java index 27e63ad6..ec72f33d 100644 --- a/src/main/java/com/massivecraft/factions/Factions.java +++ b/src/main/java/com/massivecraft/factions/Factions.java @@ -33,8 +33,6 @@ import com.massivecraft.factions.entity.MFlagColl; import com.massivecraft.factions.entity.MPermColl; import com.massivecraft.factions.entity.MPlayerColl; import com.massivecraft.factions.entity.MConfColl; -import com.massivecraft.factions.integration.dynmap.IntegrationDynmap; -import com.massivecraft.factions.integration.dynmap.IntegrationDynmapFactions; import com.massivecraft.factions.integration.herochat.IntegrationHerochat; import com.massivecraft.factions.integration.lwc.IntegrationLwc; import com.massivecraft.factions.mixin.PowerMixin; @@ -51,7 +49,6 @@ import com.massivecraft.massivecore.util.MUtil; import com.massivecraft.massivecore.xlib.gson.Gson; import com.massivecraft.massivecore.xlib.gson.GsonBuilder; - public class Factions extends MassivePlugin { // -------------------------------------------- // @@ -147,9 +144,7 @@ public class Factions extends MassivePlugin // Integrate this.integrate( IntegrationHerochat.get(), - IntegrationLwc.get(), - IntegrationDynmap.get(), - IntegrationDynmapFactions.get() + IntegrationLwc.get() ); // Modulo Repeat Tasks diff --git a/src/main/java/com/massivecraft/factions/entity/MConf.java b/src/main/java/com/massivecraft/factions/entity/MConf.java index d9e24f56..cf5fae67 100644 --- a/src/main/java/com/massivecraft/factions/entity/MConf.java +++ b/src/main/java/com/massivecraft/factions/entity/MConf.java @@ -17,7 +17,6 @@ import com.massivecraft.factions.Rel; import com.massivecraft.factions.WorldExceptionSet; import com.massivecraft.factions.engine.EngineChat; import com.massivecraft.factions.event.EventFactionsChunkChangeType; -import com.massivecraft.factions.integration.dynmap.DynmapStyle; import com.massivecraft.massivecore.store.Entity; import com.massivecraft.massivecore.util.MUtil; import com.massivecraft.massivecore.util.TimeUnit; @@ -497,89 +496,5 @@ public class MConf extends Entity //public static boolean bankMembersCanWithdraw = false; //Have to be at least moderator to withdraw or pay money to another faction public boolean bankFactionPaysCosts = true; //The faction pays for faction command costs, such as sethome public boolean bankFactionPaysLandCosts = true; //The faction pays for land claiming costs. - - // -------------------------------------------- // - // INTEGRATION: DYNMAP - // -------------------------------------------- // - - // Should the dynmap intagration be used? - public boolean dynmapUse = true; - - // Should the dynmap updates be logged to console output? - public boolean dynmapUpdateLog = false; - - // Name of the Factions layer - public String dynmapLayerName = "Factions"; - - // Should the layer be visible per default - public boolean dynmapLayerVisible = true; - - // Ordering priority in layer menu (low goes before high - default is 0) - public int dynmapLayerPriority = 2; - - // (optional) set minimum zoom level before layer is visible (0 = defalt, always visible) - public int dynmapLayerMinimumZoom = 0; - - // Format for popup - substitute values for macros - //public String dynmapInfowindowFormat = "
%regionname%
Flags
%flags%
"; - public String dynmapDescription = - "
\n" + - "%name%
\n" + - "%description%
\n" + - "
\n" + - "Leader: %players.leader%
\n" + - "Officers: %players.officers.count%
\n" + - "Members: %players.members.count%
\n" + - "Recruits: %players.recruits.count%
\n" + - "TOTAL: %players.count%
\n" + - "
\n" + - "Age: %age%
\n" + - "Bank: %money%
\n" + - "
\n" + - "Flags:
\n" + - "%flags.table3%\n" + - "
"; - - // Enable the %money% macro. Only do this if you know your economy manager is thread safe. - public boolean dynmapDescriptionMoney = false; - - // Allow players in faction to see one another on Dynmap (only relevant if Dynmap has 'player-info-protected' enabled) - public boolean dynmapVisibilityByFaction = true; - - // Optional setting to limit which regions to show. - // If empty all regions are shown. - // Specify Faction either by name or UUID. - // To show all regions on a given world, add 'world:' to the list. - public Set dynmapVisibleFactions = new LinkedHashSet(); - - // Optional setting to hide specific Factions. - // Specify Faction either by name or UUID. - // To hide all regions on a given world, add 'world:' to the list. - public Set dynmapHiddenFactions = new LinkedHashSet(); - - // Region Style - public final static transient String DYNMAP_STYLE_LINE_COLOR = "#00FF00"; - public final static transient double DYNMAP_STYLE_LINE_OPACITY = 0.8D; - public final static transient int DYNMAP_STYLE_LINE_WEIGHT = 3; - public final static transient String DYNMAP_STYLE_FILL_COLOR = "#00FF00"; - public final static transient double DYNMAP_STYLE_FILL_OPACITY = 0.35D; - public final static transient String DYNMAP_STYLE_HOME_MARKER = "greenflag"; - public final static transient boolean DYNMAP_STYLE_BOOST = false; - - public DynmapStyle dynmapDefaultStyle = new DynmapStyle() - .setStrokeColor(DYNMAP_STYLE_LINE_COLOR) - .setLineOpacity(DYNMAP_STYLE_LINE_OPACITY) - .setLineWeight(DYNMAP_STYLE_LINE_WEIGHT) - .setFillColor(DYNMAP_STYLE_FILL_COLOR) - .setFillOpacity(DYNMAP_STYLE_FILL_OPACITY) - .setHomeMarker(DYNMAP_STYLE_HOME_MARKER) - .setBoost(DYNMAP_STYLE_BOOST); - - // Optional per Faction style overrides. Any defined replace those in dynmapDefaultStyle. - // Specify Faction either by name or UUID. - public Map dynmapFactionStyles = MUtil.map( - "SafeZone", new DynmapStyle().setStrokeColor("#FF00FF").setFillColor("#FF00FF").setBoost(false), - "WarZone", new DynmapStyle().setStrokeColor("#FF0000").setFillColor("#FF0000").setBoost(false) - ); } \ No newline at end of file diff --git a/src/main/java/com/massivecraft/factions/integration/dynmap/DynmapStyle.java b/src/main/java/com/massivecraft/factions/integration/dynmap/DynmapStyle.java deleted file mode 100644 index e5562250..00000000 --- a/src/main/java/com/massivecraft/factions/integration/dynmap/DynmapStyle.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.massivecraft.factions.integration.dynmap; - -import com.massivecraft.factions.entity.MConf; - -public class DynmapStyle -{ - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - public String lineColor = null; - public int getLineColor() { return getColor(coalesce(this.lineColor, MConf.get().dynmapDefaultStyle.lineColor, MConf.DYNMAP_STYLE_LINE_COLOR)); } - public DynmapStyle setStrokeColor(String strokeColor) { this.lineColor = strokeColor; return this; } - - public Double lineOpacity = null; - public double getLineOpacity() { return coalesce(this.lineOpacity, MConf.get().dynmapDefaultStyle.lineOpacity, MConf.DYNMAP_STYLE_LINE_OPACITY); } - public DynmapStyle setLineOpacity(Double strokeOpacity) { this.lineOpacity = strokeOpacity; return this; } - - public Integer lineWeight = null; - public int getLineWeight() { return coalesce(this.lineWeight, MConf.get().dynmapDefaultStyle.lineWeight, MConf.DYNMAP_STYLE_LINE_WEIGHT); } - public DynmapStyle setLineWeight(Integer strokeWeight) { this.lineWeight = strokeWeight; return this; } - - public String fillColor = null; - public int getFillColor() { return getColor(coalesce(this.fillColor, MConf.get().dynmapDefaultStyle.fillColor, MConf.DYNMAP_STYLE_FILL_COLOR)); } - public DynmapStyle setFillColor(String fillColor) { this.fillColor = fillColor; return this; } - - public Double fillOpacity = null; - public double getFillOpacity() { return coalesce(this.fillOpacity, MConf.get().dynmapDefaultStyle.fillOpacity, MConf.DYNMAP_STYLE_FILL_OPACITY); } - public DynmapStyle setFillOpacity(Double fillOpacity) { this.fillOpacity = fillOpacity; return this; } - - // NOTE: We just return the string here. We do not return the resolved Dynmap MarkerIcon object. - // The reason is we use this class in the MConf. For serialization to work Dynmap would have to be loaded and we can't require that. - // Using dynmap is optional. - public String homeMarker = null; - public String getHomeMarker() { return coalesce(this.homeMarker, MConf.get().dynmapDefaultStyle.homeMarker, MConf.DYNMAP_STYLE_HOME_MARKER); } - public DynmapStyle setHomeMarker(String homeMarker) { this.homeMarker = homeMarker; return this; } - - public Boolean boost = null; - public boolean getBoost() { return coalesce(this.boost, MConf.get().dynmapDefaultStyle.boost, MConf.DYNMAP_STYLE_BOOST); } - public DynmapStyle setBoost(Boolean boost) { this.boost = boost; return this; } - - // -------------------------------------------- // - // UTIL - // -------------------------------------------- // - - @SafeVarargs - public static T coalesce(T... items) - { - for (T item : items) - { - if (item != null) return item; - } - return null; - } - - public static int getColor(String string) - { - int ret = 0x00FF00; - try - { - ret = Integer.parseInt(string.substring(1), 16); - } - catch (NumberFormatException nfx) - { - - } - return ret; - } - -} diff --git a/src/main/java/com/massivecraft/factions/integration/dynmap/EngineDynmap.java b/src/main/java/com/massivecraft/factions/integration/dynmap/EngineDynmap.java deleted file mode 100644 index 5baf23ef..00000000 --- a/src/main/java/com/massivecraft/factions/integration/dynmap/EngineDynmap.java +++ /dev/null @@ -1,997 +0,0 @@ -package com.massivecraft.factions.integration.dynmap; - -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.plugin.Plugin; -import org.dynmap.DynmapAPI; -import org.dynmap.markers.AreaMarker; -import org.dynmap.markers.Marker; -import org.dynmap.markers.MarkerAPI; -import org.dynmap.markers.MarkerSet; -import org.dynmap.markers.PlayerSet; -import org.dynmap.utils.TileFlags; - -import com.massivecraft.factions.Factions; -import com.massivecraft.factions.Rel; -import com.massivecraft.factions.TerritoryAccess; -import com.massivecraft.factions.entity.Board; -import com.massivecraft.factions.entity.BoardColl; -import com.massivecraft.factions.entity.Faction; -import com.massivecraft.factions.entity.FactionColl; -import com.massivecraft.factions.entity.MConf; -import com.massivecraft.factions.entity.MFlag; -import com.massivecraft.factions.entity.MPlayer; -import com.massivecraft.massivecore.EngineAbstract; -import com.massivecraft.massivecore.money.Money; -import com.massivecraft.massivecore.ps.PS; -import com.massivecraft.massivecore.util.TimeDiffUtil; -import com.massivecraft.massivecore.util.TimeUnit; -import com.massivecraft.massivecore.util.Txt; - -// This source code is a heavily modified version of mikeprimms plugin Dynmap-Factions. -public class EngineDynmap extends EngineAbstract -{ - // -------------------------------------------- // - // CONSTANTS - // -------------------------------------------- // - - public final static int BLOCKS_PER_CHUNK = 16; - - public final static String DYNMAP_INTEGRATION = Txt.parse("Dynmap Integration: "); - - public final static String FACTIONS = "factions"; - public final static String FACTIONS_ = FACTIONS + "_"; - - public final static String FACTIONS_MARKERSET = FACTIONS_ + "markerset"; - - public final static String FACTIONS_HOME = FACTIONS_ + "home"; - public final static String FACTIONS_HOME_ = FACTIONS_HOME + "_"; - - public final static String FACTIONS_PLAYERSET = FACTIONS_ + "playerset"; - public final static String FACTIONS_PLAYERSET_ = FACTIONS_PLAYERSET + "_"; - - public final static String FACTIONS_AREA = FACTIONS_ + "area"; - public final static String FACTIONS_AREA_ = FACTIONS_AREA + "_"; - - // -------------------------------------------- // - // INSTANCE & CONSTRUCT - // -------------------------------------------- // - - private static EngineDynmap i = new EngineDynmap(); - public static EngineDynmap get() { return i; } - private EngineDynmap() {} - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public Plugin getPlugin() - { - return Factions.get(); - } - - @Override - public Long getPeriod() - { - // Every 15 seconds - return 15 * 20L; - } - - @Override - public boolean isSync() - { - return false; - } - - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - public DynmapAPI dynmapApi; - public MarkerAPI markerApi; - public MarkerSet markerset; - - // -------------------------------------------- // - // RUN: UPDATE - // -------------------------------------------- // - - // Thread Safe / Asynchronous: Yes - @Override - public void run() - { - // Should we even use dynmap? - if (!MConf.get().dynmapUse) - { - if (this.markerset != null) - { - this.markerset.deleteMarkerSet(); - this.markerset = null; - } - return; - } - - long before = System.currentTimeMillis(); - - // We do what we can here. - // You /can/ run this method from the main server thread but it's not recommended at all. - // This method is supposed to be run async to avoid locking the main server thread. - final Map homes = createHomes(); - final Map areas = createAreas(); - final Map> playerSets = createPlayersets(); - - long after = System.currentTimeMillis(); - long duration = after-before; - updateLog("Async", duration); - - // Shedule non thread safe sync at the end! - Bukkit.getScheduler().scheduleSyncDelayedTask(Factions.get(), new Runnable() - { - @Override - public void run() - { - long before = System.currentTimeMillis(); - - if (!updateCore()) return; - - // createLayer() is thread safe but it makes use of fields set in updateCore() so we must have it after. - if (!updateLayer(createLayer())) return; - - updateHomes(homes); - updateAreas(areas); - updatePlayersets(playerSets); - - long after = System.currentTimeMillis(); - long duration = after-before; - updateLog("Sync", duration); - } - }); - } - - // Thread Safe / Asynchronous: Yes - public static void updateLog(String name, long millis) - { - if (!MConf.get().dynmapUpdateLog) return; - String message = Txt.parse("%s took %dms.", "Faction Dynmap " + name, millis); - Factions.get().log(message); - } - - // -------------------------------------------- // - // UPDATE: CORE - // -------------------------------------------- // - - // Thread Safe / Asynchronous: No - public boolean updateCore() - { - // Get DynmapAPI - this.dynmapApi = (DynmapAPI) Bukkit.getPluginManager().getPlugin("dynmap"); - if (this.dynmapApi == null) - { - severe("Could not retrieve the DynmapAPI."); - return false; - } - - // Get MarkerAPI - this.markerApi = this.dynmapApi.getMarkerAPI(); - if (this.markerApi == null) - { - severe("Could not retrieve the MarkerAPI."); - return false; - } - - return true; - } - - // -------------------------------------------- // - // UPDATE: Layer - // -------------------------------------------- // - - // Thread Safe / Asynchronous: Yes - public TempMarkerSet createLayer() - { - TempMarkerSet ret = new TempMarkerSet(); - ret.label = MConf.get().dynmapLayerName; - ret.minimumZoom = MConf.get().dynmapLayerMinimumZoom; - ret.priority = MConf.get().dynmapLayerPriority; - ret.hideByDefault = !MConf.get().dynmapLayerVisible; - return ret; - } - - // Thread Safe / Asynchronous: No - public boolean updateLayer(TempMarkerSet temp) - { - this.markerset = this.markerApi.getMarkerSet(FACTIONS_MARKERSET); - if (this.markerset == null) - { - this.markerset = temp.create(this.markerApi, FACTIONS_MARKERSET); - if (this.markerset == null) - { - severe("Could not create the Faction Markerset/Layer"); - return false; - } - } - else - { - temp.update(this.markerApi, this.markerset); - } - return true; - } - - // -------------------------------------------- // - // UPDATE: HOMES - // -------------------------------------------- // - - // Thread Safe / Asynchronous: Yes - public Map createHomes() - { - Map ret = new HashMap(); - - // Loop current factions - for (Faction faction : FactionColl.get().getAll()) - { - PS ps = faction.getHome(); - if (ps == null) continue; - - DynmapStyle style = getStyle(faction); - - String markerId = FACTIONS_HOME_ + faction.getId(); - - TempMarker temp = new TempMarker(); - temp.label = ChatColor.stripColor(faction.getName()); - temp.world = ps.getWorld(); - temp.x = ps.getLocationX(); - temp.y = ps.getLocationY(); - temp.z = ps.getLocationZ(); - temp.iconName = style.getHomeMarker(); - temp.description = getDescription(faction); - - ret.put(markerId, temp); - } - - return ret; - } - - // Thread Safe / Asynchronous: No - // This method places out the faction home markers into the factions markerset. - public void updateHomes(Map homes) - { - // Put all current faction markers in a map - Map markers = new HashMap(); - for (Marker marker : this.markerset.getMarkers()) - { - markers.put(marker.getMarkerID(), marker); - } - - // Loop homes - for (Entry entry : homes.entrySet()) - { - String markerId = entry.getKey(); - TempMarker temp = entry.getValue(); - - // Get Creative - // NOTE: I remove from the map created just in the beginning of this method. - // NOTE: That way what is left at the end will be outdated markers to remove. - Marker marker = markers.remove(markerId); - if (marker == null) - { - marker = temp.create(this.markerApi, this.markerset, markerId); - if (marker == null) - { - EngineDynmap.severe("Could not get/create the home marker " + markerId); - } - } - else - { - temp.update(this.markerApi, this.markerset, marker); - } - } - - // Delete Deprecated Markers - // Only old markers should now be left - for (Marker marker : markers.values()) - { - marker.deleteMarker(); - } - } - - // -------------------------------------------- // - // UPDATE: AREAS - // -------------------------------------------- // - - // Thread Safe: YES - public Map createAreas() - { - Map>> worldFactionChunks = createWorldFactionChunks(); - return createAreas(worldFactionChunks); - } - - // Thread Safe: YES - public Map>> createWorldFactionChunks() - { - // Create map "world name --> faction --> set of chunk coords" - Map>> worldFactionChunks = new HashMap>>(); - - // Note: The board is the world. The board id is the world name. - for (Board board : BoardColl.get().getAll()) - { - String world = board.getId(); - - // Get the factionChunks creatively. - Map> factionChunks = worldFactionChunks.get(world); - if (factionChunks == null) - { - factionChunks = new HashMap>(); - worldFactionChunks.put(world, factionChunks); - } - - // Populate the factionChunks - for (Entry entry : board.getMap().entrySet()) - { - PS chunk = entry.getKey(); - TerritoryAccess territoryAccess = entry.getValue(); - String factionId = territoryAccess.getHostFactionId(); - Faction faction = Faction.get(factionId); - if (faction == null) continue; - - // Get the chunks creatively. - Set chunks = factionChunks.get(faction); - if (chunks == null) - { - chunks = new HashSet(); - factionChunks.put(faction, chunks); - } - - chunks.add(chunk); - } - } - - return worldFactionChunks; - } - - // Thread Safe: YES - public Map createAreas(Map>> worldFactionChunks) - { - Map ret = new HashMap(); - - // For each world - for (Entry>> entry : worldFactionChunks.entrySet()) - { - String world = entry.getKey(); - Map> factionChunks = entry.getValue(); - - // For each faction and its chunks in that world - for (Entry> entry1 : factionChunks.entrySet()) - { - Faction faction = entry1.getKey(); - Set chunks = entry1.getValue(); - Map worldFactionMarkers = createAreas(world, faction, chunks); - ret.putAll(worldFactionMarkers); - } - } - - return ret; - } - - // Thread Safe: YES - // Handle specific faction on specific world - // "handle faction on world" - public Map createAreas(String world, Faction faction, Set chunks) - { - Map ret = new HashMap(); - - // If the faction is visible ... - if (!isVisible(faction, world)) return ret; - - // ... and has any chunks ... - if (chunks.isEmpty()) return ret; - - // Index of polygon for given faction - int markerIndex = 0; - - // Create the info window - String description = getDescription(faction); - - // Fetch Style - DynmapStyle style = this.getStyle(faction); - - // Loop through chunks: set flags on chunk map - TileFlags allChunkFlags = new TileFlags(); - LinkedList allChunks = new LinkedList(); - for (PS chunk : chunks) - { - allChunkFlags.setFlag(chunk.getChunkX(), chunk.getChunkZ(), true); // Set flag for chunk - allChunks.addLast(chunk); - } - - // Loop through until we don't find more areas - while (allChunks != null) - { - TileFlags ourChunkFlags = null; - LinkedList ourChunks = null; - LinkedList newChunks = null; - - int minimumX = Integer.MAX_VALUE; - int minimumZ = Integer.MAX_VALUE; - for (PS chunk : allChunks) - { - int chunkX = chunk.getChunkX(); - int chunkZ = chunk.getChunkZ(); - - // If we need to start shape, and this block is not part of one yet - if (ourChunkFlags == null && allChunkFlags.getFlag(chunkX, chunkZ)) - { - ourChunkFlags = new TileFlags(); // Create map for shape - ourChunks = new LinkedList(); - floodFillTarget(allChunkFlags, ourChunkFlags, chunkX, chunkZ); // Copy shape - ourChunks.add(chunk); // Add it to our chunk list - minimumX = chunkX; - minimumZ = chunkZ; - } - // If shape found, and we're in it, add to our node list - else if (ourChunkFlags != null && ourChunkFlags.getFlag(chunkX, chunkZ)) - { - ourChunks.add(chunk); - if (chunkX < minimumX) - { - minimumX = chunkX; - minimumZ = chunkZ; - } - else if (chunkX == minimumX && chunkZ < minimumZ) - { - minimumZ = chunkZ; - } - } - // Else, keep it in the list for the next polygon - else - { - if (newChunks == null) newChunks = new LinkedList(); - newChunks.add(chunk); - } - } - - // Replace list (null if no more to process) - allChunks = newChunks; - - if (ourChunkFlags == null) continue; - - // Trace outline of blocks - start from minx, minz going to x+ - int initialX = minimumX; - int initialZ = minimumZ; - int currentX = minimumX; - int currentZ = minimumZ; - Direction direction = Direction.XPLUS; - ArrayList linelist = new ArrayList(); - linelist.add(new int[]{ initialX, initialZ }); // Add start point - while ((currentX != initialX) || (currentZ != initialZ) || (direction != Direction.ZMINUS)) - { - switch (direction) - { - case XPLUS: // Segment in X+ direction - if (!ourChunkFlags.getFlag(currentX + 1, currentZ)) - { // Right turn? - linelist.add(new int[]{ currentX + 1, currentZ }); // Finish line - direction = Direction.ZPLUS; // Change direction - } - else if (!ourChunkFlags.getFlag(currentX + 1, currentZ - 1)) - { // Straight? - currentX++; - } - else - { // Left turn - linelist.add(new int[]{ currentX + 1, currentZ }); // Finish line - direction = Direction.ZMINUS; - currentX++; - currentZ--; - } - break; - case ZPLUS: // Segment in Z+ direction - if (!ourChunkFlags.getFlag(currentX, currentZ + 1)) - { // Right turn? - linelist.add(new int[]{ currentX + 1, currentZ + 1 }); // Finish line - direction = Direction.XMINUS; // Change direction - } - else if (!ourChunkFlags.getFlag(currentX + 1, currentZ + 1)) - { // Straight? - currentZ++; - } - else - { // Left turn - linelist.add(new int[]{ currentX + 1, currentZ + 1 }); // Finish line - direction = Direction.XPLUS; - currentX++; - currentZ++; - } - break; - case XMINUS: // Segment in X- direction - if (!ourChunkFlags.getFlag(currentX - 1, currentZ)) - { // Right turn? - linelist.add(new int[]{ currentX, currentZ + 1 }); // Finish line - direction = Direction.ZMINUS; // Change direction - } - else if (!ourChunkFlags.getFlag(currentX - 1, currentZ + 1)) - { // Straight? - currentX--; - } - else - { // Left turn - linelist.add(new int[] { currentX, currentZ + 1 }); // Finish line - direction = Direction.ZPLUS; - currentX--; - currentZ++; - } - break; - case ZMINUS: // Segment in Z- direction - if (!ourChunkFlags.getFlag(currentX, currentZ - 1)) - { // Right turn? - linelist.add(new int[]{ currentX, currentZ }); // Finish line - direction = Direction.XPLUS; // Change direction - } - else if (!ourChunkFlags.getFlag(currentX - 1, currentZ - 1)) - { // Straight? - currentZ--; - } - else - { // Left turn - linelist.add(new int[] { currentX, currentZ }); // Finish line - direction = Direction.XMINUS; - currentX--; - currentZ--; - } - break; - } - } - - int sz = linelist.size(); - double[] x = new double[sz]; - double[] z = new double[sz]; - for (int i = 0; i < sz; i++) - { - int[] line = linelist.get(i); - x[i] = (double) line[0] * (double) BLOCKS_PER_CHUNK; - z[i] = (double) line[1] * (double) BLOCKS_PER_CHUNK; - } - - // Build information for specific area - String markerId = FACTIONS_ + world + "__" + faction.getId() + "__" + markerIndex; - - TempAreaMarker temp = new TempAreaMarker(); - temp.label = faction.getName(); - temp.world = world; - temp.x = x; - temp.z = z; - temp.description = description; - - temp.lineColor = style.getLineColor(); - temp.lineOpacity = style.getLineOpacity(); - temp.lineWeight = style.getLineWeight(); - - temp.fillColor = style.getFillColor(); - temp.fillOpacity = style.getFillOpacity(); - - temp.boost = style.getBoost(); - - ret.put(markerId, temp); - - markerIndex++; - } - - return ret; - } - - // Thread Safe: NO - public void updateAreas(Map areas) - { - // Map Current - Map markers = new HashMap(); - for (AreaMarker marker : this.markerset.getAreaMarkers()) - { - markers.put(marker.getMarkerID(), marker); - } - - // Loop New - for (Entry entry : areas.entrySet()) - { - String markerId = entry.getKey(); - TempAreaMarker temp = entry.getValue(); - - // Get Creative - // NOTE: I remove from the map created just in the beginning of this method. - // NOTE: That way what is left at the end will be outdated markers to remove. - AreaMarker marker = markers.remove(markerId); - if (marker == null) - { - marker = temp.create(this.markerApi, this.markerset, markerId); - if (marker == null) - { - severe("Could not get/create the area marker " + markerId); - } - } - else - { - temp.update(this.markerApi, this.markerset, marker); - } - } - - // Only old/outdated should now be left. Delete them. - for (AreaMarker marker : markers.values()) - { - marker.deleteMarker(); - } - } - - // -------------------------------------------- // - // UPDATE: PLAYERSET - // -------------------------------------------- // - - // Thread Safe / Asynchronous: Yes - public String createPlayersetId(Faction faction) - { - if (faction == null) return null; - if (faction.isNone()) return null; - String factionId = faction.getId(); - if (factionId == null) return null; - return FACTIONS_PLAYERSET_ + factionId; - } - - // Thread Safe / Asynchronous: Yes - public Set createPlayerset(Faction faction) - { - if (faction == null) return null; - if (faction.isNone()) return null; - - Set ret = new HashSet(); - - for (MPlayer mplayer : faction.getMPlayers()) - { - // NOTE: We add both UUID and name. This might be a good idea for future proofing. - ret.add(mplayer.getId()); - ret.add(mplayer.getName()); - } - - return ret; - } - - // Thread Safe / Asynchronous: Yes - public Map> createPlayersets() - { - if (!MConf.get().dynmapVisibilityByFaction) return null; - - Map> ret = new HashMap>(); - - for (Faction faction : FactionColl.get().getAll()) - { - String playersetId = createPlayersetId(faction); - if (playersetId == null) continue; - Set playerIds = createPlayerset(faction); - if (playerIds == null) continue; - ret.put(playersetId, playerIds); - } - - return ret; - } - - // Thread Safe / Asynchronous: No - public void updatePlayersets(Map> playersets) - { - // Remove - for (PlayerSet set : this.markerApi.getPlayerSets()) - { - if (!set.getSetID().startsWith(FACTIONS_PLAYERSET_)) continue; - - // (Null means remove all) - if (playersets != null && playersets.containsKey(set.getSetID())) continue; - - set.deleteSet(); - } - - // Add / Update - for (Entry> entry : playersets.entrySet()) - { - // Extract from Entry - String setId = entry.getKey(); - Set playerIds = entry.getValue(); - - // Get Creatively - PlayerSet set = this.markerApi.getPlayerSet(setId); - if (set == null) set = this.markerApi.createPlayerSet( - setId, // id - true, // symmetric - playerIds, // players - false // persistent - ); - if (set == null) - { - severe("Could not get/create the player set " + setId); - continue; - } - - // Set Content - set.setPlayers(playerIds); - } - } - - // -------------------------------------------- // - // UTIL & SHARED - // -------------------------------------------- // - - // Thread Safe / Asynchronous: Yes - private String getDescription(Faction faction) - { - String ret = "
" + MConf.get().dynmapDescription + "
"; - - // Name - String name = faction.getName(); - name = ChatColor.stripColor(name); - name = escapeHtml(name); - ret = ret.replace("%name%", name); - - // Description - String description = faction.getDescription(); - description = ChatColor.stripColor(description); - description = escapeHtml(description); - ret = ret.replace("%description%", description); - - // Age - long ageMillis = faction.getCreatedAtMillis() - System.currentTimeMillis(); - LinkedHashMap ageUnitcounts = TimeDiffUtil.limit(TimeDiffUtil.unitcounts(ageMillis, TimeUnit.getAllButMillisSecondsAndMinutes()), 3); - String age = TimeDiffUtil.formatedVerboose(ageUnitcounts, ""); - age = ChatColor.stripColor(age); - ret = ret.replace("%age%", age); - - // Money - String money = "unavailable"; - if (MConf.get().bankEnabled && MConf.get().dynmapDescriptionMoney) - { - money = Money.format(Money.get(faction)); - } - ret = ret.replace("%money%", money); - - // Flags and Open - Map flags = new LinkedHashMap(); - for (MFlag mflag : MFlag.getAll()) - { - flags.put(mflag, faction.getFlag(mflag)); - } - - List flagMapParts = new ArrayList(); - List flagTableParts = new ArrayList(); - - for (Entry entry : flags.entrySet()) - { - MFlag mflag = entry.getKey(); - String flag = mflag.getName(); - boolean value = entry.getValue(); - - String bool = String.valueOf(value); - String color = boolcolor(flag, value); - String boolcolor = boolcolor(String.valueOf(value), value); - - ret = ret.replace("%" + flag + ".bool%", bool); // true - ret = ret.replace("%" + flag + ".color%", color); // monsters (red or green) - ret = ret.replace("%" + flag + ".boolcolor%", boolcolor); // true (red or green) - - if ( ! mflag.isInteresting(value)) continue; - flagMapParts.add(flag + ": " + boolcolor); - flagTableParts.add(color); - } - - String flagMap = Txt.implode(flagMapParts, "
\n"); - ret = ret.replace("%flags.map%", flagMap); - - for (int cols = 1; cols <= 10; cols++) - { - String flagTable = getHtmlAsciTable(flagTableParts, cols); - ret = ret.replace("%flags.table" + cols + "%", flagTable); - } - - // Players - List playersList = faction.getMPlayers(); - String playersCount = String.valueOf(playersList.size()); - String players = getHtmlPlayerString(playersList); - - MPlayer playersLeaderObject = faction.getLeader(); - String playersLeader = getHtmlPlayerName(playersLeaderObject); - - List playersOfficersList = faction.getMPlayersWhereRole(Rel.OFFICER); - String playersOfficersCount = String.valueOf(playersOfficersList.size()); - String playersOfficers = getHtmlPlayerString(playersOfficersList); - - List playersMembersList = faction.getMPlayersWhereRole(Rel.MEMBER); - String playersMembersCount = String.valueOf(playersMembersList.size()); - String playersMembers = getHtmlPlayerString(playersMembersList); - - List playersRecruitsList = faction.getMPlayersWhereRole(Rel.RECRUIT); - String playersRecruitsCount = String.valueOf(playersRecruitsList.size()); - String playersRecruits = getHtmlPlayerString(playersRecruitsList); - - - ret = ret.replace("%players%", players); - ret = ret.replace("%players.count%", playersCount); - ret = ret.replace("%players.leader%", playersLeader); - ret = ret.replace("%players.officers%", playersOfficers); - ret = ret.replace("%players.officers.count%", playersOfficersCount); - ret = ret.replace("%players.members%", playersMembers); - ret = ret.replace("%players.members.count%", playersMembersCount); - ret = ret.replace("%players.recruits%", playersRecruits); - ret = ret.replace("%players.recruits.count%", playersRecruitsCount); - - return ret; - } - - public static String getHtmlAsciTable(Collection strings, int cols) - { - StringBuilder ret = new StringBuilder(); - - int count = 0; - Iterator iter = strings.iterator(); - while (iter.hasNext()) - { - String string = iter.next(); - count++; - - ret.append(string); - if (iter.hasNext()) - { - if (count == cols) - { - ret.append("
\n"); - count = 0; - } - else - { - ret.append(" | "); - } - } - } - - return ret.toString(); - } - - public static String getHtmlPlayerString(List mplayers) - { - String ret = ""; - for (MPlayer mplayer : mplayers) - { - if (ret.length() > 0) ret += ", "; - ret += getHtmlPlayerName(mplayer); - } - return ret; - } - - public static String getHtmlPlayerName(MPlayer mplayer) - { - if (mplayer == null) return "none"; - return escapeHtml(mplayer.getName()); - } - - public static String boolcolor(String string, boolean bool) - { - return "" + string + ""; - } - - public static String escapeHtml(String string) - { - StringBuilder out = new StringBuilder(Math.max(16, string.length())); - for (int i = 0; i < string.length(); i++) - { - char c = string.charAt(i); - if (c > 127 || c == '"' || c == '<' || c == '>' || c == '&') - { - out.append("&#"); - out.append((int) c); - out.append(';'); - } - else - { - out.append(c); - } - } - return out.toString(); - } - - // Thread Safe / Asynchronous: Yes - private boolean isVisible(Faction faction, String world) - { - if (faction == null) return false; - final String factionId = faction.getId(); - if (factionId == null) return false; - final String factionName = faction.getName(); - if (factionName == null) return false; - - Set visible = MConf.get().dynmapVisibleFactions; - Set hidden = MConf.get().dynmapHiddenFactions; - - if (visible.size() > 0) - { - if (!visible.contains(factionId) && !visible.contains(factionName) && !visible.contains("world:" + world)) - { - return false; - } - } - - if (hidden.size() > 0) - { - if (hidden.contains(factionId) || hidden.contains(factionName) || hidden.contains("world:" + world)) - { - return false; - } - } - - return true; - } - - // Thread Safe / Asynchronous: Yes - public DynmapStyle getStyle(Faction faction) - { - DynmapStyle ret; - - ret = MConf.get().dynmapFactionStyles.get(faction.getId()); - if (ret != null) return ret; - - ret = MConf.get().dynmapFactionStyles.get(faction.getName()); - if (ret != null) return ret; - - return MConf.get().dynmapDefaultStyle; - } - - // Thread Safe / Asynchronous: Yes - public static void info(String msg) - { - String message = DYNMAP_INTEGRATION + msg; - Factions.get().log(message); - } - - // Thread Safe / Asynchronous: Yes - public static void severe(String msg) - { - String message = DYNMAP_INTEGRATION + ChatColor.RED.toString() + msg; - Factions.get().log(message); - } - - enum Direction - { - XPLUS, ZPLUS, XMINUS, ZMINUS - }; - - // Find all contiguous blocks, set in target and clear in source - private int floodFillTarget(TileFlags source, TileFlags destination, int x, int y) - { - int cnt = 0; - ArrayDeque stack = new ArrayDeque(); - stack.push(new int[] { x, y }); - - while (stack.isEmpty() == false) - { - int[] nxt = stack.pop(); - x = nxt[0]; - y = nxt[1]; - if (source.getFlag(x, y)) - { // Set in src - source.setFlag(x, y, false); // Clear source - destination.setFlag(x, y, true); // Set in destination - cnt++; - if (source.getFlag(x + 1, y)) stack.push(new int[] { x + 1, y }); - if (source.getFlag(x - 1, y)) stack.push(new int[] { x - 1, y }); - if (source.getFlag(x, y + 1)) stack.push(new int[] { x, y + 1 }); - if (source.getFlag(x, y - 1)) stack.push(new int[] { x, y - 1 }); - } - } - return cnt; - } - - - -} diff --git a/src/main/java/com/massivecraft/factions/integration/dynmap/IntegrationDynmap.java b/src/main/java/com/massivecraft/factions/integration/dynmap/IntegrationDynmap.java deleted file mode 100644 index 9fa4d64c..00000000 --- a/src/main/java/com/massivecraft/factions/integration/dynmap/IntegrationDynmap.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.massivecraft.factions.integration.dynmap; - -import com.massivecraft.massivecore.integration.IntegrationAbstract; - -public class IntegrationDynmap extends IntegrationAbstract -{ - // -------------------------------------------- // - // INSTANCE & CONSTRUCT - // -------------------------------------------- // - - private static IntegrationDynmap i = new IntegrationDynmap(); - public static IntegrationDynmap get() { return i; } - private IntegrationDynmap() { super("dynmap"); } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public void activate() - { - EngineDynmap.get().activate(); - } - - @Override - public void deactivate() - { - EngineDynmap.get().deactivate(); - } - -} diff --git a/src/main/java/com/massivecraft/factions/integration/dynmap/IntegrationDynmapFactions.java b/src/main/java/com/massivecraft/factions/integration/dynmap/IntegrationDynmapFactions.java deleted file mode 100644 index 20080310..00000000 --- a/src/main/java/com/massivecraft/factions/integration/dynmap/IntegrationDynmapFactions.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.massivecraft.factions.integration.dynmap; - -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -import com.massivecraft.factions.Factions; -import com.massivecraft.massivecore.integration.IntegrationAbstract; -import com.massivecraft.massivecore.util.Txt; - -public class IntegrationDynmapFactions extends IntegrationAbstract -{ - // -------------------------------------------- // - // INSTANCE & CONSTRUCT - // -------------------------------------------- // - - private static IntegrationDynmapFactions i = new IntegrationDynmapFactions(); - public static IntegrationDynmapFactions get() { return i; } - private IntegrationDynmapFactions() { super("Dynmap-Factions"); } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public void activate() - { - // Time for an error message! - Bukkit.getScheduler().scheduleSyncDelayedTask(Factions.get(), new Runnable() - { - @Override - public void run() - { - Factions.get().log(Txt.parse("I see you have the plugin Dynmap-Factions installed!")); - Factions.get().log(Txt.parse("That plugin is no longer required for Dynmap features.")); - Factions.get().log(Txt.parse("Factions now ship with it's own Dynmap integration.")); - Factions.get().log(Txt.parse("Now disabling Dynmap-Factions for you:")); - - Plugin plugin = Bukkit.getPluginManager().getPlugin("Dynmap-Factions"); - Bukkit.getPluginManager().disablePlugin(plugin); - } - }); - } - -} diff --git a/src/main/java/com/massivecraft/factions/integration/dynmap/TempAreaMarker.java b/src/main/java/com/massivecraft/factions/integration/dynmap/TempAreaMarker.java deleted file mode 100644 index e5ebf28b..00000000 --- a/src/main/java/com/massivecraft/factions/integration/dynmap/TempAreaMarker.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.massivecraft.factions.integration.dynmap; - -import org.dynmap.markers.AreaMarker; -import org.dynmap.markers.MarkerAPI; -import org.dynmap.markers.MarkerSet; - -import com.massivecraft.massivecore.util.MUtil; - -public class TempAreaMarker -{ - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - public String label; - public String world; - public double x[]; - public double z[]; - public String description; - - public int lineColor; - public double lineOpacity; - public int lineWeight; - - public int fillColor; - public double fillOpacity; - - public boolean boost; - - // -------------------------------------------- // - // CREATE - // -------------------------------------------- // - - public AreaMarker create(MarkerAPI markerApi, MarkerSet markerset, String markerId) - { - AreaMarker ret = markerset.createAreaMarker( - markerId, - this.label, - false, - this.world, - this.x, - this.z, - false // not persistent - ); - - if (ret == null) return null; - - // Description - ret.setDescription(this.description); - - // Line Style - ret.setLineStyle(this.lineWeight, this.lineOpacity, this.lineColor); - - // Fill Style - ret.setFillStyle(this.fillOpacity, this.fillColor); - - // Boost Flag - ret.setBoostFlag(this.boost); - - return ret; - } - - // -------------------------------------------- // - // UPDATE - // -------------------------------------------- // - - public void update(MarkerAPI markerApi, MarkerSet markerset, AreaMarker marker) - { - // Corner Locations - if (!equals(marker, this.x, this.z)) - { - marker.setCornerLocations(this.x, this.z); - } - - // Label - if (!MUtil.equals(marker.getLabel(), this.label)) - { - marker.setLabel(this.label); - } - - // Description - if (!MUtil.equals(marker.getDescription(), this.description)) - { - marker.setDescription(this.description); - } - - // Line Style - if - ( - !MUtil.equals(marker.getLineWeight(), this.lineWeight) - || - !MUtil.equals(marker.getLineOpacity(), this.lineOpacity) - || - !MUtil.equals(marker.getLineColor(), this.lineColor) - ) - { - marker.setLineStyle(this.lineWeight, this.lineOpacity, this.lineColor); - } - - // Fill Style - if - ( - !MUtil.equals(marker.getFillOpacity(), this.fillOpacity) - || - !MUtil.equals(marker.getFillColor(), this.fillColor) - ) - { - marker.setFillStyle(this.fillOpacity, this.fillColor); - } - - // Boost Flag - if (!MUtil.equals(marker.getBoostFlag(), this.boost)) - { - marker.setBoostFlag(this.boost); - } - } - - // -------------------------------------------- // - // UTIL - // -------------------------------------------- // - - public static boolean equals(AreaMarker marker, double x[], double z[]) - { - int length = marker.getCornerCount(); - - if (x.length != length) return false; - if (z.length != length) return false; - - for (int i = 0; i < length; i++) - { - if (marker.getCornerX(i) != x[i]) return false; - if (marker.getCornerZ(i) != z[i]) return false; - } - - return true; - } - -} diff --git a/src/main/java/com/massivecraft/factions/integration/dynmap/TempMarker.java b/src/main/java/com/massivecraft/factions/integration/dynmap/TempMarker.java deleted file mode 100644 index ce0a9980..00000000 --- a/src/main/java/com/massivecraft/factions/integration/dynmap/TempMarker.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.massivecraft.factions.integration.dynmap; - -import org.dynmap.markers.Marker; -import org.dynmap.markers.MarkerAPI; -import org.dynmap.markers.MarkerIcon; -import org.dynmap.markers.MarkerSet; - -import com.massivecraft.factions.entity.MConf; -import com.massivecraft.massivecore.util.MUtil; - -public class TempMarker -{ - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - public String label; - public String world; - public double x; - public double y; - public double z; - public String iconName; - public String description; - - // -------------------------------------------- // - // CREATE - // -------------------------------------------- // - - public Marker create(MarkerAPI markerApi, MarkerSet markerset, String markerId) - { - Marker ret = markerset.createMarker( - markerId, - this.label, - this.world, - this.x, - this.y, - this.z, - getMarkerIcon(markerApi, this.iconName), - false // not persistent - ); - - if (ret == null) return null; - - ret.setDescription(this.description); - - return ret; - } - - // -------------------------------------------- // - // UPDATE - // -------------------------------------------- // - - public void update(MarkerAPI markerApi, MarkerSet markerset, Marker marker) - { - if - ( - marker.getWorld() != this.world - || - marker.getX() != this.x - || - marker.getY() != this.y - || - marker.getZ() != this.z - ) - { - marker.setLocation( - this.world, - this.x, - this.y, - this.z - ); - } - - if (!MUtil.equals(marker.getLabel(), this.label)) - { - marker.setLabel(this.label); - } - - MarkerIcon icon = getMarkerIcon(markerApi, this.iconName); - if (!MUtil.equals(marker.getMarkerIcon(), icon)) - { - marker.setMarkerIcon(icon); - } - - if (!MUtil.equals(marker.getDescription(), this.description)) - { - marker.setDescription(this.description); - } - } - - // -------------------------------------------- // - // UTIL - // -------------------------------------------- // - - public static MarkerIcon getMarkerIcon(MarkerAPI markerApi, String name) - { - MarkerIcon ret = markerApi.getMarkerIcon(name); - if (ret == null) ret = markerApi.getMarkerIcon(MConf.DYNMAP_STYLE_HOME_MARKER); - return ret; - } - -} diff --git a/src/main/java/com/massivecraft/factions/integration/dynmap/TempMarkerSet.java b/src/main/java/com/massivecraft/factions/integration/dynmap/TempMarkerSet.java deleted file mode 100644 index 50390e61..00000000 --- a/src/main/java/com/massivecraft/factions/integration/dynmap/TempMarkerSet.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.massivecraft.factions.integration.dynmap; - -import org.dynmap.markers.MarkerAPI; -import org.dynmap.markers.MarkerSet; - -import com.massivecraft.massivecore.util.MUtil; - -public class TempMarkerSet -{ - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - public String label; - public int minimumZoom; - public int priority; - public boolean hideByDefault; - - // -------------------------------------------- // - // CREATE - // -------------------------------------------- // - - public MarkerSet create(MarkerAPI markerApi, String id) - { - MarkerSet ret = markerApi.createMarkerSet(id, this.label, null, false); // ("null, false" at the end means "all icons allowed, not perisistent") - - if (ret == null) return null; - - // Minimum Zoom - if (this.minimumZoom > 0) - { - ret.setMinZoom(this.minimumZoom); - } - - // Priority - ret.setLayerPriority(this.priority); - - // Hide by Default - ret.setHideByDefault(this.hideByDefault); - - return ret; - } - - // -------------------------------------------- // - // UPDATE - // -------------------------------------------- // - - public void update(MarkerAPI markerApi, MarkerSet markerset) - { - // Name - if (!MUtil.equals(markerset.getMarkerSetLabel(), this.label)) - { - markerset.setMarkerSetLabel(this.label); - } - - // Minimum Zoom - if (this.minimumZoom > 0) - { - if (!MUtil.equals(markerset.getMinZoom(), this.minimumZoom)) - { - markerset.setMinZoom(this.minimumZoom); - } - } - - // Priority - if (!MUtil.equals(markerset.getLayerPriority(), this.priority)) - { - markerset.setLayerPriority(this.priority); - } - - // Hide by Default - if (!MUtil.equals(markerset.getHideByDefault(), this.hideByDefault)) - { - markerset.setHideByDefault(this.hideByDefault); - } - } - -}