refactor: Оптимизация работы карты биомов, фикс высоты измерений

This commit is contained in:
MaXFeeD
2024-02-13 15:24:23 +03:00
parent a48d5fb380
commit 09bc1cfed5
2 changed files with 20 additions and 33 deletions
@@ -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<Biome[][]> threads_biomes_replace = new LongObjectHashMap<>();
private static final LongObjectMap<Biome[][]> 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;
}
}
}
@@ -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