2016-06-23 04:18:41 +02:00
|
|
|
From 39d7a1ae851dc10f15ff92f7bd248b0a784e20dd Mon Sep 17 00:00:00 2001
|
2016-03-29 03:01:42 +02:00
|
|
|
From: Aikar <aikar@aikar.co>
|
|
|
|
Date: Mon, 28 Mar 2016 20:55:47 -0400
|
|
|
|
Subject: [PATCH] MC Utils
|
|
|
|
|
|
|
|
|
2016-06-18 08:03:40 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
2016-06-23 04:18:41 +02:00
|
|
|
index 4542987..b651edc 100644
|
2016-06-18 08:03:40 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
2016-06-23 04:18:41 +02:00
|
|
|
@@ -675,6 +675,7 @@ public class Chunk {
|
2016-06-18 08:03:40 +02:00
|
|
|
return !block.isTileEntity() ? null : ((ITileEntity) block).a(this.world, iblockdata.getBlock().toLegacyData(iblockdata));
|
|
|
|
}
|
|
|
|
|
|
|
|
+ @Nullable public final TileEntity getTileEntityImmediately(BlockPosition pos) { return this.a(pos, EnumTileEntityState.IMMEDIATE); } // Paper - OBFHELPER
|
|
|
|
@Nullable
|
|
|
|
public TileEntity a(BlockPosition blockposition, Chunk.EnumTileEntityState chunk_enumtileentitystate) {
|
|
|
|
// CraftBukkit start
|
2016-03-29 03:01:42 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java
|
|
|
|
new file mode 100644
|
2016-06-18 08:03:40 +02:00
|
|
|
index 0000000..fe7b476
|
2016-03-29 03:01:42 +02:00
|
|
|
--- /dev/null
|
|
|
|
+++ b/src/main/java/net/minecraft/server/MCUtil.java
|
2016-06-18 08:03:40 +02:00
|
|
|
@@ -0,0 +1,199 @@
|
2016-03-29 03:01:42 +02:00
|
|
|
+package net.minecraft.server;
|
|
|
|
+
|
2016-05-17 02:50:09 +02:00
|
|
|
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
2016-03-29 03:01:42 +02:00
|
|
|
+import org.bukkit.Location;
|
2016-05-28 04:28:23 +02:00
|
|
|
+import org.bukkit.craftbukkit.util.Waitable;
|
|
|
|
+import org.spigotmc.AsyncCatcher;
|
2016-03-29 03:01:42 +02:00
|
|
|
+
|
2016-05-13 07:34:37 +02:00
|
|
|
+import javax.annotation.Nullable;
|
2016-05-28 04:28:23 +02:00
|
|
|
+import java.util.concurrent.ExecutionException;
|
2016-05-17 02:50:09 +02:00
|
|
|
+import java.util.concurrent.Executor;
|
|
|
|
+import java.util.concurrent.Executors;
|
2016-05-28 04:28:23 +02:00
|
|
|
+import java.util.function.Supplier;
|
2016-03-29 03:01:42 +02:00
|
|
|
+import java.util.regex.Pattern;
|
|
|
|
+
|
2016-05-14 04:27:20 +02:00
|
|
|
+public final class MCUtil {
|
2016-03-29 03:01:42 +02:00
|
|
|
+ private static final Pattern REPLACE_QUOTES = Pattern.compile("\"");
|
2016-05-23 04:14:17 +02:00
|
|
|
+ private static final Executor asyncExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("Paper Async Task Handler Thread - %1$d").build());
|
2016-03-29 03:01:42 +02:00
|
|
|
+
|
|
|
|
+ private MCUtil() {}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Builds a chat componenent from a string.
|
|
|
|
+ * @param str
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static IChatBaseComponent cmpFromMessage(String str) {
|
2016-04-11 07:06:28 +02:00
|
|
|
+ return IChatBaseComponent.ChatSerializer.a("{\"text\":\"" + REPLACE_QUOTES.matcher(str).replaceAll("\\\"") + "\"}");
|
2016-03-29 03:01:42 +02:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
2016-05-28 04:28:23 +02:00
|
|
|
+ * Ensures the target code is running on the main thread
|
|
|
|
+ * @param reason
|
|
|
|
+ * @param run
|
|
|
|
+ * @param <T>
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static <T> T ensureMain(String reason, Supplier<T> run) {
|
|
|
|
+ if (AsyncCatcher.enabled && Thread.currentThread() != MinecraftServer.getServer().primaryThread) {
|
|
|
|
+ new IllegalStateException( "Asynchronous " + reason + "! Blocking thread until it returns ").printStackTrace();
|
|
|
|
+ Waitable<T> wait = new Waitable<T>() {
|
|
|
|
+ @Override
|
|
|
|
+ protected T evaluate() {
|
|
|
|
+ return run.get();
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ MinecraftServer.getServer().processQueue.add(wait);
|
|
|
|
+ try {
|
|
|
|
+ return wait.get();
|
|
|
|
+ } catch (InterruptedException | ExecutionException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ return run.get();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
2016-03-29 03:01:42 +02:00
|
|
|
+ * Calculates distance between 2 entities
|
|
|
|
+ * @param e1
|
|
|
|
+ * @param e2
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static double distance(Entity e1, Entity e2) {
|
|
|
|
+ return Math.sqrt(distanceSq(e1, e2));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Calculates distance between 2 block positions
|
|
|
|
+ * @param e1
|
|
|
|
+ * @param e2
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static double distance(BlockPosition e1, BlockPosition e2) {
|
|
|
|
+ return Math.sqrt(distanceSq(e1, e2));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Gets the distance between 2 positions
|
|
|
|
+ * @param x1
|
|
|
|
+ * @param y1
|
|
|
|
+ * @param z1
|
|
|
|
+ * @param x2
|
|
|
|
+ * @param y2
|
|
|
|
+ * @param z2
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static double distance(double x1, double y1, double z1, double x2, double y2, double z2) {
|
|
|
|
+ return Math.sqrt(distanceSq(x1, y1, z1, x2, y2, z2));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Get's the distance squared between 2 entities
|
|
|
|
+ * @param e1
|
|
|
|
+ * @param e2
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static double distanceSq(Entity e1, Entity e2) {
|
|
|
|
+ return distanceSq(e1.locX,e1.locY,e1.locZ, e2.locX,e2.locY,e2.locZ);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Gets the distance sqaured between 2 block positions
|
|
|
|
+ * @param pos1
|
|
|
|
+ * @param pos2
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static double distanceSq(BlockPosition pos1, BlockPosition pos2) {
|
|
|
|
+ return distanceSq(pos1.getX(), pos1.getY(), pos1.getZ(), pos2.getX(), pos2.getY(), pos2.getZ());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Gets the distance squared between 2 positions
|
|
|
|
+ * @param x1
|
|
|
|
+ * @param y1
|
|
|
|
+ * @param z1
|
|
|
|
+ * @param x2
|
|
|
|
+ * @param y2
|
|
|
|
+ * @param z2
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static double distanceSq(double x1, double y1, double z1, double x2, double y2, double z2) {
|
|
|
|
+ return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Converts a NMS World/BlockPosition to Bukkit Location
|
|
|
|
+ * @param world
|
|
|
|
+ * @param pos
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static Location toLocation(World world, BlockPosition pos) {
|
|
|
|
+ return new Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Converts an NMS entity's current location to a Bukkit Location
|
|
|
|
+ * @param entity
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static Location toLocation(Entity entity) {
|
|
|
|
+ return new Location(entity.getWorld().getWorld(), entity.locX, entity.locY, entity.locZ);
|
|
|
|
+ }
|
2016-04-01 01:29:06 +02:00
|
|
|
+
|
2016-04-16 03:31:12 +02:00
|
|
|
+ public static BlockPosition toBlockPosition(Location loc) {
|
|
|
|
+ return new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
|
|
|
|
+ }
|
|
|
|
+
|
2016-04-01 01:29:06 +02:00
|
|
|
+ public static boolean isEdgeOfChunk(BlockPosition pos) {
|
2016-04-01 03:43:37 +02:00
|
|
|
+ final int modX = pos.getX() & 15;
|
|
|
|
+ final int modZ = pos.getZ() & 15;
|
|
|
|
+ return (modX == 0 || modX == 15 || modZ == 0 || modZ == 15);
|
2016-04-01 01:29:06 +02:00
|
|
|
+ }
|
2016-05-13 07:34:37 +02:00
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Gets a chunk without changing its boolean for should unload
|
|
|
|
+ * @param world
|
|
|
|
+ * @param x
|
|
|
|
+ * @param z
|
|
|
|
+ * @return
|
|
|
|
+ */
|
2016-06-18 08:03:40 +02:00
|
|
|
+ @Nullable
|
|
|
|
+ public static Chunk getLoadedChunkWithoutMarkingActive(World world, int x, int z) {
|
2016-05-13 07:34:37 +02:00
|
|
|
+ return ((ChunkProviderServer) world.chunkProvider).chunks.get(ChunkCoordIntPair.a(x, z));
|
|
|
|
+ }
|
2016-05-14 04:27:20 +02:00
|
|
|
+
|
2016-05-13 07:34:37 +02:00
|
|
|
+ /**
|
|
|
|
+ * Gets a chunk without changing its boolean for should unload
|
|
|
|
+ * @param provider
|
|
|
|
+ * @param x
|
|
|
|
+ * @param z
|
|
|
|
+ * @return
|
|
|
|
+ */
|
2016-06-18 08:03:40 +02:00
|
|
|
+ @Nullable
|
|
|
|
+ public static Chunk getLoadedChunkWithoutMarkingActive(IChunkProvider provider, int x, int z) {
|
2016-05-14 04:27:20 +02:00
|
|
|
+ return ((ChunkProviderServer)provider).chunks.get(ChunkCoordIntPair.a(x, z));
|
2016-05-13 07:34:37 +02:00
|
|
|
+ }
|
2016-05-17 02:50:09 +02:00
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Posts a task to be executed asynchronously
|
|
|
|
+ * @param run
|
|
|
|
+ */
|
|
|
|
+ public static void scheduleAsyncTask(Runnable run) {
|
|
|
|
+ asyncExecutor.execute(run);
|
|
|
|
+ }
|
2016-06-18 08:03:40 +02:00
|
|
|
+
|
|
|
|
+ @Nullable
|
|
|
|
+ public static TileEntityHopper getHopper(World world, BlockPosition pos) {
|
|
|
|
+ Chunk chunk = world.getChunkIfLoaded(pos.getX() >> 4, pos.getZ() >> 4);
|
|
|
|
+ if (chunk != null && chunk.getBlockData(pos).getBlock() == Blocks.HOPPER) {
|
|
|
|
+ TileEntity tileEntity = chunk.getTileEntityImmediately(pos);
|
|
|
|
+ if (tileEntity instanceof TileEntityHopper) {
|
|
|
|
+ return (TileEntityHopper) tileEntity;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
2016-03-29 03:01:42 +02:00
|
|
|
+}
|
2016-05-02 05:54:08 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/NBTTagCompound.java b/src/main/java/net/minecraft/server/NBTTagCompound.java
|
2016-06-09 05:57:14 +02:00
|
|
|
index 154a2d5..f8a624e 100644
|
2016-05-02 05:54:08 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/NBTTagCompound.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/NBTTagCompound.java
|
2016-05-12 04:07:46 +02:00
|
|
|
@@ -13,7 +13,7 @@ import javax.annotation.Nullable;
|
2016-05-02 05:54:08 +02:00
|
|
|
|
|
|
|
public class NBTTagCompound extends NBTBase {
|
|
|
|
|
2016-06-09 05:57:14 +02:00
|
|
|
- private final Map<String, NBTBase> map = Maps.newHashMap();
|
|
|
|
+ public final Map<String, NBTBase> map = Maps.newHashMap(); // Paper
|
2016-05-02 05:54:08 +02:00
|
|
|
|
|
|
|
public NBTTagCompound() {}
|
|
|
|
|
|
|
|
@@ -85,11 +85,13 @@ public class NBTTagCompound extends NBTBase {
|
|
|
|
this.map.put(s, new NBTTagLong(i));
|
|
|
|
}
|
|
|
|
|
|
|
|
+ public void setUUID(String prefix, UUID uuid) { a(prefix, uuid); } // Paper // OBFHELPER
|
|
|
|
public void a(String s, UUID uuid) {
|
|
|
|
this.setLong(s + "Most", uuid.getMostSignificantBits());
|
|
|
|
this.setLong(s + "Least", uuid.getLeastSignificantBits());
|
|
|
|
}
|
|
|
|
|
|
|
|
+ public UUID getUUID(String prefix) { return a(prefix); } // Paper // OBFHELPER
|
2016-05-12 04:07:46 +02:00
|
|
|
@Nullable
|
2016-05-02 05:54:08 +02:00
|
|
|
public UUID a(String s) {
|
|
|
|
return new UUID(this.getLong(s + "Most"), this.getLong(s + "Least"));
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/NBTTagList.java b/src/main/java/net/minecraft/server/NBTTagList.java
|
2016-06-09 05:57:14 +02:00
|
|
|
index 13b93a4..ffe2353 100644
|
2016-05-02 05:54:08 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/NBTTagList.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/NBTTagList.java
|
|
|
|
@@ -12,7 +12,7 @@ import org.apache.logging.log4j.Logger;
|
|
|
|
public class NBTTagList extends NBTBase {
|
|
|
|
|
|
|
|
private static final Logger b = LogManager.getLogger();
|
|
|
|
- private List<NBTBase> list = Lists.newArrayList();
|
|
|
|
+ public List<NBTBase> list = Lists.newArrayList(); // Paper
|
|
|
|
private byte type = 0;
|
|
|
|
|
|
|
|
public NBTTagList() {}
|
2016-03-29 03:01:42 +02:00
|
|
|
--
|
2016-06-23 04:18:41 +02:00
|
|
|
2.9.0
|
2016-03-29 03:01:42 +02:00
|
|
|
|