Initial. perhaps broken update attempt

This commit is contained in:
Kristian Knarvik 2024-05-14 02:17:29 +02:00
parent 6fb1174adf
commit ef3cf02a23
16 changed files with 673 additions and 610 deletions

2
.gitignore vendored
View File

@ -23,3 +23,5 @@
# Mac filesystem dust # Mac filesystem dust
/.DS_Store /.DS_Store
*.iml

Binary file not shown.

Binary file not shown.

163
pom.xml
View File

@ -1,90 +1,83 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<modelVersion>4.0.0</modelVersion> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>org.dynmap</groupId> <modelVersion>4.0.0</modelVersion>
<artifactId>Dynmap-Factions</artifactId> <groupId>org.dynmap</groupId>
<version>0.91</version> <artifactId>Dynmap-Factions</artifactId>
<properties> <version>0.92</version>
<timestamp>${maven.build.timestamp}</timestamp> <properties>
<maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format> <timestamp>${maven.build.timestamp}</timestamp>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
<BUILD_NUMBER>Dev${timestamp}</BUILD_NUMBER> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <BUILD_NUMBER>Dev${timestamp}</BUILD_NUMBER>
</properties>
<build> <build>
<resources> <resources>
<resource> <resource>
<directory>src/main/resources</directory> <directory>src/main/resources</directory>
<filtering>true</filtering> <filtering>true</filtering>
<includes> <includes>
<include>*.yml</include> <include>*.yml</include>
<include>*.txt</include> <include>*.txt</include>
</includes> </includes>
</resource> </resource>
<resource> <resource>
<directory>src/main/resources</directory> <directory>src/main/resources</directory>
<filtering>false</filtering> <filtering>false</filtering>
<excludes> <excludes>
<exclude>*.yml</exclude> <exclude>*.yml</exclude>
<exclude>*.txt</exclude> <exclude>*.txt</exclude>
</excludes> </excludes>
</resource> </resource>
</resources> </resources>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version> <version>3.8.1</version>
<configuration> <configuration>
<source>1.6</source> <source>16</source>
<target>1.6</target> <target>16</target>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<repositories> <repositories>
<repository> <repository>
<releases> <id>spigotmc-repo</id>
</releases> <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
<snapshots> </repository>
</snapshots> <repository>
<id>bukkit-repo</id> <id>dynmap</id>
<url>http://repo.bukkit.org/content/repositories/releases/</url> <url>https://repo.mikeprimm.com/</url>
</repository> </repository>
<repository> </repositories>
<releases>
</releases>
<snapshots>
</snapshots>
<id>dynmap-repo</id>
<url>http://repo.mikeprimm.com/</url>
</repository>
</repositories>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.dynmap</groupId> <groupId>us.dynmap</groupId>
<artifactId>dynmap-api</artifactId> <artifactId>dynmap-api</artifactId>
<version>1.9</version> <version>3.6-SNAPSHOT</version>
</dependency> <scope>provided</scope>
<dependency> </dependency>
<groupId>org.bukkit</groupId> <dependency>
<artifactId>bukkit</artifactId> <groupId>org.spigotmc</groupId>
<version>1.7.10-R0.1-SNAPSHOT</version> <artifactId>spigot-api</artifactId>
</dependency> <version>1.20.6-R0.1-SNAPSHOT</version>
<dependency> <scope>provided</scope>
<groupId>com.massivecraft</groupId> </dependency>
<artifactId>Factions</artifactId> <dependency>
<version>2.7.1</version> <groupId>com.massivecraft</groupId>
<scope>system</scope> <artifactId>Factions</artifactId>
<systemPath>${project.basedir}/Factions-2.7.1.jar</systemPath> <version>3.3.3</version>
</dependency> <scope>provided</scope>
<dependency> </dependency>
<groupId>com.massivecraft</groupId> <dependency>
<artifactId>MassiveCore</artifactId> <groupId>com.massivecraft.massivecore</groupId>
<version>2.7.1</version> <artifactId>MassiveCore</artifactId>
<scope>system</scope> <version>3.3.3</version>
<systemPath>${project.basedir}/MassiveCore-2.7.1.jar</systemPath> <scope>provided</scope>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,16 +0,0 @@
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>bin</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>zip</format>
</formats>
<fileSets>
</fileSets>
<files>
<file>
<source>${project.build.directory}/${artifactId}-${version}.jar</source>
<outputDirectory>/</outputDirectory>
<destName>${artifactId}.jar</destName>
</file>
</files>
</assembly>

View File

@ -0,0 +1,51 @@
package org.dynmap.factions;
import org.bukkit.configuration.file.FileConfiguration;
import org.dynmap.markers.MarkerIcon;
class AreaStyle {
final String strokecolor;
final double strokeopacity;
final int strokeweight;
final String fillcolor;
final double fillopacity;
final String homemarker;
MarkerIcon homeicon;
final boolean boost;
AreaStyle(DynmapFactionsPlugin dynmapFactionsPlugin, FileConfiguration cfg, String path, AreaStyle def) {
strokecolor = cfg.getString(path + ".strokeColor", def.strokecolor);
strokeopacity = cfg.getDouble(path + ".strokeOpacity", def.strokeopacity);
strokeweight = cfg.getInt(path + ".strokeWeight", def.strokeweight);
fillcolor = cfg.getString(path + ".fillColor", def.fillcolor);
fillopacity = cfg.getDouble(path + ".fillOpacity", def.fillopacity);
homemarker = cfg.getString(path + ".homeicon", def.homemarker);
if (homemarker != null) {
homeicon = dynmapFactionsPlugin.markerapi.getMarkerIcon(homemarker);
if (homeicon == null) {
DynmapFactionsPlugin.severe("Invalid homeicon: " + homemarker);
homeicon = dynmapFactionsPlugin.markerapi.getMarkerIcon("blueicon");
}
}
boost = cfg.getBoolean(path + ".boost", def.boost);
}
AreaStyle(DynmapFactionsPlugin dynmapFactionsPlugin, FileConfiguration cfg, String path) {
strokecolor = cfg.getString(path + ".strokeColor", "#FF0000");
strokeopacity = cfg.getDouble(path + ".strokeOpacity", 0.8);
strokeweight = cfg.getInt(path + ".strokeWeight", 3);
fillcolor = cfg.getString(path + ".fillColor", "#FF0000");
fillopacity = cfg.getDouble(path + ".fillOpacity", 0.35);
homemarker = cfg.getString(path + ".homeicon", null);
if (homemarker != null) {
homeicon = dynmapFactionsPlugin.markerapi.getMarkerIcon(homemarker);
if (homeicon == null) {
DynmapFactionsPlugin.severe("Invalid homeicon: " + homemarker);
homeicon = dynmapFactionsPlugin.markerapi.getMarkerIcon("blueicon");
}
}
boost = cfg.getBoolean(path + ".boost", false);
}
}

View File

@ -0,0 +1,10 @@
package org.dynmap.factions;
public enum Direction {
XPLUS,
ZPLUS,
XMINUS,
ZMINUS
}

View File

