diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 536c1b79f..54280530b 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -39,6 +39,7 @@ import com.volmit.iris.engine.platform.DummyChunkGenerator; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; +import com.volmit.iris.util.exceptions.IrisException; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.function.NastyRunnable; @@ -58,6 +59,8 @@ import io.papermc.lib.PaperLib; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.serializer.ComponentSerializer; import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -137,6 +140,23 @@ public class Iris extends VolmitPlugin implements Listener { J.s(this::setupPapi); J.a(this::verifyDataPacksPost, 20); splash(); + + if(IrisSettings.get().getGeneral().isAutoStartDefaultStudio()) + { + Iris.info("Starting up auto Studio!"); + try { + Player r = new KList<>(getServer().getOnlinePlayers()).getRandom(); + Iris.service(StudioSVC.class).open(r != null ? new VolmitSender(r) : sender, 1337, IrisSettings.get().getGenerator().getDefaultWorldType(), (w) -> { + J.s(() -> {for(Player i : getServer().getOnlinePlayers()) + { + i.setGameMode(GameMode.SPECTATOR); + i.teleport(new Location(w, 0, 200, 0)); + }}); + }); + } catch (IrisException e) { + e.printStackTrace(); + } + } } @SuppressWarnings("unchecked") diff --git a/src/main/java/com/volmit/iris/core/IrisSettings.java b/src/main/java/com/volmit/iris/core/IrisSettings.java index 804e91dae..bd23ba419 100644 --- a/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -102,6 +102,7 @@ public class IrisSettings { public boolean keepProductionOnReload = false; public boolean pluginMetrics = true; public boolean splashLogoStartup = true; + public boolean autoStartDefaultStudio = false; public String forceMainWorld = ""; public int spinh = -20; public int spins = 7; diff --git a/src/main/java/com/volmit/iris/core/command/CommandIrisDebug.java b/src/main/java/com/volmit/iris/core/command/CommandIrisDebug.java index 838e8473d..8b2ebf91b 100644 --- a/src/main/java/com/volmit/iris/core/command/CommandIrisDebug.java +++ b/src/main/java/com/volmit/iris/core/command/CommandIrisDebug.java @@ -28,6 +28,8 @@ import com.volmit.iris.util.plugin.VolmitSender; public class CommandIrisDebug extends MortarCommand { @Command private CommandIrisDebugSpawnerBoost boost; + @Command + private CommandIrisDebugReupdate reupdate; public CommandIrisDebug() { super("debug", "dbg"); diff --git a/src/main/java/com/volmit/iris/core/command/CommandIrisDebugReupdate.java b/src/main/java/com/volmit/iris/core/command/CommandIrisDebugReupdate.java new file mode 100644 index 000000000..52e157b63 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/command/CommandIrisDebugReupdate.java @@ -0,0 +1,58 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.core.command; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.plugin.MortarCommand; +import com.volmit.iris.util.plugin.VolmitSender; +import org.bukkit.Chunk; + +public class CommandIrisDebugReupdate extends MortarCommand { + public CommandIrisDebugReupdate() { + super("reupdate", "rupt"); + requiresPermission(Iris.perm.studio); + setDescription("Force update a chunk again"); + setCategory("Studio"); + } + + + @Override + public void addTabOptions(VolmitSender sender, String[] args, KList list) { + + } + + @Override + public boolean handle(VolmitSender sender, String[] args) { + + Chunk c = sender.player().getLocation().getChunk(); + Engine e = IrisToolbelt.access(sender.player().getWorld()).getEngine(); + e.getMantle().getMantle().flag(c.getX(), c.getZ(), MantleFlag.UPDATE, false); + e.updateChunk(c); + return true; + } + + @Override + protected String getArgsUsage() { + return " [|,&,^,>>,<<,%] "; + } +} diff --git a/src/main/java/com/volmit/iris/core/project/IrisProject.java b/src/main/java/com/volmit/iris/core/project/IrisProject.java index 1dd9a4ab8..654cbd0bc 100644 --- a/src/main/java/com/volmit/iris/core/project/IrisProject.java +++ b/src/main/java/com/volmit/iris/core/project/IrisProject.java @@ -56,6 +56,7 @@ import com.volmit.iris.util.scheduling.jobs.ParallelQueueJob; import lombok.Data; import org.bukkit.Bukkit; import org.bukkit.GameMode; +import org.bukkit.World; import org.zeroturnaround.zip.ZipUtil; import java.awt.*; @@ -63,6 +64,7 @@ import java.io.File; import java.io.IOException; import java.util.Objects; import java.util.UUID; +import java.util.function.Consumer; @SuppressWarnings("ALL") @Data @@ -99,12 +101,12 @@ public class IrisProject { } public void open(VolmitSender sender) throws IrisException { - open(sender, 1337, () -> + open(sender, 1337, (w) -> { }); } - public void open(VolmitSender sender, long seed, Runnable onDone) throws IrisException { + public void open(VolmitSender sender, long seed, Consumer onDone) throws IrisException { if (isOpen()) { close(); } @@ -171,13 +173,20 @@ public class IrisProject { }); - J.a(() -> activeProvider = (PlatformChunkGenerator) IrisToolbelt.createWorld() - .seed(seed) - .sender(sender) - .studio(true) - .name("iris/" + UUID.randomUUID()) - .dimension(d.getLoadKey()) - .create().getGenerator()); + J.a(() -> { + try { + activeProvider = (PlatformChunkGenerator) IrisToolbelt.createWorld() + .seed(seed) + .sender(sender) + .studio(true) + .name("iris/" + UUID.randomUUID()) + .dimension(d.getLoadKey()) + .create().getGenerator(); + onDone.accept(activeProvider.getTarget().getWorld().realWorld()); + } catch (IrisException e) { + e.printStackTrace(); + } + }); } public void close() { diff --git a/src/main/java/com/volmit/iris/core/service/BoardSVC.java b/src/main/java/com/volmit/iris/core/service/BoardSVC.java index 3f5042cc0..f8c76991e 100644 --- a/src/main/java/com/volmit/iris/core/service/BoardSVC.java +++ b/src/main/java/com/volmit/iris/core/service/BoardSVC.java @@ -149,7 +149,7 @@ public class BoardSVC implements IrisService, BoardProvider { if (Iris.jobCount() > 0) { v.add("&7&m------------------"); - v.add(C.LIGHT_PURPLE + "Tasks" + C.GRAY + ": " + Iris.jobCount()); + v.add(C.LIGHT_PURPLE + "Tasks" + C.GRAY + ": " + Form.f(Iris.jobCount())); } v.add("&7&m------------------"); diff --git a/src/main/java/com/volmit/iris/core/service/StudioSVC.java b/src/main/java/com/volmit/iris/core/service/StudioSVC.java index dbbaa8e8c..aad2a367e 100644 --- a/src/main/java/com/volmit/iris/core/service/StudioSVC.java +++ b/src/main/java/com/volmit/iris/core/service/StudioSVC.java @@ -45,6 +45,7 @@ import org.zeroturnaround.zip.commons.FileUtils; import java.io.File; import java.io.IOException; import java.util.UUID; +import java.util.function.Consumer; public class StudioSVC implements IrisService { public static final String LISTING = "https://raw.githubusercontent.com/IrisDimensions/_listing/main/listing-v2.json"; @@ -322,7 +323,7 @@ public class StudioSVC implements IrisService { public void open(VolmitSender sender, long seed, String dimm) { try { - open(sender, seed, dimm, () -> { + open(sender, seed, dimm, (w) -> { }); } catch (Exception e) { Iris.reportError(e); @@ -331,7 +332,7 @@ public class StudioSVC implements IrisService { } } - public void open(VolmitSender sender, long seed, String dimm, Runnable onDone) throws IrisException { + public void open(VolmitSender sender, long seed, String dimm, Consumer onDone) throws IrisException { if (isProjectOpen()) { close(); } diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index 89522e5c5..fdc03cff9 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -411,12 +411,12 @@ public class IrisEngine implements Engine { } } else { getMantle().generateMatter(x >> 4, z >> 4, multicore); - getTerrainActuator().actuate(x, z, vblocks, multicore); + getTerrainActuator().actuate(x, z, blocks, multicore); getBiomeActuator().actuate(x, z, vbiomes, multicore); getDecorantActuator().actuate(x, z, blocks, multicore); - getPostModifier().modify(x, z, vblocks, multicore); - getDepositModifier().modify(x, z, vblocks, multicore); - getCaveModifier().modify(x >> 4,z >> 4, vblocks, multicore); + getPostModifier().modify(x, z, blocks, multicore); + getDepositModifier().modify(x, z, blocks, multicore); + getCaveModifier().modify(x >> 4,z >> 4, blocks, multicore); getMantle().insertMatter(x >> 4, z >> 4, BlockData.class, blocks, multicore); } getMetrics().getTotal().put(p.getMilliseconds()); diff --git a/src/main/java/com/volmit/iris/engine/IrisWorldManager.java b/src/main/java/com/volmit/iris/engine/IrisWorldManager.java index 43b38cca5..4bac6040a 100644 --- a/src/main/java/com/volmit/iris/engine/IrisWorldManager.java +++ b/src/main/java/com/volmit/iris/engine/IrisWorldManager.java @@ -62,6 +62,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager { private final Looper looper; private final int id; private final KMap chunkCooldowns; + private final KList updateQueue = new KList<>(); private double energy = 25; private int entityCount = 0; private final ChronoLatch cl; @@ -142,7 +143,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager { onAsyncTick(); } - return 50; + return 250; } }; looper.setPriority(Thread.MIN_PRIORITY); @@ -152,10 +153,18 @@ public class IrisWorldManager extends EngineAssignedWorldManager { private void updateChunks() { for (Player i : getEngine().getWorld().realWorld().getPlayers()) { - J.s(() -> { - Chunk c = i.getLocation().getChunk(); - J.a(() -> getEngine().updateChunk(c)); - }, RNG.r.i(0, 5)); + int r = 2; + Chunk c = i.getLocation().getChunk(); + for(int x = -r; x <= r; x++) + { + for(int z = -r; z <= r; z++) + { + if(c.getWorld().isChunkLoaded(c.getX() + x, c.getZ() + z)) + { + getEngine().updateChunk(c.getWorld().getChunkAt(c.getX() + x, c.getZ() + z)); + } + } + } } } @@ -372,6 +381,10 @@ public class IrisWorldManager extends EngineAssignedWorldManager { () -> J.a(() -> spawnIn(e, true), RNG.r.i(5, 200)))); energy += 0.3; fixEnergy(); + if(!getMantle().hasFlag(e.getX(), e.getZ(), MantleFlag.UPDATE)) + { + J.a(() -> getEngine().updateChunk(e),20); + } } public Mantle getMantle() { diff --git a/src/main/java/com/volmit/iris/engine/framework/Engine.java b/src/main/java/com/volmit/iris/engine/framework/Engine.java index 77711d6de..0b8a01d37 100644 --- a/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -46,12 +46,14 @@ import com.volmit.iris.util.data.B; import com.volmit.iris.util.data.DataProvider; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.ChunkCoordinates; +import com.volmit.iris.util.format.Form; import com.volmit.iris.util.function.Function2; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.BlockPosition; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.matter.MatterCavern; import com.volmit.iris.util.matter.MatterUpdate; import com.volmit.iris.util.matter.slices.UpdateMatter; import com.volmit.iris.util.parallel.BurstExecutor; @@ -61,20 +63,20 @@ import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import com.volmit.iris.util.stream.ProceduralStream; import io.papermc.lib.PaperLib; -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.Material; +import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_17_R1.block.CraftBlock; import org.bukkit.generator.ChunkGenerator; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import java.awt.*; +import java.awt.Color; import java.util.Arrays; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; @@ -233,21 +235,39 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat @ChunkCoordinates @Override default void updateChunk(Chunk c) { - getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.UPDATE, () -> J.s(() -> { - PrecisionStopwatch p = PrecisionStopwatch.start(); - getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), MatterUpdate.class, (x, y, z, v) -> { - if (v != null && v.isUpdate()) { - int vx = x & 15; - int vz = z & 15; - update(x, y, z, c, new RNG(Cache.key(c.getX(), c.getZ()))); + if(c.getWorld().isChunkLoaded(c.getX() + 1, c.getZ() + 1) + && c.getWorld().isChunkLoaded(c.getX(), c.getZ() + 1) + && c.getWorld().isChunkLoaded(c.getX() + 1, c.getZ()) + && c.getWorld().isChunkLoaded(c.getX() - 1, c.getZ() - 1) + && c.getWorld().isChunkLoaded(c.getX(), c.getZ() - 1) + && c.getWorld().isChunkLoaded(c.getX() - 1, c.getZ()) + && c.getWorld().isChunkLoaded(c.getX() + 1, c.getZ() - 1) + && c.getWorld().isChunkLoaded(c.getX() - 1, c.getZ() + 1)) + { + getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.UPDATE, () -> J.s(() -> { + PrecisionStopwatch p = PrecisionStopwatch.start(); - if (vx > 0 && vx < 15 && vz > 0 && vz < 15) { - updateLighting(x, y, z, c); + getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), MatterCavern.class, (x, y, z, v) -> { + update(x, y, z, c, new RNG(Cache.key(c.getX(), c.getZ()))); + }); + + getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), MatterUpdate.class, (x, y, z, v) -> { + if (v != null && v.isUpdate()) { + int vx = x & 15; + int vz = z & 15; + update(x, y, z, c, new RNG(Cache.key(c.getX(), c.getZ()))); + if (vx > 0 && vx < 15 && vz > 0 && vz < 15) { + updateLighting(x, y, z, c); + } } - } - }); - getMetrics().getUpdates().put(p.getMilliseconds()); - })); + }); + + + getMantle().getMantle().deleteChunkSlice(c.getX(), c.getZ(), MatterCavern.class); + getMantle().getMantle().deleteChunkSlice(c.getX(), c.getZ(), MatterUpdate.class); + getMetrics().getUpdates().put(p.getMilliseconds()); + }, RNG.r.i(0, 20))); + } } @BlockCoordinates diff --git a/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index 337ee9285..253ad5e10 100644 --- a/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -35,6 +35,8 @@ import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.mantle.MantleChunk; import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.matter.Matter; +import com.volmit.iris.util.matter.MatterCavern; import com.volmit.iris.util.matter.slices.CavernMatter; import com.volmit.iris.util.matter.slices.UpdateMatter; import com.volmit.iris.util.parallel.BurstExecutor; @@ -236,6 +238,16 @@ public interface EngineMantle extends IObjectPlacer { getMantle().set(x, y, z, CavernMatter.ON); } + @BlockCoordinates + default void dropCavernBlock(int x, int y, int z) { + Matter matter = getMantle().getChunk(x & 15, z & 15).get(y & 15); + + if(matter != null) + { + matter.slice(MatterCavern.class).set(x & 15, y & 15, z & 15, null); + } + } + @ChunkCoordinates default List getFeaturesInChunk(Chunk c) { return getFeaturesInChunk(c.getX(), c.getZ()); diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java b/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java index ba35da86c..9ff7883a3 100644 --- a/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java +++ b/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java @@ -21,6 +21,7 @@ package com.volmit.iris.engine.modifier; import com.volmit.iris.engine.data.cache.Cache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.EngineAssignedModifier; +import com.volmit.iris.engine.object.basic.IrisPosition; import com.volmit.iris.engine.object.biome.IrisBiome; import com.volmit.iris.engine.object.deposits.IrisDepositGenerator; import com.volmit.iris.engine.object.objects.IrisObject; @@ -39,6 +40,8 @@ import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.util.BlockVector; +import java.util.Set; + public class IrisCarveModifier extends EngineAssignedModifier { private final RNG rng; private final BlockData AIR = Material.CAVE_AIR.createBlockData(); @@ -53,11 +56,10 @@ public class IrisCarveModifier extends EngineAssignedModifier { PrecisionStopwatch p = PrecisionStopwatch.start(); Mantle mantle = getEngine().getMantle().getMantle(); MantleChunk mc = getEngine().getMantle().getMantle().getChunk(x, z); + mc.iterate(MatterCavern.class, (xx, yy, zz, c) -> { int rx = xx & 15; int rz = zz & 15; - boolean caveAbove = mantle.get(xx, yy+1, zz, MatterCavern.class) != null; - BlockData currentAbove = output.get(rx, yy+1, rz); BlockData current = output.get(rx, yy, rz); if(current.getMaterial().isAir()) @@ -65,23 +67,11 @@ public class IrisCarveModifier extends EngineAssignedModifier { return; } - if(B.isFluid(currentAbove) && !caveAbove) - { - getEngine().getMantle().updateBlock(xx, yy+1, zz); - } - if(B.isFluid(current)) { - getEngine().getMantle().updateBlock(xx, yy, zz); return; } - if(B.isFoliage(currentAbove) && !caveAbove) - { - output.set(rx, yy+1, rz, AIR); - getEngine().getMantle().updateBlock(xx, yy+2, zz); - } - output.set(rx, yy, rz, AIR); }); getEngine().getMetrics().getDeposit().put(p.getMilliseconds()); diff --git a/src/main/java/com/volmit/iris/util/data/B.java b/src/main/java/com/volmit/iris/util/data/B.java index ecb14eca4..a112b4c28 100644 --- a/src/main/java/com/volmit/iris/util/data/B.java +++ b/src/main/java/com/volmit/iris/util/data/B.java @@ -28,6 +28,7 @@ import it.unimi.dsi.fastutil.ints.IntSets; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Leaves; import java.util.Arrays; @@ -510,4 +511,8 @@ public class B { return bt.toArray(new String[0]); } + + public static boolean isWaterLogged(BlockData b) { + return (b instanceof Waterlogged) && ((Waterlogged)b).isWaterlogged(); + } } diff --git a/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/src/main/java/com/volmit/iris/util/mantle/Mantle.java index 092a1b6c7..5f0ea90f8 100644 --- a/src/main/java/com/volmit/iris/util/mantle/Mantle.java +++ b/src/main/java/com/volmit/iris/util/mantle/Mantle.java @@ -38,6 +38,7 @@ import com.volmit.iris.util.math.KochanekBartelsInterpolation; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.PathInterpolation; import com.volmit.iris.util.matter.Matter; +import com.volmit.iris.util.matter.MatterCavern; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.HyperLock; import com.volmit.iris.util.parallel.MultiBurst; @@ -506,4 +507,8 @@ public class Mantle { public MantleChunk getChunk(Chunk e) { return getChunk(e.getX(), e.getZ()); } + + public void deleteChunkSlice(int x, int z, Class c) { + getChunk(x, z).deleteSlices(c); + } } diff --git a/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java b/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java index 56f69ffe7..46b57ec2b 100644 --- a/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java +++ b/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java @@ -241,4 +241,15 @@ public class MantleChunk { public List getFeatures() { return features; } + + public void deleteSlices(Class c) { + for(int i = 0; i < sections.length(); i++) + { + Matter m = sections.get(i); + if(m != null && m.hasSlice(c)) + { + m.deleteSlice(c); + } + } + } }