From 2da0e1b8250f08a25e6d5746512131d51ab399ea Mon Sep 17 00:00:00 2001 From: Alfie Cleveland Date: Fri, 6 Jul 2018 22:15:27 -0500 Subject: [PATCH] changes diff --git a/src/main/java/net/frozenorb/PlayerMap.java b/src/main/java/net/frozenorb/PlayerMap.java index c0d3194b6..284e532b4 100644 --- a/src/main/java/net/frozenorb/PlayerMap.java +++ b/src/main/java/net/frozenorb/PlayerMap.java @@ -1,11 +1,13 @@ package net.frozenorb; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.function.Consumer; import com.google.common.base.Function; import com.google.common.base.Predicate; +import com.google.common.collect.Lists; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import net.minecraft.server.EntityHuman; @@ -157,6 +159,29 @@ public class PlayerMap { return bestPlayer; } + + public List getNearbyPlayersIgnoreHeight(double x, double y, double z, double distance) { + List toReturn = null; + + for (int chunkX = MathHelper.floor(x - distance) >> CHUNK_BITS; chunkX <= MathHelper.floor(x + distance) >> CHUNK_BITS; chunkX++) { + for (int chunkZ = MathHelper.floor(z - distance) >> CHUNK_BITS; chunkZ <= MathHelper.floor(z + distance) >> CHUNK_BITS; chunkZ++) { + List players = map.get(xzToKey(chunkX, chunkZ)); + if (players != null) { + for (EntityPlayer player : players) { + if (player != null && !player.dead && Math.abs(player.locX - x) <= distance && Math.abs(player.locZ - z) <= distance) { + if (toReturn == null) { + toReturn = Lists.newArrayList(); + } + + toReturn.add(player); + } + } + } + } + } + + return toReturn == null ? Collections.emptyList() : toReturn; + } public EntityPlayer getNearestAttackablePlayer(double x, double y, double z, double maxXZ, double maxY, Function visibility) { return getNearestAttackablePlayer(x, y, z, maxXZ, maxY, visibility, null); diff --git a/src/main/java/net/frozenorb/util/BlockUtil.java b/src/main/java/net/frozenorb/util/BlockUtil.java new file mode 100644 index 000000000..7553fc6fe --- /dev/null +++ b/src/main/java/net/frozenorb/util/BlockUtil.java @@ -0,0 +1,244 @@ +package net.frozenorb.util; + +import java.util.HashSet; +import java.util.Set; + +import org.bukkit.Location; +import org.bukkit.World; + +public class BlockUtil { + private static Set blockSolidPassSet; + private static Set blockStairsSet; + private static Set blockLiquidsSet; + private static Set blockWebsSet; + private static Set blockIceSet; + + @SuppressWarnings("deprecation") + public static boolean isOnGround(final Location location, final int down) { + final double posX = location.getX(); + final double posZ = location.getZ(); + final double fracX = (posX % 1.0 > 0.0) ? Math.abs(posX % 1.0) : (1.0 - Math.abs(posX % 1.0)); + final double fracZ = (posZ % 1.0 > 0.0) ? Math.abs(posZ % 1.0) : (1.0 - Math.abs(posZ % 1.0)); + final int blockX = location.getBlockX(); + final int blockY = location.getBlockY() - down; + final int blockZ = location.getBlockZ(); + final World world = location.getWorld(); + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX, blockY, blockZ).getTypeId())) { + return true; + } + if (fracX < 0.3) { + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX - 1, blockY, blockZ).getTypeId())) { + return true; + } + if (fracZ < 0.3) { + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX - 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX + 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + } else if (fracZ > 0.7) { + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX - 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX + 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + } + } else if (fracX > 0.7) { + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX + 1, blockY, blockZ).getTypeId())) { + return true; + } + if (fracZ < 0.3) { + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX - 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX + 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + } else if (fracZ > 0.7) { + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX - 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX + 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + } + } else if (fracZ < 0.3) { + if (!BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId())) { + return true; + } + } else if (fracZ > 0.7 && !BlockUtil.blockSolidPassSet.contains((byte) world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId())) { + return true; + } + return false; + } + + public static boolean isOnStairs(final Location location, final int down) { + return isUnderBlock(location, BlockUtil.blockStairsSet, down); + } + + @SuppressWarnings("deprecation") + private static boolean isUnderBlock(final Location location, final Set itemIDs, final int down) { + final double posX = location.getX(); + final double posZ = location.getZ(); + final double fracX = (posX % 1.0 > 0.0) ? Math.abs(posX % 1.0) : (1.0 - Math.abs(posX % 1.0)); + final double fracZ = (posZ % 1.0 > 0.0) ? Math.abs(posZ % 1.0) : (1.0 - Math.abs(posZ % 1.0)); + final int blockX = location.getBlockX(); + final int blockY = location.getBlockY() - down; + final int blockZ = location.getBlockZ(); + final World world = location.getWorld(); + if (itemIDs.contains((byte) world.getBlockAt(blockX, blockY, blockZ).getTypeId())) { + return true; + } + if (fracX < 0.3) { + if (itemIDs.contains((byte) world.getBlockAt(blockX - 1, blockY, blockZ).getTypeId())) { + return true; + } + if (fracZ < 0.3) { + if (itemIDs.contains((byte) world.getBlockAt(blockX - 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (itemIDs.contains((byte) world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (itemIDs.contains((byte) world.getBlockAt(blockX + 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + } else if (fracZ > 0.7) { + if (itemIDs.contains((byte) world.getBlockAt(blockX - 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (itemIDs.contains((byte) world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (itemIDs.contains((byte) world.getBlockAt(blockX + 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + } + } else if (fracX > 0.7) { + if (itemIDs.contains((byte) world.getBlockAt(blockX + 1, blockY, blockZ).getTypeId())) { + return true; + } + if (fracZ < 0.3) { + if (itemIDs.contains((byte) world.getBlockAt(blockX - 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (itemIDs.contains((byte) world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (itemIDs.contains((byte) world.getBlockAt(blockX + 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + } else if (fracZ > 0.7) { + if (itemIDs.contains((byte) world.getBlockAt(blockX - 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (itemIDs.contains((byte) world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (itemIDs.contains((byte) world.getBlockAt(blockX + 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + } + } else if (fracZ < 0.3) { + if (itemIDs.contains((byte) world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId())) { + return true; + } + } else if (fracZ > 0.7 && itemIDs.contains((byte) world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId())) { + return true; + } + return false; + } + + public static boolean isOnLiquid(final Location location, final int down) { + return isUnderBlock(location, BlockUtil.blockLiquidsSet, down); + } + + public static boolean isOnWeb(final Location location, final int down) { + return isUnderBlock(location, BlockUtil.blockWebsSet, down); + } + + public static boolean isOnIce(final Location location, final int down) { + return isUnderBlock(location, BlockUtil.blockIceSet, down); + } + + static { + BlockUtil.blockSolidPassSet = new HashSet(); + BlockUtil.blockStairsSet = new HashSet(); + BlockUtil.blockLiquidsSet = new HashSet(); + BlockUtil.blockWebsSet = new HashSet(); + BlockUtil.blockIceSet = new HashSet(); + BlockUtil.blockSolidPassSet.add((byte) 0); + BlockUtil.blockSolidPassSet.add((byte) 6); + BlockUtil.blockSolidPassSet.add((byte) 8); + BlockUtil.blockSolidPassSet.add((byte) 9); + BlockUtil.blockSolidPassSet.add((byte) 10); + BlockUtil.blockSolidPassSet.add((byte) 11); + BlockUtil.blockSolidPassSet.add((byte) 27); + BlockUtil.blockSolidPassSet.add((byte) 28); + BlockUtil.blockSolidPassSet.add((byte) 30); + BlockUtil.blockSolidPassSet.add((byte) 31); + BlockUtil.blockSolidPassSet.add((byte) 32); + BlockUtil.blockSolidPassSet.add((byte) 37); + BlockUtil.blockSolidPassSet.add((byte) 38); + BlockUtil.blockSolidPassSet.add((byte) 39); + BlockUtil.blockSolidPassSet.add((byte) 40); + BlockUtil.blockSolidPassSet.add((byte) 50); + BlockUtil.blockSolidPassSet.add((byte) 51); + BlockUtil.blockSolidPassSet.add((byte) 55); + BlockUtil.blockSolidPassSet.add((byte) 59); + BlockUtil.blockSolidPassSet.add((byte) 63); + BlockUtil.blockSolidPassSet.add((byte) 66); + BlockUtil.blockSolidPassSet.add((byte) 68); + BlockUtil.blockSolidPassSet.add((byte) 69); + BlockUtil.blockSolidPassSet.add((byte) 70); + BlockUtil.blockSolidPassSet.add((byte) 72); + BlockUtil.blockSolidPassSet.add((byte) 75); + BlockUtil.blockSolidPassSet.add((byte) 76); + BlockUtil.blockSolidPassSet.add((byte) 77); + BlockUtil.blockSolidPassSet.add((byte) 78); + BlockUtil.blockSolidPassSet.add((byte) 83); + BlockUtil.blockSolidPassSet.add((byte) 90); + BlockUtil.blockSolidPassSet.add((byte) 104); + BlockUtil.blockSolidPassSet.add((byte) 105); + BlockUtil.blockSolidPassSet.add((byte) 115); + BlockUtil.blockSolidPassSet.add((byte) 119); + BlockUtil.blockSolidPassSet.add((byte) (-124)); + BlockUtil.blockSolidPassSet.add((byte) (-113)); + BlockUtil.blockSolidPassSet.add((byte) (-81)); + BlockUtil.blockStairsSet.add((byte) 53); + BlockUtil.blockStairsSet.add((byte) 67); + BlockUtil.blockStairsSet.add((byte) 108); + BlockUtil.blockStairsSet.add((byte) 109); + BlockUtil.blockStairsSet.add((byte) 114); + BlockUtil.blockStairsSet.add((byte) (-128)); + BlockUtil.blockStairsSet.add((byte) (-122)); + BlockUtil.blockStairsSet.add((byte) (-121)); + BlockUtil.blockStairsSet.add((byte) (-120)); + BlockUtil.blockStairsSet.add((byte) (-100)); + BlockUtil.blockStairsSet.add((byte) (-93)); + BlockUtil.blockStairsSet.add((byte) (-92)); + BlockUtil.blockStairsSet.add((byte) 126); + BlockUtil.blockStairsSet.add((byte) (-76)); + BlockUtil.blockLiquidsSet.add((byte) 8); + BlockUtil.blockLiquidsSet.add((byte) 9); + BlockUtil.blockLiquidsSet.add((byte) 10); + BlockUtil.blockLiquidsSet.add((byte) 11); + BlockUtil.blockWebsSet.add((byte) 30); + BlockUtil.blockIceSet.add((byte) 79); + BlockUtil.blockIceSet.add((byte) (-82)); + } +} diff --git a/src/main/java/net/frozenorb/util/ChunkFlatMap.java b/src/main/java/net/frozenorb/util/ChunkFlatMap.java deleted file mode 100644 index 6d937ec68..000000000 --- a/src/main/java/net/frozenorb/util/ChunkFlatMap.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.frozenorb.util; - -import net.minecraft.server.Chunk; - -public class ChunkFlatMap extends FlatMap { - - private Chunk lastChunk; - - @Override - public Chunk get(int x, int z) { - Chunk last = lastChunk; // have to do this to be somewhat thread-safe-ish - - if (last != null && last.locX == x && last.locZ == z) { - return last; - } - - return lastChunk = super.get(x, z); - } - - @Override - public void remove(int x, int z) { - if (lastChunk != null && lastChunk.locX == x && lastChunk.locZ == z) { - lastChunk = null; // we don't really care for thread safety here, we'd just lose a few cache hits - } - - super.remove(x, z); - } -} diff --git a/src/main/java/net/frozenorb/util/CoordinateChunkHybridMap.java b/src/main/java/net/frozenorb/util/CoordinateChunkHybridMap.java deleted file mode 100644 index bd912d30b..000000000 --- a/src/main/java/net/frozenorb/util/CoordinateChunkHybridMap.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.frozenorb.util; - -import net.minecraft.server.Chunk; - -public class CoordinateChunkHybridMap extends CoordinateObjectHybridMap { - - public CoordinateChunkHybridMap() { - flatMap = new ChunkFlatMap(); - } -} diff --git a/src/main/java/net/frozenorb/util/CoordinateObjectHybridMap.java b/src/main/java/net/frozenorb/util/CoordinateObjectHybridMap.java deleted file mode 100644 index ac015051c..000000000 --- a/src/main/java/net/frozenorb/util/CoordinateObjectHybridMap.java +++ /dev/null @@ -1,56 +0,0 @@ -package net.frozenorb.util; - -import java.util.Collection; -import java.util.Collections; - -import org.bukkit.craftbukkit.util.LongHash; - -import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; - -public class CoordinateObjectHybridMap { - - private Long2ObjectOpenHashMap backingMap = new Long2ObjectOpenHashMap(); - private Collection values = Collections.unmodifiableCollection(backingMap.values()); // values() is uncached and is simply a view, so we can cache it and make it externally unmodifiable - - protected FlatMap flatMap; - - public CoordinateObjectHybridMap() { - this.flatMap = new FlatMap(); - } - - public boolean contains(int x, int z) { - return get(x, z) != null; - } - - public T get(int x, int z) { - if (x * x < FlatMap.HALF_DIAMETER_SQUARED && z * z < FlatMap.HALF_DIAMETER_SQUARED) { - return flatMap.get(x, z); - } - - return backingMap.get(LongHash.toLong(x, z)); - } - - public void remove(int x, int z) { - if (x * x < FlatMap.HALF_DIAMETER_SQUARED && z * z < FlatMap.HALF_DIAMETER_SQUARED) { - flatMap.put(x, z, null); - } - - backingMap.remove(LongHash.toLong(x, z)); - } - - public void put(int x, int z, T value) { - if (x * x < FlatMap.HALF_DIAMETER_SQUARED && z * z < FlatMap.HALF_DIAMETER_SQUARED) { - flatMap.put(x, z, value); - } - - backingMap.put(LongHash.toLong(x, z), value); - } - - public int size() { - return backingMap.size(); - } - - public Collection values() { - return values; - } -} diff --git a/src/main/java/net/frozenorb/util/FlatMap.java b/src/main/java/net/frozenorb/util/FlatMap.java deleted file mode 100644 index 6a5c36fa2..000000000 --- a/src/main/java/net/frozenorb/util/FlatMap.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.frozenorb.util; - -public class FlatMap { - - private static final int DIAMETER = 4096; - private static final int HALF_DIAMETER = DIAMETER / 2; - private final Object[] flatLookup; - - public static final int HALF_DIAMETER_SQUARED = HALF_DIAMETER * HALF_DIAMETER; - - public FlatMap() { - this.flatLookup = new Object[DIAMETER * DIAMETER]; - } - - public void put(final int msw, final int lsw, final V value) { - this.flatLookup[(msw + HALF_DIAMETER) * DIAMETER + (lsw + HALF_DIAMETER)] = value; - } - - public void remove(final int msw, final int lsw) { - this.put(msw, lsw, null); - } - - public boolean contains(final int msw, final int lsw) { - return this.get(msw, lsw) != null; - } - - public V get(final int msw, final int lsw) { - return (V) this.flatLookup[(msw + HALF_DIAMETER) * DIAMETER + (lsw + HALF_DIAMETER)]; - } -} diff --git a/src/main/java/net/minecraft/server/BlockLever.java b/src/main/java/net/minecraft/server/BlockLever.java index e00cea3d0..5885d5f68 100644 --- a/src/main/java/net/minecraft/server/BlockLever.java +++ b/src/main/java/net/minecraft/server/BlockLever.java @@ -1,6 +1,7 @@ package net.minecraft.server; import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit +import org.spigotmc.SpigotConfig; public class BlockLever extends Block { @@ -165,6 +166,11 @@ public class BlockLever extends Block { } public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { + if (SpigotConfig.pearlThroughGatesAndTripwire) { + this.a(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F); + return; + } + int l = iblockaccess.getData(i, j, k) & 7; float f = 0.1875F; diff --git a/src/main/java/net/minecraft/server/BlockSoil.java b/src/main/java/net/minecraft/server/BlockSoil.java index b234a5378..4db09b6b8 100644 --- a/src/main/java/net/minecraft/server/BlockSoil.java +++ b/src/main/java/net/minecraft/server/BlockSoil.java @@ -20,6 +20,7 @@ public class BlockSoil extends Block { return AxisAlignedBB.a((double) (i + 0), (double) (j + 0), (double) (k + 0), (double) (i + 1), (double) (j + 1), (double) (k + 1)); } + public boolean c() { return false; } diff --git a/src/main/java/net/minecraft/server/BlockWeb.java b/src/main/java/net/minecraft/server/BlockWeb.java new file mode 100644 index 000000000..ab885738b --- /dev/null +++ b/src/main/java/net/minecraft/server/BlockWeb.java @@ -0,0 +1,40 @@ +package net.minecraft.server; + +import java.util.Random; + +public class BlockWeb extends Block { + + public BlockWeb() { + super(Material.WEB); + this.a(CreativeModeTab.c); + this.a(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F); // Velt + } + + public void a(World world, int i, int j, int k, Entity entity) { + entity.as(); + } + + public boolean c() { + return false; + } + + public AxisAlignedBB a(World world, int i, int j, int k) { + return null; + } + + public int b() { + return 1; + } + + public boolean d() { + return false; + } + + public Item getDropType(int i, Random random, int j) { + return Items.STRING; + } + + protected boolean E() { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java index 1ffef2420..4a20d7e2d 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java @@ -14,8 +14,7 @@ import org.bukkit.craftbukkit.util.LongHashSet; import org.bukkit.event.world.ChunkUnloadEvent; // CraftBukkit end -import net.frozenorb.util.CoordinateChunkHybridMap; -import net.frozenorb.util.CoordinateObjectHybridMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; public class ChunkProviderServer implements IChunkProvider { @@ -27,7 +26,7 @@ public class ChunkProviderServer implements IChunkProvider { private IChunkLoader f; public boolean forceChunkLoad = false; // true -> false //public LongObjectHashMap chunks = new LongObjectHashMap(); - public CoordinateObjectHybridMap chunks = new CoordinateChunkHybridMap(); // MineHQ + public Long2ObjectOpenHashMap chunks = new Long2ObjectOpenHashMap<>(); // MineHQ public WorldServer world; // CraftBukkit end @@ -43,7 +42,7 @@ public class ChunkProviderServer implements IChunkProvider { } public boolean isChunkLoaded(int i, int j) { - return this.chunks.contains(i, j); // CraftBukkit // MineHQ + return this.chunks.containsKey(LongHash.toLong(i, j)); // CraftBukkit // MineHQ } // CraftBukkit start - Change return type to Collection and return the values of our chunk map @@ -62,7 +61,7 @@ public class ChunkProviderServer implements IChunkProvider { if (!checked && this.world.getPlayerChunkMap().isChunkInUse(i, j)) return; // MineHQ end // PaperSpigot start - Asynchronous lighting updates - Chunk chunk = this.chunks.get(i, j); // MineHQ + Chunk chunk = this.chunks.get(LongHash.toLong(i, j)); // MineHQ if (chunk != null && chunk.world.paperSpigotConfig.useAsyncLighting && (chunk.pendingLightUpdates.get() > 0 || chunk.world.getTime() - chunk.lightUpdateTime < 20)) { return; } @@ -120,7 +119,7 @@ public class ChunkProviderServer implements IChunkProvider { // CraftBukkit start - Add async variant, provide compatibility public Chunk getChunkIfLoaded(int x, int z) { - return this.chunks.get(x, z); // MineHQ + return this.chunks.get(LongHash.toLong(x, z)); // MineHQ } public Chunk getChunkAt(int i, int j) { @@ -129,7 +128,7 @@ public class ChunkProviderServer implements IChunkProvider { public Chunk getChunkAt(int i, int j, Runnable runnable) { this.unloadQueue.remove(i, j); - Chunk chunk = this.chunks.get(i, j); // MineHQ + Chunk chunk = this.chunks.get(LongHash.toLong(i, j)); // MineHQ ChunkRegionLoader loader = null; if (this.f instanceof ChunkRegionLoader) { @@ -158,7 +157,7 @@ public class ChunkProviderServer implements IChunkProvider { public Chunk originalGetChunkAt(int i, int j) { this.unloadQueue.remove(i, j); - Chunk chunk = (Chunk) this.chunks.get(i, j); // MineHQ + Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); // MineHQ boolean newChunk = false; if (chunk == null) { @@ -183,7 +182,7 @@ public class ChunkProviderServer implements IChunkProvider { newChunk = true; // CraftBukkit } - this.chunks.put(i, j, chunk); // CraftBukkit // MineHQ + this.chunks.put(LongHash.toLong(i, j), chunk); // CraftBukkit // MineHQ chunk.addEntities(); // CraftBukkit start @@ -221,7 +220,7 @@ public class ChunkProviderServer implements IChunkProvider { public Chunk getOrCreateChunk(int i, int j) { // CraftBukkit start - Chunk chunk = (Chunk) this.chunks.get(i, j); // MineHQ + Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); // MineHQ chunk = chunk == null ? (!this.world.isLoading && !this.forceChunkLoad ? this.emptyChunk : this.getChunkAt(i, j)) : chunk; if (chunk == this.emptyChunk) return chunk; @@ -381,7 +380,7 @@ public class ChunkProviderServer implements IChunkProvider { int locX = LongHash.msw(chunkcoordinates); int locZ = LongHash.lsw(chunkcoordinates); nanoStart = System.nanoTime(); - Chunk chunk = this.chunks.get(locX, locZ); + Chunk chunk = this.chunks.get(LongHash.toLong(locX, locZ)); chunksGet += System.nanoTime() - nanoStart; // MineHQ end if (chunk == null) continue; diff --git a/src/main/java/net/minecraft/server/Container.java b/src/main/java/net/minecraft/server/Container.java index 5cc23bab0..da16a482f 100644 --- a/src/main/java/net/minecraft/server/Container.java +++ b/src/main/java/net/minecraft/server/Container.java @@ -61,7 +61,7 @@ public abstract class Container { } public List a() { - ArrayList arraylist = new ArrayList(); + ArrayList arraylist = new ArrayList(this.c.size()); // Velt for (int i = 0; i < this.c.size(); ++i) { arraylist.add(((Slot) this.c.get(i)).getItem()); @@ -75,7 +75,7 @@ public abstract class Container { ItemStack itemstack = ((Slot) this.c.get(i)).getItem(); ItemStack itemstack1 = (ItemStack) this.b.get(i); - if (!ItemStack.fastMatches(itemstack1, itemstack) || (tickCount % 5 == 0 && !ItemStack.matches(itemstack1, itemstack))) { // Spigot + if (!ItemStack.fastMatches(itemstack1, itemstack) || (tickCount % 20 == 0 && !ItemStack.matches(itemstack1, itemstack))) { // Spigot itemstack1 = itemstack == null ? null : itemstack.cloneItemStack(); this.b.set(i, itemstack1); diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java index f93b00778..625358293 100644 --- a/src/main/java/net/minecraft/server/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/DedicatedServer.java @@ -7,6 +7,7 @@ import java.net.Proxy; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Queue; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; // PaperSpigot @@ -23,10 +24,12 @@ import org.bukkit.craftbukkit.SpigotTimings; // Spigot import org.bukkit.event.server.ServerCommandEvent; // CraftBukkit end +import net.minecraft.util.com.google.common.collect.Queues; + public class DedicatedServer extends MinecraftServer implements IMinecraftServer { private static final Logger i = LogManager.getLogger(); - private final List j = Collections.synchronizedList(new ArrayList()); + private final Queue commandsQueue = Queues.newConcurrentLinkedQueue(); private RemoteStatusListener k; private RemoteControlListener l; public PropertyManager propertyManager; // CraftBukkit - private -> public @@ -302,23 +305,26 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer } public void issueCommand(String s, ICommandListener icommandlistener) { - this.j.add(new ServerCommand(s, icommandlistener)); + this.commandsQueue.add(new ServerCommand(s, icommandlistener)); } public void aB() { SpigotTimings.serverCommandTimer.startTiming(); // Spigot - while (!this.j.isEmpty()) { - ServerCommand servercommand = (ServerCommand) this.j.remove(0); + // Velt start - better server command queue + ServerCommand queuedCommand; + while ((queuedCommand = this.commandsQueue.poll()) != null) { // CraftBukkit start - ServerCommand for preprocessing - ServerCommandEvent event = new ServerCommandEvent(this.console, servercommand.command); + ServerCommandEvent event = new ServerCommandEvent(this.console, queuedCommand.command); this.server.getPluginManager().callEvent(event); - servercommand = new ServerCommand(event.getCommand(), servercommand.source); + queuedCommand = new ServerCommand(event.getCommand(), queuedCommand.source); // this.getCommandHandler().a(servercommand.source, servercommand.command); // Called in dispatchServerCommand - this.server.dispatchServerCommand(this.console, servercommand); + this.server.dispatchServerCommand(this.console, queuedCommand); // CraftBukkit end } + // Velt end + SpigotTimings.serverCommandTimer.stopTiming(); // Spigot } diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java index 4430227b9..b6183f057 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -174,7 +174,7 @@ public abstract class EntityLiving extends Entity { boolean flag = this instanceof EntityHuman && ((EntityHuman) this).abilities.isInvulnerable; - if (this.isAlive() && this.inWater) { + if (this.isAlive() && this.inWater && this.a(Material.WATER)) { if (!this.aE() && !flag && !this.hasEffect(MobEffectList.WATER_BREATHING.id)) { this.setAirTicks(this.j(this.getAirTicks())); if (this.getAirTicks() == -20) { diff --git a/src/main/java/net/minecraft/server/EntityPainting.java b/src/main/java/net/minecraft/server/EntityPainting.java index 2c3a233db..77ba1f7b7 100644 --- a/src/main/java/net/minecraft/server/EntityPainting.java +++ b/src/main/java/net/minecraft/server/EntityPainting.java @@ -13,8 +13,8 @@ public class EntityPainting extends EntityHanging { public EntityPainting(World world, int i, int j, int k, int l) { super(world, i, j, k, l); - ArrayList arraylist = new ArrayList(); EnumArt[] aenumart = EnumArt.values(); + ArrayList arraylist = new ArrayList(aenumart.length); int i1 = aenumart.length; for (int j1 = 0; j1 < i1; ++j1) { diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java index 5a36be196..5bd9ca430 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -1,5 +1,6 @@ package net.minecraft.server; +import net.frozenorb.util.BlockUtil; import net.minecraft.util.com.google.common.base.Charsets; import net.minecraft.util.com.google.common.collect.Lists; import net.minecraft.util.io.netty.buffer.Unpooled; @@ -25,12 +26,16 @@ import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.inventory.*; import org.bukkit.event.inventory.InventoryType.SlotType; import org.bukkit.event.player.*; +import org.bukkit.event.player.GuardianEvent.DisplayLevel; import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.InventoryView; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import org.bukkit.util.NumberConversions; import org.github.paperspigot.PaperSpigotConfig; import org.spigotmc.SpigotConfig; +import com.google.common.collect.Collections2; import com.google.common.collect.Sets; import java.io.ByteArrayInputStream; @@ -196,6 +201,12 @@ public class PlayerConnection implements PacketPlayInListener { private int flyModuleGAmount; private int fastFallModuleGAmount; // Guardian end + + // AGC start + private int legalMovements = 0; + private int illegalMovements = 0; + private int suspiciousHeightMovements = 0; + // AGC end // Alfie start private static Set glitchBlocks = Sets.newHashSet(Block.getById(13), @@ -472,6 +483,86 @@ public class PlayerConnection implements PacketPlayInListener { double delta = Math.pow(this.lastPosX - to.getX(), 2) + Math.pow(this.lastPosY - to.getY(), 2) + Math.pow(this.lastPosZ - to.getZ(), 2); float deltaAngle = Math.abs(this.lastYaw - to.getYaw()) + Math.abs(this.lastPitch - to.getPitch()); + // AGC start + if (packetplayinflying.hasPos && delta > 0.0 && this.checkMovement && !this.player.dead) { + if (!player.getAllowFlight() && !player.isInsideVehicle() && this.player.lastDamageByPlayerTime + 100 < MinecraftServer.currentTick && this.lastVelocitySentTick + 100 < MinecraftServer.currentTick) { + final double offsetHSquared = Math.pow(to.getX() - from.getX(), 2) + Math.pow(to.getZ() - from.getZ(), 2); + int speed = 0; + for (final PotionEffect effect : this.player.getBukkitEntity().getActivePotionEffects()) { + if (effect.getType().equals(PotionEffectType.SPEED)) { + speed = effect.getAmplifier() + 1; + break; + } + } + + double limit; + if (BlockUtil.isOnGround(to, 0) || BlockUtil.isOnGround(to, 1)) { + limit = 0.34; + if (BlockUtil.isOnStairs(to, 0) || BlockUtil.isOnStairs(to, 1)) { + limit = 0.45; + } else if (BlockUtil.isOnIce(to, 0) || BlockUtil.isOnIce(to, 1)) { + if (BlockUtil.isOnGround(to, -2)) { + limit = 1.3; + } else { + limit = 0.65; + } + } else if (BlockUtil.isOnGround(to, -2)) { + limit = 0.7; + } + limit += ((player.getWalkSpeed() > 0.2f) ? (player.getWalkSpeed() * 10.0f * 0.33f) : 0.0f); + limit += 0.06 * speed; + } else { + limit = 0.36; + if (BlockUtil.isOnStairs(to, 0) || BlockUtil.isOnStairs(to, 1)) { + limit = 0.45; + } else if (BlockUtil.isOnIce(to, 0) || BlockUtil.isOnIce(to, 1)) { + if (BlockUtil.isOnGround(to, -2)) { + limit = 1.3; + } else { + limit = 0.65; + } + } else if (BlockUtil.isOnGround(to, -2)) { + limit = 0.7; + } + + limit += ((player.getWalkSpeed() > 0.2f) ? (player.getWalkSpeed() * 10.0f * 0.33f) : 0.0f); + limit += 0.02 * speed; + } if (offsetHSquared > Math.pow(limit, 2)) { + ++this.illegalMovements; + } else { + ++this.legalMovements; + } + + final int total = this.illegalMovements + this.legalMovements; + if (total >= 20) { + final double percentage = this.illegalMovements / 20.0 * 100.0; + if (percentage >= 45.0) { + String message = String.format("%s is flying at %.1f %.1f %.1f. [%d%%]", this.player.getName(), to.getX(), to.getY(), to.getZ(), (int) percentage); + Bukkit.getPluginManager().callEvent(new GuardianEvent(player, GuardianEvent.Cheat.FLY_HACKS, "E", DisplayLevel.HIGH, message, to)); + } + + this.illegalMovements = 0; + this.legalMovements = 0; + } + } + + if (!player.getAllowFlight() && this.player.vehicle == null && !this.player.inWater && !BlockUtil.isOnGround(to, 0) && !BlockUtil.isOnGround(to, 1)) { + if ((from.getX() != to.getX() || from.getZ() != to.getZ()) && to.getY() == from.getY()) { + if (10 <= ++this.suspiciousHeightMovements) { + final double offsetH = Math.hypot(from.getX() - to.getX(), from.getZ() - to.getZ()); + String message = String.format("%s failed Fly Check G. H %.2f. VL %s.", this.player.getName(), offsetH, this.suspiciousHeightMovements); + Bukkit.getPluginManager().callEvent(new GuardianEvent(player, GuardianEvent.Cheat.FLY_HACKS, "G", DisplayLevel.HIGH, message, to)); + this.suspiciousHeightMovements = 0; + } + } else { + this.suspiciousHeightMovements = 0; + } + } else { + this.suspiciousHeightMovements = 0; + } + } + // AGC end + // Guardian start float f4 = 0.0625F; AxisAlignedBB axisalignedbb = this.player.boundingBox.clone().grow(f4, f4, f4).a(0.0D, -0.55D, 0.0D); @@ -1820,26 +1911,30 @@ public class PlayerConnection implements PacketPlayInListener { this.player.v(); if (packetplayinarmanimation.d() == 1) { // CraftBukkit start - Raytrace to look for 'rogue armswings' - float f = 1.0F; - float f1 = this.player.lastPitch + (this.player.pitch - this.player.lastPitch) * f; - float f2 = this.player.lastYaw + (this.player.yaw - this.player.lastYaw) * f; - double d0 = this.player.lastX + (this.player.locX - this.player.lastX) * (double) f; - double d1 = this.player.lastY + (this.player.locY - this.player.lastY) * (double) f + 1.62D - (double) this.player.height; - double d2 = this.player.lastZ + (this.player.locZ - this.player.lastZ) * (double) f; - Vec3D vec3d = Vec3D.a(d0, d1, d2); - - float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); - float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); - float f5 = -MathHelper.cos(-f1 * 0.017453292F); - float f6 = MathHelper.sin(-f1 * 0.017453292F); - float f7 = f4 * f5; - float f8 = f3 * f5; - double d3 = player.playerInteractManager.getGameMode() == EnumGamemode.CREATIVE ? 5.0D : 4.5D; // Spigot - Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); - MovingObjectPosition movingobjectposition = this.player.world.rayTrace(vec3d, vec3d1, false); - - if (movingobjectposition == null || movingobjectposition.type != EnumMovingObjectType.BLOCK) { - CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.inventory.getItemInHand()); + + // we only ever use this event when players are sneaking so why raytrace for no reason + if (this.player.isSneaking()) { + float f = 1.0F; + float f1 = this.player.lastPitch + (this.player.pitch - this.player.lastPitch) * f; + float f2 = this.player.lastYaw + (this.player.yaw - this.player.lastYaw) * f; + double d0 = this.player.lastX + (this.player.locX - this.player.lastX) * (double) f; + double d1 = this.player.lastY + (this.player.locY - this.player.lastY) * (double) f + 1.62D - (double) this.player.height; + double d2 = this.player.lastZ + (this.player.locZ - this.player.lastZ) * (double) f; + Vec3D vec3d = Vec3D.a(d0, d1, d2); + + float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); + float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); + float f5 = -MathHelper.cos(-f1 * 0.017453292F); + float f6 = MathHelper.sin(-f1 * 0.017453292F); + float f7 = f4 * f5; + float f8 = f3 * f5; + double d3 = player.playerInteractManager.getGameMode() == EnumGamemode.CREATIVE ? 5.0D : 4.5D; // Spigot + Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); + MovingObjectPosition movingobjectposition = this.player.world.rayTrace(vec3d, vec3d1, false); + + if (movingobjectposition == null || movingobjectposition.type != EnumMovingObjectType.BLOCK) { + CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.inventory.getItemInHand()); + } } // Arm swing animation @@ -2331,7 +2426,7 @@ public class PlayerConnection implements PacketPlayInListener { this.n.a(this.player.activeContainer.windowId, Short.valueOf(packetplayinwindowclick.f())); this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinwindowclick.c(), packetplayinwindowclick.f(), false)); this.player.activeContainer.a(this.player, false); - ArrayList arraylist = new ArrayList(); + ArrayList arraylist = new ArrayList(this.player.activeContainer.c.size()); // Velt for (int i = 0; i < this.player.activeContainer.c.size(); ++i) { arraylist.add(((Slot) this.player.activeContainer.c.get(i)).getItem()); diff --git a/src/main/java/net/minecraft/server/TileEntityBeacon.java b/src/main/java/net/minecraft/server/TileEntityBeacon.java index 198f9087f..570b72432 100644 --- a/src/main/java/net/minecraft/server/TileEntityBeacon.java +++ b/src/main/java/net/minecraft/server/TileEntityBeacon.java @@ -59,12 +59,9 @@ public class TileEntityBeacon extends TileEntity implements IInventory { if (this.l >= 4 && this.m == this.n) { b0 = 1; } - - AxisAlignedBB axisalignedbb = AxisAlignedBB.a((double) this.x, (double) this.y, (double) this.z, (double) (this.x + 1), (double) (this.y + 1), (double) (this.z + 1)).grow(d0, d0, d0); - - axisalignedbb.e = (double) this.world.getHeight(); - List list = this.world.a(EntityHuman.class, axisalignedbb); - Iterator iterator = list.iterator(); + + List list = world.playerMap.getNearbyPlayersIgnoreHeight(this.x, this.y, this.z, d0); + Iterator iterator = list.iterator(); EntityHuman entityhuman; @@ -123,16 +120,6 @@ public class TileEntityBeacon extends TileEntity implements IInventory { this.k = false; } } - - if (!this.world.isStatic && this.l == 4 && i < this.l) { - Iterator iterator = this.world.a(EntityHuman.class, AxisAlignedBB.a((double) this.x, (double) this.y, (double) this.z, (double) this.x, (double) (this.y - 4), (double) this.z).grow(10.0D, 5.0D, 10.0D)).iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - entityhuman.a((Statistic) AchievementList.K); - } - } } public int j() { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 539d86b49..f5f48a8ff 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -290,7 +290,7 @@ public class CraftWorld implements World { } world.chunkProviderServer.unloadQueue.remove(x, z); - net.minecraft.server.Chunk chunk = world.chunkProviderServer.chunks.get(x, z); // MineHQ + net.minecraft.server.Chunk chunk = world.chunkProviderServer.chunks.get(LongHash.toLong(x, z)); // MineHQ if (chunk == null) { world.timings.syncChunkLoadTimer.startTiming(); // Spigot @@ -304,7 +304,7 @@ public class CraftWorld implements World { private void chunkLoadPostProcess(net.minecraft.server.Chunk chunk, int x, int z) { if (chunk != null) { - world.chunkProviderServer.chunks.put(x, z, chunk); // MineHQ + world.chunkProviderServer.chunks.put(LongHash.toLong(x, z), chunk); // MineHQ chunk.addEntities(); diff --git a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java index 8c6f2a221..5de79d4bb 100644 --- a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java +++ b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java @@ -36,7 +36,7 @@ class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider leftover = new HashMap(); + for (ItemStack item : items) { + Bukkit.getLogger().info("Removing item " + item.getType().toString() + "."); + new Throwable().printStackTrace(); + } + // TODO: optimization for (int i = 0; i < items.length; i++) { diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java index de0ecb496..b7cf36b44 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java @@ -3,6 +3,7 @@ package org.bukkit.craftbukkit.inventory; import java.util.HashMap; import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.HumanEntity; @@ -194,6 +195,14 @@ public class CraftInventoryPlayer extends CraftInventory implements org.bukkit.i @Override public HashMap removeItem(ItemStack... items) { HashMap leftover = super.removeItem(items); + + for (ItemStack item : items) { + if (item != null) { + Bukkit.getLogger().info("Removing item " + item.getType().toString() + "."); + new Throwable().printStackTrace(); + } + } + this.updatePlayerInventory(); return leftover; } @@ -201,6 +210,12 @@ public class CraftInventoryPlayer extends CraftInventory implements org.bukkit.i @Override public void remove(ItemStack item) { super.remove(item); + + if (item != null) { + Bukkit.getLogger().info("Removing item " + item.getType().toString() + "."); + new Throwable().printStackTrace(); + } + this.updatePlayerInventory(); } diff --git a/src/main/java/org/spigotmc/CachedMojangAPIConnection.java b/src/main/java/org/spigotmc/CachedMojangAPIConnection.java index 42edebabd..b58371989 100644 --- a/src/main/java/org/spigotmc/CachedMojangAPIConnection.java +++ b/src/main/java/org/spigotmc/CachedMojangAPIConnection.java @@ -30,7 +30,7 @@ public class CachedMojangAPIConnection extends HttpURLConnection private static final Cache cache = CacheBuilder.newBuilder() .maximumSize( 10000 ) - .expireAfterAccess( 1, TimeUnit.HOURS ) + .expireAfterAccess( 30, TimeUnit.MINUTES ) .build(); public CachedMojangAPIConnection(CachedStreamHandlerFactory.CachedStreamHandler cachedStreamHandler, URL url, Proxy proxy) diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java index 7586a0aae..f76784188 100644 --- a/src/main/java/org/spigotmc/SpigotConfig.java +++ b/src/main/java/org/spigotmc/SpigotConfig.java @@ -208,7 +208,7 @@ public class SpigotConfig outdatedServerMessage = transform( getString( "messages.outdated-server", outdatedServerMessage ) ); } - public static int timeoutTime = 60; + public static int timeoutTime = 10; public static boolean restartOnCrash = true; public static String restartScript = "./start.sh"; public static String restartMessage; @@ -244,12 +244,10 @@ public class SpigotConfig lateBind = getBoolean( "settings.late-bind", false ); } - public static boolean disableStatSaving; + public static boolean disableStatSaving = true; public static TObjectIntHashMap forcedStats = new TObjectIntHashMap(); private static void stats() { - disableStatSaving = getBoolean( "stats.disable-saving", false ); - if ( !config.contains( "stats.forced-stats" ) ) { config.createSection( "stats.forced-stats" ); } @@ -265,9 +263,7 @@ public class SpigotConfig if ( disableStatSaving && section.getInt( "achievement.openInventory", 0 ) < 1 ) { - Bukkit.getLogger().warning( "*** WARNING *** stats.disable-saving is true but stats.forced-stats.achievement.openInventory" + - " isn't set to 1. Disabling stat saving without forcing the achievement may cause it to get stuck on the player's " + - "screen." ); + forcedStats.put("achievement.openInventory", 1); } } diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java index 94a3d4237..0a588ac6b 100644 --- a/src/main/java/org/spigotmc/WatchdogThread.java +++ b/src/main/java/org/spigotmc/WatchdogThread.java @@ -80,16 +80,19 @@ public class WatchdogThread extends Thread } log.log( Level.SEVERE, "------------------------------" ); - if ( restart ) - { - RestartCommand.restart(); - } + /* + * Let's try and interrupt the main thread + * + * */ + + MinecraftServer.getServer().primaryThread.interrupt(); + break; } try { - sleep( 10000 ); + sleep( 1000 ); } catch ( InterruptedException ex ) { interrupt(); -- 2.15.2 (Apple Git-101.1)