feat: добавлена возможность генерировать биомы

This commit is contained in:
Reider745
2023-12-28 19:21:14 +03:00
parent 0559c84619
commit 951b953f4c
5 changed files with 55 additions and 8 deletions
@@ -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;
@@ -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<Biome[][]> 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);
}
}
}
@@ -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<NukkitCustomBiome> 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);
@@ -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) {
@@ -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) {