Skip to content

Commit

Permalink
Merge branch 'NukkitMot' of https://github.com/Reider745/ZotCore into…
Browse files Browse the repository at this point in the history
… NukkitMot
  • Loading branch information
MaXFeeD committed Feb 28, 2024
2 parents 51251c7 + 2e86cad commit f5bc6a0
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 57 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
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
59 changes: 37 additions & 22 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 @@ -17,9 +20,18 @@
import javassist.CtField;
import javassist.Modifier;


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

@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,37 +43,40 @@ 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<>();

@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);
}
}*/

@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);
}
return ((BiomeSelector) ReflectHelper.getField(generator, "selector")).pickBiome(x, z);
}
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;
@Override
public Biome pickBiome(int x, int z) {
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)
public static void init(Normal generator, ChunkManager manager, NukkitRandom random) {
ReflectHelper.setField(generator, "selector", new CustomBiomeSelector(random));
}*/
}
102 changes: 70 additions & 32 deletions src/main/java/com/reider745/world/BiomesMethods.java
Original file line number Diff line number Diff line change
@@ -1,36 +1,30 @@
package com.reider745.world;

import cn.nukkit.block.BlockID;
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 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 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;

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 @@ -41,17 +35,11 @@ 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);
level.setBlockAt(16, 80, 16, BlockID.STONE);
}
}

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 +49,38 @@ public void populateChunk(ChunkManager level, int chunkX, int chunkZ, NukkitRand
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}*/

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

private static int pre_id = 182;
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++)//Приходится ограничивать дополн id иначе майн не коректно обрабатывет id биома
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 +102,43 @@ 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);
}*/

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);
}
}
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
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 @@ -11,6 +11,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 @@ -274,7 +275,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
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 f5bc6a0

Please sign in to comment.