diff --git a/java/Orebfuscator/BlockChange.java b/java/Orebfuscator/BlockChange.java index cf6adc9..0285225 100644 --- a/java/Orebfuscator/BlockChange.java +++ b/java/Orebfuscator/BlockChange.java @@ -22,7 +22,7 @@ public class BlockChange public static int baseY; public static int baseZ; - public static byte offset = 2; + public static int updateRadius = 2; public static int startPos; public static void parse(World world, Channel channel, S23PacketBlockChange packet) @@ -40,18 +40,18 @@ public class BlockChange // используем базовую точку, чтобы в дальнейшем высчитывать смещения обновляемых блоков // смещения будем сводить в один int и хранить в HashSet - baseX = x - offset; - baseY = y - offset; - baseZ = z - offset; + baseX = x - updateRadius; + baseY = y - updateRadius; + baseZ = z - updateRadius; - x = offset; - y = offset; - z = offset; + x = updateRadius; + y = updateRadius; + z = updateRadius; - startPos = (offset << 16) | (offset << 8) | offset; + startPos = (updateRadius << 16) | (updateRadius << 8) | updateRadius; list.clear(); - updateAjacentBlocks(world, offset, offset, offset, offset + 1); + updateAjacentBlocks(world, updateRadius, updateRadius, updateRadius, updateRadius + 1); for (int pos : list) { x = baseX + (pos >> 16 & 255); @@ -69,7 +69,7 @@ public class BlockChange return false; Block block = world.getBlock(baseX + x, baseY + y, baseZ + z); - return Orebfuscator.isBlockTransparent(Block.getIdFromBlock(block)); + return Options.isBlockTransparent(Block.getIdFromBlock(block)); } public static boolean needUpdate(World world, int x, int y, int z) diff --git a/java/Orebfuscator/ChunkInfo.java b/java/Orebfuscator/ChunkInfo.java index 7a61439..b776027 100644 --- a/java/Orebfuscator/ChunkInfo.java +++ b/java/Orebfuscator/ChunkInfo.java @@ -26,8 +26,8 @@ public class ChunkInfo // NibbleArray ExtendedBlockStorage.blockMSBArray public int[] offsetsMSB = new int[16]; - public int chunkX; - public int chunkZ; + public int startX; + public int startY; // Максимальный индекс+1 секции public int len; @@ -35,8 +35,8 @@ public class ChunkInfo public void parse(World world, int chunkX, int chunkZ, int sectionLSB, int sectionMSB, byte[] data) { - this.chunkX = chunkX; - this.chunkZ = chunkZ; + this.startX = chunkX << 4; + this.startY = chunkZ << 4; this.data = data; int countLSB = 0; @@ -104,23 +104,16 @@ public class ChunkInfo { if (offsetsLSB[i] > -1) { + l = i << 4; for (int x = 0; x < 16; x++) { for (int y = 0; y < 16; y++) { for (int z = 0; z < 16; z++) { - /* - if ((x > 0 && x < 16) && (y == 0 || y == 15) && (z == 0 || z == 15)) - setBlockID(x, y, z, 1); - if ((x == 0 || x == 15) && (y > 0 || y < 16) && (z == 0 || z == 15)) - setBlockID(x, y, z, 1); - if ((x == 0 || x == 15) && (y == 0 || y == 15) && (z > 0 || z < 16)) - setBlockID(x, y, z, 1); - */ - if (neetObfuscate(world, x, i << 4 | y, z)) + if (neetObfuscate(world, x, l | y, z)) { - setBlockID(x, i << 4 | y, z, 57); + setBlockID(x, l | y, z, Options.getRandomBlock()); } } } @@ -187,19 +180,23 @@ public class ChunkInfo if (x < 0 || x > 15 || z < 0 || z > 15) { - /* - Block block = world.getBlock((this.chunkX << 4) | x, y, (this.chunkZ << 4) | z); - return Orebfuscator.isBlockTransparent(Block.getIdFromBlock(block)); - */ + if (Options.engineMode == 2) + { + Block block = world.getBlock(this.startX | x, y, this.startY | z); + return Options.isBlockTransparent(Block.getIdFromBlock(block)); + } return true; } - return Orebfuscator.isBlockTransparent(getBlockID(world, x, y, z)); + return Options.isBlockTransparent(getBlockID(world, x, y, z)); } public boolean neetObfuscate(World world, int x, int y, int z) { + if (y > Options.maxObfuscateHeight) + return false; + if (isTransparent(world, x, y, z)) { return false; diff --git a/java/Orebfuscator/Options.java b/java/Orebfuscator/Options.java new file mode 100644 index 0000000..0eb7f66 --- /dev/null +++ b/java/Orebfuscator/Options.java @@ -0,0 +1,160 @@ +package Orebfuscator; + +import java.io.File; +import java.util.HashSet; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; +import net.minecraftforge.common.config.Configuration; + +public class Options +{ + public static int engineMode = 2; + + public static int maxObfuscateHeight = 128; + + private static boolean[] obfuscateBlocks = new boolean[4096]; + + public static int[] randomBlocks; + + public static boolean[] transparentBlocks = new boolean[4096]; + + public static void load(File modDir) + { + File configFile = new File(modDir, Orebfuscator.MODID + ".cfg"); + Configuration config = new Configuration(configFile, false); + + engineMode = clamp(config.get("Options", "engineMode", engineMode).getInt(), 1, 2); + + BlockChange.updateRadius = clamp(config.get("Options", "updateRadius", BlockChange.updateRadius).getInt(), 1, 5); + + maxObfuscateHeight = clamp(config.get("Options", "maxObfuscateHeight", maxObfuscateHeight).getInt(), 0, 256); + + int[] list = config.get("Options", "obfuscateBlocks", new int[] { + getID(Blocks.stone), + getID(Blocks.dirt), + getID(Blocks.gold_ore), + getID(Blocks.iron_ore), + getID(Blocks.coal_ore), + getID(Blocks.lapis_ore), + getID(Blocks.diamond_ore), + getID(Blocks.redstone_ore), + getID(Blocks.emerald_ore), + getID(Blocks.netherrack), + getID(Blocks.nether_brick), + getID(Blocks.quartz_ore), + getID(Blocks.end_stone), + }).getIntList(); + + if (list.length == 0) + { + for (int i = 0; i < obfuscateBlocks.length; i++) + { + obfuscateBlocks[i] = true; + } + } + else + { + updateList(obfuscateBlocks, list); + } + + + randomBlocks = config.get("Options", "randomBlocks", new int[] { + getID(Blocks.stone), + getID(Blocks.gold_ore), + getID(Blocks.iron_ore), + getID(Blocks.coal_ore), + getID(Blocks.lapis_ore), + getID(Blocks.diamond_ore), + getID(Blocks.redstone_ore), + getID(Blocks.emerald_ore), + getID(Blocks.netherrack), + getID(Blocks.nether_brick), + getID(Blocks.quartz_ore), + getID(Blocks.end_portal_frame), + getID(Blocks.end_stone), + }).getIntList(); + if (randomBlocks.length == 0) + randomBlocks = new int[] {getID(Blocks.stone)}; + + list = config.get("Options", "transparentBlocks", new int[] {}).getIntList(); + updateList(transparentBlocks, list); + + config.save(); + } + + private static void updateList(boolean[] blocks, int[] list) + { + for (int i = 0; i < blocks.length; i++) + { + blocks[i] = false; + } + for (int i = 0; i < list.length; i++) + { + if (list[i] >= 0 || list[i] < blocks.length) + blocks[list[i]] = true; + } + } + + private static int getID(Block block) + { + return Block.getIdFromBlock(block); + } + + private static int clamp(int value, int min, int max) { + if (value < min) { + value = min; + } + if (value > max) { + value = max; + } + return value; + } + + public static boolean isObfuscated(int id) { + return obfuscateBlocks[id]; + } + + private static boolean[] _transparentBlocks = new boolean[4096]; + private static boolean TransparentCached = false; + public static boolean isBlockTransparent(int id) + { + if (id < 0) + return true; + if (!TransparentCached) + { + // Generate TransparentBlocks by reading them from Minecraft + for (int i = 0; i < _transparentBlocks.length; i++) { + if (transparentBlocks[i]) + { + _transparentBlocks[i] = true; + } + else + { + Block block = Block.getBlockById(i); + if (block == null) + { + _transparentBlocks[i] = true; + } + else + { + _transparentBlocks[i] = !block.isNormalCube(); + } + } + } + TransparentCached = true; + } + return _transparentBlocks[id]; + } + + private static int randomBlock = 0; + public static int getRandomBlock() + { + randomBlock++; + if (randomBlock >= randomBlocks.length) + randomBlock = 0; + + return randomBlocks[randomBlock]; + } +} diff --git a/java/Orebfuscator/Orebfuscator.java b/java/Orebfuscator/Orebfuscator.java index f7800a0..9d8e593 100644 --- a/java/Orebfuscator/Orebfuscator.java +++ b/java/Orebfuscator/Orebfuscator.java @@ -1,10 +1,12 @@ package Orebfuscator; +import java.io.File; import java.util.HashSet; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.NetHandlerPlayServer; +import net.minecraftforge.common.config.Configuration; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; @@ -31,6 +33,8 @@ public class Orebfuscator public void preInit(FMLPreInitializationEvent event) { FMLCommonHandler.instance().bus().register(this); + + Options.load(event.getModConfigurationDirectory()); } @SubscribeEvent @@ -53,37 +57,4 @@ public class Orebfuscator PlayerInjector.hookPlayer(handler.playerEntity, handler.netManager); */ } - - private static HashSet forcedTransparentBlocks = new HashSet(); - private static boolean[] TransparentBlocks = new boolean[4096]; - private static boolean TransparentCached = false; - public static boolean isBlockTransparent(int id) - { - if (id < 0) - return true; - if (!TransparentCached) - { - // Generate TransparentBlocks by reading them from Minecraft - for (int i = 0; i < TransparentBlocks.length; i++) { - if (forcedTransparentBlocks.contains(i)) - { - TransparentBlocks[i] = true; - } - else - { - Block block = Block.getBlockById(i); - if (block == null) - { - TransparentBlocks[i] = true; - } - else - { - TransparentBlocks[i] = !block.isNormalCube(); - } - } - } - TransparentCached = true; - } - return TransparentBlocks[id]; - } } diff --git a/java/Orebfuscator/ProxyChannel.java b/java/Orebfuscator/ProxyChannel.java index 0dfec06..eb3c8da 100644 --- a/java/Orebfuscator/ProxyChannel.java +++ b/java/Orebfuscator/ProxyChannel.java @@ -36,10 +36,6 @@ public class ProxyChannel implements Channel MapChunkBulk.parse(player.worldObj, packet); return; } - if (msg instanceof MyPacketBlockChange) - { - return; - } if (msg instanceof S23PacketBlockChange) { S23PacketBlockChange packet = (S23PacketBlockChange)msg;