diff --git a/src/main/java/com/reider745/hooks/NetworkHooks.java b/src/main/java/com/reider745/hooks/NetworkHooks.java index 2c576006..6c5aac4f 100644 --- a/src/main/java/com/reider745/hooks/NetworkHooks.java +++ b/src/main/java/com/reider745/hooks/NetworkHooks.java @@ -4,6 +4,7 @@ import cn.nukkit.Player; import cn.nukkit.Server; import cn.nukkit.network.CompressionProvider; import cn.nukkit.network.Network; +import cn.nukkit.network.protocol.BiomeDefinitionListPacket; import cn.nukkit.network.protocol.DataPacket; import cn.nukkit.network.protocol.ProtocolInfo; import cn.nukkit.network.session.RakNetPlayerSession; @@ -16,6 +17,7 @@ import com.reider745.api.hooks.annotation.Hooks; import com.reider745.network.BasePacket; import com.reider745.network.InnerCorePacket; import com.reider745.network.LoginPacketFix; +import com.reider745.world.BiomesMethods; import com.zhekasmirnov.apparatus.mcpe.NativeNetworking; import com.zhekasmirnov.horizon.runtime.logger.Logger; import io.netty.buffer.ByteBuf; @@ -133,4 +135,9 @@ public class NetworkHooks implements HookClass { network.registerPacket(InnerCoreServer.PROTOCOL, InnerCorePacket.NETWORK_ID, InnerCorePacket.class); network.registerPacket(InnerCoreServer.PROTOCOL, LoginPacketFix.NETWORK_ID, LoginPacketFix.class); } + + @Inject(className = "cn.nukkit.network.protocol.BiomeDefinitionListPacket") + public static void encode(BiomeDefinitionListPacket self) { + BiomesMethods.encode(self); + } } diff --git a/src/main/java/com/reider745/world/BiomesMethods.java b/src/main/java/com/reider745/world/BiomesMethods.java index e303c1e1..56ebc6b2 100644 --- a/src/main/java/com/reider745/world/BiomesMethods.java +++ b/src/main/java/com/reider745/world/BiomesMethods.java @@ -1,21 +1,27 @@ package com.reider745.world; -import cn.nukkit.event.level.ChunkPopulateEvent; -import cn.nukkit.level.ChunkManager; import cn.nukkit.level.biome.Biome; import cn.nukkit.level.format.FullChunk; -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.InnerCoreServer; +import com.reider745.api.ReflectHelper; import com.reider745.api.pointers.PointersStorage; import com.reider745.api.pointers.pointer_gen.PointerGenFastest; +import com.zhekasmirnov.horizon.runtime.logger.Logger; import com.zhekasmirnov.innercore.api.NativeCallback; import io.netty.util.collection.LongObjectHashMap; import io.netty.util.collection.LongObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; 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; public class BiomesMethods { public static class NukkitCustomBiome extends Biome { @@ -34,12 +40,15 @@ public class BiomesMethods { protected void reg(int id){ register(id, this); + final Int2ObjectMap runtimeId2Identifier = ReflectHelper.getField(Biome.class, "runtimeId2Identifier"); + runtimeId2Identifier.put(id, getName()); + Logger.debug("Register custom biome: "+id+", name: "+getName()); } } 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 { @@ -49,7 +58,7 @@ public class BiomesMethods { } catch (IOException e) { throw new RuntimeException(e); } - }*/ + } private static final ArrayList AvailableIDS = new ArrayList<>(); @@ -76,11 +85,11 @@ public class BiomesMethods { throw new RuntimeException("MAX BIOMES!"); } NukkitCustomBiome biome = new NukkitCustomBiome(null, name); - biome.reg(AvailableIDS.remove(0)); + biome.reg(AvailableIDS.remove(AvailableIDS.size()-1)); customBiomes.put(biome.getId(), biome); // без этого дерьма работает - /*try{ + try{ final CompoundTag tag = new CompoundTag(); tag.putFloat("ash", .0f); tag.putFloat("blue_spores", .0f); @@ -102,7 +111,7 @@ public class BiomesMethods { sendBiomes = NBTIO.write(TAG_419, ByteOrder.LITTLE_ENDIAN, true); }catch (Exception e){ throw new RuntimeException(e); - }*/ + } return customBiomesPointers.addPointer(biome); } @@ -110,10 +119,10 @@ 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); - }*/ + } private static final LongObjectMap populatingChunks = new LongObjectHashMap<>(); @@ -135,8 +144,9 @@ public class BiomesMethods { final Biome[] biomes_z = biomes[x]; for (int z = 0; z < 16; z++) { final Biome biome = biomes_z[z]; - if(biome != null) - fullChunk.setBiomeId(x, z, biome.getId());//кнч очень полезно создавть матрицу Biome, может на int все ебануть? + if(biome != null) { + fullChunk.setBiomeId(x, z, biome.getId()); + } } } populatingChunks.remove(id); diff --git a/src/main/java/com/reider745/world/GenerationUtilsMethods.java b/src/main/java/com/reider745/world/GenerationUtilsMethods.java index 5985dfa0..dea5fcc3 100644 --- a/src/main/java/com/reider745/world/GenerationUtilsMethods.java +++ b/src/main/java/com/reider745/world/GenerationUtilsMethods.java @@ -33,18 +33,17 @@ public class GenerationUtilsMethods { blackListSurface.add(BlockID.LEAVES2); blackListSurface.add(BlockID.SNOW_LAYER); blackListSurface.add(BlockID.DOUBLE_PLANT); + blackListSurface.add(BlockID.WATER); + blackListSurface.add(BlockID.STILL_WATER); } - public static int findSurface(int x, int y, int z){ - Level level = CallbackHelper.getForCurrentThread(); + public static int findSurface(int x, int ignore_y, int z){ + final Level level = CallbackHelper.getForCurrentThread(); if(level == null) throw new RuntimeException("Region null"); - for(int i = y;i < 256;i++){ - if(!blackListSurface.contains(level.getBlockIdAt(x, i, z)) && level.getBlockIdAt(x, i+1, z) == 0) - return i-1; - } + int y = level.getHighestBlockAt(x, z, false); for(int i = y;i > 0;i--){ - if(!blackListSurface.contains(level.getBlockIdAt(x, i, z)) && level.getBlockIdAt(x, i+1, z) == 0) - return i-1; + if(!blackListSurface.contains(level.getBlock(x, i, z).getId())) + return i; } return y; }