@ -1,5 +1,29 @@
package org.dynmap.factions; package org.dynmap.factions;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import com.massivecraft.factions.entity.MFlag;
import com.massivecraft.factions.entity.MFlagColl;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.factions.entity.Warp;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.store.EntityInternalMap;
import org.bukkit.ChatColor;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.dynmap.DynmapAPI;
import org.dynmap.markers.AreaMarker;
import org.dynmap.markers.Marker;
import org.dynmap.markers.MarkerAPI;
import org.dynmap.markers.MarkerIcon;
import org.dynmap.markers.MarkerSet;
import org.dynmap.markers.PlayerSet;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
@ -13,40 +37,8 @@ import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.bukkit.ChatColor;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.server.PluginEnableEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.dynmap.DynmapAPI;
import org.dynmap.markers.AreaMarker;
import org.dynmap.markers.Marker;
import org.dynmap.markers.MarkerAPI;
import org.dynmap.markers.MarkerIcon;
import org.dynmap.markers.MarkerSet;
import org.dynmap.markers.PlayerSet;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import com.massivecraft.factions.entity.MFlag;
import com.massivecraft.factions.entity.MFlagColl;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.factions.event.EventFactionsChunksChange;
import com.massivecraft.factions.event.EventFactionsCreate;
import com.massivecraft.factions.event.EventFactionsDisband;
import com.massivecraft.factions.event.EventFactionsHomeChange;
import com.massivecraft.factions.event.EventFactionsMembershipChange;
import com.massivecraft.factions.event.EventFactionsNameChange;
import com.massivecraft.massivecore.ps.PS;
public class DynmapFactionsPlugin extends JavaPlugin { public class DynmapFactionsPlugin extends JavaPlugin {
private static Logger log; private static Logger log;
private static final String DEF_INFOWINDOW = "<div class=\"infowindow\"><span style=\"font-size:120%;\">%regionname%</span><br />Flags<br /><span style=\"font-weight:bold;\">%flags%</span></div>"; private static final String DEF_INFOWINDOW = "<div class=\"infowindow\"><span style=\"font-size:120%;\">%regionname%</span><br />Flags<br /><span style=\"font-weight:bold;\">%flags%</span></div>";
Plugin dynmap; Plugin dynmap;
@ -58,7 +50,6 @@ public class DynmapFactionsPlugin extends JavaPlugin {
int blocksize; int blocksize;
FileConfiguration cfg;
MarkerSet set; MarkerSet set;
long updperiod; long updperiod;
boolean use3d; boolean use3d;
@ -68,179 +59,103 @@ public class DynmapFactionsPlugin extends JavaPlugin {
Set<String> visible; Set<String> visible;
Set<String> hidden; Set<String> hidden;
boolean stop; boolean stop;
static DynmapFactionsPlugin instance;
@Override @Override
public void onLoad() { public void onLoad() {
log = this.getLogger(); log = this.getLogger();
} }
private class AreaStyle {
String strokecolor;
double strokeopacity;
int strokeweight;
String fillcolor;
double fillopacity;
String homemarker;
MarkerIcon homeicon;
boolean boost;
AreaStyle(FileConfiguration cfg, String path, AreaStyle def) {
strokecolor = cfg.getString(path+".strokeColor", def.strokecolor);
strokeopacity = cfg.getDouble(path+".strokeOpacity", def.strokeopacity);
strokeweight = cfg.getInt(path+".strokeWeight", def.strokeweight);
fillcolor = cfg.getString(path+".fillColor", def.fillcolor);
fillopacity = cfg.getDouble(path+".fillOpacity", def.fillopacity);
homemarker = cfg.getString(path+".homeicon", def.homemarker);
if(homemarker != null) {
homeicon = markerapi.getMarkerIcon(homemarker);
if(homeicon == null) {
severe("Invalid homeicon: " + homemarker);
homeicon = markerapi.getMarkerIcon("blueicon");
}
}
boost = cfg.getBoolean(path+".boost", def.boost);
}
AreaStyle(FileConfiguration cfg, String path) {
strokecolor = cfg.getString(path+".strokeColor", "#FF0000");
strokeopacity = cfg.getDouble(path+".strokeOpacity", 0.8);
strokeweight = cfg.getInt(path+".strokeWeight", 3);
fillcolor = cfg.getString(path+".fillColor", "#FF0000");
fillopacity = cfg.getDouble(path+".fillOpacity", 0.35);
homemarker = cfg.getString(path+".homeicon", null);
if(homemarker != null) {
homeicon = markerapi.getMarkerIcon(homemarker);
if(homeicon == null) {
severe("Invalid homeicon: " + homemarker);
homeicon = markerapi.getMarkerIcon("blueicon");
}
}
boost = cfg.getBoolean(path+".boost", false);
}
}
public static void info(String msg) { public static void info(String msg) {
log.log(Level.INFO, msg); log.log(Level.INFO, msg);
} }
public static void severe(String msg) { public static void severe(String msg) {
log.log(Level.SEVERE, msg); log.log(Level.SEVERE, msg);
} }
private class FactionsUpdate implements Runnable { void requestUpdatePlayerSet(String factid) {
public boolean runonce; if (playersets) {
public void run() { getServer().getScheduler().scheduleSyncDelayedTask(this, new PlayerSetUpdate(this, factid));
if(!stop) {
updateFactions();
if(!runonce) {
getServer().getScheduler().scheduleSyncDelayedTask(DynmapFactionsPlugin.this, this, updperiod);
}
else if(pending == this) {
pending = null;
}
}
} }
} }
private class PlayerSetUpdate implements Runnable { FactionsUpdate pending = null;
public String faction;
public PlayerSetUpdate(String fid) {
faction = fid;
}
public void run() {
if(!stop)
updatePlayerSet(faction);
}
}
private void requestUpdatePlayerSet(String factid) { void updatePlayerSet(String factid) {
if(playersets)
getServer().getScheduler().scheduleSyncDelayedTask(this, new PlayerSetUpdate(factid));
}
private FactionsUpdate pending = null;
private void requestUpdateFactions() {
if(pending == null) {
FactionsUpdate upd = new FactionsUpdate();
upd.runonce = true;
pending = upd;
getServer().getScheduler().scheduleSyncDelayedTask(this, upd, 20);
}
}
private void updatePlayerSet(String factid) {
/* If Wilderness or other unassociated factions (guid-style ID), skip */ /* If Wilderness or other unassociated factions (guid-style ID), skip */
if(factid.indexOf('-') >= 0) { if (factid.indexOf('-') >= 0) {
return; return;
} }
Set<String> plids = new HashSet<String>(); Set<String> plids = new HashSet<>();
FactionColl fc = FactionColl.get(); FactionColl fc = FactionColl.get();
Faction f = fc.getByName(factid); /* Get faction */ Faction f = fc.getByName(factid); /* Get faction */
if(f != null) { if (f != null) {
List<MPlayer> ps = f.getMPlayers(); List<MPlayer> ps = f.getMPlayers();
for(MPlayer fp : ps) { for (MPlayer fp : ps) {
plids.add(fp.getId()); plids.add(fp.getId());
} }
factid = f.getId(); factid = f.getId();
} }
String setid = "factions." + factid; String setid = "factions." + factid;
PlayerSet set = markerapi.getPlayerSet(setid); /* See if set exists */ PlayerSet set = markerapi.getPlayerSet(setid); /* See if set exists */
if((set == null) && (f != null)) { if ((set == null) && (f != null)) {
set = markerapi.createPlayerSet(setid, true, plids, false); set = markerapi.createPlayerSet(setid, true, plids, false);
info("Added player visibility set '" + setid + "' for faction " + factid); info("Added player visibility set '" + setid + "' for faction " + factid);
} }
else if(f != null) {
if (f != null) {
set.setPlayers(plids); set.setPlayers(plids);
} } else if (set != null) {
else {
set.deleteSet(); set.deleteSet();
} }
} }
private Map<String, AreaMarker> resareas = new HashMap<String, AreaMarker>(); private Map<String, AreaMarker> resareas = new HashMap<>();
private Map<String, Marker> resmark = new HashMap<String, Marker>(); private Map<String, Marker> resmark = new HashMap<>();
private String formatInfoWindow(Faction fact) { private String formatInfoWindow(Faction fact) {
String v = "<div class=\"regioninfo\">"+infowindow+"</div>"; String v = "<div class=\"regioninfo\">" + infowindow + "</div>";
v = v.replace("%regionname%", ChatColor.stripColor(fact.getName())); v = v.replace("%regionname%", ChatColor.stripColor(fact.getName()));
v = v.replace("%description%", ChatColor.stripColor(fact.getDescription())); v = v.replace("%description%", ChatColor.stripColor(fact.getDescription()));
MPlayer adm = fact.getLeader(); MPlayer adm = fact.getLeader();
v = v.replace("%playerowners%", (adm!=null)?adm.getName():""); v = v.replace("%playerowners%", (adm != null) ? adm.getName() : "");
String res = ""; StringBuilder res = new StringBuilder();
for(MPlayer r : fact.getMPlayers()) { for (MPlayer r : fact.getMPlayers()) {
if(res.length()>0) res += ", "; if (!res.isEmpty()) {
res += r.getName(); res.append(", ");
}
res.append(r.getName());
} }
v = v.replace("%playermembers%", res); v = v.replace("%playermembers%", res.toString());
v = v.replace("%nation%", ChatColor.stripColor(fact.getName())); v = v.replace("%nation%", ChatColor.stripColor(fact.getName()));
/* Build flags */ /* Build flags */
String flgs = ""; StringBuilder flgs = new StringBuilder();
for(MFlag ff : MFlagColl.get().getAll()) { for (MFlag ff : MFlagColl.get().getAll()) {
flgs += "<br/>" + ff.getName() + ": " + fact.getFlag(ff); flgs.append("<br/>").append(ff.getName()).append(": ").append(fact.getFlag(ff));
v = v.replace("%flag." + ff.getName() + "%", fact.getFlag(ff)?"true":"false"); v = v.replace("%flag." + ff.getName() + "%", fact.getFlag(ff) ? "true" : "false");
} }
v = v.replace("%flags%", flgs); v = v.replace("%flags%", flgs.toString());
return v; return v;
} }
private boolean isVisible(String id, String worldname) { private boolean isVisible(String id, String worldname) {
if((visible != null) && (visible.size() > 0)) { if ((visible != null) && (!visible.isEmpty())) {
if((visible.contains(id) == false) && (visible.contains("world:" + worldname) == false)) { if ((!visible.contains(id)) && (!visible.contains("world:" + worldname))) {
return false; return false;
} }
} }
if((hidden != null) && (hidden.size() > 0)) { if ((hidden != null) && (!hidden.isEmpty())) {
if(hidden.contains(id) || hidden.contains("world:" + worldname)) return !hidden.contains(id) && !hidden.contains("world:" + worldname);
return false;
} }
return true; return true;
} }
private void addStyle(String resid, AreaMarker m) { private void addStyle(String resid, AreaMarker m) {
AreaStyle as = cusstyle.get(resid); AreaStyle as = cusstyle.get(resid);
if(as == null) { if (as == null) {
as = defstyle; as = defstyle;
} }
int sc = 0xFF0000; int sc = 0xFF0000;
@ -248,7 +163,7 @@ public class DynmapFactionsPlugin extends JavaPlugin {
try { try {
sc = Integer.parseInt(as.strokecolor.substring(1), 16); sc = Integer.parseInt(as.strokecolor.substring(1), 16);
fc = Integer.parseInt(as.fillcolor.substring(1), 16); fc = Integer.parseInt(as.fillcolor.substring(1), 16);
} catch (NumberFormatException nfx) { } catch (NumberFormatException ignored) {
} }
m.setLineStyle(as.strokeweight, as.strokeopacity, sc); m.setLineStyle(as.strokeweight, as.strokeopacity, sc);
m.setFillStyle(as.fillopacity, fc); m.setFillStyle(as.fillopacity, fc);
@ -257,170 +172,161 @@ public class DynmapFactionsPlugin extends JavaPlugin {
private MarkerIcon getMarkerIcon(String factname, Faction fact) { private MarkerIcon getMarkerIcon(String factname, Faction fact) {
AreaStyle as = cusstyle.get(factname); AreaStyle as = cusstyle.get(factname);
if(as == null) { if (as == null) {
as = defstyle; as = defstyle;
} }
return as.homeicon; return as.homeicon;
} }
enum direction { XPLUS, ZPLUS, XMINUS, ZMINUS };
/** /**
* Find all contiguous blocks, set in target and clear in source * Find all contiguous blocks, set in target and clear in source
*/ */
private int floodFillTarget(TileFlags src, TileFlags dest, int x, int y) { private int floodFillTarget(TileFlags src, TileFlags dest, int x, int y) {
int cnt = 0; int cnt = 0;
ArrayDeque<int[]> stack = new ArrayDeque<int[]>(); ArrayDeque<int[]> stack = new ArrayDeque<>();
stack.push(new int[] { x, y }); stack.push(new int[]{x, y});
while(stack.isEmpty() == false) { while (!stack.isEmpty()) {
int[] nxt = stack.pop(); int[] nxt = stack.pop();
x = nxt[0]; x = nxt[0];
y = nxt[1]; y = nxt[1];
if(src.getFlag(x, y)) { /* Set in src */ if (src.getFlag(x, y)) { /* Set in src */
src.setFlag(x, y, false); /* Clear source */ src.setFlag(x, y, false); /* Clear source */
dest.setFlag(x, y, true); /* Set in destination */ dest.setFlag(x, y, true); /* Set in destination */
cnt++; cnt++;
if(src.getFlag(x+1, y)) if (src.getFlag(x + 1, y)) {
stack.push(new int[] { x+1, y }); stack.push(new int[]{x + 1, y});
if(src.getFlag(x-1, y)) }
stack.push(new int[] { x-1, y }); if (src.getFlag(x - 1, y)) {
if(src.getFlag(x, y+1)) stack.push(new int[]{x - 1, y});
stack.push(new int[] { x, y+1 }); }
if(src.getFlag(x, y-1)) if (src.getFlag(x, y + 1)) {
stack.push(new int[] { x, y-1 }); stack.push(new int[]{x, y + 1});
}
if (src.getFlag(x, y - 1)) {
stack.push(new int[]{x, y - 1});
}
} }
} }
return cnt; return cnt;
} }
private static class FactionBlock {
int x, z;
}
private static class FactionBlocks {
Map<String, LinkedList<FactionBlock>> blocks = new HashMap<String, LinkedList<FactionBlock>>();
}
/* Handle specific faction on specific world */ /* Handle specific faction on specific world */
private void handleFactionOnWorld(String factname, Faction fact, String world, LinkedList<FactionBlock> blocks, Map<String, AreaMarker> newmap, Map<String, Marker> newmark) { private void handleFactionOnWorld(String factname, Faction fact, String world, LinkedList<FactionBlock> blocks, Map<String, AreaMarker> newmap, Map<String, Marker> newmark) {
double[] x = null; double[] x;
double[] z = null; double[] z;
int poly_index = 0; /* Index of polygon for given faction */ int poly_index = 0; /* Index of polygon for given faction */
/* Build popup */ /* Build popup */
String desc = formatInfoWindow(fact); String desc = formatInfoWindow(fact);
/* Handle areas */ /* Handle areas */
if(isVisible(factname, world)) { if (isVisible(factname, world)) {
if(blocks.isEmpty()) if (blocks.isEmpty()) {
return; return;
LinkedList<FactionBlock> nodevals = new LinkedList<FactionBlock>(); }
LinkedList<FactionBlock> nodevals = new LinkedList<>();
TileFlags curblks = new TileFlags(); TileFlags curblks = new TileFlags();
/* Loop through blocks: set flags on blockmaps */ /* Loop through blocks: set flags on blockmaps */
for(FactionBlock b : blocks) { for (FactionBlock b : blocks) {
curblks.setFlag(b.x, b.z, true); /* Set flag for block */ curblks.setFlag(b.x(), b.z(), true); /* Set flag for block */
nodevals.addLast(b); nodevals.addLast(b);
} }
/* Loop through until we don't find more areas */ /* Loop through until we don't find more areas */
while(nodevals != null) { while (nodevals != null) {
LinkedList<FactionBlock> ournodes = null; LinkedList<FactionBlock> ournodes = null;
LinkedList<FactionBlock> newlist = null; LinkedList<FactionBlock> newlist = null;
TileFlags ourblks = null; TileFlags ourblks = null;
int minx = Integer.MAX_VALUE; int minx = Integer.MAX_VALUE;
int minz = Integer.MAX_VALUE; int minz = Integer.MAX_VALUE;
for(FactionBlock node : nodevals) { for (FactionBlock node : nodevals) {
int nodex = node.x; int nodex = node.x();
int nodez = node.z; int nodez = node.z();
/* If we need to start shape, and this block is not part of one yet */ /* If we need to start shape, and this block is not part of one yet */
if((ourblks == null) && curblks.getFlag(nodex, nodez)) { if ((ourblks == null) && curblks.getFlag(nodex, nodez)) {
ourblks = new TileFlags(); /* Create map for shape */ ourblks = new TileFlags(); /* Create map for shape */
ournodes = new LinkedList<FactionBlock>(); ournodes = new LinkedList<>();
floodFillTarget(curblks, ourblks, nodex, nodez); /* Copy shape */ floodFillTarget(curblks, ourblks, nodex, nodez); /* Copy shape */
ournodes.add(node); /* Add it to our node list */ ournodes.add(node); /* Add it to our node list */
minx = nodex; minz = nodez; minx = nodex;
minz = nodez;
} }
/* If shape found, and we're in it, add to our node list */ /* If shape found, and we're in it, add to our node list */
else if((ourblks != null) && ourblks.getFlag(nodex, nodez)) { else if ((ourblks != null) && ourblks.getFlag(nodex, nodez)) {
ournodes.add(node); ournodes.add(node);
if(nodex < minx) { if (nodex < minx) {
minx = nodex; minz = nodez; minx = nodex;
} minz = nodez;
else if((nodex == minx) && (nodez < minz)) { } else if ((nodex == minx) && (nodez < minz)) {
minz = nodez; minz = nodez;
} }
} } else { /* Else, keep it in the list for the next polygon */
else { /* Else, keep it in the list for the next polygon */ if (newlist == null) {
if(newlist == null) newlist = new LinkedList<FactionBlock>(); newlist = new LinkedList<>();
}
newlist.add(node); newlist.add(node);
} }
} }
nodevals = newlist; /* Replace list (null if no more to process) */ nodevals = newlist; /* Replace list (null if no more to process) */
if(ourblks != null) { if (ourblks != null) {
/* Trace outline of blocks - start from minx, minz going to x+ */ /* Trace outline of blocks - start from minx, minz going to x+ */
int init_x = minx;
int init_z = minz;
int cur_x = minx; int cur_x = minx;
int cur_z = minz; int cur_z = minz;
direction dir = direction.XPLUS; Direction dir = Direction.XPLUS;
ArrayList<int[]> linelist = new ArrayList<int[]>(); ArrayList<int[]> linelist = new ArrayList<>();
linelist.add(new int[] { init_x, init_z } ); // Add start point linelist.add(new int[]{minx, minz}); // Add start point
while((cur_x != init_x) || (cur_z != init_z) || (dir != direction.ZMINUS)) { while ((cur_x != minx) || (cur_z != minz) || (dir != Direction.ZMINUS)) {
switch(dir) { switch (dir) {
case XPLUS: /* Segment in X+ direction */ case XPLUS: /* Segment in X+ direction */
if(!ourblks.getFlag(cur_x+1, cur_z)) { /* Right turn? */ if (!ourblks.getFlag(cur_x + 1, cur_z)) { /* Right turn? */
linelist.add(new int[] { cur_x+1, cur_z }); /* Finish line */ linelist.add(new int[]{cur_x + 1, cur_z}); /* Finish line */
dir = direction.ZPLUS; /* Change direction */ dir = Direction.ZPLUS; /* Change direction */
} } else if (!ourblks.getFlag(cur_x + 1, cur_z - 1)) { /* Straight? */
else if(!ourblks.getFlag(cur_x+1, cur_z-1)) { /* Straight? */
cur_x++; cur_x++;
} } else { /* Left turn */
else { /* Left turn */ linelist.add(new int[]{cur_x + 1, cur_z}); /* Finish line */
linelist.add(new int[] { cur_x+1, cur_z }); /* Finish line */ dir = Direction.ZMINUS;
dir = direction.ZMINUS; cur_x++;
cur_x++; cur_z--; cur_z--;
} }
break; break;
case ZPLUS: /* Segment in Z+ direction */ case ZPLUS: /* Segment in Z+ direction */
if(!ourblks.getFlag(cur_x, cur_z+1)) { /* Right turn? */ if (!ourblks.getFlag(cur_x, cur_z + 1)) { /* Right turn? */
linelist.add(new int[] { cur_x+1, cur_z+1 }); /* Finish line */ linelist.add(new int[]{cur_x + 1, cur_z + 1}); /* Finish line */
dir = direction.XMINUS; /* Change direction */ dir = Direction.XMINUS; /* Change direction */
} } else if (!ourblks.getFlag(cur_x + 1, cur_z + 1)) { /* Straight? */
else if(!ourblks.getFlag(cur_x+1, cur_z+1)) { /* Straight? */ cur_z++;
} else { /* Left turn */
linelist.add(new int[]{cur_x + 1, cur_z + 1}); /* Finish line */
dir = Direction.XPLUS;
cur_x++;
cur_z++; cur_z++;
}
else { /* Left turn */
linelist.add(new int[] { cur_x+1, cur_z+1 }); /* Finish line */
dir = direction.XPLUS;
cur_x++; cur_z++;
} }
break; break;
case XMINUS: /* Segment in X- direction */ case XMINUS: /* Segment in X- direction */
if(!ourblks.getFlag(cur_x-1, cur_z)) { /* Right turn? */ if (!ourblks.getFlag(cur_x - 1, cur_z)) { /* Right turn? */
linelist.add(new int[] { cur_x, cur_z+1 }); /* Finish line */ linelist.add(new int[]{cur_x, cur_z + 1}); /* Finish line */
dir = direction.ZMINUS; /* Change direction */ dir = Direction.ZMINUS; /* Change direction */
} } else if (!ourblks.getFlag(cur_x - 1, cur_z + 1)) { /* Straight? */
else if(!ourblks.getFlag(cur_x-1, cur_z+1)) { /* Straight? */
cur_x--; cur_x--;
} } else { /* Left turn */
else { /* Left turn */ linelist.add(new int[]{cur_x, cur_z + 1}); /* Finish line */
linelist.add(new int[] { cur_x, cur_z+1 }); /* Finish line */ dir = Direction.ZPLUS;
dir = direction.ZPLUS; cur_x--;
cur_x--; cur_z++; cur_z++;
} }
break; break;
case ZMINUS: /* Segment in Z- direction */ case ZMINUS: /* Segment in Z- direction */
if(!ourblks.getFlag(cur_x, cur_z-1)) { /* Right turn? */ if (!ourblks.getFlag(cur_x, cur_z - 1)) { /* Right turn? */
linelist.add(new int[] { cur_x, cur_z }); /* Finish line */ linelist.add(new int[]{cur_x, cur_z}); /* Finish line */
dir = direction.XPLUS; /* Change direction */ dir = Direction.XPLUS; /* Change direction */
} } else if (!ourblks.getFlag(cur_x - 1, cur_z - 1)) { /* Straight? */
else if(!ourblks.getFlag(cur_x-1, cur_z-1)) { /* Straight? */ cur_z--;
} else { /* Left turn */
linelist.add(new int[]{cur_x, cur_z}); /* Finish line */
dir = Direction.XMINUS;
cur_x--;
cur_z--; cur_z--;
}
else { /* Left turn */
linelist.add(new int[] { cur_x, cur_z }); /* Finish line */
dir = direction.XMINUS;
cur_x--; cur_z--;
} }
break; break;
} }
@ -430,21 +336,20 @@ public class DynmapFactionsPlugin extends JavaPlugin {
int sz = linelist.size(); int sz = linelist.size();
x = new double[sz]; x = new double[sz];
z = new double[sz]; z = new double[sz];
for(int i = 0; i < sz; i++) { for (int i = 0; i < sz; i++) {
int[] line = linelist.get(i); int[] line = linelist.get(i);
x[i] = (double)line[0] * (double)blocksize; x[i] = (double) line[0] * (double) blocksize;
z[i] = (double)line[1] * (double)blocksize; z[i] = (double) line[1] * (double) blocksize;
} }
/* Find existing one */ /* Find existing one */
AreaMarker m = resareas.remove(polyid); /* Existing area? */ AreaMarker m = resareas.remove(polyid); /* Existing area? */
if(m == null) { if (m == null) {
m = set.createAreaMarker(polyid, factname, false, world, x, z, false); m = set.createAreaMarker(polyid, factname, false, world, x, z, false);
if(m == null) { if (m == null) {
info("error adding area marker " + polyid); info("error adding area marker " + polyid);
return; return;
} }
} } else {
else {
m.setCornerLocations(x, z); /* Replace corner locations */ m.setCornerLocations(x, z); /* Replace corner locations */
m.setLabel(factname); /* Update label */ m.setLabel(factname); /* Update label */
} }
@ -462,83 +367,88 @@ public class DynmapFactionsPlugin extends JavaPlugin {
} }
/* Update Factions information */ /* Update Factions information */
private void updateFactions() { void updateFactions() {
Map<String,AreaMarker> newmap = new HashMap<String,AreaMarker>(); /* Build new map */ Map<String, AreaMarker> newmap = new HashMap<>(); /* Build new map */
Map<String,Marker> newmark = new HashMap<String,Marker>(); /* Build new map */ Map<String, Marker> newmark = new HashMap<>(); /* Build new map */
/* Parse into faction centric mapping, split by world */ /* Parse into faction centric mapping, split by world */
Map<String, FactionBlocks> blocks_by_faction = new HashMap<String, FactionBlocks>(); Map<String, FactionBlocks> blocks_by_faction = new HashMap<>();
FactionColl fc = FactionColl.get(); FactionColl fc = FactionColl.get();
Collection<Faction> facts = fc.getAll(); Collection<Faction> facts = fc.getAll();
for (Faction fact : facts) { for (Faction fact : facts) {
Set<PS> chunks = BoardColl.get().getChunks(fact); Set<PS> chunks = BoardColl.get().getChunks(fact);
String fid = fc.getUniverse() + "_" + fact.getId(); String fid = fc.getUniverse() + "_" + fact.getId();
FactionBlocks factblocks = blocks_by_faction.get(fid); /* Look up faction */ FactionBlocks factblocks = blocks_by_faction.get(fid); /* Look up faction */
if(factblocks == null) { /* Create faction block if first time */ if (factblocks == null) { /* Create faction block if first time */
factblocks = new FactionBlocks(); factblocks = new FactionBlocks();
blocks_by_faction.put(fid, factblocks); blocks_by_faction.put(fid, factblocks);
} }
for (PS cc : chunks) { for (PS cc : chunks) {
String world = cc.getWorld(); String world = cc.getWorld();
/* Get block set for given world */ /* Get block set for given world */
LinkedList<FactionBlock> blocks = factblocks.blocks.get(world); LinkedList<FactionBlock> blocks = factblocks.blocks.computeIfAbsent(world, k -> new LinkedList<>());
if(blocks == null) { FactionBlock fb = new FactionBlock(cc.getChunkX(), cc.getChunkZ());
blocks = new LinkedList<FactionBlock>(); blocks.add(fb); /* Add to list */
factblocks.blocks.put(world, blocks); }
} }
FactionBlock fb = new FactionBlock(); /* Loop through factions */
fb.x = cc.getChunkX(); for (Faction fact : facts) {
fb.z = cc.getChunkZ(); String factname = ChatColor.stripColor(fact.getName());
blocks.add(fb); /* Add to list */ String fid = fc.getUniverse() + "_" + fact.getId();
FactionBlocks factblocks = blocks_by_faction.get(fid); /* Look up faction */
if (factblocks == null) {
continue;
}
/* Loop through each world that faction has blocks on */
for (Map.Entry<String, LinkedList<FactionBlock>> worldblocks : factblocks.blocks.entrySet()) {
handleFactionOnWorld(factname, fact, worldblocks.getKey(), worldblocks.getValue(), newmap, newmark);
}
factblocks.blocks.clear();
/* Now, add marker for home location */
EntityInternalMap<Warp> warps = fact.getWarps();
Warp home = null;
for (String warp : warps.keySet()) {
if (warp.equalsIgnoreCase("home")) {
home = warps.get(warp);
} }
} }
/* Loop through factions */ if (home == null) {
for(Faction fact : facts) { continue;
String factname = ChatColor.stripColor(fact.getName()); }
String fid = fc.getUniverse() + "_" + fact.getId(); PS homeloc = home.getLocation();
FactionBlocks factblocks = blocks_by_faction.get(fid); /* Look up faction */ if (homeloc != null) {
if (factblocks == null) continue; String markid = fc.getUniverse() + "_" + factname + "__home";
MarkerIcon ico = getMarkerIcon(factname, fact);
/* Loop through each world that faction has blocks on */ if (ico != null) {
for(Map.Entry<String, LinkedList<FactionBlock>> worldblocks : factblocks.blocks.entrySet()) { Marker homeMarker = resmark.remove(markid);
handleFactionOnWorld(factname, fact, worldblocks.getKey(), worldblocks.getValue(), newmap, newmark); String lbl = factname + " [home]";
} if (homeMarker == null) {
factblocks.blocks.clear(); homeMarker = set.createMarker(markid, lbl, homeloc.getWorld(),
homeloc.getLocationX(), homeloc.getLocationY(), homeloc.getLocationZ(), ico, false);
/* Now, add marker for home location */ } else {
PS homeloc = fact.getHome(); homeMarker.setLocation(homeloc.getWorld(), homeloc.getLocationX(), homeloc.getLocationY(), homeloc.getLocationZ());
if(homeloc != null) { homeMarker.setLabel(lbl); /* Update label */
String markid = fc.getUniverse() + "_" + factname + "__home"; homeMarker.setMarkerIcon(ico);
MarkerIcon ico = getMarkerIcon(factname, fact); }
if(ico != null) { if (homeMarker != null) {
Marker home = resmark.remove(markid); homeMarker.setDescription(formatInfoWindow(fact)); /* Set popup */
String lbl = factname + " [home]"; newmark.put(markid, homeMarker);
if(home == null) {
home = set.createMarker(markid, lbl, homeloc.getWorld(),
homeloc.getLocationX(), homeloc.getLocationY(), homeloc.getLocationZ(), ico, false);
}
else {
home.setLocation(homeloc.getWorld(), homeloc.getLocationX(), homeloc.getLocationY(), homeloc.getLocationZ());
home.setLabel(lbl); /* Update label */
home.setMarkerIcon(ico);
}
if (home != null) {
home.setDescription(formatInfoWindow(fact)); /* Set popup */
newmark.put(markid, home);
}
} }
} }
}
} }
blocks_by_faction.clear(); blocks_by_faction.clear();
/* Now, review old map - anything left is gone */ /* Now, review old map - anything left is gone */
for(AreaMarker oldm : resareas.values()) { for (AreaMarker oldm : resareas.values()) {
oldm.deleteMarker(); oldm.deleteMarker();
} }
for(Marker oldm : resmark.values()) { for (Marker oldm : resmark.values()) {
oldm.deleteMarker(); oldm.deleteMarker();
} }
/* And replace with new map */ /* And replace with new map */
@ -548,9 +458,9 @@ public class DynmapFactionsPlugin extends JavaPlugin {
} }
private void updatePlayerSets() { private void updatePlayerSets() {
if(playersets) { if (playersets) {
FactionColl fc = FactionColl.get(); FactionColl fc = FactionColl.get();
for(Faction f : fc.getAll()) { for (Faction f : fc.getAll()) {
if ((f == fc.getNone()) || (f == fc.getWarzone()) || (f == fc.getSafezone())) { if ((f == fc.getNone()) || (f == fc.getWarzone()) || (f == fc.getSafezone())) {
continue; continue;
} }
@ -559,97 +469,42 @@ public class DynmapFactionsPlugin extends JavaPlugin {
} }
} }
private class OurServerListener implements Listener {
@EventHandler
public void onPluginEnable(PluginEnableEvent event) {
Plugin p = event.getPlugin();
String name = p.getDescription().getName();
if(name.equals("dynmap") || name.equals("Factions")) {
if(dynmap.isEnabled() && factions.isEnabled())
activate();
}
}
@EventHandler(priority=EventPriority.MONITOR)
public void onFPlayerJoin(EventFactionsMembershipChange event) {
if(event.isCancelled())
return;
if(playersets) {
Faction f = event.getNewFaction();
requestUpdatePlayerSet(f.getId());
}
}
@EventHandler(priority=EventPriority.MONITOR)
public void onFactionCreate(EventFactionsCreate event) {
if(event.isCancelled())
return;
if(playersets)
requestUpdatePlayerSet(event.getFactionId());
requestUpdateFactions();
}
@EventHandler(priority=EventPriority.MONITOR)
public void onFactionDisband(EventFactionsDisband event) {
if(event.isCancelled())
return;
if(playersets) {
Faction f = event.getFaction();
requestUpdatePlayerSet(f.getId());
}
requestUpdateFactions();
}
@EventHandler(priority=EventPriority.MONITOR)
public void onFactionRename(EventFactionsNameChange event) {
if(event.isCancelled())
return;
requestUpdateFactions();
}
@EventHandler(priority=EventPriority.MONITOR)
public void onFactionRename(EventFactionsHomeChange event) {
if(event.isCancelled())
return;
requestUpdateFactions();
}
@EventHandler(priority=EventPriority.MONITOR)
public void onFactionRename(EventFactionsChunksChange event) {
if(event.isCancelled())
return;
requestUpdateFactions();
}
}
public void onEnable() { public void onEnable() {
instance = this;
info("initializing"); info("initializing");
PluginManager pm = getServer().getPluginManager(); PluginManager pm = getServer().getPluginManager();
/* Get dynmap */ /* Get dynmap */
dynmap = pm.getPlugin("dynmap"); dynmap = pm.getPlugin("dynmap");
if(dynmap == null) { if (dynmap == null) {
severe("Cannot find dynmap!"); severe("Cannot find dynmap!");
return; return;
} }
api = (DynmapAPI)dynmap; /* Get API */ api = (DynmapAPI) dynmap; /* Get API */
/* Get Factions */ /* Get Factions */
Plugin p = pm.getPlugin("Factions"); Plugin p = pm.getPlugin("Factions");
if(p == null) { if (p == null) {
severe("Cannot find Factions!"); severe("Cannot find Factions!");
return; return;
} }
factions = p; factions = p;
/* If both enabled, activate */ /* If both enabled, activate */
if(dynmap.isEnabled() && factions.isEnabled()) if (dynmap.isEnabled() && factions.isEnabled()) {
activate(); activate();
}
try { try {
MetricsLite ml = new MetricsLite(this); MetricsLite ml = new MetricsLite(this);
ml.start(); ml.start();
} catch (IOException iox) { } catch (IOException ignored) {
} }
} }
private boolean reload = false; private boolean reload = false;
private void activate() { void activate() {
markerapi = api.getMarkerAPI(); markerapi = api.getMarkerAPI();
if(markerapi == null) { if (markerapi == null) {
severe("Error loading dynmap marker API!"); severe("Error loading dynmap marker API!");
return; return;
} }
@ -659,14 +514,13 @@ public class DynmapFactionsPlugin extends JavaPlugin {
blocksize = 16; /* Fixed at 16 */ blocksize = 16; /* Fixed at 16 */
/* Load configuration */ /* Load configuration */
if(reload) { if (reload) {
this.reloadConfig(); this.reloadConfig();
if(set != null) { if (set != null) {
set.deleteMarkerSet(); set.deleteMarkerSet();
set = null; set = null;
} }
} } else {
else {
reload = true; reload = true;
} }
FileConfiguration cfg = getConfig(); FileConfiguration cfg = getConfig();
@ -675,11 +529,12 @@ public class DynmapFactionsPlugin extends JavaPlugin {
/* Now, add marker set for mobs (make it transient) */ /* Now, add marker set for mobs (make it transient) */
set = markerapi.getMarkerSet("factions.markerset"); set = markerapi.getMarkerSet("factions.markerset");
if(set == null) if (set == null) {
set = markerapi.createMarkerSet("factions.markerset", cfg.getString("layer.name", "Factions"), null, false); set = markerapi.createMarkerSet("factions.markerset", cfg.getString("layer.name", "Factions"), null, false);
else } else {
set.setMarkerSetLabel(cfg.getString("layer.name", "Factions")); set.setMarkerSetLabel(cfg.getString("layer.name", "Factions"));
if(set == null) { }
if (set == null) {
severe("Error creating marker set"); severe("Error creating marker set");
return; return;
} }
@ -688,37 +543,38 @@ public class DynmapFactionsPlugin extends JavaPlugin {
resmark.clear(); resmark.clear();
int minzoom = cfg.getInt("layer.minzoom", 0); int minzoom = cfg.getInt("layer.minzoom", 0);
if(minzoom > 0) if (minzoom > 0) {
set.setMinZoom(minzoom); set.setMinZoom(minzoom);
}
set.setLayerPriority(cfg.getInt("layer.layerprio", 10)); set.setLayerPriority(cfg.getInt("layer.layerprio", 10));
set.setHideByDefault(cfg.getBoolean("layer.hidebydefault", false)); set.setHideByDefault(cfg.getBoolean("layer.hidebydefault", false));
use3d = cfg.getBoolean("use3dregions", false); use3d = cfg.getBoolean("use3dregions", false);
infowindow = cfg.getString("infowindow", DEF_INFOWINDOW); infowindow = cfg.getString("infowindow", DEF_INFOWINDOW);
/* Get style information */ /* Get style information */
defstyle = new AreaStyle(cfg, "regionstyle"); defstyle = new AreaStyle(this, cfg, "regionstyle");
cusstyle = new HashMap<String, AreaStyle>(); cusstyle = new HashMap<>();
ConfigurationSection sect = cfg.getConfigurationSection("custstyle"); ConfigurationSection sect = cfg.getConfigurationSection("custstyle");
if(sect != null) { if (sect != null) {
Set<String> ids = sect.getKeys(false); Set<String> ids = sect.getKeys(false);
for(String id : ids) { for (String id : ids) {
cusstyle.put(id, new AreaStyle(cfg, "custstyle." + id, defstyle)); cusstyle.put(id, new AreaStyle(this, cfg, "custstyle." + id, defstyle));
} }
} }
List<String> vis = cfg.getStringList("visibleregions"); List<String> vis = cfg.getStringList("visibleregions");
if(vis != null) { if (vis != null) {
visible = new HashSet<String>(vis); visible = new HashSet<>(vis);
} }
List<String> hid = cfg.getStringList("hiddenregions"); List<String> hid = cfg.getStringList("hiddenregions");
if(hid != null) { if (hid != null) {
hidden = new HashSet<String>(hid); hidden = new HashSet<>(hid);
} }
/* Chec if player sets enabled */ /* Chec if player sets enabled */
playersets = cfg.getBoolean("visibility-by-faction", false); playersets = cfg.getBoolean("visibility-by-faction", false);
if(playersets) { if (playersets) {
try { try {
if(!api.testIfPlayerInfoProtected()) { if (!api.testIfPlayerInfoProtected()) {
playersets = false; playersets = false;
info("Dynmap does not have player-info-protected enabled - visibility-by-faction will have no effect"); info("Dynmap does not have player-info-protected enabled - visibility-by-faction will have no effect");
} }
@ -731,18 +587,20 @@ public class DynmapFactionsPlugin extends JavaPlugin {
/* Set up update job - based on periond */ /* Set up update job - based on periond */
int per = cfg.getInt("update.period", 300); int per = cfg.getInt("update.period", 300);
if(per < 15) per = 15; if (per < 15) {
updperiod = (per*20); per = 15;
}
updperiod = (per * 20L);
stop = false; stop = false;
getServer().getScheduler().scheduleSyncDelayedTask(this, new FactionsUpdate(), 40); /* First time is 2 seconds */ getServer().getScheduler().scheduleSyncDelayedTask(this, new FactionsUpdate(this), 40); /* First time is 2 seconds */
getServer().getPluginManager().registerEvents(new OurServerListener(), this); getServer().getPluginManager().registerEvents(new OurServerListener(this), this);
info("version " + this.getDescription().getVersion() + " is activated"); info("version " + this.getDescription().getVersion() + " is activated");
} }
public void onDisable() { public void onDisable() {
if(set != null) { if (set != null) {
set.deleteMarkerSet(); set.deleteMarkerSet();
set = null; set = null;
} }

View File

@ -0,0 +1,4 @@
package org.dynmap.factions;
public record FactionBlock(int x, int z) {
}

View File

@ -0,0 +1,11 @@
package org.dynmap.factions;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
public class FactionBlocks {
final Map<String, LinkedList<FactionBlock>> blocks = new HashMap<>();
}

View File

@ -0,0 +1,26 @@
package org.dynmap.factions;
public class FactionsUpdate implements Runnable {
private final DynmapFactionsPlugin dynmapFactionsPlugin;
public boolean runonce;
public FactionsUpdate(DynmapFactionsPlugin dynmapFactionsPlugin) {
this.dynmapFactionsPlugin = dynmapFactionsPlugin;
}
public void run() {
if (dynmapFactionsPlugin.stop) {
return;
}
dynmapFactionsPlugin.updateFactions();
if (!runonce) {
dynmapFactionsPlugin.getServer().getScheduler().scheduleSyncDelayedTask(dynmapFactionsPlugin,
this, dynmapFactionsPlugin.updperiod);
} else if (dynmapFactionsPlugin.pending == this) {
dynmapFactionsPlugin.pending = null;
}
}
}

View File

@ -45,6 +45,7 @@ import java.net.Proxy;
import java.net.URL; import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
@ -193,16 +194,11 @@ public class MetricsLite {
* @return true if metrics should be opted out of it * @return true if metrics should be opted out of it
*/ */
public boolean isOptOut() { public boolean isOptOut() {
synchronized(optOutLock) { synchronized (optOutLock) {
try { try {
// Reload the metrics file // Reload the metrics file
configuration.load(getConfigFile()); configuration.load(getConfigFile());
} catch (IOException ex) { } catch (IOException | InvalidConfigurationException ex) {
if (debug) {
Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage());
}
return true;
} catch (InvalidConfigurationException ex) {
if (debug) { if (debug) {
Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage());
} }
@ -378,10 +374,10 @@ public class MetricsLite {
* </code> * </code>
* *
* @param buffer the stringbuilder to append the data pair onto * @param buffer the stringbuilder to append the data pair onto
* @param key the key value * @param key the key value
* @param value the value * @param value the value
*/ */
private static void encodeDataPair(final StringBuilder buffer, final String key, final String value) throws UnsupportedEncodingException { private static void encodeDataPair(final StringBuilder buffer, final String key, final String value) {
buffer.append('&').append(encode(key)).append('=').append(encode(value)); buffer.append('&').append(encode(key)).append('=').append(encode(value));
} }
@ -391,8 +387,8 @@ public class MetricsLite {
* @param text the text to encode * @param text the text to encode
* @return the encoded text, as UTF-8 * @return the encoded text, as UTF-8
*/ */
private static String encode(final String text) throws UnsupportedEncodingException { private static String encode(final String text) {
return URLEncoder.encode(text, "UTF-8"); return URLEncoder.encode(text, StandardCharsets.UTF_8);
} }
} }

View File

@ -0,0 +1,111 @@
package org.dynmap.factions;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.event.EventFactionsChunksChange;
import com.massivecraft.factions.event.EventFactionsCreate;
import com.massivecraft.factions.event.EventFactionsDisband;
import com.massivecraft.factions.event.EventFactionsMembershipChange;
import com.massivecraft.factions.event.EventFactionsNameChange;
import com.massivecraft.factions.event.EventFactionsWarpAdd;
import com.massivecraft.factions.event.EventFactionsWarpRemove;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.server.PluginEnableEvent;
import org.bukkit.plugin.Plugin;
class OurServerListener implements Listener {
private final DynmapFactionsPlugin dynmapFactionsPlugin;
public OurServerListener(DynmapFactionsPlugin dynmapFactionsPlugin) {
this.dynmapFactionsPlugin = dynmapFactionsPlugin;
}
@EventHandler
public void onPluginEnable(PluginEnableEvent event) {
Plugin p = event.getPlugin();
String name = p.getDescription().getName();
if (name.equals("dynmap") || name.equals("Factions")) {
if (dynmapFactionsPlugin.dynmap.isEnabled() && dynmapFactionsPlugin.factions.isEnabled()) {
dynmapFactionsPlugin.activate();
}
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onFPlayerJoin(EventFactionsMembershipChange event) {
if (event.isCancelled()) {
return;
}
if (dynmapFactionsPlugin.playersets) {
Faction f = event.getNewFaction();
dynmapFactionsPlugin.requestUpdatePlayerSet(f.getId());
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onFactionCreate(EventFactionsCreate event) {
if (event.isCancelled()) {
return;
}
if (dynmapFactionsPlugin.playersets) {
dynmapFactionsPlugin.requestUpdatePlayerSet(event.getFactionId());
}
requestUpdateFactions();
}
@EventHandler(priority = EventPriority.MONITOR)
public void onFactionDisband(EventFactionsDisband event) {
if (event.isCancelled()) {
return;
}
if (dynmapFactionsPlugin.playersets) {
Faction f = event.getFaction();
dynmapFactionsPlugin.requestUpdatePlayerSet(f.getId());
}
requestUpdateFactions();
}
@EventHandler(priority = EventPriority.MONITOR)
public void onFactionRename(EventFactionsNameChange event) {
if (event.isCancelled()) {
return;
}
requestUpdateFactions();
}
@EventHandler(priority = EventPriority.MONITOR)
public void onFactionRename(EventFactionsWarpAdd event) {
if (event.isCancelled()) {
return;
}
requestUpdateFactions();
}
@EventHandler(priority = EventPriority.MONITOR)
public void onFactionRename(EventFactionsWarpRemove event) {
if (event.isCancelled()) {
return;
}
requestUpdateFactions();
}
@EventHandler(priority = EventPriority.MONITOR)
public void onFactionRename(EventFactionsChunksChange event) {
if (event.isCancelled()) {
return;
}
requestUpdateFactions();
}
private void requestUpdateFactions() {
if (DynmapFactionsPlugin.instance.pending == null) {
FactionsUpdate upd = new FactionsUpdate(DynmapFactionsPlugin.instance);
upd.runonce = true;
DynmapFactionsPlugin.instance.pending = upd;
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(DynmapFactionsPlugin.instance, upd, 20);
}
}
}

View File

@ -0,0 +1,17 @@
package org.dynmap.factions;
class PlayerSetUpdate implements Runnable {
private final DynmapFactionsPlugin dynmapFactionsPlugin;
public final String faction;
public PlayerSetUpdate(DynmapFactionsPlugin dynmapFactionsPlugin, String fid) {
this.dynmapFactionsPlugin = dynmapFactionsPlugin;
faction = fid;
}
public void run() {
if (!dynmapFactionsPlugin.stop) {
dynmapFactionsPlugin.updatePlayerSet(faction);
}
}
}

View File

@ -1,67 +1,67 @@
package org.dynmap.factions; package org.dynmap.factions;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
/** /**
* scalable flags primitive - used for keeping track of potentially huge number of tiles * scalable flags primitive - used for keeping track of potentially huge number of tiles
* * <p>
* Represents a flag for each tile, with 2D coordinates based on 0,0 origin. Flags are grouped * Represents a flag for each tile, with 2D coordinates based on 0,0 origin. Flags are grouped
* 64 x 64, represented by an array of 64 longs. Each set is stored in a hashmap, keyed by a long * 64 x 64, represented by an array of 64 longs. Each set is stored in a hashmap, keyed by a long
* computed by ((x/64)<<32)+(y/64). * computed by ((x/64)<<32)+(y/64).
*
*/ */
public class TileFlags { public class TileFlags {
private HashMap<Long, long[]> chunkmap = new HashMap<Long, long[]>(); private final Map<Long, long[]> chunkMap = new HashMap<>();
private long last_key = Long.MAX_VALUE; private long last_key = Long.MAX_VALUE;
private long[] last_row; private long[] last_row;
public TileFlags() { public TileFlags() {
} }
public boolean getFlag(int x, int y) { public boolean getFlag(int x, int y) {
long k = (((long)(x >> 6)) << 32) | (0xFFFFFFFFL & (long)(y >> 6)); long k = (((long) (x >> 6)) << 32) | (0xFFFFFFFFL & (long) (y >> 6));
long[] row; long[] row;
if(k == last_key) { if (k == last_key) {
row = last_row; row = last_row;
} } else {
else { row = chunkMap.get(k);
row = chunkmap.get(k); last_key = k;
last_key = k; last_row = row;
last_row = row; }
} if (row == null) {
if(row == null) return false;
return false; } else {
else return (row[y & 0x3F] & (1L << (x & 0x3F))) != 0;
return (row[y & 0x3F] & (1L << (x & 0x3F))) != 0; }
} }
public void setFlag(int x, int y, boolean f) { public void setFlag(int x, int y, boolean f) {
long k = (((long)(x >> 6)) << 32) | (0xFFFFFFFFL & (long)(y >> 6)); long k = (((long) (x >> 6)) << 32) | (0xFFFFFFFFL & (long) (y >> 6));
long[] row; long[] row;
if(k == last_key) { if (k == last_key) {
row = last_row; row = last_row;
} } else {
else { row = chunkMap.get(k);
row = chunkmap.get(k); last_key = k;
last_key = k; last_row = row;
last_row = row; }
} if (f) {
if(f) { if (row == null) {
if(row == null) { row = new long[64];
row = new long[64]; chunkMap.put(k, row);
chunkmap.put(k, row); last_row = row;
last_row = row; }
} row[y & 0x3F] |= (1L << (x & 0x3F));
row[y & 0x3F] |= (1L << (x & 0x3F)); } else {
} if (row != null) {
else { row[y & 0x3F] &= ~(1L << (x & 0x3F));
if(row != null) }
row[y & 0x3F] &= ~(1L << (x & 0x3F)); }
} }
}
public void clear() { public void clear() {
chunkmap.clear(); chunkMap.clear();
last_row = null; last_row = null;
last_key = Long.MAX_VALUE; last_key = Long.MAX_VALUE;
} }
} }