diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index c39154b13..b7e87aed6 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -91,6 +91,7 @@ import java.io.*; import java.lang.annotation.Annotation; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; +import java.lang.management.ThreadMXBean; import java.net.URL; import java.util.Date; import java.util.Map; @@ -811,6 +812,22 @@ public class Iris extends VolmitPlugin implements Listener { Iris.info("Server type & version: " + C.RED + Bukkit.getVersion()); } else { Iris.info("Server type & version: " + Bukkit.getVersion()); } Iris.info("Java: " + getJava()); + try { + if (getCPUModel().contains("Intel")) { + Iris.info("Server Cpu: " + C.BLUE + getCPUModel()); + } + if (getCPUModel().contains("Ryzen")) { + Iris.info("Server Cpu: " + C.RED + getCPUModel()); + } + if (!getCPUModel().contains("Ryzen") && !getCPUModel().contains("Intel")) { + Iris.info("Server Cpu: " + C.GRAY + getCPUModel()); + } + + } catch (Exception e){ + Iris.info("Server Cpu: " + C.DARK_RED + "Failed"); + } + + Iris.info("Threads: " + C.GRAY + Runtime.getRuntime().availableProcessors()); if (!instance.getServer().getVersion().contains("Purpur")) { if (instance.getServer().getVersion().contains("Spigot") && instance.getServer().getVersion().contains("Bukkit")) { Iris.info(C.RED + " Iris requires paper or above to function properly.."); diff --git a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java index 01316a54d..13b99e225 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java +++ b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java @@ -99,6 +99,10 @@ public interface INMSBinding { int countCustomBiomes(); + default boolean setBlock(World world, int x, int y, int z, BlockData data, int flag, int updateDepth) { + throw new UnsupportedOperationException(); + } + void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk); default boolean supportsDataPacks() { diff --git a/core/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java b/core/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java index 3348a4b52..583745c2c 100644 --- a/core/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java +++ b/core/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java @@ -57,30 +57,29 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator public IrisTerrainNormalActuator(Engine engine) { super(engine, "Terrain"); rng = new RNG(engine.getSeedManager().getTerrain()); - boolean debug = getDimension().getMerger().isDatapackMode(); - if (!getDimension().getMerger().getGenerator().isBlank()) { - try { - if (!getDimension().getMerger().isDatapackMode()) { - this.memoryWorld = INMS.get().createMemoryWorld(new WorldCreator("terrain").generator(getEngine().getDimension().getMerger().getGenerator())); - } else { - String test = getDimension().getMerger().getGenerator().toLowerCase(); - this.memoryWorld = INMS.get().createMemoryWorld(NamespacedKey.minecraft(test), new WorldCreator("terrain")); - } - } catch (Exception e) { - e.printStackTrace(); - } - } + // todo: for v4 +// boolean debug = getDimension().getMerger().isDatapackMode(); +// if (!getDimension().getMerger().getGenerator().isBlank()) { +// try { +// if (!getDimension().getMerger().isDatapackMode()) { +// this.memoryWorld = INMS.get().createMemoryWorld(new WorldCreator("terrain").generator(getEngine().getDimension().getMerger().getGenerator())); +// } else { +// String test = getDimension().getMerger().getGenerator().toLowerCase(); +// this.memoryWorld = INMS.get().createMemoryWorld(NamespacedKey.minecraft(test), new WorldCreator("terrain")); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } } @BlockCoordinates @Override public void onActuate(int x, int z, Hunk h, boolean multicore, ChunkContext context) { try { - PrecisionStopwatch p = PrecisionStopwatch.start(); AtomicReference> hm = new AtomicReference<>(); if (memoryWorld != null) { - PaperLib.getChunkAtAsync(memoryWorld.getBukkit(), x, z, true).thenAccept((i) -> { hm.set(toHunk(memoryWorld.getChunkData(x, z))); }).get(); @@ -176,11 +175,6 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator continue; } - // Merger DEV CODE - if (hm != null) { - h.set(xf, i, zf, hm.get(xf, i, zf)); - } - BlockData ore = biome.generateOres(realX, i, realZ, rng, getData()); ore = ore == null ? region.generateOres(realX, i, realZ, rng, getData()) : ore; ore = ore == null ? getDimension().generateOres(realX, i, realZ, rng, getData()) : ore; diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java index 6f18e3b6a..544a853f7 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java @@ -144,8 +144,10 @@ public class IrisDimension extends IrisRegistrant { @RegistryListResource(IrisJigsawStructure.class) @Desc("If defined, Iris will place the given jigsaw structure where minecraft should place the overworld stronghold.") private String stronghold; - @Desc("Iris merger") - private IrisMerger merger = new IrisMerger(); +// @Desc("Iris merger") V4 Feature +// private IrisMerger merger = new IrisMerger(); + @Desc("Cheap temp solution till v4 arrives") + private boolean vanillaUnderground = true; @Desc("If set to true, Iris will remove chunks to allow visualizing cross sections of chunks easily") private boolean debugChunkCrossSections = false; @Desc("Vertically split up the biome palettes with 3 air blocks in between to visualize them") diff --git a/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java b/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java index 237543e23..ac542eb6f 100644 --- a/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java +++ b/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java @@ -20,6 +20,7 @@ package com.volmit.iris.engine.platform; import com.volmit.iris.Iris; import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.core.nms.IMemoryWorld; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.engine.IrisEngine; @@ -32,23 +33,31 @@ import com.volmit.iris.engine.object.StudioMode; import com.volmit.iris.engine.platform.studio.StudioGenerator; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.data.IrisBiomeStorage; +import com.volmit.iris.util.format.Form; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.hunk.view.BiomeGridHunkHolder; import com.volmit.iris.util.hunk.view.ChunkDataHunkHolder; import com.volmit.iris.util.io.ReactiveFolder; +import com.volmit.iris.util.math.RollingSequence; +import com.volmit.iris.util.misc.E; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.Looper; +import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Setter; +import org.apache.commons.lang3.Functions; +import org.apache.commons.lang3.function.Failable; import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.WorldInitEvent; import org.bukkit.generator.BiomeProvider; import org.bukkit.generator.BlockPopulator; @@ -83,10 +92,12 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun private final KList populators; private final ChronoLatch hotloadChecker; private final AtomicBoolean setup; + private IMemoryWorld memoryWorld; private final boolean studio; private final AtomicInteger a = new AtomicInteger(0); private final CompletableFuture spawnChunks = new CompletableFuture<>(); private final boolean smartVanillaHeight; + private RollingSequence mergeDuration; private Engine engine; private Looper hotloader; private StudioMode lastMode; @@ -103,6 +114,14 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun populators = new KList<>(); loadLock = new Semaphore(LOAD_LOCKS); this.world = world; + this.mergeDuration = new RollingSequence(20); + try { + this.memoryWorld = INMS.get().createMemoryWorld(NamespacedKey.minecraft("overworld"), new WorldCreator("terrain")); + } catch (Exception e) { + e.printStackTrace(); + } + + //this.memoryWorld = engine.getDimension().isVanillaUnderground() ? Failable.get(() -> INMS.get().createMemoryWorld(NamespacedKey.minecraft("overworld"), new WorldCreator("terrain"))) : null; this.hotloadChecker = new ChronoLatch(1000, false); this.studio = studio; this.dataLocation = dataLocation; @@ -362,8 +381,12 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun getEngine().generate(x << 4, z << 4, blocks, biomes, false); blocks.apply(); biomes.apply(); + J.s(() -> { + //generateVanillaUnderground(x,z, blocks); + }); } + Iris.info("dev"); Iris.debug("Generated " + x + " " + z); } catch (Throwable e) { Iris.error("======================================"); @@ -379,6 +402,50 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun } } + @EventHandler + private void onChunkGeneration(ChunkLoadEvent event) { + if(!event.isNewChunk() || !engine.getWorld().realWorld().equals(event.getWorld()) || !engine.getDimension().isVanillaUnderground()) return; + generateVanillaUnderground(event.getChunk().getX(), event.getChunk().getZ()); + } + + @Deprecated + private void generateVanillaUnderground(int x, int z) { + if (memoryWorld == null || engine.getWorld() == null) + throw new NullPointerException(); + PrecisionStopwatch p = PrecisionStopwatch.start(); + Hunk vh = toHunk(memoryWorld.getChunkData(x, z)); + int totalHeight = memoryWorld.getBukkit().getMaxHeight() - memoryWorld.getBukkit().getMinHeight(); + int minHeight = memoryWorld.getBukkit().getMinHeight(); + + for (int xx = 0; xx < 16; xx++) { + for (int zz = 0; zz < 16; zz++) { + for (int y = 0; y < totalHeight; y++) { + if (y < engine.getHeight(x * 16 + xx, z * 16 + zz, false) - 10) { + BlockData blockData = vh.get(xx, y, zz); + if (blockData != null) { + INMS.get().setBlock(world.realWorld(), x * 16 + xx, y - minHeight , z * 16 + zz, blockData, 1042, 0); + } + } + } + } + } + mergeDuration.put(p.getMilliseconds()); + Iris.info("Vanilla merge average in: " + Form.duration(mergeDuration.getAverage(), 8)); + } + + private Hunk toHunk(ChunkGenerator.ChunkData data) { + Hunk h = Hunk.newArrayHunk(16, memoryWorld.getBukkit().getMaxHeight() - memoryWorld.getBukkit().getMinHeight(), 16); + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < memoryWorld.getBukkit().getMaxHeight() - memoryWorld.getBukkit().getMinHeight(); y++) { + BlockData block = data.getBlockData(x, y, z); + h.set(x, y, z, block); + } + } + } + return h; + } + @Override public int getBaseHeight(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z, @NotNull HeightMap heightMap) { return 4; diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java index 4a105c5e8..457af3933 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java @@ -20,9 +20,11 @@ import net.minecraft.nbt.*; import net.minecraft.nbt.Tag; import net.minecraft.server.commands.data.BlockDataAccessor; import net.minecraft.tags.TagKey; +import net.minecraft.util.datafix.fixes.BlockStateData; import net.minecraft.world.level.DataPackConfig; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.chunk.LevelChunkSection; import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -634,6 +636,13 @@ public class NMSBinding implements INMSBinding { return registry.getHolderOrThrow(ResourceKey.create(Registries.BIOME, CraftNamespacedKey.toMinecraft(biome.getKey()))); } + @Override + public boolean setBlock(World world, int x, int y, int z, BlockData data, int flag, int updateDepth) { + var level = ((CraftWorld) world).getHandle(); + var blockData = ((CraftBlockData) data).getState(); + return level.setBlock(new BlockPos(x, y, z), blockData, flag, updateDepth); + } + @Override public BlockData getBlockData(CompoundTag tag) { if (tag == null) {