This commit is contained in:
DanLT 2021-06-23 20:09:33 -08:00
parent fa201d21e2
commit a48400535f
5 changed files with 161 additions and 217 deletions

View File

@ -5,7 +5,7 @@ plugins {
} }
group 'com.volmit.iris' group 'com.volmit.iris'
version '1.4.2' version '1.4.3'
def apiVersion = '1.17' def apiVersion = '1.17'
def name = 'Iris' def name = 'Iris'
def main = 'com.volmit.iris.Iris' def main = 'com.volmit.iris.Iris'

View File

@ -134,86 +134,85 @@ public class IrisProject
.seed(1337) .seed(1337)
.name(wfp) .name(wfp)
.studioMode() .studioMode()
.asyncPrepare()
.create(); .create();
IrisAccess gx = ((IrisAccess)c.generator());
sender.sendMessage("Generating with " + Iris.getThreadCount() + " threads per chunk");
O<Boolean> done = new O<>();
done.set(false);
activeProvider = gx;
J.a(() -> IrisAccess gx = ((IrisAccess)c.generator());
{ sender.sendMessage("Generating with " + Iris.getThreadCount() + " threads per chunk");
double last = 0; O<Boolean> done = new O<>();
int req = 300; done.set(false);
double lpc = 0; activeProvider = gx;
boolean fc;
while(!done.get()) J.a(() ->
{ {
boolean derp = false; double last = 0;
int req = 300;
double lpc = 0;
boolean fc;
assert gx != null; while(!done.get())
double v = (double) gx.getGenerated() / (double) req; {
fc = lpc != v; boolean derp = false;
lpc = v;
if(last > v || v > 1) assert gx != null;
{ double v = (double) gx.getGenerated() / (double) req;
derp = true; fc = lpc != v;
v = last; lpc = v;
}
else if(last > v || v > 1)
{ {
last = v; derp = true;
} v = last;
}
if(fc) else
{ {
sender.sendMessage(C.WHITE + "Generating " + Form.pc(v) + (derp ? (C.GRAY + " (Waiting on Server...)") : (C.GRAY + " (" + (req - gx.getGenerated()) + " Left)"))); last = v;
} }
if (sender.isPlayer()){ if(fc)
sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.BLUE + "Creating studio world. Please wait...")); {
} sender.sendMessage(C.WHITE + "Generating " + Form.pc(v) + (derp ? (C.GRAY + " (Waiting on Server...)") : (C.GRAY + " (" + (req - gx.getGenerated()) + " Left)")));
}
J.sleep(1500); if (sender.isPlayer()){
sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.BLUE + "Creating studio world. Please wait..."));
}
if(gx.isFailing()) J.sleep(1500);
{
sender.sendMessage("Generation Failed!"); if(gx.isFailing())
return; {
}
}
});
//@builder sender.sendMessage("Generation Failed!");
World world = c.createWorld(); return;
Iris.linkMultiverseCore.removeFromConfig(world); }
}
});
done.set(true); //@builder
sender.sendMessage(C.WHITE + "Generating Complete!"); World world = c.createWorld();
Iris.linkMultiverseCore.removeFromConfig(world);
if(sender.isPlayer()) done.set(true);
{ sender.sendMessage(C.WHITE + "Generating Complete!");
assert world != null;
sender.player().teleport(world.getSpawnLocation());
}
Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> if(sender.isPlayer())
{ {
sender.sendMessage("Hotloading Active! Change any files and watch your changes appear as you load new chunks!"); assert world != null;
sender.player().teleport(world.getSpawnLocation());
}
if(sender.isPlayer()) Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () ->
{ {
sender.player().setGameMode(GameMode.SPECTATOR); sender.sendMessage("Hotloading Active! Change any files and watch your changes appear as you load new chunks!");
}
onDone.run(); if(sender.isPlayer())
}, 0); {
sender.player().setGameMode(GameMode.SPECTATOR);
}
onDone.run();
}, 0);
} }
public void close() public void close()

View File

