Cleanup old compat

This commit is contained in:
Daniel Mills 2021-07-20 11:33:02 -04:00
parent 326bddad2a
commit 18195b778a
16 changed files with 61 additions and 710 deletions

View File

@ -78,9 +78,6 @@ public class Iris extends VolmitPlugin implements Listener {
public static MultiverseCoreLink linkMultiverseCore; public static MultiverseCoreLink linkMultiverseCore;
public static MythicMobsLink linkMythicMobs; public static MythicMobsLink linkMythicMobs;
private static final Queue<Runnable> syncJobs = new ShurikenQueue<>(); private static final Queue<Runnable> syncJobs = new ShurikenQueue<>();
public static boolean customModels = doesSupportCustomModels();
public static boolean awareEntities = doesSupportAwareness();
public static boolean lowMemoryMode = false;
public static IrisCompat compat; public static IrisCompat compat;
public static FileWatcher configWatcher; public static FileWatcher configWatcher;
@ -94,7 +91,6 @@ public class Iris extends VolmitPlugin implements Listener {
instance = this; instance = this;
INMS.get(); INMS.get();
IO.delete(new File("iris")); IO.delete(new File("iris"));
lowMemoryMode = Runtime.getRuntime().maxMemory() < 4000000000L; // 4 * 1000 * 1000 * 1000 // 4;
installDataPacks(); installDataPacks();
} }
@ -155,30 +151,6 @@ public class Iris extends VolmitPlugin implements Listener {
Iris.info("Data Packs Setup!"); Iris.info("Data Packs Setup!");
} }
private static boolean doesSupportCustomModels() {
try {
int v = Integer.parseInt(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]);
return v >= 14;
} catch (Throwable e) {
Iris.reportError(e);
}
return false;
}
private static boolean doesSupportAwareness() {
try {
int v = Integer.parseInt(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]);
return v >= 15;
} catch (Throwable e) {
Iris.reportError(e);
}
return false;
}
@Override @Override
public void start() { public void start() {
@ -545,18 +517,6 @@ public class Iris extends VolmitPlugin implements Listener {
} }
Iris.info("\n\n " + new KList<>(splash).toString("\n") + "\n"); Iris.info("\n\n " + new KList<>(splash).toString("\n") + "\n");
if (lowMemoryMode) {
Iris.verbose("* Low Memory mode Activated! For better performance, allocate 4gb or more to this server.");
}
if (!customModels) {
Iris.verbose("* This version of minecraft does not support custom model data in loot items (1.14 and up). Iris will generate as normal, but loot will not have custom models.");
}
if (!doesSupportAwareness()) {
Iris.verbose("* This version of minecraft does not support entity awareness.");
}
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")

View File

@ -63,7 +63,7 @@ public class IrisSettings {
return 2; return 2;
} }
return c < 0 ? Runtime.getRuntime().availableProcessors() / -c : c; return Math.max(2, c < 0 ? Runtime.getRuntime().availableProcessors() / -c : c);
} }
@Data @Data
@ -73,8 +73,12 @@ public class IrisSettings {
@Data @Data
public static class IrisSettingsConcurrency { public static class IrisSettingsConcurrency {
public int threadCount = -1; public int engineThreadCount = -1;
public int engineThreadPriority = 6;
public int pregenThreadCount = -1; public int pregenThreadCount = -1;
public int pregenThreadPriority = 8;
public int miscThreadCount = -4;
public int miscThreadPriority = 3;
} }
@Data @Data

View File

@ -21,7 +21,6 @@ package com.volmit.iris.core.command.world;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.core.IrisDataManager;
import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.gui.components.Pregenerator;
import com.volmit.iris.core.link.MultiverseCoreLink; import com.volmit.iris.core.link.MultiverseCoreLink;
import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.INMS;
import com.volmit.iris.core.tools.IrisWorldCreator; import com.volmit.iris.core.tools.IrisWorldCreator;
@ -161,8 +160,7 @@ public class CommandIrisCreate extends MortarCommand {
sender.sendMessage("Pregenerating " + worldName + " " + size + " x " + size); sender.sendMessage("Pregenerating " + worldName + " " + size + " x " + size);
sender.sendMessage("Expect server lag during this time. Use '/iris pregen stop' to cancel"); sender.sendMessage("Expect server lag during this time. Use '/iris pregen stop' to cancel");
new Pregenerator(world.get(), size, () ->
b.set(true));
} }
World ww = world.get(); World ww = world.get();
@ -248,15 +246,6 @@ public class CommandIrisCreate extends MortarCommand {
World w = INMS.get().createWorld(wc); World w = INMS.get().createWorld(wc);
world.set(w); world.set(w);
try {
if (pregen.get() > 0) {
new Pregenerator(w, pregen.get());
}
} catch (Throwable e) {
Iris.reportError(e);
}
done.set(true); done.set(true);
}); });
} }

