mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2024-11-22 13:16:45 +01:00
Critical bug fixes, reformatting, and cleaning
Signed-off-by: matt <4009945+MattBDev@users.noreply.github.com>
This commit is contained in:
parent
c5d9412c6c
commit
2f18ef6828
2
.github/auto-comment.yml
vendored
2
.github/auto-comment.yml
vendored
@ -2,7 +2,7 @@
|
|||||||
issueOpened: >
|
issueOpened: >
|
||||||
Thank your for raising a issue. We will try and get back to you as soon as possible.
|
Thank your for raising a issue. We will try and get back to you as soon as possible.
|
||||||
|
|
||||||
Please make sure that you followed the issue template, and provied all neccessary information.
|
Please make sure that you followed the issue template, and provided all neccessary information.
|
||||||
Failure to do so will prevent us from resolving the issue in a timely manner.
|
Failure to do so will prevent us from resolving the issue in a timely manner.
|
||||||
|
|
||||||
Please note that suggestions are now to be submitted to https://git.io/fN5B4 rather than this issue tracker!
|
Please note that suggestions are now to be submitted to https://git.io/fN5B4 rather than this issue tracker!
|
||||||
|
@ -125,9 +125,10 @@ public class EntitySpawnListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler public void onTeleport(EntityTeleportEvent event) {
|
@EventHandler public void onTeleport(EntityTeleportEvent event) {
|
||||||
Entity ent = event.getEntity();
|
Entity ent = event.getEntity();
|
||||||
if (ent instanceof Vehicle || ent instanceof ArmorStand)
|
if (ent instanceof Vehicle || ent instanceof ArmorStand) {
|
||||||
test(event.getEntity());
|
test(event.getEntity());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
public void vehicleMove(VehicleMoveEvent event) throws IllegalAccessException {
|
public void vehicleMove(VehicleMoveEvent event) throws IllegalAccessException {
|
||||||
|
@ -672,8 +672,9 @@ import java.util.regex.Pattern;
|
|||||||
if (passenger instanceof Player) {
|
if (passenger instanceof Player) {
|
||||||
final Player player = (Player) passenger;
|
final Player player = (Player) passenger;
|
||||||
// reset
|
// reset
|
||||||
if (moveTmp == null)
|
if (moveTmp == null) {
|
||||||
moveTmp = new PlayerMoveEvent(null, from, to);
|
moveTmp = new PlayerMoveEvent(null, from, to);
|
||||||
|
}
|
||||||
moveTmp.setFrom(from);
|
moveTmp.setFrom(from);
|
||||||
moveTmp.setTo(to);
|
moveTmp.setTo(to);
|
||||||
moveTmp.setCancelled(false);
|
moveTmp.setCancelled(false);
|
||||||
@ -859,8 +860,9 @@ import java.util.regex.Pattern;
|
|||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW) public void onChat(AsyncPlayerChatEvent event) {
|
@EventHandler(priority = EventPriority.LOW) public void onChat(AsyncPlayerChatEvent event) {
|
||||||
if (event.isCancelled())
|
if (event.isCancelled()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
PlotPlayer plotPlayer = BukkitUtil.getPlayer(event.getPlayer());
|
PlotPlayer plotPlayer = BukkitUtil.getPlayer(event.getPlayer());
|
||||||
Location location = plotPlayer.getLocation();
|
Location location = plotPlayer.getLocation();
|
||||||
@ -1077,8 +1079,9 @@ import java.util.regex.Pattern;
|
|||||||
PlotArea area = location.getPlotArea();
|
PlotArea area = location.getPlotArea();
|
||||||
if (area != null) {
|
if (area != null) {
|
||||||
Plot plot = area.getOwnedPlot(location);
|
Plot plot = area.getOwnedPlot(location);
|
||||||
if (plot != null && Flags.MOB_BREAK.isTrue(plot))
|
if (plot != null && Flags.MOB_BREAK.isTrue(plot)) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1446,8 +1449,9 @@ import java.util.regex.Pattern;
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case WATER_BUCKET:
|
case WATER_BUCKET:
|
||||||
case LAVA_BUCKET: {
|
case LAVA_BUCKET: {
|
||||||
if (event.getBlock().getType() == Material.DROPPER)
|
if (event.getBlock().getType() == Material.DROPPER) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
BlockFace targetFace =
|
BlockFace targetFace =
|
||||||
((Directional) event.getBlock().getState().getData()).getFacing();
|
((Directional) event.getBlock().getState().getData()).getFacing();
|
||||||
Location location =
|
Location location =
|
||||||
@ -1570,8 +1574,9 @@ import java.util.regex.Pattern;
|
|||||||
switch (newItem.getType()) {
|
switch (newItem.getType()) {
|
||||||
case LEGACY_BANNER:
|
case LEGACY_BANNER:
|
||||||
case PLAYER_HEAD:
|
case PLAYER_HEAD:
|
||||||
if (newMeta != null)
|
if (newMeta != null) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1587,11 +1592,13 @@ import java.util.regex.Pattern;
|
|||||||
switch (stateType) {
|
switch (stateType) {
|
||||||
case LEGACY_STANDING_BANNER:
|
case LEGACY_STANDING_BANNER:
|
||||||
case LEGACY_WALL_BANNER:
|
case LEGACY_WALL_BANNER:
|
||||||
if (itemType == Material.LEGACY_BANNER)
|
if (itemType == Material.LEGACY_BANNER) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case LEGACY_SKULL:
|
case LEGACY_SKULL:
|
||||||
if (itemType == Material.LEGACY_SKULL_ITEM)
|
if (itemType == Material.LEGACY_SKULL_ITEM) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -42,14 +42,18 @@ import static com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils
|
|||||||
public void markChunkAsClean(Chunk chunk) {
|
public void markChunkAsClean(Chunk chunk) {
|
||||||
try {
|
try {
|
||||||
Object nmsChunk = methodGetHandleChunk.invoke(chunk);
|
Object nmsChunk = methodGetHandleChunk.invoke(chunk);
|
||||||
if (done != null)
|
if (done != null) {
|
||||||
this.done.set(nmsChunk, true);
|
this.done.set(nmsChunk, true);
|
||||||
if (mustSave != null)
|
}
|
||||||
|
if (mustSave != null) {
|
||||||
this.mustSave.set(nmsChunk, false);
|
this.mustSave.set(nmsChunk, false);
|
||||||
if (lit != null)
|
}
|
||||||
|
if (lit != null) {
|
||||||
this.lit.set(nmsChunk, false);
|
this.lit.set(nmsChunk, false);
|
||||||
if (s != null)
|
}
|
||||||
|
if (s != null) {
|
||||||
this.s.set(nmsChunk, false);
|
this.s.set(nmsChunk, false);
|
||||||
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -59,10 +63,12 @@ import static com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils
|
|||||||
World world = event.getWorld();
|
World world = event.getWorld();
|
||||||
String name = world.getName();
|
String name = world.getName();
|
||||||
PlotAreaManager man = PlotSquared.get().getPlotAreaManager();
|
PlotAreaManager man = PlotSquared.get().getPlotAreaManager();
|
||||||
if (!(man instanceof SinglePlotAreaManager))
|
if (!(man instanceof SinglePlotAreaManager)) {
|
||||||
return;
|
return;
|
||||||
if (!isPlotId(name))
|
}
|
||||||
|
if (!isPlotId(name)) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
markChunkAsClean(event.getChunk());
|
markChunkAsClean(event.getChunk());
|
||||||
}
|
}
|
||||||
|
@ -126,13 +126,15 @@ public class BukkitPlayer extends PlotPlayer {
|
|||||||
String end = perm.substring(stubPlus.length());
|
String end = perm.substring(stubPlus.length());
|
||||||
if (MathMan.isInteger(end)) {
|
if (MathMan.isInteger(end)) {
|
||||||
int val = Integer.parseInt(end);
|
int val = Integer.parseInt(end);
|
||||||
if (val > range)
|
if (val > range) {
|
||||||
return val;
|
return val;
|
||||||
if (val > max)
|
}
|
||||||
|
if (val > max) {
|
||||||
max = val;
|
max = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int i = range; i > 0; i--) {
|
for (int i = range; i > 0; i--) {
|
||||||
if (hasPermission(stub + "." + i)) {
|
if (hasPermission(stub + "." + i)) {
|
||||||
|
@ -145,7 +145,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
|
|||||||
ChestedHorse horse1 = (ChestedHorse) horse;
|
ChestedHorse horse1 = (ChestedHorse) horse;
|
||||||
this.horse.chest = horse1.isCarryingChest();
|
this.horse.chest = horse1.isCarryingChest();
|
||||||
}
|
}
|
||||||
//todo these horse feeatures need fixing
|
//todo these horse features need fixing
|
||||||
//this.horse.variant = horse.getVariant();
|
//this.horse.variant = horse.getVariant();
|
||||||
//this.horse.style = horse.getStyle();
|
//this.horse.style = horse.getStyle();
|
||||||
//this.horse.color = horse.getColor();
|
//this.horse.color = horse.getColor();
|
||||||
|
@ -109,8 +109,9 @@ public class TitleManager_1_11 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static boolean equalsTypeArray(Class<?>[] a, Class<?>[] o) {
|
private static boolean equalsTypeArray(Class<?>[] a, Class<?>[] o) {
|
||||||
if (a.length != o.length)
|
if (a.length != o.length) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
return IntStream.range(0, a.length)
|
return IntStream.range(0, a.length)
|
||||||
.noneMatch(i -> !a[i].equals(o[i]) && !a[i].isAssignableFrom(o[i]));
|
.noneMatch(i -> !a[i].equals(o[i]) && !a[i].isAssignableFrom(o[i]));
|
||||||
}
|
}
|
||||||
@ -202,8 +203,9 @@ public class TitleManager_1_11 {
|
|||||||
Integer.TYPE).newInstance(actions[3], null, fadeInTime * (ticks ? 1 : 20),
|
Integer.TYPE).newInstance(actions[3], null, fadeInTime * (ticks ? 1 : 20),
|
||||||
stayTime * (ticks ? 1 : 20), fadeOutTime * (ticks ? 1 : 20));
|
stayTime * (ticks ? 1 : 20), fadeOutTime * (ticks ? 1 : 20));
|
||||||
// Send if set
|
// Send if set
|
||||||
if (fadeInTime != -1 && fadeOutTime != -1 && stayTime != -1)
|
if (fadeInTime != -1 && fadeOutTime != -1 && stayTime != -1) {
|
||||||
sendPacket.invoke(connection, packet);
|
sendPacket.invoke(connection, packet);
|
||||||
|
}
|
||||||
|
|
||||||
Object serialized;
|
Object serialized;
|
||||||
if (!subtitle.equals("")) {
|
if (!subtitle.equals("")) {
|
||||||
@ -339,8 +341,9 @@ public class TitleManager_1_11 {
|
|||||||
private Class<?>[] toPrimitiveTypeArray(Class<?>[] classes) {
|
private Class<?>[] toPrimitiveTypeArray(Class<?>[] classes) {
|
||||||
int a = classes != null ? classes.length : 0;
|
int a = classes != null ? classes.length : 0;
|
||||||
Class<?>[] types = new Class<?>[a];
|
Class<?>[] types = new Class<?>[a];
|
||||||
for (int i = 0; i < a; i++)
|
for (int i = 0; i < a; i++) {
|
||||||
types[i] = getPrimitiveType(classes[i]);
|
types[i] = getPrimitiveType(classes[i]);
|
||||||
|
}
|
||||||
return types;
|
return types;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -357,9 +360,10 @@ public class TitleManager_1_11 {
|
|||||||
Class<?>[] t = toPrimitiveTypeArray(paramTypes);
|
Class<?>[] t = toPrimitiveTypeArray(paramTypes);
|
||||||
for (Method m : clazz.getMethods()) {
|
for (Method m : clazz.getMethods()) {
|
||||||
Class<?>[] types = toPrimitiveTypeArray(m.getParameterTypes());
|
Class<?>[] types = toPrimitiveTypeArray(m.getParameterTypes());
|
||||||
if (m.getName().equals(name) && equalsTypeArray(types, t))
|
if (m.getName().equals(name) && equalsTypeArray(types, t)) {
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,24 +407,26 @@ public class TitleManager_1_11 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Method getMethod(Class<?> clazz, String name, Class<?>... args) {
|
private Method getMethod(Class<?> clazz, String name, Class<?>... args) {
|
||||||
for (Method m : clazz.getMethods())
|
for (Method m : clazz.getMethods()) {
|
||||||
if (m.getName().equals(name) && (args.length == 0 || ClassListEqual(args,
|
if (m.getName().equals(name) && (args.length == 0 || ClassListEqual(args, m.getParameterTypes()))) {
|
||||||
m.getParameterTypes()))) {
|
|
||||||
m.setAccessible(true);
|
m.setAccessible(true);
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean ClassListEqual(Class<?>[] l1, Class<?>[] l2) {
|
private boolean ClassListEqual(Class<?>[] l1, Class<?>[] l2) {
|
||||||
boolean equal = true;
|
boolean equal = true;
|
||||||
if (l1.length != l2.length)
|
if (l1.length != l2.length) {
|
||||||
return false;
|
return false;
|
||||||
for (int i = 0; i < l1.length; i++)
|
}
|
||||||
|
for (int i = 0; i < l1.length; i++) {
|
||||||
if (l1[i] != l2[i]) {
|
if (l1[i] != l2[i]) {
|
||||||
equal = false;
|
equal = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return equal;
|
return equal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,6 +476,7 @@ public class BukkitChunkManager extends ChunkManager {
|
|||||||
case SNOWBALL:
|
case SNOWBALL:
|
||||||
case ENDER_PEARL:
|
case ENDER_PEARL:
|
||||||
case ARROW:
|
case ARROW:
|
||||||
|
case TRIDENT:
|
||||||
case TIPPED_ARROW:
|
case TIPPED_ARROW:
|
||||||
case SHULKER_BULLET:
|
case SHULKER_BULLET:
|
||||||
case SPECTRAL_ARROW:
|
case SPECTRAL_ARROW:
|
||||||
@ -537,6 +538,13 @@ public class BukkitChunkManager extends ChunkManager {
|
|||||||
case SKELETON_HORSE:
|
case SKELETON_HORSE:
|
||||||
case ZOMBIE_HORSE:
|
case ZOMBIE_HORSE:
|
||||||
case MULE:
|
case MULE:
|
||||||
|
case DOLPHIN:
|
||||||
|
case TURTLE:
|
||||||
|
case COD:
|
||||||
|
case PARROT:
|
||||||
|
case SALMON:
|
||||||
|
case PUFFERFISH:
|
||||||
|
case TROPICAL_FISH:
|
||||||
// animal
|
// animal
|
||||||
count[3]++;
|
count[3]++;
|
||||||
count[1]++;
|
count[1]++;
|
||||||
|
@ -70,8 +70,9 @@ public class BukkitHybridUtils extends HybridUtils {
|
|||||||
|
|
||||||
PlotArea area = PlotSquared.get().getPlotArea(world, null);
|
PlotArea area = PlotSquared.get().getPlotArea(world, null);
|
||||||
|
|
||||||
if (!(area instanceof HybridPlotWorld))
|
if (!(area instanceof HybridPlotWorld)) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
HybridPlotWorld hpw = (HybridPlotWorld) area;
|
HybridPlotWorld hpw = (HybridPlotWorld) area;
|
||||||
final BlockBucket[][] result = hpw.getBlockBucketChunk();
|
final BlockBucket[][] result = hpw.getBlockBucketChunk();
|
||||||
|
@ -74,7 +74,7 @@ public final class BukkitLegacyMappings extends LegacyMappings {
|
|||||||
new LegacyBlock(19, 1, "sponge", "wet_sponge"), new LegacyBlock(20, "glass"),
|
new LegacyBlock(19, 1, "sponge", "wet_sponge"), new LegacyBlock(20, "glass"),
|
||||||
new LegacyBlock(21, "lapis_ore"), new LegacyBlock(22, "lapis_block"),
|
new LegacyBlock(21, "lapis_ore"), new LegacyBlock(22, "lapis_block"),
|
||||||
new LegacyBlock(23, "dispenser"), new LegacyBlock(24, "sandstone"),
|
new LegacyBlock(23, "dispenser"), new LegacyBlock(24, "sandstone"),
|
||||||
new LegacyBlock(24, 1, "sandstone", "chisled_sandstone"),
|
new LegacyBlock(24, 1, "sandstone", "chiseled_sandstone"),
|
||||||
new LegacyBlock(24, 2, "sandstone", "cut_sandstone"), new LegacyBlock(25, "note_block"),
|
new LegacyBlock(24, 2, "sandstone", "cut_sandstone"), new LegacyBlock(25, "note_block"),
|
||||||
new LegacyBlock(26, "bed_block"), new LegacyBlock(27, "powered_rail"),
|
new LegacyBlock(26, "bed_block"), new LegacyBlock(27, "powered_rail"),
|
||||||
new LegacyBlock(28, "detector_rail"),
|
new LegacyBlock(28, "detector_rail"),
|
||||||
@ -181,10 +181,10 @@ public final class BukkitLegacyMappings extends LegacyMappings {
|
|||||||
new LegacyBlock(95, 15, "stained_glass", "black_stained_glass"),
|
new LegacyBlock(95, 15, "stained_glass", "black_stained_glass"),
|
||||||
new LegacyBlock(96, "trap_door", "oak_trapdoor"),
|
new LegacyBlock(96, "trap_door", "oak_trapdoor"),
|
||||||
new LegacyBlock(97, "monster_eggs", "infested_stone"),
|
new LegacyBlock(97, "monster_eggs", "infested_stone"),
|
||||||
new LegacyBlock(97, 1, "monster_eggs", "infested_coblestone"),
|
new LegacyBlock(97, 1, "monster_eggs", "infested_cobblestone"),
|
||||||
new LegacyBlock(97, 2, "monster_eggs", "infested_stone_bricks"),
|
new LegacyBlock(97, 2, "monster_eggs", "infested_stone_bricks"),
|
||||||
new LegacyBlock(97, 3, "monster_eggs", "infested_mossy_stone_bricks"),
|
new LegacyBlock(97, 3, "monster_eggs", "infested_mossy_stone_bricks"),
|
||||||
new LegacyBlock(97, 4, "monster_eggs", "infested_crcked_stone_bricks"),
|
new LegacyBlock(97, 4, "monster_eggs", "infested_cracked_stone_bricks"),
|
||||||
new LegacyBlock(97, 5, "monster_eggs", "infested_chiseled_stone_bricks"),
|
new LegacyBlock(97, 5, "monster_eggs", "infested_chiseled_stone_bricks"),
|
||||||
new LegacyBlock(98, "smooth_brick", "stone_bricks"),
|
new LegacyBlock(98, "smooth_brick", "stone_bricks"),
|
||||||
new LegacyBlock(98, 1, "smooth_brick", "mossy_stone_bricks"),
|
new LegacyBlock(98, 1, "smooth_brick", "mossy_stone_bricks"),
|
||||||
@ -207,7 +207,7 @@ public final class BukkitLegacyMappings extends LegacyMappings {
|
|||||||
new LegacyBlock(100, 10, "huge_mushroom_2", "mushroom_stem"),
|
new LegacyBlock(100, 10, "huge_mushroom_2", "mushroom_stem"),
|
||||||
new LegacyBlock(100, 14, "huge_mushroom_2"),
|
new LegacyBlock(100, 14, "huge_mushroom_2"),
|
||||||
new LegacyBlock(100, 15, "huge_mushroom_2"),
|
new LegacyBlock(100, 15, "huge_mushroom_2"),
|
||||||
new LegacyBlock(101, "iron_fence", "ironbars"),
|
new LegacyBlock(101, "iron_fence", "iron_bars"),
|
||||||
new LegacyBlock(102, "thin_glass", "glass_pane"), new LegacyBlock(103, "melon_block"),
|
new LegacyBlock(102, "thin_glass", "glass_pane"), new LegacyBlock(103, "melon_block"),
|
||||||
new LegacyBlock(104, "pumpkin_stem"), new LegacyBlock(105, "melon_stem"),
|
new LegacyBlock(104, "pumpkin_stem"), new LegacyBlock(105, "melon_stem"),
|
||||||
new LegacyBlock(106, "vine"), new LegacyBlock(107, "fence_gate", "oak_fence_gate"),
|
new LegacyBlock(106, "vine"), new LegacyBlock(107, "fence_gate", "oak_fence_gate"),
|
||||||
@ -540,7 +540,7 @@ public final class BukkitLegacyMappings extends LegacyMappings {
|
|||||||
new LegacyBlock(383, 5, "monster_egg", "wither_skeleton_spawn_egg"),
|
new LegacyBlock(383, 5, "monster_egg", "wither_skeleton_spawn_egg"),
|
||||||
new LegacyBlock(383, 6, "monster_egg", "stray_spawn_egg"),
|
new LegacyBlock(383, 6, "monster_egg", "stray_spawn_egg"),
|
||||||
new LegacyBlock(383, 23, "monster_egg", "husk_spawn_egg"),
|
new LegacyBlock(383, 23, "monster_egg", "husk_spawn_egg"),
|
||||||
new LegacyBlock(383, 27, "monster_egg", "zombe_villager_spawn_egg"),
|
new LegacyBlock(383, 27, "monster_egg", "zombie_villager_spawn_egg"),
|
||||||
new LegacyBlock(383, 28, "monster_egg", "skeleton_horse_spawn_egg"),
|
new LegacyBlock(383, 28, "monster_egg", "skeleton_horse_spawn_egg"),
|
||||||
new LegacyBlock(383, 29, "monster_egg", "zombie_horse_spawn_egg"),
|
new LegacyBlock(383, 29, "monster_egg", "zombie_horse_spawn_egg"),
|
||||||
new LegacyBlock(383, 31, "monster_egg", "donkey_spawn_egg"),
|
new LegacyBlock(383, 31, "monster_egg", "donkey_spawn_egg"),
|
||||||
|
@ -264,35 +264,29 @@ import java.util.*;
|
|||||||
return getWorld(world).getBiome(x, z).name();
|
return getWorld(world).getBiome(x, z).name();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override @SuppressWarnings("deprecation")
|
@Override public int getHighestBlock(@NonNull final String world, final int x, final int z) {
|
||||||
public void setSign(@NonNull final String worldName, final int x, final int y, final int z,
|
final World bukkitWorld = getWorld(world);
|
||||||
@NonNull final String[] lines) {
|
// Skip top and bottom block
|
||||||
final World world = getWorld(worldName);
|
int air = 1;
|
||||||
final Block block = world.getBlockAt(x, y, z);
|
for (int y = bukkitWorld.getMaxHeight() - 1; y >= 0; y--) {
|
||||||
// block.setType(Material.AIR);
|
Block block = bukkitWorld.getBlockAt(x, y, z);
|
||||||
final Material type = block.getType();
|
if (block != null) {
|
||||||
if (type != Material.SIGN && type != Material.WALL_SIGN) {
|
Material type = block.getType();
|
||||||
BlockFace facing = BlockFace.EAST;
|
if (type.isSolid()) {
|
||||||
if (world.getBlockAt(x, y, z + 1).getType().isSolid())
|
if (air > 1) {
|
||||||
facing = BlockFace.NORTH;
|
return y;
|
||||||
else if (world.getBlockAt(x + 1, y, z).getType().isSolid())
|
|
||||||
facing = BlockFace.WEST;
|
|
||||||
else if (world.getBlockAt(x, y, z - 1).getType().isSolid())
|
|
||||||
facing = BlockFace.SOUTH;
|
|
||||||
block.setType(Material.WALL_SIGN, false);
|
|
||||||
final WallSign sign = (WallSign) block.getBlockData();
|
|
||||||
sign.setFacing(facing);
|
|
||||||
block.setBlockData(sign, false);
|
|
||||||
}
|
}
|
||||||
final BlockState blockstate = block.getState();
|
air = 0;
|
||||||
if (blockstate instanceof Sign) {
|
} else {
|
||||||
final Sign sign = (Sign) blockstate;
|
if (block.isLiquid()) {
|
||||||
for (int i = 0; i < lines.length; i++) {
|
return y;
|
||||||
sign.setLine(i, lines[i]);
|
|
||||||
}
|
}
|
||||||
sign.update(true);
|
air++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return bukkitWorld.getMaxHeight() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
@Override @Nullable public String[] getSign(@NonNull final Location location) {
|
@Override @Nullable public String[] getSign(@NonNull final Location location) {
|
||||||
Block block = getWorld(location.getWorld())
|
Block block = getWorld(location.getWorld())
|
||||||
@ -330,27 +324,35 @@ import java.util.*;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public int getHighestBlock(@NonNull final String world, final int x, final int z) {
|
@Override @SuppressWarnings("deprecation")
|
||||||
final World bukkitWorld = getWorld(world);
|
public void setSign(@NonNull final String worldName, final int x, final int y, final int z,
|
||||||
// Skip top and bottom block
|
@NonNull final String[] lines) {
|
||||||
int air = 1;
|
final World world = getWorld(worldName);
|
||||||
for (int y = bukkitWorld.getMaxHeight() - 1; y >= 0; y--) {
|
final Block block = world.getBlockAt(x, y, z);
|
||||||
Block block = bukkitWorld.getBlockAt(x, y, z);
|
// block.setType(Material.AIR);
|
||||||
if (block != null) {
|
final Material type = block.getType();
|
||||||
Material type = block.getType();
|
if (type != Material.SIGN && type != Material.WALL_SIGN) {
|
||||||
if (type.isSolid()) {
|
BlockFace facing = BlockFace.EAST;
|
||||||
if (air > 1)
|
if (world.getBlockAt(x, y, z + 1).getType().isSolid()) {
|
||||||
return y;
|
facing = BlockFace.NORTH;
|
||||||
air = 0;
|
} else if (world.getBlockAt(x + 1, y, z).getType().isSolid()) {
|
||||||
} else {
|
facing = BlockFace.WEST;
|
||||||
if (block.isLiquid()) {
|
} else if (world.getBlockAt(x, y, z - 1).getType().isSolid()) {
|
||||||
return y;
|
facing = BlockFace.SOUTH;
|
||||||
}
|
}
|
||||||
air++;
|
block.setType(Material.WALL_SIGN, false);
|
||||||
|
final WallSign sign = (WallSign) block.getBlockData();
|
||||||
|
sign.setFacing(facing);
|
||||||
|
block.setBlockData(sign, false);
|
||||||
}
|
}
|
||||||
|
final BlockState blockstate = block.getState();
|
||||||
|
if (blockstate instanceof Sign) {
|
||||||
|
final Sign sign = (Sign) blockstate;
|
||||||
|
for (int i = 0; i < lines.length; i++) {
|
||||||
|
sign.setLine(i, lines[i]);
|
||||||
}
|
}
|
||||||
|
sign.update(true);
|
||||||
}
|
}
|
||||||
return bukkitWorld.getMaxHeight() - 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public int getBiomeFromString(@NonNull final String biomeString) {
|
@Override public int getBiomeFromString(@NonNull final String biomeString) {
|
||||||
|
@ -49,7 +49,8 @@ import java.util.zip.ZipInputStream;
|
|||||||
* An implementation of the core, with a static getter for easy access.
|
* An implementation of the core, with a static getter for easy access.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"unused", "WeakerAccess"}) public class PlotSquared {
|
@SuppressWarnings({"unused", "WeakerAccess"}) public class PlotSquared {
|
||||||
private static final Set<Plot> EMPTY_SET = Collections.unmodifiableSet(Collections.emptySet());
|
private static final Set<Plot> EMPTY_SET = Collections.
|
||||||
|
unmodifiableSet(Collections.emptySet());
|
||||||
private static PlotSquared instance;
|
private static PlotSquared instance;
|
||||||
// Implementation
|
// Implementation
|
||||||
public final IPlotMain IMP;
|
public final IPlotMain IMP;
|
||||||
|
@ -15,11 +15,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@CommandDeclaration(command = "area", permission = "plots.area",
|
@CommandDeclaration(command = "area", permission = "plots.area", category = CommandCategory.ADMINISTRATION, requiredType = RequiredType.NONE, description = "Create a new PlotArea", aliases = "world", usage = "/plot area <create|info|list|tp|regen>", confirmation = true)
|
||||||
category = CommandCategory.ADMINISTRATION, requiredType = RequiredType.NONE,
|
public class Area extends SubCommand {
|
||||||
description = "Create a new PlotArea", aliases = "world",
|
|
||||||
usage = "/plot area <create|info|list|tp|regen>", confirmation = true) public class Area
|
|
||||||
extends SubCommand {
|
|
||||||
|
|
||||||
@Override public boolean onCommand(final PlotPlayer player, String[] args) {
|
@Override public boolean onCommand(final PlotPlayer player, String[] args) {
|
||||||
if (args.length == 0) {
|
if (args.length == 0) {
|
||||||
@ -104,8 +101,7 @@ import java.util.Set;
|
|||||||
final String path =
|
final String path =
|
||||||
"worlds." + area.worldname + ".areas." + area.id + '-'
|
"worlds." + area.worldname + ".areas." + area.id + '-'
|
||||||
+ object.min + '-' + object.max;
|
+ object.min + '-' + object.max;
|
||||||
Runnable run = new Runnable() {
|
Runnable run = () -> {
|
||||||
@Override public void run() {
|
|
||||||
if (offsetX != 0) {
|
if (offsetX != 0) {
|
||||||
PlotSquared.get().worlds
|
PlotSquared.get().worlds
|
||||||
.set(path + ".road.offset.x", offsetX);
|
.set(path + ".road.offset.x", offsetX);
|
||||||
@ -134,7 +130,6 @@ import java.util.Set;
|
|||||||
"An error occurred while creating the world: "
|
"An error occurred while creating the world: "
|
||||||
+ area.worldname);
|
+ area.worldname);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
};
|
};
|
||||||
if (hasConfirmation(player)) {
|
if (hasConfirmation(player)) {
|
||||||
CmdConfirm.addPending(player,
|
CmdConfirm.addPending(player,
|
||||||
@ -228,8 +223,7 @@ import java.util.Set;
|
|||||||
C.SETUP_WORLD_TAKEN.send(player, pa.worldname);
|
C.SETUP_WORLD_TAKEN.send(player, pa.worldname);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Runnable run = new Runnable() {
|
Runnable run = () -> {
|
||||||
@Override public void run() {
|
|
||||||
String path = "worlds." + pa.worldname;
|
String path = "worlds." + pa.worldname;
|
||||||
if (!PlotSquared.get().worlds.contains(path)) {
|
if (!PlotSquared.get().worlds.contains(path)) {
|
||||||
PlotSquared.get().worlds.createSection(path);
|
PlotSquared.get().worlds.createSection(path);
|
||||||
@ -254,7 +248,6 @@ import java.util.Set;
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
};
|
};
|
||||||
if (hasConfirmation(player)) {
|
if (hasConfirmation(player)) {
|
||||||
CmdConfirm.addPending(player,
|
CmdConfirm.addPending(player,
|
||||||
@ -422,11 +415,7 @@ import java.util.Set;
|
|||||||
@Override public void run(ChunkLoc value) {
|
@Override public void run(ChunkLoc value) {
|
||||||
AugmentedUtils.generate(area.worldname, value.x, value.z, null);
|
AugmentedUtils.generate(area.worldname, value.x, value.z, null);
|
||||||
}
|
}
|
||||||
}, new Runnable() {
|
}, () -> player.sendMessage("Regen complete"));
|
||||||
@Override public void run() {
|
|
||||||
player.sendMessage("Regen complete");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "goto":
|
case "goto":
|
||||||
|
@ -22,8 +22,9 @@ public class Auto extends SubCommand {
|
|||||||
|
|
||||||
private static boolean checkAllowedPlots(PlotPlayer player, PlotArea plotarea,
|
private static boolean checkAllowedPlots(PlotPlayer player, PlotArea plotarea,
|
||||||
@Nullable Integer allowed_plots, int size_x, int size_z) {
|
@Nullable Integer allowed_plots, int size_x, int size_z) {
|
||||||
if (allowed_plots == null)
|
if (allowed_plots == null) {
|
||||||
allowed_plots = player.getAllowedPlots();
|
allowed_plots = player.getAllowedPlots();
|
||||||
|
}
|
||||||
int currentPlots =
|
int currentPlots =
|
||||||
Settings.Limit.GLOBAL ? player.getPlotCount() : player.getPlotCount(plotarea.worldname);
|
Settings.Limit.GLOBAL ? player.getPlotCount() : player.getPlotCount(plotarea.worldname);
|
||||||
int diff = currentPlots - allowed_plots;
|
int diff = currentPlots - allowed_plots;
|
||||||
@ -189,8 +190,9 @@ public class Auto extends SubCommand {
|
|||||||
}
|
}
|
||||||
final int allowed_plots = player.getAllowedPlots();
|
final int allowed_plots = player.getAllowedPlots();
|
||||||
if (player.getMeta(Auto.class.getName(), false) || !checkAllowedPlots(player, plotarea,
|
if (player.getMeta(Auto.class.getName(), false) || !checkAllowedPlots(player, plotarea,
|
||||||
allowed_plots, size_x, size_z))
|
allowed_plots, size_x, size_z)) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (schematic != null && !schematic.isEmpty()) {
|
if (schematic != null && !schematic.isEmpty()) {
|
||||||
if (!plotarea.SCHEMATICS.contains(schematic.toLowerCase())) {
|
if (!plotarea.SCHEMATICS.contains(schematic.toLowerCase())) {
|
||||||
|
@ -70,7 +70,7 @@ import com.github.intellectualsites.plotsquared.plot.util.MainUtil;
|
|||||||
RunnableVal3<Command, Runnable, Runnable> confirm,
|
RunnableVal3<Command, Runnable, Runnable> confirm,
|
||||||
RunnableVal2<Command, CommandResult> whenDone) {
|
RunnableVal2<Command, CommandResult> whenDone) {
|
||||||
PlotArea area = player.getApplicablePlotArea();
|
PlotArea area = player.getApplicablePlotArea();
|
||||||
boolean chat = area == null ? false : area.PLOT_CHAT;
|
boolean chat = area != null && area.PLOT_CHAT;
|
||||||
if (toggle(player, "disabletitles") != chat) {
|
if (toggle(player, "disabletitles") != chat) {
|
||||||
MainUtil.sendMessage(player, C.TOGGLE_ENABLED, command.toString());
|
MainUtil.sendMessage(player, C.TOGGLE_ENABLED, command.toString());
|
||||||
} else {
|
} else {
|
||||||
|
@ -64,8 +64,9 @@ import java.util.*;
|
|||||||
page = Integer.parseInt(args[1]);
|
page = Integer.parseInt(args[1]);
|
||||||
case 1:
|
case 1:
|
||||||
UUID user = args[0].length() >= 2 ? UUIDHandler.getUUIDFromString(args[0]) : null;
|
UUID user = args[0].length() >= 2 ? UUIDHandler.getUUIDFromString(args[0]) : null;
|
||||||
if (user != null && !PlotSquared.get().hasPlot(user))
|
if (user != null && !PlotSquared.get().hasPlot(user)) {
|
||||||
user = null;
|
user = null;
|
||||||
|
}
|
||||||
if (page == Integer.MIN_VALUE && user == null && MathMan.isInteger(args[0])) {
|
if (page == Integer.MIN_VALUE && user == null && MathMan.isInteger(args[0])) {
|
||||||
page = Integer.parseInt(args[0]);
|
page = Integer.parseInt(args[0]);
|
||||||
unsorted = PlotSquared.get().getBasePlots(player);
|
unsorted = PlotSquared.get().getBasePlots(player);
|
||||||
|
@ -45,7 +45,7 @@ public interface AbstractDB {
|
|||||||
void createTables() throws Exception;
|
void createTables() throws Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletess a plot.
|
* Deletes a plot.
|
||||||
*
|
*
|
||||||
* @param plot the plot to delete
|
* @param plot the plot to delete
|
||||||
*/
|
*/
|
||||||
|
@ -1001,15 +1001,17 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
+ "plot_settings`(`plot_plot_id`) VALUES(?)");
|
+ "plot_settings`(`plot_plot_id`) VALUES(?)");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (success != null)
|
if (success != null) {
|
||||||
addNotifyTask(success);
|
addNotifyTask(success);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (failure != null)
|
if (failure != null) {
|
||||||
failure.run();
|
failure.run();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
Location top = plot.getExtendedTopAbs();
|
Location top = plot.getExtendedTopAbs();
|
||||||
LocalBlockQueue queue = plotArea.getQueue(false);
|
LocalBlockQueue queue = plotArea.getQueue(false);
|
||||||
int maxY = plotArea.getPlotManager().getWorldHeight();
|
int maxY = plotArea.getPlotManager().getWorldHeight();
|
||||||
if (!plot.getMerged(0)) {
|
if (!plot.getMerged(Direction.NORTH)) {
|
||||||
int z = bottom.getZ();
|
int z = bottom.getZ();
|
||||||
for (int x = bottom.getX(); x <= top.getX(); x++) {
|
for (int x = bottom.getX(); x <= top.getX(); x++) {
|
||||||
for (int y = dpw.PLOT_HEIGHT; y <= maxY; y++) {
|
for (int y = dpw.PLOT_HEIGHT; y <= maxY; y++) {
|
||||||
@ -153,7 +153,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!plot.getMerged(3)) {
|
if (!plot.getMerged(Direction.WEST)) {
|
||||||
int x = bottom.getX();
|
int x = bottom.getX();
|
||||||
for (int z = bottom.getZ(); z <= top.getZ(); z++) {
|
for (int z = bottom.getZ(); z <= top.getZ(); z++) {
|
||||||
for (int y = dpw.PLOT_HEIGHT; y <= maxY; y++) {
|
for (int y = dpw.PLOT_HEIGHT; y <= maxY; y++) {
|
||||||
@ -162,7 +162,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!plot.getMerged(2)) {
|
if (!plot.getMerged(Direction.SOUTH)) {
|
||||||
int z = top.getZ();
|
int z = top.getZ();
|
||||||
for (int x = bottom.getX(); x <= top.getX(); x++) {
|
for (int x = bottom.getX(); x <= top.getX(); x++) {
|
||||||
for (int y = dpw.PLOT_HEIGHT; y <= maxY; y++) {
|
for (int y = dpw.PLOT_HEIGHT; y <= maxY; y++) {
|
||||||
@ -170,7 +170,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!plot.getMerged(1)) {
|
if (!plot.getMerged(Direction.EAST)) {
|
||||||
int x = top.getX();
|
int x = top.getX();
|
||||||
for (int z = bottom.getZ(); z <= top.getZ(); z++) {
|
for (int z = bottom.getZ(); z <= top.getZ(); z++) {
|
||||||
for (int y = dpw.PLOT_HEIGHT; y <= maxY; y++) {
|
for (int y = dpw.PLOT_HEIGHT; y <= maxY; y++) {
|
||||||
@ -196,10 +196,11 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
}
|
}
|
||||||
Plot plot = plotArea.getPlotAbs(plotId);
|
Plot plot = plotArea.getPlotAbs(plotId);
|
||||||
Location bot = plot.getExtendedBottomAbs()
|
Location bot = plot.getExtendedBottomAbs()
|
||||||
.subtract(plot.getMerged(3) ? 0 : 1, 0, plot.getMerged(0) ? 0 : 1);
|
.subtract(plot.getMerged(Direction.WEST) ? 0 : 1, 0,
|
||||||
|
plot.getMerged(Direction.NORTH) ? 0 : 1);
|
||||||
Location top = plot.getExtendedTopAbs().add(1, 0, 1);
|
Location top = plot.getExtendedTopAbs().add(1, 0, 1);
|
||||||
LocalBlockQueue queue = plotArea.getQueue(false);
|
LocalBlockQueue queue = plotArea.getQueue(false);
|
||||||
if (!plot.getMerged(0)) {
|
if (!plot.getMerged(Direction.NORTH)) {
|
||||||
int z = bot.getZ();
|
int z = bot.getZ();
|
||||||
for (int x = bot.getX(); x < top.getX(); x++) {
|
for (int x = bot.getX(); x < top.getX(); x++) {
|
||||||
for (int y = 1; y <= dpw.WALL_HEIGHT; y++) {
|
for (int y = 1; y <= dpw.WALL_HEIGHT; y++) {
|
||||||
@ -207,7 +208,7 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!plot.getMerged(3)) {
|
if (!plot.getMerged(Direction.WEST)) {
|
||||||
int x = bot.getX();
|
int x = bot.getX();
|
||||||
for (int z = bot.getZ(); z < top.getZ(); z++) {
|
for (int z = bot.getZ(); z < top.getZ(); z++) {
|
||||||
for (int y = 1; y <= dpw.WALL_HEIGHT; y++) {
|
for (int y = 1; y <= dpw.WALL_HEIGHT; y++) {
|
||||||
@ -215,17 +216,19 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!plot.getMerged(2)) {
|
if (!plot.getMerged(Direction.SOUTH)) {
|
||||||
int z = top.getZ();
|
int z = top.getZ();
|
||||||
for (int x = bot.getX(); x < top.getX() + (plot.getMerged(1) ? 0 : 1); x++) {
|
for (int x = bot.getX();
|
||||||
|
x < top.getX() + (plot.getMerged(Direction.EAST) ? 0 : 1); x++) {
|
||||||
for (int y = 1; y <= dpw.WALL_HEIGHT; y++) {
|
for (int y = 1; y <= dpw.WALL_HEIGHT; y++) {
|
||||||
queue.setBlock(x, y, z, blocks.getBlock());
|
queue.setBlock(x, y, z, blocks.getBlock());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!plot.getMerged(1)) {
|
if (!plot.getMerged(Direction.EAST)) {
|
||||||
int x = top.getX();
|
int x = top.getX();
|
||||||
for (int z = bot.getZ(); z < top.getZ() + (plot.getMerged(2) ? 0 : 1); z++) {
|
for (int z = bot.getZ();
|
||||||
|
z < top.getZ() + (plot.getMerged(Direction.SOUTH) ? 0 : 1); z++) {
|
||||||
for (int y = 1; y <= dpw.WALL_HEIGHT; y++) {
|
for (int y = 1; y <= dpw.WALL_HEIGHT; y++) {
|
||||||
queue.setBlock(x, y, z, blocks.getBlock());
|
queue.setBlock(x, y, z, blocks.getBlock());
|
||||||
}
|
}
|
||||||
@ -242,32 +245,35 @@ public class ClassicPlotManager extends SquarePlotManager {
|
|||||||
}
|
}
|
||||||
Plot plot = plotArea.getPlotAbs(plotId);
|
Plot plot = plotArea.getPlotAbs(plotId);
|
||||||
Location bot = plot.getExtendedBottomAbs()
|
Location bot = plot.getExtendedBottomAbs()
|
||||||
.subtract(plot.getMerged(3) ? 0 : 1, 0, plot.getMerged(0) ? 0 : 1);
|
.subtract(plot.getMerged(Direction.WEST) ? 0 : 1, 0,
|
||||||
|
plot.getMerged(Direction.NORTH) ? 0 : 1);
|
||||||
Location top = plot.getExtendedTopAbs().add(1, 0, 1);
|
Location top = plot.getExtendedTopAbs().add(1, 0, 1);
|
||||||
PseudoRandom random = new PseudoRandom();
|
PseudoRandom random = new PseudoRandom();
|
||||||
LocalBlockQueue queue = plotArea.getQueue(false);
|
LocalBlockQueue queue = plotArea.getQueue(false);
|
||||||
int y = dpw.WALL_HEIGHT + 1;
|
int y = dpw.WALL_HEIGHT + 1;
|
||||||
if (!plot.getMerged(0)) {
|
if (!plot.getMerged(Direction.NORTH)) {
|
||||||
int z = bot.getZ();
|
int z = bot.getZ();
|
||||||
for (int x = bot.getX(); x < top.getX(); x++) {
|
for (int x = bot.getX(); x < top.getX(); x++) {
|
||||||
queue.setBlock(x, y, z, blocks.getBlock());
|
queue.setBlock(x, y, z, blocks.getBlock());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!plot.getMerged(3)) {
|
if (!plot.getMerged(Direction.WEST)) {
|
||||||
int x = bot.getX();
|
int x = bot.getX();
|
||||||
for (int z = bot.getZ(); z < top.getZ(); z++) {
|
for (int z = bot.getZ(); z < top.getZ(); z++) {
|
||||||
queue.setBlock(x, y, z, blocks.getBlock());
|
queue.setBlock(x, y, z, blocks.getBlock());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!plot.getMerged(2)) {
|
if (!plot.getMerged(Direction.SOUTH)) {
|
||||||
int z = top.getZ();
|
int z = top.getZ();
|
||||||
for (int x = bot.getX(); x < top.getX() + (plot.getMerged(1) ? 0 : 1); x++) {
|
for (int x = bot.getX();
|
||||||
|
x < top.getX() + (plot.getMerged(Direction.EAST) ? 0 : 1); x++) {
|
||||||
queue.setBlock(x, y, z, blocks.getBlock());
|
queue.setBlock(x, y, z, blocks.getBlock());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!plot.getMerged(1)) {
|
if (!plot.getMerged(Direction.EAST)) {
|
||||||
int x = top.getX();
|
int x = top.getX();
|
||||||
for (int z = bot.getZ(); z < top.getZ() + (plot.getMerged(2) ? 0 : 1); z++) {
|
for (int z = bot.getZ();
|
||||||
|
z < top.getZ() + (plot.getMerged(Direction.SOUTH) ? 0 : 1); z++) {
|
||||||
queue.setBlock(x, y, z, blocks.getBlock());
|
queue.setBlock(x, y, z, blocks.getBlock());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,9 +95,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
return bot.add(-1, 0, -2);
|
return bot.add(-1, 0, -2);
|
||||||
} else {
|
} else {
|
||||||
bot.setY(0);
|
bot.setY(0);
|
||||||
Location loc =
|
return bot.add(SIGN_LOCATION.getX(), SIGN_LOCATION.getY(), SIGN_LOCATION.getZ());
|
||||||
bot.add(SIGN_LOCATION.getX(), SIGN_LOCATION.getY(), SIGN_LOCATION.getZ());
|
|
||||||
return loc;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,11 +275,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
|
|||||||
id = rotate(id);
|
id = rotate(id);
|
||||||
}
|
}
|
||||||
int pair = MathMan.pair(x, z);
|
int pair = MathMan.pair(x, z);
|
||||||
BaseBlock[] existing = this.G_SCH.get(pair);
|
BaseBlock[] existing = this.G_SCH.computeIfAbsent(pair, k -> new BaseBlock[height]);
|
||||||
if (existing == null) {
|
|
||||||
existing = new BaseBlock[height];
|
|
||||||
this.G_SCH.put(pair, existing);
|
|
||||||
}
|
|
||||||
existing[y] = id;
|
existing[y] = id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -173,28 +173,28 @@ public abstract class SquarePlotManager extends GridPlotManager {
|
|||||||
switch (hash) {
|
switch (hash) {
|
||||||
case 8:
|
case 8:
|
||||||
// north
|
// north
|
||||||
return plot.getMerged(0) ? id : null;
|
return plot.getMerged(Direction.NORTH) ? id : null;
|
||||||
case 4:
|
case 4:
|
||||||
// east
|
// east
|
||||||
return plot.getMerged(1) ? id : null;
|
return plot.getMerged(Direction.EAST) ? id : null;
|
||||||
case 2:
|
case 2:
|
||||||
// south
|
// south
|
||||||
return plot.getMerged(2) ? id : null;
|
return plot.getMerged(Direction.SOUTH) ? id : null;
|
||||||
case 1:
|
case 1:
|
||||||
// west
|
// west
|
||||||
return plot.getMerged(3) ? id : null;
|
return plot.getMerged(Direction.WEST) ? id : null;
|
||||||
case 12:
|
case 12:
|
||||||
// northest
|
// northeast
|
||||||
return plot.getMerged(4) ? id : null;
|
return plot.getMerged(Direction.NORTHEAST) ? id : null;
|
||||||
case 6:
|
case 6:
|
||||||
// southeast
|
// southeast
|
||||||
return plot.getMerged(5) ? id : null;
|
return plot.getMerged(Direction.SOUTHEAST) ? id : null;
|
||||||
case 3:
|
case 3:
|
||||||
// southwest
|
// southwest
|
||||||
return plot.getMerged(6) ? id : null;
|
return plot.getMerged(Direction.SOUTHWEST) ? id : null;
|
||||||
case 9:
|
case 9:
|
||||||
// northwest
|
// northwest
|
||||||
return plot.getMerged(7) ? id : null;
|
return plot.getMerged(Direction.NORTHWEST) ? id : null;
|
||||||
}
|
}
|
||||||
PlotSquared.debug("invalid location: " + Arrays.toString(merged));
|
PlotSquared.debug("invalid location: " + Arrays.toString(merged));
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
|
@ -13,7 +13,7 @@ import com.sk89q.worldedit.extent.NullExtent;
|
|||||||
import com.sk89q.worldedit.math.BlockVector2;
|
import com.sk89q.worldedit.math.BlockVector2;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.util.Location;
|
import com.sk89q.worldedit.util.Location;
|
||||||
import com.sk89q.worldedit.world.biome.BaseBiome;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||||
@ -46,21 +46,22 @@ public class ProcessedWEExtent extends AbstractDelegateExtent {
|
|||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public BlockState getBlock(BlockVector3 location) {
|
@Override public BlockState getBlock(BlockVector3 position) {
|
||||||
if (WEManager.maskContains(this.mask, location.getX(), location.getY(), location.getZ())) {
|
if (WEManager.maskContains(this.mask, position.getX(), position.getY(), position.getZ())) {
|
||||||
return super.getBlock(location);
|
return super.getBlock(position);
|
||||||
}
|
}
|
||||||
return WEExtent.AIRSTATE;
|
return WEExtent.AIRSTATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public BaseBlock getFullBlock(BlockVector3 location) {
|
@Override public BaseBlock getFullBlock(BlockVector3 position) {
|
||||||
if (WEManager.maskContains(this.mask, location.getX(), location.getY(), location.getZ())) {
|
if (WEManager.maskContains(this.mask, position.getX(), position.getY(), position.getZ())) {
|
||||||
return super.getFullBlock(location);
|
return super.getFullBlock(position);
|
||||||
}
|
}
|
||||||
return WEExtent.AIRBASE;
|
return WEExtent.AIRBASE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public boolean setBlock(BlockVector3 location, BlockStateHolder block)
|
@Override
|
||||||
|
public <T extends BlockStateHolder<T>> boolean setBlock(BlockVector3 location, T block)
|
||||||
throws WorldEditException {
|
throws WorldEditException {
|
||||||
String id = block.getBlockType().getId();
|
String id = block.getBlockType().getId();
|
||||||
switch (id) {
|
switch (id) {
|
||||||
@ -171,7 +172,7 @@ public class ProcessedWEExtent extends AbstractDelegateExtent {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public boolean setBiome(BlockVector2 position, BaseBiome biome) {
|
@Override public boolean setBiome(BlockVector2 position, BiomeType biome) {
|
||||||
return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super
|
return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super
|
||||||
.setBiome(position, biome);
|
.setBiome(position, biome);
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ import com.sk89q.worldedit.extent.Extent;
|
|||||||
import com.sk89q.worldedit.math.BlockVector2;
|
import com.sk89q.worldedit.math.BlockVector2;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.util.Location;
|
import com.sk89q.worldedit.util.Location;
|
||||||
import com.sk89q.worldedit.world.biome.BaseBiome;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||||
@ -42,22 +42,22 @@ public class WEExtent extends AbstractDelegateExtent {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public boolean setBiome(BlockVector2 position, BaseBiome biome) {
|
@Override public BlockState getBlock(BlockVector3 position) {
|
||||||
return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super
|
if (WEManager.maskContains(this.mask, position.getX(), position.getY(), position.getZ())) {
|
||||||
.setBiome(position, biome);
|
return super.getBlock(position);
|
||||||
}
|
|
||||||
|
|
||||||
@Override public BlockState getBlock(BlockVector3 location) {
|
|
||||||
if (WEManager.maskContains(this.mask, location.getX(), location.getY(), location.getZ())) {
|
|
||||||
return super.getBlock(location);
|
|
||||||
}
|
}
|
||||||
return AIRSTATE;
|
return AIRSTATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public BaseBlock getFullBlock(BlockVector3 location) {
|
@Override public BaseBlock getFullBlock(BlockVector3 position) {
|
||||||
if (WEManager.maskContains(this.mask, location.getX(), location.getY(), location.getZ())) {
|
if (WEManager.maskContains(this.mask, position.getX(), position.getY(), position.getZ())) {
|
||||||
return super.getFullBlock(location);
|
return super.getFullBlock(position);
|
||||||
}
|
}
|
||||||
return AIRBASE;
|
return AIRBASE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override public boolean setBiome(BlockVector2 position, BiomeType biome) {
|
||||||
|
return WEManager.maskContains(this.mask, position.getX(), position.getZ()) && super
|
||||||
|
.setBiome(position, biome);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3015,4 +3015,8 @@ public class Plot {
|
|||||||
@SuppressWarnings("deprecation") public void setComments(List<PlotComment> list) {
|
@SuppressWarnings("deprecation") public void setComments(List<PlotComment> list) {
|
||||||
getSettings().setComments(list);
|
getSettings().setComments(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getMerged(Direction direction) {
|
||||||
|
return getMerged(direction.getIndex());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -713,8 +713,9 @@ public abstract class PlotArea {
|
|||||||
if (TYPE == 2) {
|
if (TYPE == 2) {
|
||||||
center = new PlotId(MathMan.average(min.x, max.x), MathMan.average(min.y, max.y));
|
center = new PlotId(MathMan.average(min.x, max.x), MathMan.average(min.y, max.y));
|
||||||
plots = Math.max(max.x - min.x, max.y - min.y) + 1;
|
plots = Math.max(max.x - min.x, max.y - min.y) + 1;
|
||||||
if (start != null)
|
if (start != null) {
|
||||||
start = new PlotId(start.x - center.x, start.y - center.y);
|
start = new PlotId(start.x - center.x, start.y - center.y);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
center = new PlotId(0, 0);
|
center = new PlotId(0, 0);
|
||||||
plots = Integer.MAX_VALUE;
|
plots = Integer.MAX_VALUE;
|
||||||
|
@ -6,7 +6,6 @@ import com.github.intellectualsites.plotsquared.plot.object.comment.PlotComment;
|
|||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.IntStream;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generic settings class.
|
* Generic settings class.
|
||||||
@ -57,13 +56,6 @@ public class PlotSettings {
|
|||||||
return this.merged[direction];
|
return this.merged[direction];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the plot is merged (i.e. if it's a mega plot)
|
|
||||||
*/
|
|
||||||
public boolean isMerged() {
|
|
||||||
return IntStream.of(0, 1, 2, 3).anyMatch(i -> this.merged[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean[] getMerged() {
|
public boolean[] getMerged() {
|
||||||
return this.merged;
|
return this.merged;
|
||||||
}
|
}
|
||||||
|
@ -30,8 +30,9 @@ public class SinglePlotArea extends GridPlotWorld {
|
|||||||
TaskManager.IMP.sync(new RunnableVal<Object>() {
|
TaskManager.IMP.sync(new RunnableVal<Object>() {
|
||||||
@Override public void run(Object value) {
|
@Override public void run(Object value) {
|
||||||
String worldName = id.toCommaSeparatedString();
|
String worldName = id.toCommaSeparatedString();
|
||||||
if (WorldUtil.IMP.isWorld(worldName))
|
if (WorldUtil.IMP.isWorld(worldName)) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
SetupObject setup = new SetupObject();
|
SetupObject setup = new SetupObject();
|
||||||
setup.plotManager = "PlotSquared:single";
|
setup.plotManager = "PlotSquared:single";
|
||||||
setup.setupGenerator = "PlotSquared:single";
|
setup.setupGenerator = "PlotSquared:single";
|
||||||
|
@ -70,32 +70,36 @@ public class SinglePlotAreaManager extends DefaultPlotAreaManager {
|
|||||||
|
|
||||||
@Override public PlotArea getApplicablePlotArea(Location location) {
|
@Override public PlotArea getApplicablePlotArea(Location location) {
|
||||||
PlotArea found = super.getApplicablePlotArea(location);
|
PlotArea found = super.getApplicablePlotArea(location);
|
||||||
if (found != null)
|
if (found != null) {
|
||||||
return found;
|
return found;
|
||||||
|
}
|
||||||
String world = location.getWorld();
|
String world = location.getWorld();
|
||||||
return isWorld(world) || world.equals("*") || super.getAllPlotAreas().length == 0 ?
|
return isWorld(world) || world.equals("*") || super.getAllPlotAreas().length == 0 ?
|
||||||
area :
|
area :
|
||||||
null;
|
null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public PlotArea getPlotArea(Location location) {
|
|
||||||
PlotArea found = super.getPlotArea(location);
|
|
||||||
if (found != null)
|
|
||||||
return found;
|
|
||||||
return isWorld(location.getWorld()) || location.getWorld().equals("*") ? area : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override public PlotArea getPlotArea(String world, String id) {
|
@Override public PlotArea getPlotArea(String world, String id) {
|
||||||
PlotArea found = super.getPlotArea(world, id);
|
PlotArea found = super.getPlotArea(world, id);
|
||||||
if (found != null)
|
if (found != null) {
|
||||||
return found;
|
return found;
|
||||||
|
}
|
||||||
return isWorld(world) || world.equals("*") ? area : null;
|
return isWorld(world) || world.equals("*") ? area : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override public PlotArea getPlotArea(Location location) {
|
||||||
|
PlotArea found = super.getPlotArea(location);
|
||||||
|
if (found != null) {
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
return isWorld(location.getWorld()) || location.getWorld().equals("*") ? area : null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override public PlotArea[] getPlotAreas(String world, RegionWrapper region) {
|
@Override public PlotArea[] getPlotAreas(String world, RegionWrapper region) {
|
||||||
PlotArea[] found = super.getPlotAreas(world, region);
|
PlotArea[] found = super.getPlotAreas(world, region);
|
||||||
if (found != null && found.length != 0)
|
if (found != null && found.length != 0) {
|
||||||
return found;
|
return found;
|
||||||
|
}
|
||||||
return isWorld(world) || world.equals("*") ? array : noPlotAreas;
|
return isWorld(world) || world.equals("*") ? array : noPlotAreas;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,9 +33,10 @@ public class SinglePlotManager extends PlotManager {
|
|||||||
TaskManager.IMP.taskAsync(new Runnable() {
|
TaskManager.IMP.taskAsync(new Runnable() {
|
||||||
@Override public void run() {
|
@Override public void run() {
|
||||||
MainUtil.deleteDirectory(worldFolder);
|
MainUtil.deleteDirectory(worldFolder);
|
||||||
if (whenDone != null)
|
if (whenDone != null) {
|
||||||
whenDone.run();
|
whenDone.run();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -46,8 +47,9 @@ public class SinglePlotManager extends PlotManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override public boolean unclaimPlot(PlotArea plotArea, Plot plot, Runnable whenDone) {
|
@Override public boolean unclaimPlot(PlotArea plotArea, Plot plot, Runnable whenDone) {
|
||||||
if (whenDone != null)
|
if (whenDone != null) {
|
||||||
whenDone.run();
|
whenDone.run();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,11 +264,8 @@ public abstract class ChunkManager {
|
|||||||
}
|
}
|
||||||
Location top = new Location(world, x2, 0, z2);
|
Location top = new Location(world, x2, 0, z2);
|
||||||
plot = top.getOwnedPlotAbs();
|
plot = top.getOwnedPlotAbs();
|
||||||
if (plot != null) {
|
|
||||||
return plot;
|
return plot;
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copy a region to a new location (in the same world)
|
* Copy a region to a new location (in the same world)
|
||||||
|
@ -17,8 +17,9 @@ public class CmdConfirm {
|
|||||||
public static void addPending(final PlotPlayer player, String commandStr,
|
public static void addPending(final PlotPlayer player, String commandStr,
|
||||||
final Runnable runnable) {
|
final Runnable runnable) {
|
||||||
removePending(player);
|
removePending(player);
|
||||||
if (commandStr != null)
|
if (commandStr != null) {
|
||||||
MainUtil.sendMessage(player, C.REQUIRES_CONFIRM, commandStr);
|
MainUtil.sendMessage(player, C.REQUIRES_CONFIRM, commandStr);
|
||||||
|
}
|
||||||
TaskManager.runTaskLater(new Runnable() {
|
TaskManager.runTaskLater(new Runnable() {
|
||||||
@Override public void run() {
|
@Override public void run() {
|
||||||
CmdInstance cmd = new CmdInstance(runnable);
|
CmdInstance cmd = new CmdInstance(runnable);
|
||||||
|
@ -181,8 +181,9 @@ public class MathMan {
|
|||||||
|
|
||||||
public static int floorMod(int x, int y) {
|
public static int floorMod(int x, int y) {
|
||||||
int i = x % y;
|
int i = x % y;
|
||||||
if (i < 0)
|
if (i < 0) {
|
||||||
i += y;
|
i += y;
|
||||||
|
}
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,9 +171,10 @@ public abstract class BasicLocalBlockQueue<T> extends LocalBlockQueue {
|
|||||||
GlobalBlockQueue.IMP.dequeue(this);
|
GlobalBlockQueue.IMP.dequeue(this);
|
||||||
TaskManager.IMP.sync(new RunnableVal<Object>() {
|
TaskManager.IMP.sync(new RunnableVal<Object>() {
|
||||||
@Override public void run(Object value) {
|
@Override public void run(Object value) {
|
||||||
while (next())
|
while (next()) {
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,11 +329,12 @@ public class ExpireManager {
|
|||||||
long diff = time - existing;
|
long diff = time - existing;
|
||||||
if (diff > 0) {
|
if (diff > 0) {
|
||||||
Long account_age = this.account_age_cache.get(uuid);
|
Long account_age = this.account_age_cache.get(uuid);
|
||||||
if (account_age != null)
|
if (account_age != null) {
|
||||||
this.account_age_cache.put(uuid, account_age + diff);
|
this.account_age_cache.put(uuid, account_age + diff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void storeAccountAge(UUID uuid, long time) {
|
public void storeAccountAge(UUID uuid, long time) {
|
||||||
this.account_age_cache.put(uuid, time);
|
this.account_age_cache.put(uuid, time);
|
||||||
|
@ -106,8 +106,9 @@ public class ExpiryTask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean appliesAccountAge(long accountAge) {
|
public boolean appliesAccountAge(long accountAge) {
|
||||||
if (settings.SKIP_ACCOUNT_AGE_DAYS != -1)
|
if (settings.SKIP_ACCOUNT_AGE_DAYS != -1) {
|
||||||
return accountAge <= TimeUnit.DAYS.toMillis(settings.SKIP_ACCOUNT_AGE_DAYS);
|
return accountAge <= TimeUnit.DAYS.toMillis(settings.SKIP_ACCOUNT_AGE_DAYS);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user