Support creation of studio worlds through tk

This commit is contained in:
Daniel Mills 2021-07-24 09:41:39 -04:00
parent f360fadd3f
commit 970a5ec763
4 changed files with 107 additions and 108 deletions

View File

@ -21,15 +21,19 @@ package com.volmit.iris.core;
import com.google.gson.Gson;
import com.volmit.iris.Iris;
import com.volmit.iris.core.nms.INMS;
import com.volmit.iris.core.pregenerator.PregenTask;
import com.volmit.iris.core.report.Report;
import com.volmit.iris.core.report.ReportType;
import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.core.tools.IrisWorldCreator;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.framework.IrisAccess;
import com.volmit.iris.engine.object.*;
import com.volmit.iris.engine.parallel.MultiBurst;
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.io.IO;
@ -171,13 +175,13 @@ public class IrisProject {
return collectFiles(path, json);
}
public void open(VolmitSender sender) {
public void open(VolmitSender sender) throws IrisException {
open(sender, () ->
{
});
}
public void open(VolmitSender sender, Runnable onDone) {
public void open(VolmitSender sender, Runnable onDone) throws IrisException {
if (isOpen()) {
close();
}
@ -186,8 +190,6 @@ public class IrisProject {
if (d == null) {
sender.sendMessage("Can't find dimension: " + getName());
return;
} else if (sender.isPlayer()) {
sender.player().setGameMode(GameMode.SPECTATOR);
}
J.attemptAsync(() ->
@ -237,49 +239,23 @@ public class IrisProject {
}
});
String wfp = "iris/" + UUID.randomUUID();
WorldCreator c = new IrisWorldCreator().dimension(getName())
MultiBurst.burst.lazy(() -> {
try {
IrisAccess a = IrisToolbelt.createWorld()
.studio(true)
.sender(sender)
.name("iris/" + UUID.randomUUID())
.dimension(d.getLoadKey())
.seed(1337)
.name(wfp)
.studioMode()
.headless(!IrisSettings.get().getGenerator().isDisableMCA())
.pregen(PregenTask.builder()
.radius(1)
.build())
.create();
World world = a.getCompound().getWorld().realWorld();
IrisAccess gx = ((IrisAccess) c.generator());
O<Boolean> done = new O<>();
done.set(false);
activeProvider = gx;
J.a(() ->
{
double last = 0;
int req = 400;
while (gx.getGenerated() < req) {
assert gx != null;
double v = (double) gx.getGenerated() / (double) req;
if (sender.isPlayer()) {
sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generating " + Form.pc(v) + ((C.GRAY + " (" + (req - gx.getGenerated()) + " Left)"))));
J.sleep(50);
} else {
sender.sendMessage(C.WHITE + "Generating " + Form.pc(v) + ((C.GRAY + " (" + (req - gx.getGenerated()) + " Left)")));
J.sleep(1000);
}
if (gx.isFailing()) {
sender.sendMessage("Generation Failed!");
break;
}
}
if (sender.isPlayer()) {
sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generation Complete"));
}
});
//@builder
World world = INMS.get().createWorld(c);
J.s(() -> {
activeProvider = a;
if (IrisSettings.get().getStudio().isDisableTimeAndWeather()) {
world.setGameRule(GameRule.DO_WEATHER_CYCLE, false);
world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false);
@ -287,8 +263,6 @@ public class IrisProject {
}
Iris.linkMultiverseCore.removeFromConfig(world);
done.set(true);
if (sender.isPlayer()) {
assert world != null;
sender.player().teleport(world.getSpawnLocation());
@ -304,6 +278,11 @@ public class IrisProject {
onDone.run();
}, 0);
});
} catch (IrisException e) {
e.printStackTrace();
}
});
}
public void close() {

View File

@ -24,6 +24,7 @@ import com.volmit.iris.Iris;
import com.volmit.iris.engine.cache.AtomicCache;
import com.volmit.iris.engine.object.IrisDimension;
import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.exceptions.IrisException;
import com.volmit.iris.util.format.Form;
import com.volmit.iris.util.io.IO;
import com.volmit.iris.util.json.JSONException;
@ -333,7 +334,7 @@ public class ProjectManager {
}
}
public void open(VolmitSender sender, String dimm, Runnable onDone) {
public void open(VolmitSender sender, String dimm, Runnable onDone) throws IrisException {
if (isProjectOpen()) {
close();
}

View File

@ -37,6 +37,8 @@ import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.WorldCreator;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.function.Consumer;
/**
@ -166,9 +168,23 @@ public class IrisCreator {
throw new IrisException("Access is null. Something bad happened.");
}
IrisAccess finalAccess = access;
Runnable loadup = () -> {
CompletableFuture<Boolean> ff = new CompletableFuture<>();
if (pregen != null) {
IrisToolbelt.pregenerate(pregen, access)
.onProgress(prog)
.whenDone(() -> ff.complete(true));
try {
ff.get();
} catch (Throwable e) {
e.printStackTrace();
}
}
try {
IrisAccess finalAccess = access;
J.sfut(() -> {
if (headless) {
O<Boolean> done = new O<>();
@ -204,16 +220,10 @@ public class IrisCreator {
done.set(true);
}
}).get();
} catch (Throwable e) {
e.printStackTrace();
}
};
if (pregen != null) {
IrisToolbelt.pregenerate(pregen, access).onProgress(prog).whenDone(loadup);
} else {
loadup.run();
}
return access;
}

View File

@ -219,6 +219,15 @@ public class J {
return f;
}
public static CompletableFuture afut(Runnable r) {
CompletableFuture f = new CompletableFuture();
J.a(() -> {
r.run();
f.complete(null);
});
return f;
}
/**
* Queue a sync task
*