diff --git a/iclibs/Nukkit-MOT-SNAPSHOT.jar b/iclibs/Nukkit-MOT-SNAPSHOT.jar new file mode 100644 index 00000000..0e23629f Binary files /dev/null and b/iclibs/Nukkit-MOT-SNAPSHOT.jar differ diff --git a/src/main/java/com/reider745/InnerCoreServer.java b/src/main/java/com/reider745/InnerCoreServer.java index 6a5446e5..757b0d9f 100644 --- a/src/main/java/com/reider745/InnerCoreServer.java +++ b/src/main/java/com/reider745/InnerCoreServer.java @@ -202,7 +202,7 @@ public class InnerCoreServer { Thread.currentThread().setPriority(Thread.MAX_PRIORITY); server.getLogger().info("Initiating target directory '" + server.getDataPath() + "'"); - BiomesHooks.init(); + // BiomesHooks.init(); dataPath = server.getDataPath(); final File dataFolderFile = new File(dataPath); diff --git a/src/main/java/com/reider745/hooks/BiomesHooks.java b/src/main/java/com/reider745/hooks/BiomesHooks.java index 2f9e738e..b43f57d3 100644 --- a/src/main/java/com/reider745/hooks/BiomesHooks.java +++ b/src/main/java/com/reider745/hooks/BiomesHooks.java @@ -1,8 +1,11 @@ package com.reider745.hooks; +import cn.nukkit.level.ChunkManager; import cn.nukkit.level.biome.Biome; import cn.nukkit.level.biome.BiomeSelector; import cn.nukkit.level.generator.Normal; +import cn.nukkit.level.generator.noise.nukkit.f.SimplexF; +import cn.nukkit.math.NukkitRandom; import cn.nukkit.network.protocol.BiomeDefinitionListPacket; import com.reider745.api.ReflectHelper; import com.reider745.api.hooks.HookClass; @@ -19,7 +22,11 @@ import javassist.Modifier; @Hooks(className = "cn.nukkit.level.biome.Biome") public class BiomesHooks implements HookClass { - private static final int MAX_ID = 512; + /* + Биомов не может быть больше 256, слишком много ограничений внутри Nukkit-Mot и вероятно это ограничено и клиентом + */ + private static final int MAX_ID = Biome.MAX_BIOMES; + /* @Override public void rebuildField(CtClass ctClass, CtField field) { @@ -31,12 +38,12 @@ public class BiomesHooks implements HookClass { public static void init() throws NoSuchFieldException { ReflectHelper.setField(Biome.class, "biomes", new Biome[MAX_ID]); - } + }*/ - @Inject(className = "cn.nukkit.network.protocol.BiomeDefinitionListPacket", type = TypeHook.BEFORE_REPLACE) + /*@Inject(className = "cn.nukkit.network.protocol.BiomeDefinitionListPacket", type = TypeHook.BEFORE_REPLACE) public static void encode(BiomeDefinitionListPacket packet) { BiomesMethods.encode(packet); - } + }*/ private static final LongObjectMap populatingChunks = new LongObjectHashMap<>(); @@ -46,16 +53,26 @@ public class BiomesHooks implements HookClass { NativeCallback.onBiomeMapGenerated(generator.getDimensionData().getDimensionId(), chunkX, chunkZ); } - @Inject(className = "cn.nukkit.level.generator.Normal") - public static Biome pickBiome(Normal generator, int x, int z) { - Biome[][] biomes = populatingChunks.get(Thread.currentThread().getId()); - if (biomes != null) { - Biome biome = biomes[x & 0xf][z & 0xf]; - if (biome != null) { - return biome; - } + public static class CustomBiomeSelector extends BiomeSelector { + public CustomBiomeSelector(NukkitRandom random) { + super(random); } - return ((BiomeSelector) ReflectHelper.getField(generator, "selector")).pickBiome(x, z); + + @Override + public Biome pickBiome(int x, int z) { + Biome[][] biomes = populatingChunks.get(Thread.currentThread().getId()); + if (biomes != null) { + Biome biome = biomes[x & 0xf][z & 0xf]; + if (biome != null) + return biome; + } + return super.pickBiome(x, z); + } + } + + @Inject(className = "cn.nukkit.level.generator.Normal", type = TypeHook.AFTER_NOT_REPLACE) + public static void init(Normal generator, ChunkManager manager, NukkitRandom random) { + ReflectHelper.setField(generator, "selector", new CustomBiomeSelector(random)); } public static void setBiomeMap(int x, int z, int id) { diff --git a/src/main/java/com/reider745/world/BiomesMethods.java b/src/main/java/com/reider745/world/BiomesMethods.java index 2d51dda2..632d9ea4 100644 --- a/src/main/java/com/reider745/world/BiomesMethods.java +++ b/src/main/java/com/reider745/world/BiomesMethods.java @@ -1,36 +1,25 @@ package com.reider745.world; -import cn.nukkit.block.BlockID; import cn.nukkit.level.ChunkManager; import cn.nukkit.level.biome.Biome; import cn.nukkit.math.NukkitRandom; -import cn.nukkit.nbt.NBTIO; -import cn.nukkit.nbt.tag.CompoundTag; -import cn.nukkit.network.protocol.BiomeDefinitionListPacket; -import com.reider745.api.ReflectHelper; +import com.reider745.InnerCoreServer; import com.reider745.api.pointers.PointersStorage; import com.reider745.api.pointers.pointer_gen.PointerGenFastest; -import com.zhekasmirnov.innercore.api.nbt.NativeCompoundTag; +import org.json.JSONArray; import org.json.JSONObject; -import java.io.IOException; -import java.nio.ByteOrder; +import java.util.ArrayList; import java.util.HashMap; -import java.util.Objects; -/* -format BiomeDefinitionListPacket -name: { - temperature - downfall -} - */ public class BiomesMethods { - private static class NukkitCustomBiome extends Biome { + public static class NukkitCustomBiome extends Biome { private final String name; + private final Biome base; - public NukkitCustomBiome(String name){ + public NukkitCustomBiome(Biome base, String name){ this.name = name; + this.base = base; } @Override @@ -45,13 +34,26 @@ public class BiomesMethods { @Override public void populateChunk(ChunkManager level, int chunkX, int chunkZ, NukkitRandom random) { super.populateChunk(level, chunkX, chunkZ, random); - level.setBlockAt(16, 80, 16, BlockID.STONE); + + //new BiomeSelector(random).pickBiome(chunkX * 16 + 7, chunkZ * 16 + 7).populateChunk(level, chunkX, chunkZ, random); + /*final int POS_CHUNK_X = chunkX * 16; + final int POS_CHUNK_Z = chunkZ * 16; + final BiomeSelector selector = ; + + for(int x = 0;x < 16;x++) { + final int X_POS = POS_CHUNK_X + x; + + for (int z = 0; z < 16; z++) { + final Biome biome = selector.pickBiome(X_POS, POS_CHUNK_Z + z); + biome.populateChunk(); + } + }*/ } } private static final PointersStorage customBiomesPointers = new PointersStorage<>("biomes", new PointerGenFastest(), false); private static final HashMap customBiomes = new HashMap<>(); - private static final CompoundTag TAG_419; + /*private static final CompoundTag TAG_419; private static byte[] sendBiomes; static { @@ -61,15 +63,38 @@ public class BiomesMethods { } catch (IOException e) { throw new RuntimeException(e); } + }*/ + + private static final ArrayList AvailableIDS = new ArrayList<>(); + + static { + try { + JSONArray json = new JSONArray(new String(InnerCoreServer.class.getClassLoader().getResourceAsStream("available_ids_biomes.json").readAllBytes())); + for (int i = 0; i < json.length(); i++) + AvailableIDS.add(json.getInt(i)); + + for(int i = 0;i < 50;i++) + AvailableIDS.remove(0); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + public static JSONObject getCustomBiomes() { + JSONObject json = new JSONObject(); + customBiomes.forEach((k, v) -> json.put(v.name, k)); + return json; } - private static int pre_id = 182; - public static long nativeRegister(String name) { - NukkitCustomBiome biome = new NukkitCustomBiome(name); - biome.reg(pre_id++); + if(AvailableIDS.isEmpty()){ + throw new RuntimeException("MAX BIOMES!"); + } + NukkitCustomBiome biome = new NukkitCustomBiome(null, name); + biome.reg(AvailableIDS.remove(0)); customBiomes.put(biome.getId(), biome); - try{ + + // без этого дерьма работает + /*try{ final CompoundTag tag = new CompoundTag(); tag.putFloat("ash", .0f); tag.putFloat("blue_spores", .0f); @@ -91,7 +116,7 @@ public class BiomesMethods { sendBiomes = NBTIO.write(TAG_419, ByteOrder.LITTLE_ENDIAN, true); }catch (Exception e){ throw new RuntimeException(e); - } + }*/ return customBiomesPointers.addPointer(biome); } @@ -99,8 +124,8 @@ public class BiomesMethods { return customBiomesPointers.get(pointer).getId(); } - public static void encode(BiomeDefinitionListPacket self) { + /*public static void encode(BiomeDefinitionListPacket self) { self.reset(); self.put(sendBiomes); - } + }*/ } diff --git a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/NetworkConfig.java b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/NetworkConfig.java index ee5962ad..d5735a92 100644 --- a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/NetworkConfig.java +++ b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/NetworkConfig.java @@ -1,5 +1,6 @@ package com.zhekasmirnov.apparatus.multiplayer; +import com.reider745.world.BiomesMethods; import org.json.JSONObject; import com.reider745.InnerCoreServer; @@ -89,6 +90,7 @@ public class NetworkConfig { JSONObject json = new JSONObject(); json.put("server", true); json.put("socket_port", defaultPort); + json.put("biomes", BiomesMethods.getCustomBiomes()); byte[] bytes = json.toString().getBytes(); InnerCorePacket packet = new InnerCorePacket(); diff --git a/src/main/resources/available_ids_biomes.json b/src/main/resources/available_ids_biomes.json new file mode 100644 index 00000000..7691542c --- /dev/null +++ b/src/main/resources/available_ids_biomes.json @@ -0,0 +1 @@ +[254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,177,176,175,174,173,172,171,170,169,168,159,154,153,152,150,148,147,146,145,144,143,142,141,139,138,137,136,135,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51] \ No newline at end of file