@ -14,6 +14,9 @@ import org.bukkit.World;
import org.bukkit.WorldCreator; import org.bukkit.WorldCreator;
import java.io.File; import java.io.File;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.AtomicReferenceArray;
public class CommandIrisCreate extends MortarCommand public class CommandIrisCreate extends MortarCommand
{ {
@ -42,20 +45,80 @@ public class CommandIrisCreate extends MortarCommand
String worldName = args[0]; String worldName = args[0];
String type = IrisSettings.get().getGenerator().getDefaultWorldType(); String type = IrisSettings.get().getGenerator().getDefaultWorldType();
long seed = 1337; long seed = 1337;
int pregen = 0; AtomicInteger pregen = new AtomicInteger(0);
boolean multiverse = Iris.linkMultiverseCore.supported(); boolean multiverse = Iris.linkMultiverseCore.supported();
for(String i : args) for(String i : args)
{ {
type = i.startsWith("type=") ? i.split("\\Q=\\E")[1] : type; type = i.startsWith("type=") ? i.split("\\Q=\\E")[1] : type;
seed = i.startsWith("seed=") ? Long.valueOf(i.split("\\Q=\\E")[1]) : seed; seed = i.startsWith("seed=") ? Long.valueOf(i.split("\\Q=\\E")[1]) : seed;
pregen = i.startsWith("pregen=") ? getVal(i.split("\\Q=\\E")[1]) : pregen; pregen.set(i.startsWith("pregen=") ? getVal(i.split("\\Q=\\E")[1]) : pregen.get());
} }
Iris.linkMultiverseCore.assignWorldType(worldName, type); Iris.linkMultiverseCore.assignWorldType(worldName, type);
World world = null; final AtomicReference<World> world = new AtomicReference<>();
IrisDimension dim; IrisDimension dim;
File folder = new File(worldName); File folder = new File(worldName);
Runnable onDone = () -> {
sender.sendMessage(worldName + " Spawn Area generated.");
sender.sendMessage("You must remember to either have multiverse installed or use the Bukkit method, otherwise the world will go corrupt!");
sender.sendMessage("Wiki: https://volmitsoftware.gitbook.io/iris/getting-started");
O<Boolean> b = new O<Boolean>();
b.set(true);
if(sender.isPlayer())
{
try
{
sender.player().teleport(world.get().getSpawnLocation());
}
catch(Throwable e)
{
}
}
if(pregen.get() > 0)
{
b.set(false);
sender.sendMessage("Pregenerating " + worldName + " " + pregen + " x " + pregen);
sender.sendMessage("Expect server lag during this time. Use '/iris pregen stop' to cancel");
new Pregenerator(world.get(), pregen.get(), () ->
{
b.set(true);
});
}
World ww = world.get();
if (ww == null){
sender.sendMessage("World not created, can not finish");
return;
}
J.a(() ->
{
while(!b.get())
{
J.sleep(1000);
}
Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () ->
{
ww.save();
sender.sendMessage("All Done!");
});
});
};
if(multiverse) if(multiverse)
{ {
dim = IrisDataManager.loadAnyDimension(type); dim = IrisDataManager.loadAnyDimension(type);
@ -81,7 +144,8 @@ public class CommandIrisCreate extends MortarCommand
command += " -g Iris:" + dim.getLoadKey(); command += " -g Iris:" + dim.getLoadKey();
sender.sendMessage("Delegating " + command); sender.sendMessage("Delegating " + command);
Bukkit.dispatchCommand(sender, command); Bukkit.dispatchCommand(sender, command);
world= Bukkit.getWorld(worldName); world.set(Bukkit.getWorld(worldName));
onDone.run();
} }
else else
@ -99,92 +163,43 @@ public class CommandIrisCreate extends MortarCommand
WorldCreator wc = new IrisWorldCreator().dimension(dim).name(worldName) WorldCreator wc = new IrisWorldCreator().dimension(dim).name(worldName)
.productionMode().seed(seed).create(); .productionMode().seed(seed).create();
sender.sendMessage("Generating with " + Iris.getThreadCount() + " threads per chunk");
O<Boolean> done = new O<Boolean>();
done.set(false);
J.a(() -> J.s(() -> {
{ sender.sendMessage("Generating with " + Iris.getThreadCount() + " threads per chunk");
double last = 0; O<Boolean> done = new O<>();
int req = 800; done.set(false);
while(!done.get())
J.a(() ->
{ {
boolean derp = false; double last = 0;
double v = (double) ((IrisAccess) wc.generator()).getGenerated() / (double) req; int req = 800;
while(!done.get())
if(last > v || v > 1)
{ {
derp = true; boolean derp = false;
v = last; double v = (double) ((IrisAccess) wc.generator()).getGenerated() / (double) req;
if(last > v || v > 1)
{
derp = true;
v = last;
}
else
{
last = v;
}
sender.sendMessage("Generating " + Form.pc(v) + (derp ? " (Waiting on Server...)" : ""));
J.sleep(3000);
} }
});
else world.set(wc.createWorld());
{
last = v;
}
sender.sendMessage("Generating " + Form.pc(v) + (derp ? " (Waiting on Server...)" : "")); done.set(true);
J.sleep(3000);
}
});
world = wc.createWorld();
done.set(true);
}
sender.sendMessage(worldName + " Spawn Area generated.");
sender.sendMessage("You must remember to either have multiverse installed or use the Bukkit method, otherwise the world will go corrupt!");
sender.sendMessage("Wiki: https://volmitsoftware.gitbook.io/iris/getting-started");
O<Boolean> b = new O<Boolean>();
b.set(true);
if(sender.isPlayer())
{
try
{
sender.player().teleport(world.getSpawnLocation());
}
catch(Throwable e)
{
}
}
if(pregen > 0)
{
b.set(false);
sender.sendMessage("Pregenerating " + worldName + " " + pregen + " x " + pregen);
sender.sendMessage("Expect server lag during this time. Use '/iris pregen stop' to cancel");
new Pregenerator(world, pregen, () ->
{
b.set(true);
}); });
} }
World ww = world;
if (ww == null){
sender.sendMessage("World not created, can not finish");
return true;
}
J.a(() ->
{
while(!b.get())
{
J.sleep(1000);
}
Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () ->
{
ww.save();
sender.sendMessage("All Done!");
});
});
return true; return true;
} }

