support BuildCraft servers

This commit is contained in:
shsa 2015-02-03 20:42:37 +07:00
parent 7238761ce1
commit 495c15d287
6 changed files with 111 additions and 41 deletions

View file

@ -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;
}
/**

View file

@ -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()

View file

@ -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;
}
}

View file

@ -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++)
{

View file

@ -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());
}

View file

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