Skip to content

Commit

Permalink
feat: основа для кастумных измерений
Browse files Browse the repository at this point in the history
- Исправлен custom_items
  • Loading branch information
Reider745 committed Jan 4, 2024
1 parent 89b2e50 commit e5a3bff
Show file tree
Hide file tree
Showing 6 changed files with 198 additions and 21 deletions.
2 changes: 2 additions & 0 deletions src/main/java/com/reider745/InnerCoreServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import com.reider745.item.ItemMethod;
import com.reider745.item.NukkitIdConvertor;
import com.reider745.world.DimensionsMethods;
import com.zhekasmirnov.apparatus.mcpe.NativeWorkbench;
import com.zhekasmirnov.apparatus.multiplayer.Network;
import com.zhekasmirnov.apparatus.multiplayer.NetworkConfig;
Expand Down Expand Up @@ -207,6 +208,7 @@ public void preload(Server server) throws Exception {

CallbackHelper.init();
NukkitIdConvertor.init();
DimensionsMethods.init();

HashMap<String, Object> description = new HashMap<>();
description.put("name", "ZoteCore");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public boolean execute(CommandSender commandSender, String commandLabel, String[
+ CustomItem.getTextIdForNumber(id) + ")");
}

commandSender.sendMessage("Custom items (" + CustomItem.items.size() + "):");
commandSender.sendMessage("Custom items (" + CustomItem.items.size() + "):\n"+list);
return true;
}
}
28 changes: 28 additions & 0 deletions src/main/java/com/reider745/hooks/LevelHooks.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import cn.nukkit.item.enchantment.Enchantment;
import cn.nukkit.level.GameRule;
import cn.nukkit.level.Level;
import cn.nukkit.level.format.generic.BaseLevelProvider;
import cn.nukkit.level.particle.DestroyBlockParticle;
import cn.nukkit.level.particle.ItemBreakParticle;
import cn.nukkit.math.BlockFace;
Expand All @@ -22,10 +23,12 @@
import com.reider745.api.hooks.annotation.Hooks;
import com.reider745.api.hooks.annotation.Inject;
import com.reider745.event.EventListener;
import com.reider745.world.DimensionsMethods;
import javassist.CtClass;
import javassist.CtField;
import javassist.Modifier;

import java.util.HashMap;
import java.util.Map;

@Hooks(className = "cn.nukkit.level.Level")
Expand Down Expand Up @@ -191,4 +194,29 @@ public static Item useBreakOn(Level level, Vector3 vector, BlockFace face, Item

return item;
}

@Inject(className = "cn.nukkit.level.EnumLevel")
public static void initLevels(){
DimensionsMethods.initLevels();
}

@Inject
public static void initLevel(Level level){
DimensionsMethods.initLevel(level);
}

@Inject(className = "cn.nukkit.level.format.generic.BaseLevelProvider")
public static Map<String, Object> getGeneratorOptions(BaseLevelProvider provider) {
return new HashMap<>() {
{
final String name = provider.getName();
put("preset", provider.getLevelData().getString("generatorOptions"));
DimensionsMethods.CustomDimensionDescription description = DimensionsMethods.descriptions.get(name);
if(description != null){
put("id", description.getId());
put("name", name);
}
}
};
}
}
13 changes: 4 additions & 9 deletions src/main/java/com/reider745/world/BlockSourceMethods.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,10 @@ private static void sendBlock(Level level, int x, int y, int z, int layer){
}

public static Level getLevelForDimension(int dimension) {
if (dimension >= 0 && dimension <= 2) {
return Server.getInstance().getLevelByName(switch (dimension) {
case 0 -> "world";
case 1 -> "nether";
case 2 -> "the_end";
default -> throw new UnsupportedOperationException();
});
}
return Server.getInstance().getLevel(dimension);
for(Level level : Server.getInstance().getLevels().values())
if (level.getDimension() == dimension)
return level;
return null;
}

