From 951b953f4cf0c569332a7db0e65f597a1e9a2ec0 Mon Sep 17 00:00:00 2001 From: Reider745 <70357814+Reider745@users.noreply.github.com> Date: Thu, 28 Dec 2023 19:21:14 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B1=D0=B8=D0=BE=D0=BC?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/reider745/event/EventListener.java | 1 + .../java/com/reider745/hooks/BiomesHooks.java | 43 ++++++++++++++++++- .../com/reider745/world/BiomesMethods.java | 11 ++++- .../zhekasmirnov/innercore/api/NativeAPI.java | 6 +-- .../innercore/api/NativeCallback.java | 2 +- 5 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/reider745/event/EventListener.java b/src/main/java/com/reider745/event/EventListener.java index a2a349eb..fbd5a101 100644 --- a/src/main/java/com/reider745/event/EventListener.java +++ b/src/main/java/com/reider745/event/EventListener.java @@ -29,6 +29,7 @@ import cn.nukkit.item.food.Food; import cn.nukkit.level.Level; import cn.nukkit.level.Location; import cn.nukkit.level.Position; +import cn.nukkit.level.biome.Biome; import cn.nukkit.level.format.FullChunk; import cn.nukkit.math.Vector3; diff --git a/src/main/java/com/reider745/hooks/BiomesHooks.java b/src/main/java/com/reider745/hooks/BiomesHooks.java index 1d597d2b..7fc333e1 100644 --- a/src/main/java/com/reider745/hooks/BiomesHooks.java +++ b/src/main/java/com/reider745/hooks/BiomesHooks.java @@ -1,7 +1,15 @@ package com.reider745.hooks; -import cn.nukkit.block.Block; +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; @@ -9,10 +17,17 @@ import com.reider745.api.hooks.TypeHook; 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; @@ -26,7 +41,7 @@ public class BiomesHooks implements HookClass { } } - public static void init() { + public static void init() throws NoSuchFieldException { ReflectHelper.setField(Biome.class, "biomes", new Biome[MAX_ID]); } @@ -34,4 +49,28 @@ public class BiomesHooks implements HookClass { public static void encode(BiomeDefinitionListPacket self){ BiomesMethods.encode(self); } + + private static final LongObjectMap threads_biomes_replace = 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); + } + + @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()); + 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 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[Math.abs(x % 16)][Math.abs(z % 16)] = Biome.getBiome(id); + } + } } diff --git a/src/main/java/com/reider745/world/BiomesMethods.java b/src/main/java/com/reider745/world/BiomesMethods.java index ad5b57c8..2d51dda2 100644 --- a/src/main/java/com/reider745/world/BiomesMethods.java +++ b/src/main/java/com/reider745/world/BiomesMethods.java @@ -1,6 +1,9 @@ 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; @@ -38,6 +41,12 @@ public class BiomesMethods { protected void reg(int id){ register(id, this); } + + @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); + } } private static final PointersStorage customBiomesPointers = new PointersStorage<>("biomes", new PointerGenFastest(), false); @@ -54,7 +63,7 @@ public class BiomesMethods { } } - private static int pre_id = 256; + private static int pre_id = 182; public static long nativeRegister(String name) { NukkitCustomBiome biome = new NukkitCustomBiome(name); diff --git a/src/main/java/com/zhekasmirnov/innercore/api/NativeAPI.java b/src/main/java/com/zhekasmirnov/innercore/api/NativeAPI.java index a4fe0405..96559347 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/NativeAPI.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/NativeAPI.java @@ -6,6 +6,7 @@ import java.lang.reflect.Field; import com.reider745.InnerCoreServer; import com.reider745.api.CallbackHelper; import com.reider745.entity.EntityMethod; +import com.reider745.hooks.BiomesHooks; import com.reider745.item.ItemMethod; import com.reider745.world.BlockSourceMethods; import com.reider745.world.WorldMethod; @@ -238,10 +239,7 @@ public class NativeAPI { } public static void setBiomeMap(int x, int z, int id) { - NativeBlockSource region = NativeBlockSource.getCurrentWorldGenRegion(); - if (region != null) - region.setBiome(x, z, id); - InnerCoreServer.useNotCurrentSupport("NativeAPI.setBiomeMap(x, z, id)"); + BiomesHooks.setBiomeMap(x, z, id); } public static int getBiome(int x, int z) { diff --git a/src/main/java/com/zhekasmirnov/innercore/api/NativeCallback.java b/src/main/java/com/zhekasmirnov/innercore/api/NativeCallback.java index 9b56940f..0aaeee1c 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/NativeCallback.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/NativeCallback.java @@ -1091,7 +1091,7 @@ public class NativeCallback { } public static void onBiomeMapGenerated(int dimension, int x, int z) { - WorldGen.onBiomeMapGenerated(dimension, x >> 4, z >> 4); + WorldGen.onBiomeMapGenerated(dimension, x, z); } public static void onCustomDimensionTransfer(long entity, int from, int to) {