diff --git a/src/main/java/com/reider745/hooks/BiomesHooks.java b/src/main/java/com/reider745/hooks/BiomesHooks.java index 46ff864b..2f9e738e 100644 --- a/src/main/java/com/reider745/hooks/BiomesHooks.java +++ b/src/main/java/com/reider745/hooks/BiomesHooks.java @@ -1,15 +1,8 @@ package com.reider745.hooks; -import cn.nukkit.block.BlockID; -import cn.nukkit.level.ChunkManager; import cn.nukkit.level.biome.Biome; import cn.nukkit.level.biome.BiomeSelector; -import cn.nukkit.level.format.generic.BaseFullChunk; import cn.nukkit.level.generator.Normal; -import cn.nukkit.level.generator.noise.vanilla.f.NoiseGeneratorOctavesF; -import cn.nukkit.level.generator.populator.type.Populator; -import cn.nukkit.math.MathHelper; -import cn.nukkit.math.NukkitRandom; import cn.nukkit.network.protocol.BiomeDefinitionListPacket; import com.reider745.api.ReflectHelper; import com.reider745.api.hooks.HookClass; @@ -18,16 +11,12 @@ import com.reider745.api.hooks.annotation.Hooks; import com.reider745.api.hooks.annotation.Inject; import com.reider745.world.BiomesMethods; import com.zhekasmirnov.innercore.api.NativeCallback; -import io.netty.util.collection.IntObjectHashMap; import io.netty.util.collection.LongObjectHashMap; import io.netty.util.collection.LongObjectMap; import javassist.CtClass; import javassist.CtField; import javassist.Modifier; -import java.lang.reflect.Field; -import java.util.List; - @Hooks(className = "cn.nukkit.level.biome.Biome") public class BiomesHooks implements HookClass { private static final int MAX_ID = 512; @@ -45,35 +34,34 @@ public class BiomesHooks implements HookClass { } @Inject(className = "cn.nukkit.network.protocol.BiomeDefinitionListPacket", type = TypeHook.BEFORE_REPLACE) - public static void encode(BiomeDefinitionListPacket self){ - BiomesMethods.encode(self); + public static void encode(BiomeDefinitionListPacket packet) { + BiomesMethods.encode(packet); } - private static final LongObjectMap threads_biomes_replace = new LongObjectHashMap<>(); + private static final LongObjectMap populatingChunks = new LongObjectHashMap<>(); @Inject(className = "cn.nukkit.level.generator.Normal") - public static void generateChunk(Normal self, final int chunkX, final int chunkZ) { - threads_biomes_replace.put(Thread.currentThread().getId(), new Biome[16][16]); - NativeCallback.onBiomeMapGenerated(self.getDimension(), chunkX, chunkZ); + public static void generateChunk(Normal generator, int chunkX, int chunkZ) { + populatingChunks.put(Thread.currentThread().getId(), new Biome[16][16]); + NativeCallback.onBiomeMapGenerated(generator.getDimensionData().getDimensionId(), chunkX, chunkZ); } @Inject(className = "cn.nukkit.level.generator.Normal") - public static Biome pickBiome(Normal self, int x, int z) { - final Biome[][] biomes_override = threads_biomes_replace.get(Thread.currentThread().getId()); - if(biomes_override == null) - return ((BiomeSelector) ReflectHelper.getField(self, "selector")).pickBiome(x, z); - - final Biome biome = biomes_override[Math.abs(x % 16)][Math.abs(z % 16)]; - if(biome != null) - return biome; - - return ((BiomeSelector) ReflectHelper.getField(self, "selector")).pickBiome(x, z); + 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; + } + } + return ((BiomeSelector) ReflectHelper.getField(generator, "selector")).pickBiome(x, z); } - public static void setBiomeMap(int x, int z, int id){ - final Biome[][] biomes_override = threads_biomes_replace.get(Thread.currentThread().getId()); - if(biomes_override != null){ - biomes_override[x % 16][z % 16] = Biome.getBiome(id); + public static void setBiomeMap(int x, int z, int id) { + Biome[][] biomes = populatingChunks.get(Thread.currentThread().getId()); + if (biomes != null) { + biomes[x & 0xf][z & 0xf] = id >= 0 && id < MAX_ID ? Biome.biomes[id] : null; } } } diff --git a/src/main/java/com/reider745/world/dimensions/DimensionsMethods.java b/src/main/java/com/reider745/world/dimensions/DimensionsMethods.java index e8fe5ad8..fa6d8255 100644 --- a/src/main/java/com/reider745/world/dimensions/DimensionsMethods.java +++ b/src/main/java/com/reider745/world/dimensions/DimensionsMethods.java @@ -4,7 +4,6 @@ import cn.nukkit.Server; import cn.nukkit.level.ChunkManager; import cn.nukkit.level.DimensionData; import cn.nukkit.level.Level; -import cn.nukkit.level.format.generic.BaseFullChunk; import cn.nukkit.level.generator.Generator; import cn.nukkit.math.NukkitRandom; import cn.nukkit.math.Vector3; @@ -32,7 +31,7 @@ public class DimensionsMethods { dimensionId = (int) settings.get("id"); name = (String) settings.get("name"); description = descriptions.get(name); - data = new DimensionData(dimensionId, 0, 256); + data = new DimensionData(dimensionId, 0, 255); } @Override