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)); + } +}