mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2024-11-22 21:26:45 +01:00
Fix "Cleaner reflection" breaking plugin.
Also add method to sort plots by modification date.
This commit is contained in:
parent
d30626d11f
commit
8074d041b8
@ -54,7 +54,7 @@ public final class Reflection {
|
|||||||
return _loadedNMSClasses.get(className);
|
return _loadedNMSClasses.get(className);
|
||||||
}
|
}
|
||||||
|
|
||||||
final String fullName = "net.minecraft.server." + getVersion() + className;
|
final String fullName = "net.minecraft.server." + getVersion() + "." + className;
|
||||||
Class<?> clazz;
|
Class<?> clazz;
|
||||||
try {
|
try {
|
||||||
clazz = Class.forName(fullName);
|
clazz = Class.forName(fullName);
|
||||||
@ -80,7 +80,7 @@ public final class Reflection {
|
|||||||
return _loadedOBCClasses.get(className);
|
return _loadedOBCClasses.get(className);
|
||||||
}
|
}
|
||||||
|
|
||||||
final String fullName = "org.bukkit.craftbukkit." + getVersion() + className;
|
final String fullName = "org.bukkit.craftbukkit." + getVersion() + "." + className;
|
||||||
Class<?> clazz;
|
Class<?> clazz;
|
||||||
try {
|
try {
|
||||||
clazz = Class.forName(fullName);
|
clazz = Class.forName(fullName);
|
||||||
|
@ -923,6 +923,55 @@ public class PS {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public ArrayList<Plot> sortPlotsByTimestamp(final Collection<Plot> plots) {
|
||||||
|
List<Plot> unknown = new ArrayList<>();
|
||||||
|
int hardmax = 256000;
|
||||||
|
int max = 0;
|
||||||
|
int overflowSize = 0;
|
||||||
|
for (final Plot plot : plots) {
|
||||||
|
final int hash = MathMan.getPositiveId(plot.hashCode());
|
||||||
|
if (hash > max) {
|
||||||
|
if (hash >= hardmax) {
|
||||||
|
overflowSize++;
|
||||||
|
} else {
|
||||||
|
max = hash;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hardmax = Math.min(hardmax, max);
|
||||||
|
final Plot[] cache = new Plot[hardmax + 1];
|
||||||
|
final List<Plot> overflow = new ArrayList<>(overflowSize);
|
||||||
|
final ArrayList<Plot> extra = new ArrayList<>();
|
||||||
|
for (final Plot plot : plots) {
|
||||||
|
final int hash = MathMan.getPositiveId(plot.hashCode());
|
||||||
|
if (hash < hardmax) {
|
||||||
|
if (hash >= 0) {
|
||||||
|
cache[hash] = plot;
|
||||||
|
} else {
|
||||||
|
extra.add(plot);
|
||||||
|
}
|
||||||
|
} else if ((Math.abs(plot.getId().x) > 15446) || (Math.abs(plot.getId().y) > 15446)) {
|
||||||
|
extra.add(plot);
|
||||||
|
} else {
|
||||||
|
overflow.add(plot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final Plot[] overflowArray = overflow.toArray(new Plot[overflow.size()]);
|
||||||
|
sortPlotsByHash(overflowArray);
|
||||||
|
final ArrayList<Plot> result = new ArrayList<>(cache.length + overflowArray.length);
|
||||||
|
for (final Plot plot : cache) {
|
||||||
|
if (plot != null) {
|
||||||
|
result.add(plot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Collections.addAll(result, overflowArray);
|
||||||
|
for (final Plot plot : extra) {
|
||||||
|
result.add(plot);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sort plots by creation timestamp
|
* Sort plots by creation timestamp
|
||||||
* @param input
|
* @param input
|
||||||
@ -930,167 +979,20 @@ public class PS {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public ArrayList<Plot> sortPlotsByTimestamp(final Collection<Plot> input) {
|
public List<Plot> sortPlotsByModified(final Collection<Plot> input) {
|
||||||
List<Plot> list;
|
List<Plot> list;
|
||||||
if (input instanceof ArrayList<?>) {
|
if (input instanceof List) {
|
||||||
list = (List<Plot>) input;
|
list = (List<Plot>) input;
|
||||||
} else {
|
} else {
|
||||||
list = new ArrayList<>(input);
|
list = new ArrayList<>(input);
|
||||||
}
|
}
|
||||||
long min = Integer.MAX_VALUE;
|
Collections.sort(list, new Comparator<Plot>() {
|
||||||
long max = 0;
|
@Override
|
||||||
final int size = list.size();
|
public int compare(Plot a, Plot b) {
|
||||||
final int limit = Math.min(1048576, size * 2);
|
return (int) Math.signum(ExpireManager.IMP.getTimestamp(a.owner) - ExpireManager.IMP.getTimestamp(b.owner));
|
||||||
for (final Plot plot : list) {
|
|
||||||
final long time = plot.getTimestamp();
|
|
||||||
if (time < min) {
|
|
||||||
min = time;
|
|
||||||
}
|
}
|
||||||
if (time > max) {
|
});
|
||||||
max = time;
|
return list;
|
||||||
}
|
|
||||||
}
|
|
||||||
final long range = max - min;
|
|
||||||
try {
|
|
||||||
final ArrayList<Plot> overflow = new ArrayList<>();
|
|
||||||
Plot[] plots;
|
|
||||||
if ((range > limit) && (size > 1024)) {
|
|
||||||
plots = new Plot[limit];
|
|
||||||
final int factor = (int) ((range / limit));
|
|
||||||
for (Plot plot : list) {
|
|
||||||
int index = (int) (plot.getTimestamp() - min) / factor;
|
|
||||||
if (index < 0) {
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
if (index >= plots.length) {
|
|
||||||
overflow.add(plot);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Plot current = plots[index];
|
|
||||||
while (true) {
|
|
||||||
if (current == null) {
|
|
||||||
plots[index] = plot;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (current.getTimestamp() > plot.getTimestamp()) {
|
|
||||||
plots[index] = plot;
|
|
||||||
plot = current;
|
|
||||||
}
|
|
||||||
index++;
|
|
||||||
if (index >= plots.length) {
|
|
||||||
overflow.add(plot);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
current = plots[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ((range < size) || (size < 1024)) {
|
|
||||||
final ArrayList<Plot> result = new ArrayList<>(list);
|
|
||||||
Collections.sort(result, new Comparator<Plot>() {
|
|
||||||
@Override
|
|
||||||
public int compare(final Plot a, final Plot b) {
|
|
||||||
if (a.getTimestamp() > b.getTimestamp()) {
|
|
||||||
return -1;
|
|
||||||
} else if (b.getTimestamp() > a.getTimestamp()) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
} else if (min != 0) {
|
|
||||||
plots = new Plot[(int) range];
|
|
||||||
for (Plot plot : list) {
|
|
||||||
int index = (int) (plot.getTimestamp() - min);
|
|
||||||
if (index >= plots.length) {
|
|
||||||
overflow.add(plot);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Plot current = plots[index];
|
|
||||||
while (true) {
|
|
||||||
if (current == null) {
|
|
||||||
plots[index] = plot;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (current.getTimestamp() > plot.getTimestamp()) {
|
|
||||||
plots[index] = plot;
|
|
||||||
plot = current;
|
|
||||||
}
|
|
||||||
index++;
|
|
||||||
if (index >= plots.length) {
|
|
||||||
overflow.add(plot);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
current = plots[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
plots = new Plot[(int) range];
|
|
||||||
for (Plot plot : list) {
|
|
||||||
int index = (int) (plot.getTimestamp());
|
|
||||||
if (index >= plots.length) {
|
|
||||||
overflow.add(plot);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Plot current = plots[index];
|
|
||||||
// Move everything along until a free spot is found
|
|
||||||
while (true) {
|
|
||||||
if (current == null) {
|
|
||||||
plots[index] = plot;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (current.getTimestamp() > plot.getTimestamp()) {
|
|
||||||
plots[index] = plot;
|
|
||||||
plot = current;
|
|
||||||
}
|
|
||||||
index++;
|
|
||||||
if (index >= plots.length) {
|
|
||||||
overflow.add(plot);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
current = plots[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
final ArrayList<Plot> result = new ArrayList<>(size);
|
|
||||||
if (!overflow.isEmpty()) {
|
|
||||||
Collections.sort(overflow, new Comparator<Plot>() {
|
|
||||||
@Override
|
|
||||||
public int compare(final Plot a, final Plot b) {
|
|
||||||
if (a.getTimestamp() > b.getTimestamp()) {
|
|
||||||
return -1;
|
|
||||||
} else if (b.getTimestamp() > a.getTimestamp()) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
for (final Plot plot : overflow) {
|
|
||||||
result.add(plot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (int i = plots.length - 1; i >= 0; i--) {
|
|
||||||
if (plots[i] != null) {
|
|
||||||
result.add(plots[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
} catch (final Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
final ArrayList<Plot> result = new ArrayList<>(list);
|
|
||||||
Collections.sort(result, new Comparator<Plot>() {
|
|
||||||
@Override
|
|
||||||
public int compare(final Plot a, final Plot b) {
|
|
||||||
if (a.getTimestamp() > b.getTimestamp()) {
|
|
||||||
return -1;
|
|
||||||
} else if (b.getTimestamp() > a.getTimestamp()) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1179,6 +1081,8 @@ public class PS {
|
|||||||
case DISTANCE_FROM_ORIGIN:
|
case DISTANCE_FROM_ORIGIN:
|
||||||
toReturn.addAll(sortPlotsByHash(map.get(area)));
|
toReturn.addAll(sortPlotsByHash(map.get(area)));
|
||||||
break;
|
break;
|
||||||
|
case LAST_MODIFIED:
|
||||||
|
toReturn.addAll(sortPlotsByModified(map.get(area)));
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2562,6 +2466,6 @@ public class PS {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public enum SortType {
|
public enum SortType {
|
||||||
CREATION_DATE, CREATION_DATE_TIMESTAMP, DISTANCE_FROM_ORIGIN
|
CREATION_DATE, CREATION_DATE_TIMESTAMP, LAST_MODIFIED, DISTANCE_FROM_ORIGIN
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,11 @@ public class ExpireManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getTimestamp(UUID uuid) {
|
||||||
|
Long value = dates_cache.get(uuid);
|
||||||
|
return value == null ? 0 : value;
|
||||||
|
}
|
||||||
|
|
||||||
public void confirmExpiry(final PlotPlayer pp) {
|
public void confirmExpiry(final PlotPlayer pp) {
|
||||||
if (Settings.AUTO_CLEAR_CONFIRMATION && plotsToDelete != null && !plotsToDelete.isEmpty() && pp.hasPermission("plots.admin.command.autoclear")) {
|
if (Settings.AUTO_CLEAR_CONFIRMATION && plotsToDelete != null && !plotsToDelete.isEmpty() && pp.hasPermission("plots.admin.command.autoclear")) {
|
||||||
final int num = plotsToDelete.size();
|
final int num = plotsToDelete.size();
|
||||||
|
Loading…
Reference in New Issue
Block a user