View File

@ -22,6 +22,7 @@ import com.volmit.iris.Iris;
import com.volmit.iris.core.gui.PregeneratorJob; import com.volmit.iris.core.gui.PregeneratorJob;
import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.core.pregenerator.PregenTask;
import com.volmit.iris.core.pregenerator.methods.HybridPregenMethod; import com.volmit.iris.core.pregenerator.methods.HybridPregenMethod;
import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.Position2;
import com.volmit.iris.util.plugin.MortarCommand; import com.volmit.iris.util.plugin.MortarCommand;
@ -108,12 +109,11 @@ public class CommandIrisPregen extends MortarCommand {
} }
} }
try { try {
new PregeneratorJob(PregenTask IrisToolbelt.pregenerate(PregenTask
.builder() .builder()
.center(new Position2(0, 0)) .center(new Position2(0, 0))
.radius(((getVal(args[0])>>4)>>5) + 1) .radius(((getVal(args[0])>>4)>>5) + 1)
.build(), .build(), world);
new HybridPregenMethod(world, Runtime.getRuntime().availableProcessors()));
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
Iris.reportError(e); Iris.reportError(e);
sender.sendMessage("Invalid argument in command"); sender.sendMessage("Invalid argument in command");

View File

@ -1,638 +0,0 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package com.volmit.iris.core.gui.components;
import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.tools.IrisWorlds;
import com.volmit.iris.engine.data.mca.MCAFile;
import com.volmit.iris.engine.data.mca.NBTWorld;
import com.volmit.iris.engine.framework.IrisAccess;
import com.volmit.iris.engine.parallel.BurstExecutor;
import com.volmit.iris.engine.parallel.MultiBurst;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.function.Consumer2;
import com.volmit.iris.util.function.Consumer3;
import com.volmit.iris.util.math.Position2;
import com.volmit.iris.util.math.M;
import com.volmit.iris.util.math.RollingSequence;
import com.volmit.iris.util.math.Spiraler;
import com.volmit.iris.util.scheduling.ChronoLatch;
import com.volmit.iris.util.scheduling.J;
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import com.volmit.iris.util.scheduling.SR;
import io.papermc.lib.PaperLib;
import lombok.Data;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.event.Listener;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Comparator;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.ReentrantLock;
@Deprecated
@Data
public class Pregenerator implements Listener {
private static Pregenerator instance;
private static final Color COLOR_ERROR = Color.decode("#E34113");
private static final Color COLOR_MCA_PREPARE = Color.decode("#3CAAB5");
private static final Color COLOR_MCA_RELOAD = Color.decode("#41FF61");
private static final Color COLOR_MCA_GENERATE = Color.decode("#33FF8F");
private static final Color COLOR_MCA_GENERATE_SLOW = Color.decode("#13BAE3");
private static final Color COLOR_MCA_GENERATE_SLOW_ASYNC = Color.decode("#13BAE3");
private static final Color COLOR_MCA_GENERATED = Color.decode("#33FF8F");
private static final Color COLOR_MCA_GENERATED_MCA = Color.decode("#13E3C9");
private static final Color COLOR_MCA_SEALED = Color.decode("#33FF8F");
private static final Color COLOR_MCA_DEFERRED = Color.decode("#3CB57A");
private final World world;
private int lowestBedrock;
private final NBTWorld directWriter;
private final AtomicBoolean active;
private final AtomicBoolean running;
private final KList<Position2> errors;
private final KList<Runnable> onComplete;
private final Position2 max;
private final Position2 min;
private final MCAPregenGui gui;
private final KList<Position2> mcaDefer;
private final AtomicInteger generated;
private final AtomicInteger generatedLast;
private final RollingSequence perSecond;
private final RollingSequence perMinute;
private final AtomicInteger totalChunks;
private final AtomicLong memory;
private final AtomicReference<String> memoryMetric;
private final AtomicReference<String> method;
private final AtomicInteger vmcax;
private final AtomicInteger vmcaz;
private final AtomicInteger vcax;
private final AtomicInteger vcaz;
private final long elapsed;
private final ChronoLatch latch;
private IrisAccess access;
private final KList<Position2> regionReload;
private KList<Position2> wait = new KList<>();
public Pregenerator(World world, int blockSize, Runnable onComplete) {
this(world, blockSize);
this.onComplete.add(onComplete);
}
public Pregenerator(World world, int blockSize) throws HeadlessException {
this(world, blockSize, true);
}
public Pregenerator(World world, int blockSize, boolean dogui) throws HeadlessException {
instance();
regionReload = new KList<>();
latch = new ChronoLatch(5000);
memoryMetric = new AtomicReference<>("...");
method = new AtomicReference<>("STARTUP");
memory = new AtomicLong(0);
this.world = world;
errors = new KList<>();
vmcax = new AtomicInteger();
vmcaz = new AtomicInteger();
vcax = new AtomicInteger();
vcaz = new AtomicInteger();
perMinute = new RollingSequence(200);
perSecond = new RollingSequence(20);
generatedLast = new AtomicInteger(0);
totalChunks = new AtomicInteger(0);
generated = new AtomicInteger(0);
mcaDefer = new KList<>();
access = IrisWorlds.access(world);
this.directWriter = new NBTWorld(world.getWorldFolder());
this.running = new AtomicBoolean(true);
this.active = new AtomicBoolean(true);
MultiBurst burst = new MultiBurst("Iris Pregenerator", 9, Runtime.getRuntime().availableProcessors());
int mcaSize = (((blockSize >> 4) + 2) >> 5) + 1;
onComplete = new KList<>();
max = new Position2(0, 0);
min = new Position2(0, 0);
KList<Runnable> draw = new KList<>();
new Spiraler(mcaSize, mcaSize, (xx, zz) -> {
min.setX(Math.min(xx << 5, min.getX()));
min.setZ(Math.min(zz << 5, min.getZ()));
max.setX(Math.max((xx << 5) + 31, max.getX()));
max.setZ(Math.max((zz << 5) + 31, max.getZ()));
totalChunks.getAndAdd(1024);
draw.add(() -> drawMCA(xx, zz, COLOR_MCA_PREPARE));
}).drain();
if (access != null) {
lowestBedrock = access.getCompound().getLowestBedrock();
}
gui = dogui ? (IrisSettings.get().getGui().isLocalPregenGui() && IrisSettings.get().getGui().isUseServerLaunchedGuis() ? MCAPregenGui.createAndShowGUI(this) : null) : null;
flushWorld();
KList<Position2> order = computeChunkOrder();
Consumer3<Integer, Integer, Consumer2<Integer, Integer>> mcaIteration =
(ox, oz, r) -> order.forEach((i)
-> r.accept(i.getX() + ox, i.getZ() + oz));
draw.forEach(Runnable::run);
Spiraler spiraler = new Spiraler(mcaSize, mcaSize, (xx, zz) -> {
vmcax.set(xx);
vmcaz.set(zz);
flushWorld();
drawMCA(xx, zz, COLOR_MCA_PREPARE);
if (access != null && generateMCARegion(xx, zz, burst, access, mcaIteration)) {
flushWorld();
}
});
elapsed = M.ms();
new Thread(() -> {
flushWorld();
J.sleep(2000);
flushWorld();
while (running.get() && spiraler.hasNext()) {
if (active.get()) {
spiraler.next();
}
}
mcaDefer.removeDuplicates();
while (running.get() && mcaDefer.isNotEmpty()) {
Position2 p = mcaDefer.popLast();
vmcax.set(p.getX());
vmcaz.set(p.getZ());
generateDeferedMCARegion(p.getX(), p.getZ(), burst, mcaIteration);
flushWorld();
}
while (wait.isNotEmpty()) {
J.sleep(50);
}
burst.shutdownNow();
directWriter.close();
flushWorld();
onComplete.forEach(Runnable::run);
running.set(false);
active.set(false);
if (gui != null) {
gui.close();
}
}).start();
new Thread(() -> {
PrecisionStopwatch p = PrecisionStopwatch.start();
while (running.get() && active.get()) {
int m = generated.get();
int w = generatedLast.get();
int up = m - w;
double dur = p.getMilliseconds();
perSecond.put((int) (up / (dur / 1000D)));
perMinute.put((int) (up / (dur / 60000D)));
p.reset();
p.begin();
updateProgress();
generatedLast.set(m);
J.sleep(100);
long lmem = memory.get();
memory.set(Runtime.getRuntime().freeMemory());
if (memory.get() > lmem) {
long free = memory.get();
long max = Runtime.getRuntime().maxMemory();
long total = Runtime.getRuntime().totalMemory();
long use = total - free;
memoryMetric.set(Form.memSize(use, 2) + " (" + Form.pc((double) use / (double) max, 0) + ")");
}
}
}).start();
}
private boolean generateMCARegion(int x, int z, MultiBurst burst, IrisAccess access, Consumer3<Integer, Integer, Consumer2<Integer, Integer>> mcaIteration) {
if (!Iris.instance.isMCA()) {
generateDeferedMCARegion(x, z, burst, mcaIteration);
return false;
}
File mca = directWriter.getRegionFile(x, z);
BurstExecutor e = burst.burst(1024);
int mcaox = x << 5;
int mcaoz = z << 5;
if (isMCAWritable(x, z) && !mca.exists()) {
method.set("Direct (Fast)");
mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> e.queue(() -> {
draw(ii, jj, COLOR_MCA_GENERATE);
access.directWriteChunk(access.getCompound().getWorld(), ii, jj, directWriter);
draw(ii, jj, COLOR_MCA_GENERATED_MCA);
generated.getAndIncrement();
vcax.set(ii);
vcaz.set(jj);
}));
e.complete();
//verifyMCA(x, z, burst);
directWriter.save();
} else {
totalChunks.getAndAdd(1024);
mcaDefer.add(new Position2(x, z));
e.complete();
return false;
}
return true;
}
private void verifyMCA(int x, int z, MultiBurst burst) {
MCAFile rg = directWriter.getMCA(x, z);
KList<Runnable> requeue = new KList<>();
for (int i = 0; i < 32; i++)
{
for(int j = 0; j < 32; j++)
{
com.volmit.iris.engine.data.mca.Chunk c = rg.getChunk(i, j);
if(c == null)
{
draw(((x << 5) + i), ((z << 5) + j), COLOR_ERROR);
int finalI = i;
int finalJ = j;
requeue.add(() -> {
draw(((x << 5) + finalI), ((z << 5) + finalJ), COLOR_MCA_GENERATE);
access.directWriteChunk(access.getCompound().getWorld(), ((x << 5) + finalI), ((z << 5) + finalJ), directWriter);
draw(((x << 5) + finalI), ((z << 5) + finalJ), COLOR_MCA_GENERATED_MCA);
});
}
}
}
if(requeue.isNotEmpty())
{
burst.burst(requeue);
verifyMCA(x, z, burst);
}
}
public void updateProgress() {
if (!latch.flip()) {
return;
}
String[] v = getProgress();
Iris.info("Pregeneration " + v[0] + " | " + v[1] + " | " + v[2] + " | " + v[3]);
}
private void generateDeferedMCARegion(int x, int z, MultiBurst burst, Consumer3<Integer, Integer, Consumer2<Integer, Integer>> mcaIteration) {
int mcaox = x << 5;
int mcaoz = z << 5;
if (PaperLib.isPaper()) {
method.set("PaperAsync (Slow)");
while (wait.size() > 16) {
J.sleep(5);
}
mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> {
Position2 cx = new Position2(ii, jj);
PaperLib.getChunkAtAsync(world, ii, jj).thenAccept((c) -> {
draw(ii, jj, COLOR_MCA_GENERATE_SLOW_ASYNC);
draw(ii, jj, COLOR_MCA_GENERATED);
generated.getAndIncrement();
vcax.set(ii);
vcaz.set(jj);
synchronized (wait) {
wait.remove(cx);
}
});
wait.add(cx);
});
} else {
AtomicInteger m = new AtomicInteger();
method.set("Spigot (Very Slow)");
KList<Runnable> q = new KList<>();
mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> q.add(() -> {
draw(ii, jj, COLOR_MCA_GENERATE_SLOW);
world.getChunkAt(ii, jj).load(true);
Chunk c = world.getChunkAt(ii, jj);
draw(ii, jj, COLOR_MCA_GENERATED);
m.getAndIncrement();
generated.getAndIncrement();
vcax.set(ii);
vcaz.set(jj);
}));
ChronoLatch tick = new ChronoLatch(1000);
new SR(0) {
@Override
public void run() {
if (tick.flip()) {
return;
}
if (q.isEmpty()) {
cancel();
return;
}
try {
q.pop().run();
} catch (Throwable e) {
Iris.reportError(e);
}
}
};
while (m.get() < 1024) {
J.sleep(25);
}
}
}
private KList<Position2> computeChunkOrder() {
Position2 center = new Position2(15, 15);
KList<Position2> p = new KList<>();
new Spiraler(33, 33, (x, z) -> {
int xx = x + 15;
int zz = z + 15;
if (xx < 0 || xx > 31 || zz < 0 || zz > 31) {
return;
}
p.add(new Position2(xx, zz));
}).drain();
p.sort(Comparator.comparing((i) -> i.distance(center)));
return p;
}
public static Pregenerator getInstance() {
return instance;
}
public static boolean shutdownInstance() {
if (instance != null) {
instance.shutdown();
instance = null;
return true;
}
return false;
}
public static void pauseResume() {
instance.active.set(!instance.active.get());
}
public static boolean isPaused() {
return instance.paused();
}
private void instance() {
if (instance != null) {
instance.shutdown();
}
instance = this;
}
public void shutdown() {
running.set(false);
active.set(false);
}
private void draw(int cx, int cz, Color color) {
if (gui != null) {
gui.func.accept(new Position2(cx, cz), color);
}
}
private void drawMCA(int cx, int cz, Color color) {
for (int i = 0; i < 32; i++) {
for (int j = 0; j < 32; j++) {
draw((cx << 5) + i, (cz << 5) + j, color);
}
}
}
private void flushWorld() {
if (Bukkit.isPrimaryThread()) {
flushWorldSync();
return;
}
AtomicBoolean b = new AtomicBoolean(false);
J.s(() -> {
flushWorldSync();
b.set(true);
});
while (!b.get()) {
J.sleep(1);
}
}
private void flushWorldSync() {
for (Chunk i : world.getLoadedChunks()) {
i.unload(true);
}
world.save();
}
private boolean isMCAWritable(int x, int z) {
File mca = new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca");
if (mca.exists()) {
return false;
}
for (Chunk i : world.getLoadedChunks()) {
if (i.getX() >> 5 == x && i.getZ() >> 5 == z) {
return false;
}
}
return true;
}
public String[] getProgress() {
long eta = (long) ((totalChunks.get() - generated.get()) * ((double) (M.ms() - elapsed) / (double) generated.get()));
return new String[]{
"Progress: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (" + Form.pc((double) generated.get() / (double) totalChunks.get(), 0) + ")",
"ETA: " + Form.duration(eta, 0),
"Chunks/s: " + Form.f((int) perSecond.getAverage()) + " (" + Form.f((int)perSecond.getMax()) + " Peak)",
"Chunks/min: " + Form.f((int) perMinute.getAverage())+ " (" + Form.f((int)perMinute.getMax()) + " Peak)",
"Memory: " + memoryMetric.get(),
"Cursor: " + "MCA(" + vmcax.get() + ", " + vmcaz.get() + ") @ (" + vcax.get() + ", " + vcaz.get() + ")",
"Gen Mode: " + method.get(),
};
}
public boolean paused() {
return !active.get();
}
public static class MCAPregenGui extends JPanel implements KeyListener {
private Pregenerator job;
private static final long serialVersionUID = 2094606939770332040L;
private final KList<Runnable> order = new KList<>();
private final int res = 512;
Graphics2D bg;
private ReentrantLock l;
private final BufferedImage image = new BufferedImage(res, res, BufferedImage.TYPE_INT_RGB);
private Consumer2<Position2, Color> func;
private JFrame frame;
public MCAPregenGui() {
}
public void paint(int x, int z, Color c) {
func.accept(new Position2(x, z), c);
}
@Override
public void paint(Graphics gx) {
Graphics2D g = (Graphics2D) gx;
bg = (Graphics2D) image.getGraphics();
l.lock();
while (order.isNotEmpty()) {
try {
order.pop().run();
} catch (Throwable e) {
Iris.reportError(e);
}
}
l.unlock();
g.drawImage(image, 0, 0, getParent().getWidth(), getParent().getHeight(), (img, infoflags, x, y, width, height) -> true);
g.setColor(Color.WHITE);
g.setFont(new Font("Hevetica", Font.BOLD, 28));
String[] prog = job.getProgress();
int h = g.getFontMetrics().getHeight() + 5;
int hh = 20;
if (job.paused()) {
g.drawString("PAUSED", 20, hh += h);
g.drawString("Press P to Resume", 20, hh += h);
} else {
for (String i : prog) {
g.drawString(i, 20, hh += h);
}
g.drawString("Press P to Pause", 20, hh += h);
}
J.sleep(IrisSettings.get().getGui().isMaximumPregenGuiFPS() ? 4 : 250);
repaint();
}
private void draw(Position2 p, Color c, Graphics2D bg) {
double pw = M.lerpInverse(job.getMin().getX(), job.getMax().getX(), p.getX());
double ph = M.lerpInverse(job.getMin().getZ(), job.getMax().getZ(), p.getZ());
double pwa = M.lerpInverse(job.getMin().getX(), job.getMax().getX(), p.getX() + 1);
double pha = M.lerpInverse(job.getMin().getZ(), job.getMax().getZ(), p.getZ() + 1);
int x = (int) M.lerp(0, res, pw);
int z = (int) M.lerp(0, res, ph);
int xa = (int) M.lerp(0, res, pwa);
int za = (int) M.lerp(0, res, pha);
bg.setColor(c);
bg.fillRect(x, z, xa - x, za - z);
}
@SuppressWarnings("deprecation")
private static MCAPregenGui createAndShowGUI(Pregenerator j) throws HeadlessException {
JFrame frame;
frame = new JFrame("Pregen View");
MCAPregenGui nv = new MCAPregenGui();
frame.addKeyListener(nv);
nv.l = new ReentrantLock();
nv.frame = frame;
nv.job = j;
nv.func = (c, b) ->
{
if (b.equals(Color.pink) && c.equals(new Position2(Integer.MAX_VALUE, Integer.MAX_VALUE))) {
frame.hide();
}
nv.l.lock();
nv.order.add(() -> nv.draw(c, b, nv.bg));
nv.l.unlock();
};
frame.add(nv);
frame.setSize(1000, 1000);
frame.setVisible(true);
File file = Iris.getCached("Iris Icon", "https://raw.githubusercontent.com/VolmitSoftware/Iris/master/icon.png");
if (file != null) {
try {
frame.setIconImage(ImageIO.read(file));
} catch (IOException ignored) {
Iris.reportError(ignored);
}
}
return nv;
}
public static void launch(Pregenerator g) {
J.a(() ->
{
createAndShowGUI(g);
});
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_P) {
Pregenerator.pauseResume();
}
}
public void close() {
frame.setVisible(false);
}
}
}