public static void destroyBlock(Level pointer, int x, int y, int z, boolean drop, int updateType,
Expand Down
140 changes: 140 additions & 0 deletions src/main/java/com/reider745/world/DimensionsMethods.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
package com.reider745.world;

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;
import com.reider745.api.pointers.PointersStorage;
import com.reider745.api.pointers.pointer_gen.PointerGenFastest;

import java.util.HashMap;
import java.util.Map;

public class DimensionsMethods {
public static class CustomDimensionGenerator extends Generator {
private ChunkManager manager;
private int dimensionId;
private Vector3 spawn = new Vector3(0, 0, 0);
private String name;
private final Map<String, Object> settings;
private final DimensionData data;

public CustomDimensionGenerator(Map<String, Object> settings){
this.settings = settings;

dimensionId = (int) settings.get("id");
name = (String) settings.get("name");
data = new DimensionData(dimensionId, 0, 256);
}

@Override
public DimensionData getDimensionData() {
return data;
}

@Override
public int getId() {
return dimensionId;
}

@Override
public void init(ChunkManager chunkManager, NukkitRandom nukkitRandom) {
this.manager = chunkManager;
}

@Override
public void populateStructure(int chunkX, int chunkZ) {

}

@Override
public void generateChunk(int chunkX, int chunkZ) {
final BaseFullChunk chunk = manager.getChunk(chunkX, chunkZ);
chunk.setBlock(0, 0, 0, 1, 0);
}

@Override
public void populateChunk(int chunkX, int chunkZ) {

}

@Override
public Map<String, Object> getSettings() {
return settings;
}

@Override
public String getName() {
return name;
}

@Override
public Vector3 getSpawn() {
return spawn;
}

@Override
public ChunkManager getChunkManager() {
return manager;
}
}

public static class CustomDimensionDescription {
private final int id;
private final String name;

public CustomDimensionDescription(int id, String name){
this.id = id;
this.name = name;
}

public int getId() {
return id;
}

public String getName() {
return name;
}
}

private static final PointersStorage<CustomDimensionDescription> customDimensionsPointers = new PointersStorage<>("dimensions", new PointerGenFastest(), false);
public static final Map<String, CustomDimensionDescription> descriptions = new HashMap<>();

public static long nativeConstruct(int id, String name) {
CustomDimensionDescription description = new CustomDimensionDescription(id, name);
descriptions.put(name, description);
return customDimensionsPointers.addPointer(description);
}

public static void init(){
Generator.addGenerator(CustomDimensionGenerator.class, "inner_core_generator", 666);
}

public static void initLevel(Level level) {
final String name = level.getName();
CustomDimensionDescription description = descriptions.get(name);
if(description == null) return;

final Map<String, Object> options = level.requireProvider().getGeneratorOptions();

options.put("id", description.getId());
options.put("name", name);
}

public static void initLevels() {
final Server server = Server.getInstance();

for(CustomDimensionDescription description : descriptions.values()){
final String name = description.getName();

if (server.getLevelByName(name) == null) {
server.generateLevel(name, System.currentTimeMillis(), CustomDimensionGenerator.class);
server.loadLevel(name);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.zhekasmirnov.innercore.api.dimensions;

import com.reider745.InnerCoreServer;
import com.reider745.world.DimensionsMethods;
import com.zhekasmirnov.innercore.api.log.ICLog;

import java.util.HashMap;
Expand All @@ -9,7 +10,7 @@ public class CustomDimension {
private static final HashMap<String, CustomDimension> dimensionByName = new HashMap<>();
private static final HashMap<Integer, CustomDimension> dimensionById = new HashMap<>();

public final long pointer = 0;
public final long pointer;
public final int id;
public final String name;

Expand All @@ -22,6 +23,7 @@ public CustomDimension(String name, int prefferedId) {
}
this.id = prefferedId;
this.name = name;
this.pointer = nativeConstruct(id, name);
dimensionById.put(id, this);
dimensionByName.put(name, this);
}
Expand Down Expand Up @@ -50,52 +52,42 @@ public boolean hasSkyLight() {
}

public CustomDimension setSkyColor(float r, float g, float b) {
InnerCoreServer.useNotCurrentSupport("CustomDimension.setSkyColor(r, g, b)");
return this;
}

public CustomDimension resetSkyColor() {
InnerCoreServer.useNotCurrentSupport("CustomDimension.resetSkyColor()");
return this;
}

public CustomDimension setFogColor(float r, float g, float b) {
InnerCoreServer.useNotCurrentSupport("CustomDimension.setFogColor(r, g, b)");
return this;
}

public CustomDimension resetFogColor() {
InnerCoreServer.useNotCurrentSupport("CustomDimension.resetFogColor()");
return this;
}

public CustomDimension setCloudColor(float r, float g, float b) {
InnerCoreServer.useNotCurrentSupport("CustomDimension.setCloudColor(r, g, b)");
return this;
}

public CustomDimension resetCloudColor() {
InnerCoreServer.useNotCurrentSupport("CustomDimension.resetCloudColor()");
return this;
}

public CustomDimension setSunsetColor(float r, float g, float b) {
InnerCoreServer.useNotCurrentSupport("CustomDimension.setSunsetColor(r, g, b)");
return this;
}

public CustomDimension resetSusetColor() {
InnerCoreServer.useNotCurrentSupport("CustomDimension.resetSusetColor()");
return this;
}

public CustomDimension setFogDistance(float start, float end) {
InnerCoreServer.useNotCurrentSupport("CustomDimension.setFogDistance(start, end)");
return this;
}

public CustomDimension resetFogDistance() {
InnerCoreServer.useNotCurrentSupport("CustomDimension.resetFogDistance()");
return this;
}

Expand All @@ -115,4 +107,24 @@ public static boolean isLimboId(int id) {
InnerCoreServer.useNotCurrentSupport("CustomDimension.isLimboId(id)");
return false;
}

private static long nativeConstruct(int id, String name){
return DimensionsMethods.nativeConstruct(id, name);
}
private static native long nativeGetCustomDimensionById(int id);
private static native boolean nativeIsLimboDimensionId(int id);
private static native void nativeOverrideVanillaGenerator(int id, long generator);
private static native void nativeSetGenerator(long ptr, long generator);
private static native void nativeSetHasSkyLight(long ptr, boolean value);
private static native void nativeSetSkyColor(long ptr, float r, float g, float b);
private static native void nativeResetSkyColor(long ptr);
private static native void nativeSetFogColor(long ptr, float r, float g, float b);
private static native void nativeResetFogColor(long ptr);
private static native void nativeSetCloudColor(long ptr, float r, float g, float b);
private static native void nativeResetCloudColor(long ptr);
private static native void nativeSetSunsetColor(long ptr, float r, float g, float b);
private static native void nativeResetSunsetColor(long ptr);
private static native void nativeSetFogDistance(long ptr, float start, float end);
private static native void nativeResetFogDistance(long ptr);

}

0 comments on commit e5a3bff

Please sign in to comment.