From 495c15d28792c5997ee0c1d45ed6dddeeaddddd7 Mon Sep 17 00:00:00 2001 From: shsa Date: Tue, 3 Feb 2015 20:42:37 +0700 Subject: [PATCH] support BuildCraft servers --- java/Orebfuscator/ChunkObfuscator.java | 12 ++-- java/Orebfuscator/Fields.java | 13 ++++ java/Orebfuscator/MapChunkBulkObfuscator.java | 40 +++++++++-- java/Orebfuscator/Options.java | 72 ++++++++++++------- java/Orebfuscator/Orebfuscator.java | 7 +- java/Orebfuscator/ProxyChannel.java | 8 +-- 6 files changed, 111 insertions(+), 41 deletions(-) diff --git a/java/Orebfuscator/ChunkObfuscator.java b/java/Orebfuscator/ChunkObfuscator.java index 59ada98..1ef13ba 100644 --- a/java/Orebfuscator/ChunkObfuscator.java +++ b/java/Orebfuscator/ChunkObfuscator.java @@ -34,7 +34,7 @@ public class ChunkObfuscator public int len; public byte[] data; - public void obfuscate(World world, int chunkX, int chunkZ, int sectionLSB, int sectionMSB, byte[] data) + public int obfuscate(World world, int chunkX, int chunkZ, boolean hasSky, int sectionLSB, int sectionMSB, byte[] data, int pos) { this.startX = chunkX << 4; this.startZ = chunkZ << 4; @@ -43,7 +43,6 @@ public class ChunkObfuscator int countLSB = 0; len = 0; int l; - int pos = 0; int i; for (i = 0; i < 16; ++i) { @@ -81,7 +80,8 @@ public class ChunkObfuscator } - if (!world.provider.hasNoSky) + //if (!world.provider.hasNoSky) + if (hasSky) { // если есть небо, то в буфере будет массив ExtendedBlockStorage.skylightArray pos += countLSB * 2048; @@ -101,7 +101,9 @@ public class ChunkObfuscator } } - Options.worldOptions = Options.getWorldOptions(world); + // biome info + pos += 256; + for (i = 0; i < len; i++) { if (offsetsLSB[i] > -1) @@ -122,6 +124,8 @@ public class ChunkObfuscator } } } + + return pos; } /** diff --git a/java/Orebfuscator/Fields.java b/java/Orebfuscator/Fields.java index 4812448..d071c88 100644 --- a/java/Orebfuscator/Fields.java +++ b/java/Orebfuscator/Fields.java @@ -72,6 +72,19 @@ public class Fields } } + public static void setValue(Object instance, Field field, Object value) + { + try + { + field.setAccessible(true); + field.set(instance, value); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + public static class NetworkManager { public static String getOutboundPacketsQueueName() diff --git a/java/Orebfuscator/MapChunkBulkObfuscator.java b/java/Orebfuscator/MapChunkBulkObfuscator.java index 9867609..94e675d 100644 --- a/java/Orebfuscator/MapChunkBulkObfuscator.java +++ b/java/Orebfuscator/MapChunkBulkObfuscator.java @@ -1,17 +1,21 @@ package Orebfuscator; import java.lang.reflect.Field; +import java.util.ArrayList; +import net.minecraft.network.EnumConnectionState; import net.minecraft.network.play.server.S26PacketMapChunkBulk; import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; public class MapChunkBulkObfuscator { public static Field fieldChunkX; public static Field fieldChunkZ; - + public static Field fieldHasSky; + // 1110011 - набор блоков (ExtendedBlockStorage.blockLSBArray) по высоте (1 - есть блок, 0 - нет блока) public static Field fieldStatusLSB = null; @@ -20,19 +24,26 @@ public class MapChunkBulkObfuscator // -- массив данных public static Field fieldData; + public static Field field_149268_i; public static ChunkObfuscator info; - public static void obfuscate(World world, S26PacketMapChunkBulk packet) + public static S26PacketMapChunkBulk obfuscate(World world, S26PacketMapChunkBulk packet) { if (fieldStatusLSB == null) { fieldChunkX = Fields.getField(packet, "field_149266_a"); fieldChunkZ = Fields.getField(packet, "field_149264_b"); - fieldStatusLSB = Fields.getField(packet, "field_149265_c"); + fieldHasSky = Fields.getField(packet, "field_149267_h"); + + fieldStatusLSB = Fields.getField(packet, "field_149265_c"); fieldStatusMSB = Fields.getField(packet, "field_149262_d"); fieldData = Fields.getField(packet, "field_149260_f"); + field_149268_i = Fields.getField(packet, "field_149268_i"); + + byte[] data = (byte[]) Fields.getValue(packet, field_149268_i); + Options.isBuildCraft = data.length > 0; // Forge keep this array empty info = new ChunkObfuscator(); } @@ -40,13 +51,30 @@ public class MapChunkBulkObfuscator int[] chunkX = (int[]) Fields.getValue(packet, fieldChunkX); int[] chunkZ = (int[]) Fields.getValue(packet, fieldChunkZ); + boolean hasSky = (Boolean) Fields.getValue(packet, fieldHasSky); int[] statusLSB = (int[]) Fields.getValue(packet, fieldStatusLSB); int[] statusMSB = (int[]) Fields.getValue(packet, fieldStatusMSB); - byte[][] dataArray = (byte[][]) Fields.getValue(packet, fieldData); + + Options.worldOptions = Options.getWorldOptions(world); - for (int i = 0; i < statusLSB.length; i++) + if (Options.isBuildCraft) { - info.obfuscate(world, chunkX[i], chunkZ[i], statusLSB[i], statusMSB[i], dataArray[i]); + byte[] data = (byte[]) Fields.getValue(packet, field_149268_i); + int pos = 0; + for (int i = 0; i < statusLSB.length; i++) + { + pos = info.obfuscate(world, chunkX[i], chunkZ[i], hasSky, statusLSB[i], statusMSB[i], data, pos); + } } + else + { + byte[][] dataArray = (byte[][]) Fields.getValue(packet, fieldData); + for (int i = 0; i < statusLSB.length; i++) + { + info.obfuscate(world, chunkX[i], chunkZ[i], hasSky, statusLSB[i], statusMSB[i], dataArray[i], 0); + } + } + + return packet; } } diff --git a/java/Orebfuscator/Options.java b/java/Orebfuscator/Options.java index 844604b..241d265 100644 --- a/java/Orebfuscator/Options.java +++ b/java/Orebfuscator/Options.java @@ -1,6 +1,7 @@ package Orebfuscator; import java.io.File; +import java.net.URLClassLoader; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -134,47 +135,52 @@ public class Options if (world.provider instanceof WorldProviderSurface) { options.load(config, new String[] { - getID(Blocks.gold_ore, 1), - getID(Blocks.iron_ore, 1), - getID(Blocks.coal_ore, 1), - getID(Blocks.lapis_ore, 1), - getID(Blocks.diamond_ore, 1), - getID(Blocks.redstone_ore, 1), - getID(Blocks.emerald_ore, 1), - getID(Blocks.mossy_cobblestone, 1), - getID(Blocks.mob_spawner, 100), + getID(Blocks.air, 1), + getID(Blocks.gold_ore, 16), + getID(Blocks.iron_ore, 16), + getID(Blocks.coal_ore, 16), + getID(Blocks.lapis_ore, 16), + getID(Blocks.diamond_ore, 16), + getID(Blocks.redstone_ore, 16), + getID(Blocks.emerald_ore, 16), + getID(Blocks.mossy_cobblestone, 16), + getID(Blocks.mob_spawner, 1000), }); } if (world.provider instanceof WorldProviderHell) { options.load(config, new String[] { - getID(Blocks.glowstone, 1), - getID(Blocks.netherrack, 1), - getID(Blocks.nether_brick, 1), - getID(Blocks.nether_brick_fence, 1), - getID(Blocks.nether_brick_stairs, 1), - getID(Blocks.nether_wart, 1), - getID(Blocks.quartz_ore, 1), + getID(Blocks.air, 1), + getID(Blocks.glowstone, 16), + getID(Blocks.netherrack, 16), + getID(Blocks.nether_brick, 16), + getID(Blocks.nether_brick_fence, 16), + getID(Blocks.nether_brick_stairs, 16), + getID(Blocks.nether_wart, 16), + getID(Blocks.quartz_ore, 16), + getID(Blocks.mob_spawner, 1000), }); } else if (world.provider instanceof WorldProviderEnd) { options.load(config, new String[] { - getID(Blocks.end_stone, 1), + getID(Blocks.air, 1), + getID(Blocks.end_stone, 16), }); } else { options.load(config, new String[] { - getID(Blocks.gold_ore, 1), - getID(Blocks.iron_ore, 1), - getID(Blocks.coal_ore, 1), - getID(Blocks.lapis_ore, 1), - getID(Blocks.diamond_ore, 1), - getID(Blocks.redstone_ore, 1), - getID(Blocks.emerald_ore, 1), - getID(Blocks.mossy_cobblestone, 1), + getID(Blocks.air, 1), + getID(Blocks.gold_ore, 16), + getID(Blocks.iron_ore, 16), + getID(Blocks.coal_ore, 16), + getID(Blocks.lapis_ore, 16), + getID(Blocks.diamond_ore, 16), + getID(Blocks.redstone_ore, 16), + getID(Blocks.emerald_ore, 16), + getID(Blocks.mossy_cobblestone, 16), getID(Blocks.mob_spawner, 1000), }); } @@ -191,6 +197,8 @@ public class Options public static boolean[] transparentBlocks = new boolean[4096]; + public static boolean isBuildCraft = false; + public static class Offset { public int x; @@ -207,6 +215,20 @@ public class Options configFile = new File(modDir, Orebfuscator.MODID + ".cfg"); Configuration config = new Configuration(configFile, false); + /* + ClassLoader loader = (ClassLoader)Thread.currentThread().getContextClassLoader(); + try + { + loader.loadClass("org.bukkit.craftbukkit.CraftWorld"); + isBuildCraft = true; + } + catch (Exception e) + { + isBuildCraft = false; + } + isBuildCraft = config.getBoolean("isBuildCraft", "Options", isBuildCraft, "BuildCraft and Forge have different algorithms update chunks"); + */ + int updateRadius = config.getInt("updateRadius", "Options", 2, 1, 5, "How much blocks update after block break"); for (int x = -updateRadius; x <= updateRadius; x++) { diff --git a/java/Orebfuscator/Orebfuscator.java b/java/Orebfuscator/Orebfuscator.java index 41fbe2f..3edd788 100644 --- a/java/Orebfuscator/Orebfuscator.java +++ b/java/Orebfuscator/Orebfuscator.java @@ -1,11 +1,14 @@ package Orebfuscator; import java.io.File; +import java.lang.reflect.Method; import java.util.HashSet; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.EnumConnectionState; import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Configuration; import cpw.mods.fml.common.FMLCommonHandler; @@ -23,7 +26,7 @@ import cpw.mods.fml.relauncher.ReflectionHelper; public class Orebfuscator { public static final String MODID = "Orebfuscator"; - public static final String VERSION = "0.3"; + public static final String VERSION = "0.4"; @EventHandler public void init(FMLInitializationEvent event) @@ -35,7 +38,7 @@ public class Orebfuscator { FMLCommonHandler.instance().bus().register(this); MinecraftForge.EVENT_BUS.register(new PlayerHandler()); - + Options.load(event.getModConfigurationDirectory()); } diff --git a/java/Orebfuscator/ProxyChannel.java b/java/Orebfuscator/ProxyChannel.java index a0ecf75..35afed5 100644 --- a/java/Orebfuscator/ProxyChannel.java +++ b/java/Orebfuscator/ProxyChannel.java @@ -28,14 +28,14 @@ public class ProxyChannel implements Channel this.player = player; } - public void updateMsg(Object msg) + public Object updateMsg(Object msg) { if (msg instanceof S26PacketMapChunkBulk) { S26PacketMapChunkBulk packet = (S26PacketMapChunkBulk)msg; - MapChunkBulkObfuscator.obfuscate(player.worldObj, packet); - return; + return MapChunkBulkObfuscator.obfuscate(player.worldObj, packet); } + return msg; } @Override @@ -121,7 +121,7 @@ public class ProxyChannel implements Channel @Override public ChannelFuture writeAndFlush(Object msg) { - this.updateMsg(msg); + msg = this.updateMsg(msg); return this.channel.writeAndFlush(msg); }