diff --git a/.gitignore b/.gitignore
index 682f887..71a2670 100644
--- a/.gitignore
+++ b/.gitignore
@@ -82,6 +82,7 @@ local.properties
### Intellij ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+.idea
# User-specific stuff:
.idea/workspace.xml
diff --git a/Plugin/pom.xml b/Plugin/pom.xml
index 8f51601..cf9df7b 100644
--- a/Plugin/pom.xml
+++ b/Plugin/pom.xml
@@ -4,7 +4,7 @@
com.lishid
orebfuscator
- 4.2.2-SNAPSHOT
+ 4.3.0-SNAPSHOT
jar
Orebfuscator4
@@ -81,6 +81,14 @@
compile
true
+
+ com.lishid
+ orebfuscator-v1_12_R1
+ v1_12_R1
+ jar
+ compile
+ true
+
diff --git a/Plugin/src/main/java/com/lishid/orebfuscator/Orebfuscator.java b/Plugin/src/main/java/com/lishid/orebfuscator/Orebfuscator.java
index 06d1cfe..22d5286 100644
--- a/Plugin/src/main/java/com/lishid/orebfuscator/Orebfuscator.java
+++ b/Plugin/src/main/java/com/lishid/orebfuscator/Orebfuscator.java
@@ -117,8 +117,11 @@ public class Orebfuscator extends JavaPlugin {
private static INmsManager createNmsManager() {
String serverVersion = org.bukkit.Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
-
- if(serverVersion.equals("v1_11_R1")) {
+
+ if(serverVersion.equals("v1_12_R1")) {
+ return new com.lishid.orebfuscator.nms.v1_12_R1.NmsManager();
+ }
+ else if(serverVersion.equals("v1_11_R1")) {
return new com.lishid.orebfuscator.nms.v1_11_R1.NmsManager();
}
else if(serverVersion.equals("v1_10_R1")) {
diff --git a/pom.xml b/pom.xml
index a3ec8ca..5b86f34 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,14 +30,19 @@
- Plugin
+ API
v1_9_R1
v1_9_R2
v1_10_R1
v1_11_R1
- API
+ v1_12_R1
+ Plugin
+
+ clean install
+
+
scm:git:git://github.com/lishid/Orebfuscator.git
scm:git:git@github.com:lishid/Orebfuscator.git
diff --git a/v1_12_R1/pom.xml b/v1_12_R1/pom.xml
new file mode 100644
index 0000000..aab8e27
--- /dev/null
+++ b/v1_12_R1/pom.xml
@@ -0,0 +1,46 @@
+
+ 4.0.0
+ com.lishid
+ orebfuscator-v1_12_R1
+ v1_12_R1
+ jar
+ Orebfuscator4 v1_12_R1
+
+
+ com.lishid.parent
+ orebfuscator-parent
+ parent
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.1
+
+ 1.7
+ 1.7
+
+
+
+
+
+
+
+ org.spigotmc
+ spigot
+ 1.12-pre2-SNAPSHOT
+ provided
+ true
+
+
+ com.lishid
+ orebfuscator-api
+ API
+ jar
+
+
+
+
diff --git a/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/BlockInfo.java b/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/BlockInfo.java
new file mode 100644
index 0000000..3b51194
--- /dev/null
+++ b/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/BlockInfo.java
@@ -0,0 +1,65 @@
+/**
+ * @author Aleksey Terzi
+ *
+ */
+
+package com.lishid.orebfuscator.nms.v1_12_R1;
+
+import net.minecraft.server.v1_12_R1.Block;
+import net.minecraft.server.v1_12_R1.IBlockData;
+
+import com.lishid.orebfuscator.nms.IBlockInfo;
+
+public class BlockInfo implements IBlockInfo {
+ private int x;
+ private int y;
+ private int z;
+ private IBlockData blockData;
+
+ public BlockInfo(int x, int y, int z, IBlockData blockData) {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ this.blockData = blockData;
+ }
+
+ public int getX() {
+ return this.x;
+ }
+
+ public int getY() {
+ return this.y;
+ }
+
+ public int getZ() {
+ return this.z;
+ }
+
+ public int getTypeId() {
+ return Block.getId(this.blockData.getBlock());
+ }
+
+ public IBlockData getBlockData() {
+ return this.blockData;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == null || !(other instanceof BlockInfo)) {
+ return false;
+ }
+ BlockInfo object = (BlockInfo) other;
+
+ return this.x == object.x && this.y == object.y && this.z == object.z;
+ }
+
+ @Override
+ public int hashCode() {
+ return this.x ^ this.y ^ this.z;
+ }
+
+ @Override
+ public String toString() {
+ return this.x + " " + this.y + " " + this.z;
+ }
+}
diff --git a/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/ChunkCache.java b/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/ChunkCache.java
new file mode 100644
index 0000000..3e4bd35
--- /dev/null
+++ b/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/ChunkCache.java
@@ -0,0 +1,85 @@
+/**
+ * @author lishid
+ * @author Aleksey Terzi
+ *
+ */
+
+package com.lishid.orebfuscator.nms.v1_12_R1;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.util.HashMap;
+
+import net.minecraft.server.v1_12_R1.RegionFile;
+
+import com.lishid.orebfuscator.nms.IChunkCache;
+
+public class ChunkCache implements IChunkCache {
+ private static final HashMap cachedRegionFiles = new HashMap();
+
+ private int maxLoadedCacheFiles;
+
+ public ChunkCache(int maxLoadedCacheFiles) {
+ this.maxLoadedCacheFiles = maxLoadedCacheFiles;
+ }
+
+ public DataInputStream getInputStream(File folder, int x, int z) {
+ RegionFile regionFile = getRegionFile(folder, x, z);
+ return regionFile.a(x & 0x1F, z & 0x1F);
+ }
+
+ public DataOutputStream getOutputStream(File folder, int x, int z) {
+ RegionFile regionFile = getRegionFile(folder, x, z);
+ return regionFile.b(x & 0x1F, z & 0x1F);
+ }
+
+ public void closeCacheFiles() {
+ closeCacheFilesInternal();
+ }
+
+ private synchronized RegionFile getRegionFile(File folder, int x, int z) {
+ File path = new File(folder, "region");
+ File file = new File(path, "r." + (x >> 5) + "." + (z >> 5) + ".mcr");
+ try {
+ RegionFile regionFile = cachedRegionFiles.get(file);
+ if (regionFile != null) {
+ return regionFile;
+ }
+
+ if (!path.exists()) {
+ path.mkdirs();
+ }
+
+ if (cachedRegionFiles.size() >= this.maxLoadedCacheFiles) {
+ closeCacheFiles();
+ }
+
+ regionFile = new RegionFile(file);
+ cachedRegionFiles.put(file, regionFile);
+
+ return regionFile;
+ }
+ catch (Exception e) {
+ try {
+ file.delete();
+ }
+ catch (Exception e2) {
+ }
+ }
+ return null;
+ }
+
+ private synchronized void closeCacheFilesInternal() {
+ for (RegionFile regionFile : cachedRegionFiles.values()) {
+ try {
+ if (regionFile != null)
+ regionFile.c();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ cachedRegionFiles.clear();
+ }
+}
diff --git a/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/ChunkManager.java b/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/ChunkManager.java
new file mode 100644
index 0000000..61fa417
--- /dev/null
+++ b/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/ChunkManager.java
@@ -0,0 +1,43 @@
+/**
+ * @author Aleksey Terzi
+ *
+ */
+
+package com.lishid.orebfuscator.nms.v1_12_R1;
+
+import java.util.HashSet;
+
+import net.minecraft.server.v1_12_R1.EntityPlayer;
+import net.minecraft.server.v1_12_R1.PacketPlayOutMapChunk;
+import net.minecraft.server.v1_12_R1.PacketPlayOutUnloadChunk;
+import net.minecraft.server.v1_12_R1.PlayerChunk;
+import net.minecraft.server.v1_12_R1.PlayerChunkMap;
+
+import org.bukkit.entity.Player;
+
+import com.lishid.orebfuscator.nms.IChunkManager;
+
+public class ChunkManager implements IChunkManager {
+ private PlayerChunkMap chunkMap;
+
+ public ChunkManager(PlayerChunkMap chunkMap) {
+ this.chunkMap = chunkMap;
+ }
+
+ public boolean resendChunk(int chunkX, int chunkZ, HashSet affectedPlayers) {
+ if(!this.chunkMap.isChunkInUse(chunkX, chunkZ)) return true;
+
+ PlayerChunk playerChunk = this.chunkMap.getChunk(chunkX, chunkZ);
+
+ if(playerChunk == null || playerChunk.chunk == null || !playerChunk.chunk.isReady()) return false;
+
+ for(EntityPlayer player : playerChunk.c) {
+ player.playerConnection.sendPacket(new PacketPlayOutUnloadChunk(chunkX, chunkZ));
+ player.playerConnection.sendPacket(new PacketPlayOutMapChunk(playerChunk.chunk, 0xffff));
+
+ affectedPlayers.add(player.getBukkitEntity());
+ }
+
+ return true;
+ }
+}
diff --git a/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/NBT.java b/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/NBT.java
new file mode 100644
index 0000000..b766e91
--- /dev/null
+++ b/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/NBT.java
@@ -0,0 +1,73 @@
+/**
+ * @author lishid
+ * @author Aleksey Terzi
+ *
+ */
+
+package com.lishid.orebfuscator.nms.v1_12_R1;
+
+import java.io.DataInput;
+import java.io.DataInputStream;
+import java.io.DataOutput;
+import java.io.IOException;
+
+import net.minecraft.server.v1_12_R1.NBTCompressedStreamTools;
+import net.minecraft.server.v1_12_R1.NBTTagCompound;
+
+import com.lishid.orebfuscator.nms.INBT;
+
+public class NBT implements INBT {
+ NBTTagCompound nbt = new NBTTagCompound();
+
+ public void reset() {
+ nbt = new NBTTagCompound();
+ }
+
+ public void setInt(String tag, int value) {
+ nbt.setInt(tag, value);
+ }
+
+ public void setLong(String tag, long value) {
+ nbt.setLong(tag, value);
+ }
+
+ public void setBoolean(String tag, boolean value) {
+ nbt.setBoolean(tag, value);
+ }
+
+ public void setByteArray(String tag, byte[] value) {
+ nbt.setByteArray(tag, value);
+ }
+
+ public void setIntArray(String tag, int[] value) {
+ nbt.setIntArray(tag, value);
+ }
+
+ public int getInt(String tag) {
+ return nbt.getInt(tag);
+ }
+
+ public long getLong(String tag) {
+ return nbt.getLong(tag);
+ }
+
+ public boolean getBoolean(String tag) {
+ return nbt.getBoolean(tag);
+ }
+
+ public byte[] getByteArray(String tag) {
+ return nbt.getByteArray(tag);
+ }
+
+ public int[] getIntArray(String tag) {
+ return nbt.getIntArray(tag);
+ }
+
+ public void Read(DataInput stream) throws IOException {
+ nbt = NBTCompressedStreamTools.a((DataInputStream) stream);
+ }
+
+ public void Write(DataOutput stream) throws IOException {
+ NBTCompressedStreamTools.a(nbt, stream);
+ }
+}
diff --git a/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/NmsManager.java b/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/NmsManager.java
new file mode 100644
index 0000000..e4c7957
--- /dev/null
+++ b/v1_12_R1/src/main/java/com/lishid/orebfuscator/nms/v1_12_R1/NmsManager.java
@@ -0,0 +1,138 @@
+/**
+ * @author lishid
+ * @author Aleksey Terzi
+ *
+ */
+
+package com.lishid.orebfuscator.nms.v1_12_R1;
+
+import net.minecraft.server.v1_12_R1.Block;
+import net.minecraft.server.v1_12_R1.BlockPosition;
+import net.minecraft.server.v1_12_R1.Chunk;
+import net.minecraft.server.v1_12_R1.ChunkProviderServer;
+import net.minecraft.server.v1_12_R1.IBlockData;
+import net.minecraft.server.v1_12_R1.IChatBaseComponent;
+import net.minecraft.server.v1_12_R1.Packet;
+import net.minecraft.server.v1_12_R1.PlayerChunkMap;
+import net.minecraft.server.v1_12_R1.TileEntity;
+import net.minecraft.server.v1_12_R1.WorldServer;
+
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_12_R1.CraftWorld;
+import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_12_R1.util.CraftChatMessage;
+import org.bukkit.entity.Player;
+
+import com.lishid.orebfuscator.nms.IBlockInfo;
+import com.lishid.orebfuscator.nms.IChunkCache;
+import com.lishid.orebfuscator.nms.IChunkManager;
+import com.lishid.orebfuscator.nms.INBT;
+import com.lishid.orebfuscator.nms.INmsManager;
+import com.lishid.orebfuscator.types.BlockCoord;
+import com.lishid.orebfuscator.types.BlockState;
+
+public class NmsManager implements INmsManager {
+ private int maxLoadedCacheFiles;
+
+ public void setMaxLoadedCacheFiles(int value) {
+ this.maxLoadedCacheFiles = value;
+ }
+
+ public INBT createNBT() {
+ return new NBT();
+ }
+
+ @Override
+ public IChunkCache createChunkCache() {
+ return new ChunkCache(this.maxLoadedCacheFiles);
+ }
+
+ @Override
+ public IChunkManager getChunkManager(World world) {
+ WorldServer worldServer = ((CraftWorld)world).getHandle();
+ PlayerChunkMap chunkMap = worldServer.getPlayerChunkMap();
+
+ return new ChunkManager(chunkMap);
+ }
+
+ @Override
+ public void updateBlockTileEntity(BlockCoord blockCoord, Player player) {
+ CraftWorld world = (CraftWorld)player.getWorld();
+ TileEntity tileEntity = world.getTileEntityAt(blockCoord.x, blockCoord.y, blockCoord.z);
+
+ if (tileEntity == null) {
+ return;
+ }
+
+ Packet> packet = tileEntity.getUpdatePacket();
+
+ if (packet != null) {
+ CraftPlayer player2 = (CraftPlayer)player;
+ player2.getHandle().playerConnection.sendPacket(packet);
+ }
+ }
+
+ @Override
+ public void notifyBlockChange(World world, IBlockInfo blockInfo) {
+ BlockPosition blockPosition = new BlockPosition(blockInfo.getX(), blockInfo.getY(), blockInfo.getZ());
+ IBlockData blockData = ((BlockInfo)blockInfo).getBlockData();
+
+ ((CraftWorld)world).getHandle().notify(blockPosition, blockData, blockData, 0);
+ }
+
+ @Override
+ public int getBlockLightLevel(World world, int x, int y, int z) {
+ return ((CraftWorld)world).getHandle().getLightLevel(new BlockPosition(x, y, z));
+ }
+
+ @Override
+ public IBlockInfo getBlockInfo(World world, int x, int y, int z) {
+ IBlockData blockData = getBlockData(world, x, y, z);
+
+ return blockData != null
+ ? new BlockInfo(x, y, z, blockData)
+ : null;
+ }
+
+ @Override
+ public BlockState getBlockState(World world, int x, int y, int z) {
+ IBlockData blockData = getBlockData(world, x, y, z);
+
+ if(blockData == null) return null;
+
+ Block block = blockData.getBlock();
+
+ BlockState blockState = new BlockState();
+ blockState.id = Block.getId(block);
+ blockState.meta = block.toLegacyData(blockData);
+
+ return blockState;
+ }
+
+ @Override
+ public int getBlockId(World world, int x, int y, int z) {
+ IBlockData blockData = getBlockData(world, x, y, z);
+
+ return blockData != null ? Block.getId(blockData.getBlock()): -1;
+ }
+
+ @Override
+ public String getTextFromChatComponent(String json) {
+ IChatBaseComponent component = IChatBaseComponent.ChatSerializer.a(json);
+ return CraftChatMessage.fromComponent(component);
+ }
+
+ private static IBlockData getBlockData(World world, int x, int y, int z) {
+ int chunkX = x >> 4;
+ int chunkZ = z >> 4;
+
+ WorldServer worldServer = ((CraftWorld)world).getHandle();
+ ChunkProviderServer chunkProviderServer = worldServer.getChunkProviderServer();
+
+ if(!chunkProviderServer.isLoaded(chunkX, chunkZ)) return null;
+
+ Chunk chunk = chunkProviderServer.getOrLoadChunkAt(chunkX, chunkZ);
+
+ return chunk.getBlockData(new BlockPosition(x, y, z));
+ }
+}