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 ae13a7f commit 8df4614
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 41 deletions.
Binary file added iclibs/Nukkit-MOT-SNAPSHOT.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion src/main/java/com/reider745/InnerCoreServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ public void preload(Server server) throws Exception {

Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
server.getLogger().info("Initiating target directory '" + server.getDataPath() + "'");
BiomesHooks.init();
// BiomesHooks.init();

dataPath = server.getDataPath();
final File dataFolderFile = new File(dataPath);
Expand Down
41 changes: 29 additions & 12 deletions src/main/java/com/reider745/hooks/BiomesHooks.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package com.reider745.hooks;

import cn.nukkit.level.ChunkManager;
import cn.nukkit.level.biome.Biome;
import cn.nukkit.level.biome.BiomeSelector;
import cn.nukkit.level.generator.Normal;
import cn.nukkit.level.generator.noise.nukkit.f.SimplexF;
import cn.nukkit.math.NukkitRandom;
import cn.nukkit.network.protocol.BiomeDefinitionListPacket;
import com.reider745.api.ReflectHelper;
import com.reider745.api.hooks.HookClass;
Expand All @@ -19,7 +22,11 @@

@Hooks(className = "cn.nukkit.level.biome.Biome")
public class BiomesHooks implements HookClass {
private static final int MAX_ID = 512;
/*
Биомов не может быть больше 256, слишком много ограничений внутри Nukkit-Mot и вероятно это ограничено и клиентом
*/
private static final int MAX_ID = Biome.MAX_BIOMES;
/*
@Override
public void rebuildField(CtClass ctClass, CtField field) {
Expand All @@ -31,12 +38,12 @@ public void rebuildField(CtClass ctClass, CtField field) {
public static void init() throws NoSuchFieldException {
ReflectHelper.setField(Biome.class, "biomes", new Biome[MAX_ID]);
}
}*/

@Inject(className = "cn.nukkit.network.protocol.BiomeDefinitionListPacket", type = TypeHook.BEFORE_REPLACE)
/*@Inject(className = "cn.nukkit.network.protocol.BiomeDefinitionListPacket", type = TypeHook.BEFORE_REPLACE)
public static void encode(BiomeDefinitionListPacket packet) {
BiomesMethods.encode(packet);
}
}*/

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

Expand All @@ -46,16 +53,26 @@ public static void generateChunk(Normal generator, int chunkX, int chunkZ) {
NativeCallback.onBiomeMapGenerated(generator.getDimensionData().getDimensionId(), chunkX, chunkZ);
}

@Inject(className = "cn.nukkit.level.generator.Normal")
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;
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());
if (biomes != null) {
Biome biome = biomes[x & 0xf][z & 0xf];
if (biome != null)
return biome;
}
return super.pickBiome(x, z);
}
return ((BiomeSelector) ReflectHelper.getField(generator, "selector")).pickBiome(x, z);
}

@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) {
Expand Down
81 changes: 53 additions & 28 deletions src/main/java/com/reider745/world/BiomesMethods.java
Original file line number Diff line number Diff line change
@@ -1,36 +1,25 @@
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;
import com.reider745.api.ReflectHelper;
import com.reider745.InnerCoreServer;
import com.reider745.api.pointers.PointersStorage;
import com.reider745.api.pointers.pointer_gen.PointerGenFastest;
import com.zhekasmirnov.innercore.api.nbt.NativeCompoundTag;
import org.json.JSONArray;
import org.json.JSONObject;

import java.io.IOException;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;

/*
format BiomeDefinitionListPacket
name: {
temperature
downfall
}
*/
public class BiomesMethods {
private static class NukkitCustomBiome extends Biome {
public static class NukkitCustomBiome extends Biome {
private final String name;
private final Biome base;

public NukkitCustomBiome(String name){
public NukkitCustomBiome(Biome base, String name){
this.name = name;
this.base = base;
}

@Override
Expand All @@ -45,13 +34,26 @@ protected void reg(int id){
@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);

//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);
private static final HashMap<Integer, NukkitCustomBiome> customBiomes = new HashMap<>();
private static final CompoundTag TAG_419;
/*private static final CompoundTag TAG_419;
private static byte[] sendBiomes;
static {
Expand All @@ -61,15 +63,38 @@ public void populateChunk(ChunkManager level, int chunkX, int chunkZ, NukkitRand
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}*/

private static int pre_id = 182;
private static final ArrayList<Integer> AvailableIDS = new ArrayList<>();

static {
try {
JSONArray json = new JSONArray(new String(InnerCoreServer.class.getClassLoader().getResourceAsStream("available_ids_biomes.json").readAllBytes()));
for (int i = 0; i < json.length(); i++)
AvailableIDS.add(json.getInt(i));

for(int i = 0;i < 50;i++)
AvailableIDS.remove(0);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static JSONObject getCustomBiomes() {
JSONObject json = new JSONObject();
customBiomes.forEach((k, v) -> json.put(v.name, k));
return json;
}

public static long nativeRegister(String name) {
NukkitCustomBiome biome = new NukkitCustomBiome(name);
biome.reg(pre_id++);
if(AvailableIDS.isEmpty()){
throw new RuntimeException("MAX BIOMES!");
}
NukkitCustomBiome biome = new NukkitCustomBiome(null, name);
biome.reg(AvailableIDS.remove(0));
customBiomes.put(biome.getId(), biome);
try{

// без этого дерьма работает
/*try{
final CompoundTag tag = new CompoundTag();
tag.putFloat("ash", .0f);
tag.putFloat("blue_spores", .0f);
Expand All @@ -91,16 +116,16 @@ public static long nativeRegister(String name) {
sendBiomes = NBTIO.write(TAG_419, ByteOrder.LITTLE_ENDIAN, true);
}catch (Exception e){
throw new RuntimeException(e);
}
}*/
return customBiomesPointers.addPointer(biome);
}

public static int nativeGetId(long pointer) {
return customBiomesPointers.get(pointer).getId();
}

public static void encode(BiomeDefinitionListPacket self) {
/*public static void encode(BiomeDefinitionListPacket self) {
self.reset();
self.put(sendBiomes);
}
}*/
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.zhekasmirnov.apparatus.multiplayer;

import com.reider745.world.BiomesMethods;
import org.json.JSONObject;

import com.reider745.InnerCoreServer;
Expand Down Expand Up @@ -89,6 +90,7 @@ protected InnerCorePacket getServerDetectionPacket() {
JSONObject json = new JSONObject();
json.put("server", true);
json.put("socket_port", defaultPort);
json.put("biomes", BiomesMethods.getCustomBiomes());
byte[] bytes = json.toString().getBytes();

InnerCorePacket packet = new InnerCorePacket();
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/available_ids_biomes.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,177,176,175,174,173,172,171,170,169,168,159,154,153,152,150,148,147,146,145,144,143,142,141,139,138,137,136,135,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51]

0 comments on commit 8df4614

Please sign in to comment.