View File

@ -44,7 +44,7 @@ public class AsyncPregenMethod implements PregeneratorMethod {
} }
this.world = world; this.world = world;
burst = new MultiBurst("Iris PaperAsync Pregenerator", 6, threads); burst = new MultiBurst("Iris Async Pregenerator", IrisSettings.get().getConcurrency().getPregenThreadPriority(), threads);
future = new KList<>(1024); future = new KList<>(1024);
} }

View File

@ -20,6 +20,7 @@ package com.volmit.iris.core.tools;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.core.IrisDataManager;
import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.gui.PregeneratorJob; import com.volmit.iris.core.gui.PregeneratorJob;
import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.core.pregenerator.PregenTask;
import com.volmit.iris.core.pregenerator.PregeneratorMethod; import com.volmit.iris.core.pregenerator.PregeneratorMethod;
@ -121,7 +122,24 @@ public class IrisToolbelt {
return pregenerate(task, new HeadlessPregenMethod(access.getHeadlessGenerator().getWorld(), access.getHeadlessGenerator())); return pregenerate(task, new HeadlessPregenMethod(access.getHeadlessGenerator().getWorld(), access.getHeadlessGenerator()));
} }
return pregenerate(task, new HybridPregenMethod(access.getCompound().getWorld().realWorld(), Runtime.getRuntime().availableProcessors())); return pregenerate(task, new HybridPregenMethod(access.getCompound().getWorld().realWorld(), IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())));
}
/**
* Start a pregenerator task. If the supplied generator is headless, headless mode is used,
* otherwise Hybrid mode is used.
* @param task the scheduled task
* @param world the World
* @return the pregenerator job (already started)
*/
public static PregeneratorJob pregenerate(PregenTask task, World world)
{
if(isIrisWorld(world))
{
return pregenerate(task, access(world));
}
return pregenerate(task, new HybridPregenMethod(world, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())));
} }
/** /**

View File

@ -20,6 +20,7 @@ package com.volmit.iris.engine;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.core.IrisDataManager;
import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.framework.EngineCompound; import com.volmit.iris.engine.framework.EngineCompound;
import com.volmit.iris.engine.framework.EngineData; import com.volmit.iris.engine.framework.EngineData;
@ -98,7 +99,7 @@ public class IrisEngineCompound implements EngineCompound {
} else { } else {
double totalWeight = 0D; double totalWeight = 0D;
engines = new Engine[rootDimension.getDimensionalComposite().size()]; engines = new Engine[rootDimension.getDimensionalComposite().size()];
burster = engines.length > 1 ? new MultiBurst(engines.length) : null; burster = engines.length > 1 ? new MultiBurst("Iris Compound " + rootDimension.getName(), IrisSettings.get().getConcurrency().getEngineThreadPriority(), engines.length) : null;
int threadDist = (Math.max(2, maximumThreads - engines.length)) / engines.length; int threadDist = (Math.max(2, maximumThreads - engines.length)) / engines.length;
if ((threadDist * engines.length) + engines.length > maximumThreads) { if ((threadDist * engines.length) + engines.length > maximumThreads) {

View File

@ -357,8 +357,13 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro
return getCompound().isStudio(); return getCompound().isStudio();
} }
default MultiBurst burst()
{
return getTarget().getBurster();
}
default void clean() { default void clean() {
MultiBurst.burst.lazy(() -> getParallax().cleanup()); burst().lazy(() -> getParallax().cleanup());
} }
default IrisBiome getBiome(Location l) { default IrisBiome getBiome(Location l) {

View File

@ -302,7 +302,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
initialized.set(true); initialized.set(true);
IrisDimension dim = getDimension(world); IrisDimension dim = getDimension(world);
IrisDataManager data = production ? new IrisDataManager(getDataFolder(world)) : dim.getLoader().copy(); IrisDataManager data = production ? new IrisDataManager(getDataFolder(world)) : dim.getLoader().copy();
compound.set(new IrisEngineCompound(world, dim, data, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getThreadCount()))); compound.set(new IrisEngineCompound(world, dim, data, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getEngineThreadCount())));
compound.get().setStudio(!production); compound.get().setStudio(!production);
populators.clear(); populators.clear();
populators.addAll(compound.get().getPopulators()); populators.addAll(compound.get().getPopulators());

View File

@ -19,6 +19,7 @@
package com.volmit.iris.engine.framework; package com.volmit.iris.engine.framework;
import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.core.IrisDataManager;
import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.IrisDimension;
import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.engine.object.common.IrisWorld;
import com.volmit.iris.engine.parallax.ParallaxWorld; import com.volmit.iris.engine.parallax.ParallaxWorld;
@ -43,7 +44,7 @@ public class EngineTarget {
this.dimension = dimension; this.dimension = dimension;
this.data = data; this.data = data;
this.inverted = inverted; this.inverted = inverted;
this.burster = new MultiBurst("Iris Engine " + dimension.getName(), threads, 6); this.burster = new MultiBurst("Iris Engine " + dimension.getName(), IrisSettings.get().getConcurrency().getEngineThreadPriority(), threads);
this.parallaxWorld = new ParallaxWorld(burster, 256, new File(world.worldFolder(), "iris/" + dimension.getLoadKey() + "/parallax")); this.parallaxWorld = new ParallaxWorld(burster, 256, new File(world.worldFolder(), "iris/" + dimension.getLoadKey() + "/parallax"));
} }

View File

@ -262,7 +262,7 @@ public class LightingTaskBatch implements LightingTask {
LightingChunk nextChunk = null; LightingChunk nextChunk = null;
CompletableFuture<Void> nextChunkFuture = null; CompletableFuture<Void> nextChunkFuture = null;
synchronized (chunks_lock) { synchronized (chunks_lock) {
for (; i < chunks.length && numBeingLoaded < IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getThreadCount()); i++) { for (; i < chunks.length && numBeingLoaded < IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getEngineThreadCount()); i++) {
LightingChunk lc = chunks[i]; LightingChunk lc = chunks[i];
if (lc.loadingStarted) { if (lc.loadingStarted) {
continue; // Already (being) loaded continue; // Already (being) loaded

View File

@ -279,7 +279,7 @@ public class IrisEntity extends IrisRegistrant {
}, 1); }, 1);
} }
if (Iris.awareEntities && e instanceof Mob) { if (e instanceof Mob) {
Mob m = (Mob) e; Mob m = (Mob) e;
m.setAware(isAware()); m.setAware(isAware());
} }

View File

@ -142,10 +142,15 @@ public class IrisLoot {
i.apply(rng, m); i.apply(rng, m);
} }
if (Iris.customModels) { try
{
m.setCustomModelData(getCustomModel()); m.setCustomModelData(getCustomModel());
} }
catch(Throwable e)
{
Iris.reportError(e);
}
m.setLocalizedName(C.translateAlternateColorCodes('&', displayName)); m.setLocalizedName(C.translateAlternateColorCodes('&', displayName));
m.setDisplayName(C.translateAlternateColorCodes('&', displayName)); m.setDisplayName(C.translateAlternateColorCodes('&', displayName));
m.setUnbreakable(isUnbreakable()); m.setUnbreakable(isUnbreakable());
@ -226,10 +231,16 @@ public class IrisLoot {
i.apply(rng, m); i.apply(rng, m);
} }
if (Iris.customModels) { try
{
m.setCustomModelData(getCustomModel()); m.setCustomModelData(getCustomModel());
} }
catch(Throwable e)
{
Iris.reportError(e);
}
m.setLocalizedName(C.translateAlternateColorCodes('&', displayName)); m.setLocalizedName(C.translateAlternateColorCodes('&', displayName));
m.setDisplayName(C.translateAlternateColorCodes('&', displayName)); m.setDisplayName(C.translateAlternateColorCodes('&', displayName));
m.setUnbreakable(isUnbreakable()); m.setUnbreakable(isUnbreakable());

View File

@ -257,7 +257,7 @@ public class ParallaxWorld implements ParallaxAccess {
@Override @Override
public void saveAll() { public void saveAll() {
MultiBurst.burst.lazy(this::saveAllNOW); burst.lazy(this::saveAllNOW);
} }
@Override @Override

View File

@ -19,17 +19,17 @@
package com.volmit.iris.engine.parallel; package com.volmit.iris.engine.parallel;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KList;
import java.util.concurrent.*; import java.util.concurrent.*;
public class MultiBurst { public class MultiBurst {
public static final MultiBurst burst = new MultiBurst("Iris", 6, Runtime.getRuntime().availableProcessors()); public static final MultiBurst burst = new MultiBurst("Iris", IrisSettings.get().getConcurrency().getMiscThreadPriority(), IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getMiscThreadCount()));
private final ExecutorService service; private final ExecutorService service;
private ExecutorService syncService; private ExecutorService syncService;
private int tid; private int tid;
public MultiBurst(int tc) { public MultiBurst(int tc) {
this("Iris", 6, tc); this("Iris", 6, tc);
} }