Skip to content

Commit

Permalink
feat: исправлена генерация биомов
Browse files Browse the repository at this point in the history
  • Loading branch information
Reider745 committed Feb 26, 2024
1 parent 8df4614 commit 2e86cad
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 38 deletions.
2 changes: 1 addition & 1 deletion src/main/java/com/reider745/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public static void main(String[] args) throws Throwable {
loader.registerHooksInitializationForClass(SnowfallEverywhere.class);
}

loader.registerHooksInitializationForClass(BiomesHooks.class);
//loader.registerHooksInitializationForClass(BiomesHooks.class);
loader.registerHooksInitializationForClass(GlobalBanList.class);

// bug fix
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/reider745/event/EventListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import cn.nukkit.level.Position;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.math.Vector3;
import com.reider745.world.BiomesMethods;
import oshi.hardware.NetworkIF;

import java.util.ArrayList;
Expand Down Expand Up @@ -152,6 +153,8 @@ public void onChunkPopulate(ChunkPopulateEvent event) {
final CallbackHelper.ICallbackApply applyPre = () -> NativeCallback.onPreChunkPostProcessed(X, Z);
final CallbackHelper.ICallbackApply applyPost = () -> NativeCallback.onChunkPostProcessed(X, Z);

BiomesMethods.onChunkPopulate(fullChunk, X, Z, level.getDimensionData().getDimensionId());

try {
switch (level.getDimension()) {
case Level.DIMENSION_OVERWORLD -> {
Expand Down
30 changes: 14 additions & 16 deletions src/main/java/com/reider745/hooks/BiomesHooks.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,17 @@
import javassist.CtField;
import javassist.Modifier;


//Забейте хуй товарищи, нам этот класс больше не нужен
//Нахуя он тут?
//А нахуй он тут не нужен

@Hooks(className = "cn.nukkit.level.biome.Biome")
public class BiomesHooks implements HookClass {
/*
Биомов не может быть больше 256, слишком много ограничений внутри Nukkit-Mot и вероятно это ограничено и клиентом
*/
private static final int MAX_ID = Biome.MAX_BIOMES;
//private static final int MAX_ID = Biome.MAX_BIOMES;
/*
@Override
Expand All @@ -45,40 +50,33 @@ public static void encode(BiomeDefinitionListPacket packet) {
BiomesMethods.encode(packet);
}*/

private static final LongObjectMap<Biome[][]> populatingChunks = new LongObjectHashMap<>();

@Inject(className = "cn.nukkit.level.generator.Normal")

/*@Inject(className = "cn.nukkit.level.generator.Normal")
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);
}
}*/

public static class CustomBiomeSelector extends BiomeSelector {
/* public static class CustomBiomeSelector extends BiomeSelector {
public CustomBiomeSelector(NukkitRandom random) {
super(random);
}
@Override
public Biome pickBiome(int x, int z) {
Biome[][] biomes = populatingChunks.get(Thread.currentThread().getId());
Biome[][] biomes = BiomesMethods.getBiomesChunk();
if (biomes != null) {
Biome biome = biomes[x & 0xf][z & 0xf];
if (biome != null)
return biome;
}
return super.pickBiome(x, z);
}
}
}*/

@Inject(className = "cn.nukkit.level.generator.Normal", type = TypeHook.AFTER_NOT_REPLACE)
/*@Inject(className = "cn.nukkit.level.generator.Normal", type = TypeHook.AFTER_NOT_REPLACE)
public static void init(Normal generator, ChunkManager manager, NukkitRandom random) {
ReflectHelper.setField(generator, "selector", new CustomBiomeSelector(random));
}

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;
}
}
}*/
}
53 changes: 33 additions & 20 deletions src/main/java/com/reider745/world/BiomesMethods.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package com.reider745.world;

import cn.nukkit.event.level.ChunkPopulateEvent;
import cn.nukkit.level.ChunkManager;
import cn.nukkit.level.biome.Biome;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.math.NukkitRandom;
import com.reider745.InnerCoreServer;
import com.reider745.api.pointers.PointersStorage;
import com.reider745.api.pointers.pointer_gen.PointerGenFastest;
import com.zhekasmirnov.innercore.api.NativeCallback;
import io.netty.util.collection.LongObjectHashMap;
import io.netty.util.collection.LongObjectMap;
import org.json.JSONArray;
import org.json.JSONObject;

Expand All @@ -30,25 +35,6 @@ public String getName() {
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);

//new BiomeSelector(random).pickBiome(chunkX * 16 + 7, chunkZ * 16 + 7).populateChunk(level, chunkX, chunkZ, random);
/*final int POS_CHUNK_X = chunkX * 16;
final int POS_CHUNK_Z = chunkZ * 16;
final BiomeSelector selector = ;
for(int x = 0;x < 16;x++) {
final int X_POS = POS_CHUNK_X + x;
for (int z = 0; z < 16; z++) {
final Biome biome = selector.pickBiome(X_POS, POS_CHUNK_Z + z);
biome.populateChunk();
}
}*/
}
}

private static final PointersStorage<NukkitCustomBiome> customBiomesPointers = new PointersStorage<>("biomes", new PointerGenFastest(), false);
Expand All @@ -73,7 +59,7 @@ public void populateChunk(ChunkManager level, int chunkX, int chunkZ, NukkitRand
for (int i = 0; i < json.length(); i++)
AvailableIDS.add(json.getInt(i));

for(int i = 0;i < 50;i++)
for(int i = 0;i < 50;i++)//Приходится ограничивать дополн id иначе майн не коректно обрабатывет id биома
AvailableIDS.remove(0);
} catch (Exception e) {
throw new RuntimeException(e);
Expand Down Expand Up @@ -128,4 +114,31 @@ public static int nativeGetId(long pointer) {
self.reset();
self.put(sendBiomes);
}*/

private static final LongObjectMap<Biome[][]> populatingChunks = new LongObjectHashMap<>();

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 < Biome.MAX_BIOMES ? Biome.biomes[id] : null;
}
}

public static void onChunkPopulate(FullChunk fullChunk, int chunkX, int chunkZ, int dimension) {
final long id = Thread.currentThread().getId();

final Biome[][] biomes = new Biome[16][16];
populatingChunks.put(id, biomes);
NativeCallback.onBiomeMapGenerated(dimension, chunkX, chunkZ);

for(int x = 0;x < 16;x++) {
final Biome[] biomes_z = biomes[x];
for (int z = 0; z < 16; z++) {
final Biome biome = biomes_z[z];
if(biome != null)
fullChunk.setBiomeId(x, z, biome.getId());//кнч очень полезно создавть матрицу Biome, может на int все ебануть?
}
}
populatingChunks.remove(id);
}
}
3 changes: 2 additions & 1 deletion src/main/java/com/zhekasmirnov/innercore/api/NativeAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.reider745.entity.EntityMethod;
import com.reider745.hooks.BiomesHooks;
import com.reider745.item.ItemMethod;
import com.reider745.world.BiomesMethods;
import com.reider745.world.WorldMethod;
import com.zhekasmirnov.apparatus.mcpe.NativeBlockSource;
import com.zhekasmirnov.horizon.runtime.logger.Logger;
Expand Down Expand Up @@ -263,7 +264,7 @@ public static int getBiomeMap(int x, int z) {
}

public static void setBiomeMap(int x, int z, int id) {
BiomesHooks.setBiomeMap(x, z, id);
BiomesMethods.setBiomeMap(x, z, id);
}

@Deprecated(since = "Zote")
Expand Down

0 comments on commit 2e86cad

Please sign in to comment.