View File

@ -1,20 +1,10 @@
package com.volmit.iris.scaffold; package com.volmit.iris.scaffold;
import com.volmit.iris.Iris;
import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.object.IrisDimension; import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.scaffold.engine.EngineCompositeGenerator; import com.volmit.iris.scaffold.engine.EngineCompositeGenerator;
import com.volmit.iris.util.Form;
import com.volmit.iris.util.J;
import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.WorldCreator; import org.bukkit.WorldCreator;
import org.bukkit.entity.Player;
import org.bukkit.generator.ChunkGenerator;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class IrisWorldCreator public class IrisWorldCreator
{ {
@ -22,7 +12,6 @@ public class IrisWorldCreator
private boolean studio = false; private boolean studio = false;
private String dimensionName = null; private String dimensionName = null;
private long seed = 1337; private long seed = 1337;
private boolean asyncPrepare = false;
public IrisWorldCreator() public IrisWorldCreator()
{ {
@ -59,12 +48,6 @@ public class IrisWorldCreator
return this; return this;
} }
public IrisWorldCreator asyncPrepare()
{
this.asyncPrepare = true;
return this;
}
public IrisWorldCreator productionMode() public IrisWorldCreator productionMode()
{ {
this.studio = false; this.studio = false;
@ -81,24 +64,6 @@ public class IrisWorldCreator
.generator(g).seed(seed); .generator(g).seed(seed);
} }
public void createAsync(Consumer<WorldCreator> result)
{
EngineCompositeGenerator g = new EngineCompositeGenerator(dimensionName, !studio);
Environment env = findEnvironment();
g.prepareSpawnAsync(seed, name, env, 16, (progresss) -> {
for(Player i : Bukkit.getOnlinePlayers())
{
i.sendMessage("Async Prepare 32x32: " + Form.pc(progresss, 2));
}
}, () -> {
J.s(() -> result.accept(new WorldCreator(name)
.environment(env)
.generateStructures(true)
.generator(g).seed(seed)));
});
}
private World.Environment findEnvironment() { private World.Environment findEnvironment() {
IrisDimension dim = IrisDataManager.loadAnyDimension(dimensionName); IrisDimension dim = IrisDataManager.loadAnyDimension(dimensionName);
if(dim == null || dim.getEnvironment() == null) if(dim == null || dim.getEnvironment() == null)

View File

@ -77,40 +77,6 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
}); });
} }
public void prepareSpawnAsync(long seed, String worldName, World.Environment env, int radius, Consumer<Double> progress, Runnable onComplete)
{
// TODO: WARNING HEIGHT
prepareSpawnAsync(256, seed, worldName, env, radius, progress, onComplete);
}
public void prepareSpawnAsync(int worldHeight, long seed, String worldName, World.Environment env, int radius, Consumer<Double> progress, Runnable onComplete)
{
FakeWorld world = new FakeWorld(worldHeight, seed, new File(worldName), env);
world.setWorldName(worldName);
AtomicInteger generated = new AtomicInteger();
int total = (int) Math.pow(radius * 2, 2);
MultiBurst.burst.lazy(() -> {
progress.accept(0D);
BurstExecutor burst = MultiBurst.burst.burst(total);
new Spiraler(radius * 2, radius * 2, (x, z) -> burst.queue(() -> {
try {
precache(world, x, z);
generated.getAndIncrement();
}
catch(Throwable e)
{
e.printStackTrace();
}
})).drain();
burst.complete();
System.out.println("BURSTER FINISHED TOTAL IS " + total + " OF GENNED " + generated.get());
J.sleep(5000);
progress.accept(1D);
onComplete.run();
});
}
public void hotload() public void hotload()
{ {
if(isStudio()) if(isStudio())
@ -318,7 +284,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
return dim; return dim;
} }
private synchronized void initialize(World world) { public synchronized void initialize(World world) {
if (initialized.get()) { if (initialized.get()) {
return; return;
} }
@ -353,6 +319,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
@NotNull @NotNull
@Override @Override
public ChunkData generateChunkData(@NotNull World world, @NotNull Random ignored, int x, int z, @NotNull BiomeGrid biome) { public ChunkData generateChunkData(@NotNull World world, @NotNull Random ignored, int x, int z, @NotNull BiomeGrid biome) {
long key = Cache.key(x, z);
TerrainChunk tc = TerrainChunk.create(world, biome); TerrainChunk tc = TerrainChunk.create(world, biome);
generateChunkRawData(world, x, z, tc).run(); generateChunkRawData(world, x, z, tc).run();
return tc.getRaw(); return tc.getRaw();
@ -370,9 +337,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
for(int j = 0; j < 32; j++) for(int j = 0; j < 32; j++)
{ {
int jj = j; int jj = j;
e.queue(() -> { e.queue(() -> directWriteChunk(w, ii + mcaox, jj + mcaoz, writer));
directWriteChunk(w, ii + mcaox, jj + mcaoz, writer);
});
} }
} }