feat: добавлена возможность генерировать биомы
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user