mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-19 10:43:14 +00:00
Iris doesnt need worlds anymore
This commit is contained in:
parent
035f2a0236
commit
036dc289d5
19
pom.xml
19
pom.xml
@ -161,12 +161,31 @@
|
|||||||
<version>1.16.1-R0.1-SNAPSHOT</version>
|
<version>1.16.1-R0.1-SNAPSHOT</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- NMS -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.bukkit.craftbukkit</groupId>
|
<groupId>org.bukkit.craftbukkit</groupId>
|
||||||
<artifactId>cb-1.16.2</artifactId>
|
<artifactId>cb-1.16.2</artifactId>
|
||||||
<version>1.16.2</version>
|
<version>1.16.2</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bukkit.craftbukkit</groupId>
|
||||||
|
<artifactId>cb-1.16.1</artifactId>
|
||||||
|
<version>1.16.1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bukkit.craftbukkit</groupId>
|
||||||
|
<artifactId>cb-1.15.1</artifactId>
|
||||||
|
<version>1.15.1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bukkit.craftbukkit</groupId>
|
||||||
|
<artifactId>cb-1.14.4</artifactId>
|
||||||
|
<version>1.14.4</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
<!-- Utilities -->
|
<!-- Utilities -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.bstats</groupId>
|
<groupId>org.bstats</groupId>
|
||||||
|
@ -4,15 +4,14 @@ import java.io.BufferedInputStream;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
|
||||||
import org.bstats.bukkit.Metrics;
|
import org.bstats.bukkit.Metrics;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.World.Environment;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
|
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
import org.bukkit.generator.ChunkGenerator;
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
@ -27,6 +26,9 @@ import com.volmit.iris.gen.post.PostPotholeFiller;
|
|||||||
import com.volmit.iris.gen.post.PostSlabber;
|
import com.volmit.iris.gen.post.PostSlabber;
|
||||||
import com.volmit.iris.gen.post.PostWallPatcher;
|
import com.volmit.iris.gen.post.PostWallPatcher;
|
||||||
import com.volmit.iris.gen.post.PostWaterlogger;
|
import com.volmit.iris.gen.post.PostWaterlogger;
|
||||||
|
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||||
|
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.link.MultiverseCoreLink;
|
import com.volmit.iris.link.MultiverseCoreLink;
|
||||||
import com.volmit.iris.util.C;
|
import com.volmit.iris.util.C;
|
||||||
import com.volmit.iris.util.Form;
|
import com.volmit.iris.util.Form;
|
||||||
@ -37,7 +39,6 @@ import com.volmit.iris.util.IrisPostBlockFilter;
|
|||||||
import com.volmit.iris.util.J;
|
import com.volmit.iris.util.J;
|
||||||
import com.volmit.iris.util.KList;
|
import com.volmit.iris.util.KList;
|
||||||
import com.volmit.iris.util.MortarPlugin;
|
import com.volmit.iris.util.MortarPlugin;
|
||||||
import com.volmit.iris.util.NMSVersion;
|
|
||||||
import com.volmit.iris.util.Permission;
|
import com.volmit.iris.util.Permission;
|
||||||
|
|
||||||
public class Iris extends MortarPlugin
|
public class Iris extends MortarPlugin
|
||||||
@ -86,6 +87,16 @@ public class Iris extends MortarPlugin
|
|||||||
return "UNKNOWN NMS VERSION";
|
return "UNKNOWN NMS VERSION";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ProvisionBukkit createProvisionBukkit(IrisGenConfiguration config)
|
||||||
|
{
|
||||||
|
return new ProvisionBukkit(createIrisProvider(config));
|
||||||
|
}
|
||||||
|
|
||||||
|
public IrisChunkGenerator createIrisProvider(IrisGenConfiguration config)
|
||||||
|
{
|
||||||
|
return new IrisChunkGenerator(config);
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean doesSupport3DBiomes()
|
private static boolean doesSupport3DBiomes()
|
||||||
{
|
{
|
||||||
int v = Integer.valueOf(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]);
|
int v = Integer.valueOf(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]);
|
||||||
@ -160,9 +171,9 @@ public class Iris extends MortarPlugin
|
|||||||
|
|
||||||
for(World i : Bukkit.getWorlds())
|
for(World i : Bukkit.getWorlds())
|
||||||
{
|
{
|
||||||
if(i.getGenerator() instanceof IrisChunkGenerator)
|
if(i.getGenerator() instanceof ProvisionBukkit)
|
||||||
{
|
{
|
||||||
((IrisChunkGenerator) i.getGenerator()).close();
|
((IrisChunkGenerator) ((ProvisionBukkit) i.getGenerator()).getProvider()).close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,7 +219,18 @@ public class Iris extends MortarPlugin
|
|||||||
@Override
|
@Override
|
||||||
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id)
|
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id)
|
||||||
{
|
{
|
||||||
return new IrisChunkGenerator(IrisSettings.get().threads);
|
//@builder
|
||||||
|
return createProvisionBukkit(IrisGenConfiguration.builder()
|
||||||
|
.threads(IrisSettings.get().threads)
|
||||||
|
.target(TerrainTarget
|
||||||
|
.builder()
|
||||||
|
.environment(Environment.NORMAL)
|
||||||
|
.folder(new File(worldName))
|
||||||
|
.name(worldName)
|
||||||
|
.seed(worldName.hashCode())
|
||||||
|
.build()
|
||||||
|
).build());
|
||||||
|
//@done
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void msg(String string)
|
public static void msg(String string)
|
||||||
|
@ -9,6 +9,7 @@ import org.bukkit.event.Listener;
|
|||||||
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
||||||
|
|
||||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||||
|
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||||
import com.volmit.iris.noise.CNG;
|
import com.volmit.iris.noise.CNG;
|
||||||
import com.volmit.iris.object.IrisBiome;
|
import com.volmit.iris.object.IrisBiome;
|
||||||
import com.volmit.iris.util.BoardManager;
|
import com.volmit.iris.util.BoardManager;
|
||||||
@ -54,7 +55,7 @@ public class IrisBoardManager implements BoardProvider, Listener
|
|||||||
@DontObfuscate
|
@DontObfuscate
|
||||||
private boolean isIrisWorld(World w)
|
private boolean isIrisWorld(World w)
|
||||||
{
|
{
|
||||||
return (w.getGenerator() instanceof IrisChunkGenerator) && ((IrisChunkGenerator) w.getGenerator()).isDev();
|
return (w.getGenerator() instanceof ProvisionBukkit) && ((IrisChunkGenerator) ((ProvisionBukkit) w.getGenerator()).getProvider()).isDev();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updatePlayer(Player p)
|
public void updatePlayer(Player p)
|
||||||
@ -88,7 +89,7 @@ public class IrisBoardManager implements BoardProvider, Listener
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
IrisChunkGenerator g = (IrisChunkGenerator) player.getWorld().getGenerator();
|
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) player.getWorld().getGenerator()).getProvider();
|
||||||
|
|
||||||
if(cl.flip())
|
if(cl.flip())
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.volmit.iris;
|
package com.volmit.iris;
|
||||||
|
|
||||||
import org.bukkit.World;
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
|
|
||||||
import com.volmit.iris.object.IrisBiome;
|
import com.volmit.iris.object.IrisBiome;
|
||||||
import com.volmit.iris.object.IrisDimension;
|
import com.volmit.iris.object.IrisDimension;
|
||||||
import com.volmit.iris.object.IrisRegion;
|
import com.volmit.iris.object.IrisRegion;
|
||||||
@ -9,18 +8,20 @@ import com.volmit.iris.util.KMap;
|
|||||||
|
|
||||||
public interface IrisContext
|
public interface IrisContext
|
||||||
{
|
{
|
||||||
static KMap<World, IrisContext> contexts = new KMap<>();
|
static KMap<TerrainTarget, IrisContext> contexts = new KMap<>();
|
||||||
|
|
||||||
public static void pushContext(IrisContext context)
|
public static void pushContext(IrisContext context)
|
||||||
{
|
{
|
||||||
contexts.put(context.getWorld(), context);
|
contexts.put(context.getTarget(), context);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IrisContext of(World world)
|
public static IrisContext of(TerrainTarget world)
|
||||||
{
|
{
|
||||||
return contexts.get(world);
|
return contexts.get(world);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TerrainTarget getTarget();
|
||||||
|
|
||||||
public IrisBiome getBiome(int x, int z);
|
public IrisBiome getBiome(int x, int z);
|
||||||
|
|
||||||
public IrisDimension getDimension();
|
public IrisDimension getDimension();
|
||||||
@ -31,7 +32,5 @@ public interface IrisContext
|
|||||||
|
|
||||||
public int getHeight(int x, int z);
|
public int getHeight(int x, int z);
|
||||||
|
|
||||||
public World getWorld();
|
|
||||||
|
|
||||||
public void onHotloaded();
|
public void onHotloaded();
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,11 @@ import org.zeroturnaround.zip.commons.FileUtils;
|
|||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.JsonSyntaxException;
|
import com.google.gson.JsonSyntaxException;
|
||||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||||
|
import com.volmit.iris.gen.nms.NMSCreator;
|
||||||
import com.volmit.iris.gen.post.Post;
|
import com.volmit.iris.gen.post.Post;
|
||||||
|
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||||
|
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.object.DecorationPart;
|
import com.volmit.iris.object.DecorationPart;
|
||||||
import com.volmit.iris.object.Envelope;
|
import com.volmit.iris.object.Envelope;
|
||||||
import com.volmit.iris.object.InterpolationMethod;
|
import com.volmit.iris.object.InterpolationMethod;
|
||||||
@ -316,7 +320,11 @@ public class ProjectManager
|
|||||||
|
|
||||||
Iris.globaldata.dump();
|
Iris.globaldata.dump();
|
||||||
sender.sendMessage("Loading " + dimm + "...");
|
sender.sendMessage("Loading " + dimm + "...");
|
||||||
IrisChunkGenerator gx = new IrisChunkGenerator(dimm, IrisSettings.get().threads);
|
String wfp = "iris/" + UUID.randomUUID();
|
||||||
|
ProvisionBukkit gen = Iris.instance.createProvisionBukkit(IrisGenConfiguration.builder().threads(IrisSettings.get().threads).dimension(dimm).target(TerrainTarget.builder().environment(d.getEnvironment()).folder(new File(wfp)).name(wfp).seed(1337).build()).build());
|
||||||
|
//@done
|
||||||
|
|
||||||
|
IrisChunkGenerator gx = (IrisChunkGenerator) gen.getProvider();
|
||||||
currentProject = gx;
|
currentProject = gx;
|
||||||
gx.setDev(true);
|
gx.setDev(true);
|
||||||
sender.sendMessage("Generating with " + IrisSettings.get().threads + " threads per chunk");
|
sender.sendMessage("Generating with " + IrisSettings.get().threads + " threads per chunk");
|
||||||
@ -365,13 +373,14 @@ public class ProjectManager
|
|||||||
});
|
});
|
||||||
|
|
||||||
//@builder
|
//@builder
|
||||||
World world = Bukkit.createWorld(new WorldCreator("iris/" + UUID.randomUUID())
|
World world = NMSCreator.createWorld(new WorldCreator(wfp)
|
||||||
.seed(1337)
|
.seed(1337)
|
||||||
.generator(gx)
|
.generator(gen)
|
||||||
.generateStructures(d.isVanillaStructures())
|
.generateStructures(d.isVanillaStructures())
|
||||||
.type(WorldType.NORMAL)
|
.type(WorldType.NORMAL)
|
||||||
.environment(d.getEnvironment()));
|
.environment(d.getEnvironment()), false);
|
||||||
//@done
|
//@done
|
||||||
|
gx.getTarget().setRealWorld(world);
|
||||||
Iris.linkMultiverseCore.removeFromConfig(world);
|
Iris.linkMultiverseCore.removeFromConfig(world);
|
||||||
|
|
||||||
done.set(true);
|
done.set(true);
|
||||||
@ -400,9 +409,9 @@ public class ProjectManager
|
|||||||
if(isProjectOpen())
|
if(isProjectOpen())
|
||||||
{
|
{
|
||||||
currentProject.close();
|
currentProject.close();
|
||||||
File folder = currentProject.getWorld().getWorldFolder();
|
File folder = currentProject.getTarget().getFolder();
|
||||||
Iris.linkMultiverseCore.removeFromConfig(currentProject.getWorld());
|
Iris.linkMultiverseCore.removeFromConfig(currentProject.getTarget().getName());
|
||||||
Bukkit.unloadWorld(currentProject.getWorld(), false);
|
Bukkit.unloadWorld(currentProject.getTarget().getName(), false);
|
||||||
currentProject = null;
|
currentProject = null;
|
||||||
Iris.globaldata.dump();
|
Iris.globaldata.dump();
|
||||||
Iris.globaldata.preferFolder(null);
|
Iris.globaldata.preferFolder(null);
|
||||||
|
@ -5,6 +5,7 @@ import org.bukkit.entity.Player;
|
|||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||||
|
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||||
import com.volmit.iris.util.MortarCommand;
|
import com.volmit.iris.util.MortarCommand;
|
||||||
import com.volmit.iris.util.MortarSender;
|
import com.volmit.iris.util.MortarSender;
|
||||||
|
|
||||||
@ -26,13 +27,13 @@ public class CommandIrisCTC extends MortarCommand
|
|||||||
Player p = sender.player();
|
Player p = sender.player();
|
||||||
World world = p.getWorld();
|
World world = p.getWorld();
|
||||||
|
|
||||||
if(!(world.getGenerator() instanceof IrisChunkGenerator))
|
if(!(world.getGenerator() instanceof ProvisionBukkit))
|
||||||
{
|
{
|
||||||
sender.sendMessage("You must be in an iris world.");
|
sender.sendMessage("You must be in an iris world.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
|
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
|
||||||
int m = Math.min(Math.max(Integer.valueOf(args[0]), 2), 256);
|
int m = Math.min(Math.max(Integer.valueOf(args[0]), 2), 256);
|
||||||
g.changeThreadCount(m);
|
g.changeThreadCount(m);
|
||||||
sender.sendMessage("Thread count changed to " + m);
|
sender.sendMessage("Thread count changed to " + m);
|
||||||
|
@ -14,6 +14,10 @@ import com.volmit.iris.Iris;
|
|||||||
import com.volmit.iris.IrisDataManager;
|
import com.volmit.iris.IrisDataManager;
|
||||||
import com.volmit.iris.IrisSettings;
|
import com.volmit.iris.IrisSettings;
|
||||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||||
|
import com.volmit.iris.gen.nms.NMSCreator;
|
||||||
|
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||||
|
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.object.IrisDimension;
|
import com.volmit.iris.object.IrisDimension;
|
||||||
import com.volmit.iris.util.Form;
|
import com.volmit.iris.util.Form;
|
||||||
import com.volmit.iris.util.IO;
|
import com.volmit.iris.util.IO;
|
||||||
@ -138,7 +142,20 @@ public class CommandIrisCreate extends MortarCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
sender.sendMessage(worldName + " type installed. Generating Spawn Area...");
|
sender.sendMessage(worldName + " type installed. Generating Spawn Area...");
|
||||||
IrisChunkGenerator gen = new IrisChunkGenerator("", 16);
|
//@builder
|
||||||
|
ProvisionBukkit gen = Iris.instance.createProvisionBukkit(
|
||||||
|
IrisGenConfiguration.builder()
|
||||||
|
.threads(IrisSettings.get().threads)
|
||||||
|
.dimension(dim.getLoadKey())
|
||||||
|
.target(TerrainTarget
|
||||||
|
.builder()
|
||||||
|
.environment(dim.getEnvironment())
|
||||||
|
.folder(folder)
|
||||||
|
.name(worldName)
|
||||||
|
.seed(seed)
|
||||||
|
.build()
|
||||||
|
).build());
|
||||||
|
//@done
|
||||||
|
|
||||||
sender.sendMessage("Generating with " + IrisSettings.get().threads + " threads per chunk");
|
sender.sendMessage("Generating with " + IrisSettings.get().threads + " threads per chunk");
|
||||||
O<Boolean> done = new O<Boolean>();
|
O<Boolean> done = new O<Boolean>();
|
||||||
@ -151,7 +168,7 @@ public class CommandIrisCreate extends MortarCommand
|
|||||||
while(!done.get())
|
while(!done.get())
|
||||||
{
|
{
|
||||||
boolean derp = false;
|
boolean derp = false;
|
||||||
double v = (double) gen.getGenerated() / (double) req;
|
double v = (double) ((IrisChunkGenerator) gen.getProvider()).getGenerated() / (double) req;
|
||||||
|
|
||||||
if(last > v || v > 1)
|
if(last > v || v > 1)
|
||||||
{
|
{
|
||||||
@ -169,7 +186,10 @@ public class CommandIrisCreate extends MortarCommand
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
World world = Bukkit.createWorld(new WorldCreator(worldName).seed(seed).generator(gen).type(WorldType.NORMAL).environment(dim.getEnvironment()));
|
WorldCreator wc = new WorldCreator(worldName).seed(seed).generator(gen).type(WorldType.NORMAL).environment(dim.getEnvironment());
|
||||||
|
|
||||||
|
World world = NMSCreator.createWorld(wc, false);
|
||||||
|
|
||||||
done.set(true);
|
done.set(true);
|
||||||
sender.sendMessage(worldName + " Spawn Area generated.");
|
sender.sendMessage(worldName + " Spawn Area generated.");
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ import org.bukkit.entity.Player;
|
|||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.IrisMetrics;
|
import com.volmit.iris.IrisMetrics;
|
||||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||||
|
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||||
import com.volmit.iris.util.C;
|
import com.volmit.iris.util.C;
|
||||||
import com.volmit.iris.util.Form;
|
import com.volmit.iris.util.Form;
|
||||||
import com.volmit.iris.util.MortarCommand;
|
import com.volmit.iris.util.MortarCommand;
|
||||||
@ -28,7 +29,13 @@ public class CommandIrisMetrics extends MortarCommand
|
|||||||
{
|
{
|
||||||
Player p = sender.player();
|
Player p = sender.player();
|
||||||
World world = p.getWorld();
|
World world = p.getWorld();
|
||||||
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
|
if(!(world.getGenerator() instanceof ProvisionBukkit))
|
||||||
|
{
|
||||||
|
sender.sendMessage("You must be in an iris world.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
|
||||||
IrisMetrics m = g.getMetrics();
|
IrisMetrics m = g.getMetrics();
|
||||||
sender.sendMessage("Thread Count: " + C.BOLD + "" + C.WHITE + g.getThreads());
|
sender.sendMessage("Thread Count: " + C.BOLD + "" + C.WHITE + g.getThreads());
|
||||||
sender.sendMessage("Total : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTotal().getAverage(), 2));
|
sender.sendMessage("Total : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTotal().getAverage(), 2));
|
||||||
|
@ -40,7 +40,7 @@ public class CommandIrisStudioClose extends MortarCommand
|
|||||||
|
|
||||||
for(World i : Bukkit.getWorlds())
|
for(World i : Bukkit.getWorlds())
|
||||||
{
|
{
|
||||||
if(i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getCurrentProject().getWorld().getWorldFolder().getAbsolutePath()))
|
if(i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getCurrentProject().getTarget().getFolder().getAbsolutePath()))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -51,7 +51,7 @@ public class CommandIrisStudioClose extends MortarCommand
|
|||||||
|
|
||||||
if(f == null)
|
if(f == null)
|
||||||
{
|
{
|
||||||
for(Player i : Iris.proj.getCurrentProject().getWorld().getPlayers())
|
for(Player i : Iris.proj.getCurrentProject().getTarget().getPlayers())
|
||||||
{
|
{
|
||||||
i.kickPlayer("Project Closing, No other world to put you in. Rejoin Please!");
|
i.kickPlayer("Project Closing, No other world to put you in. Rejoin Please!");
|
||||||
}
|
}
|
||||||
@ -59,7 +59,7 @@ public class CommandIrisStudioClose extends MortarCommand
|
|||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for(Player i : Iris.proj.getCurrentProject().getWorld().getPlayers())
|
for(Player i : Iris.proj.getCurrentProject().getTarget().getPlayers())
|
||||||
{
|
{
|
||||||
i.teleport(f.getSpawnLocation());
|
i.teleport(f.getSpawnLocation());
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import org.bukkit.entity.Player;
|
|||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.IrisSettings;
|
import com.volmit.iris.IrisSettings;
|
||||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||||
|
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||||
import com.volmit.iris.object.IrisBiome;
|
import com.volmit.iris.object.IrisBiome;
|
||||||
import com.volmit.iris.util.MortarCommand;
|
import com.volmit.iris.util.MortarCommand;
|
||||||
import com.volmit.iris.util.MortarSender;
|
import com.volmit.iris.util.MortarSender;
|
||||||
@ -42,13 +43,13 @@ public class CommandIrisStudioGoto extends MortarCommand
|
|||||||
Player p = sender.player();
|
Player p = sender.player();
|
||||||
World world = p.getWorld();
|
World world = p.getWorld();
|
||||||
|
|
||||||
if(!(world.getGenerator() instanceof IrisChunkGenerator))
|
if(!(world.getGenerator() instanceof ProvisionBukkit))
|
||||||
{
|
{
|
||||||
sender.sendMessage("You must be in an iris world.");
|
sender.sendMessage("You must be in an iris world.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
|
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
|
||||||
int tries = 10000;
|
int tries = 10000;
|
||||||
boolean cave = false;
|
boolean cave = false;
|
||||||
IrisBiome biome2 = null;
|
IrisBiome biome2 = null;
|
||||||
|
@ -6,6 +6,7 @@ import org.bukkit.entity.Player;
|
|||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.IrisSettings;
|
import com.volmit.iris.IrisSettings;
|
||||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||||
|
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||||
import com.volmit.iris.util.MortarCommand;
|
import com.volmit.iris.util.MortarCommand;
|
||||||
import com.volmit.iris.util.MortarSender;
|
import com.volmit.iris.util.MortarSender;
|
||||||
|
|
||||||
@ -32,14 +33,13 @@ public class CommandIrisStudioHotload extends MortarCommand
|
|||||||
{
|
{
|
||||||
Player p = sender.player();
|
Player p = sender.player();
|
||||||
World world = p.getWorld();
|
World world = p.getWorld();
|
||||||
|
if(!(world.getGenerator() instanceof ProvisionBukkit))
|
||||||
if(!(world.getGenerator() instanceof IrisChunkGenerator))
|
|
||||||
{
|
{
|
||||||
sender.sendMessage("You must be in an iris world.");
|
sender.sendMessage("You must be in an iris world.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
|
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
|
||||||
g.onHotload();
|
g.onHotload();
|
||||||
sender.sendMessage("Hotloaded!");
|
sender.sendMessage("Hotloaded!");
|
||||||
return true;
|
return true;
|
||||||
|
@ -1,14 +1,7 @@
|
|||||||
package com.volmit.iris.command;
|
package com.volmit.iris.command;
|
||||||
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.IrisMetrics;
|
|
||||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
|
||||||
import com.volmit.iris.util.C;
|
|
||||||
import com.volmit.iris.util.Command;
|
import com.volmit.iris.util.Command;
|
||||||
import com.volmit.iris.util.Form;
|
|
||||||
import com.volmit.iris.util.MortarCommand;
|
import com.volmit.iris.util.MortarCommand;
|
||||||
import com.volmit.iris.util.MortarSender;
|
import com.volmit.iris.util.MortarSender;
|
||||||
|
|
||||||
@ -32,26 +25,7 @@ public class CommandIrisWhat extends MortarCommand
|
|||||||
@Override
|
@Override
|
||||||
public boolean handle(MortarSender sender, String[] args)
|
public boolean handle(MortarSender sender, String[] args)
|
||||||
{
|
{
|
||||||
if(sender.isPlayer())
|
printHelp(sender);
|
||||||
{
|
|
||||||
Player p = (Player) sender;
|
|
||||||
World world = p.getWorld();
|
|
||||||
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
|
|
||||||
IrisMetrics m = g.getMetrics();
|
|
||||||
sender.sendMessage("Thread Count: " + C.BOLD + "" + C.WHITE + g.getThreads());
|
|
||||||
sender.sendMessage("Total : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTotal().getAverage(), 2));
|
|
||||||
sender.sendMessage(" Terrain : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTerrain().getAverage(), 2));
|
|
||||||
sender.sendMessage(" Parallax: " + C.BOLD + "" + C.WHITE + Form.duration(m.getParallax().getAverage(), 2));
|
|
||||||
sender.sendMessage(" Post : " + C.BOLD + "" + C.WHITE + Form.duration(m.getPost().getAverage(), 2));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sender.sendMessage("Players only.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,13 +1,10 @@
|
|||||||
package com.volmit.iris.gen;
|
package com.volmit.iris.gen;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
@ -23,8 +20,6 @@ import org.bukkit.event.player.PlayerTeleportEvent;
|
|||||||
import org.bukkit.event.world.ChunkLoadEvent;
|
import org.bukkit.event.world.ChunkLoadEvent;
|
||||||
import org.bukkit.event.world.ChunkUnloadEvent;
|
import org.bukkit.event.world.ChunkUnloadEvent;
|
||||||
import org.bukkit.event.world.WorldUnloadEvent;
|
import org.bukkit.event.world.WorldUnloadEvent;
|
||||||
import org.bukkit.generator.BlockPopulator;
|
|
||||||
import org.bukkit.generator.ChunkGenerator;
|
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.IrisContext;
|
import com.volmit.iris.IrisContext;
|
||||||
@ -32,6 +27,9 @@ import com.volmit.iris.IrisDataManager;
|
|||||||
import com.volmit.iris.IrisMetrics;
|
import com.volmit.iris.IrisMetrics;
|
||||||
import com.volmit.iris.gen.atomics.AtomicCache;
|
import com.volmit.iris.gen.atomics.AtomicCache;
|
||||||
import com.volmit.iris.gen.atomics.AtomicMulticache;
|
import com.volmit.iris.gen.atomics.AtomicMulticache;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainChunk;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainProvider;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.noise.CNG;
|
import com.volmit.iris.noise.CNG;
|
||||||
import com.volmit.iris.object.IrisBiome;
|
import com.volmit.iris.object.IrisBiome;
|
||||||
import com.volmit.iris.object.IrisDimension;
|
import com.volmit.iris.object.IrisDimension;
|
||||||
@ -53,7 +51,7 @@ import lombok.EqualsAndHashCode;
|
|||||||
|
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = false)
|
@EqualsAndHashCode(callSuper = false)
|
||||||
public abstract class ContextualChunkGenerator extends ChunkGenerator implements Listener
|
public abstract class ContextualChunkGenerator implements TerrainProvider, Listener
|
||||||
{
|
{
|
||||||
private KList<BlockPosition> noLoot;
|
private KList<BlockPosition> noLoot;
|
||||||
private BlockPosition allowLoot;
|
private BlockPosition allowLoot;
|
||||||
@ -69,16 +67,17 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
private ChronoLatch pushLatch;
|
private ChronoLatch pushLatch;
|
||||||
private AtomicCache<IrisDimension> dimCache;
|
private AtomicCache<IrisDimension> dimCache;
|
||||||
private IrisMetrics metrics;
|
private IrisMetrics metrics;
|
||||||
private World world;
|
|
||||||
private int generated;
|
private int generated;
|
||||||
private int ticks;
|
private int ticks;
|
||||||
private long hlast;
|
private long hlast;
|
||||||
private boolean fastPregen = false;
|
private boolean fastPregen = false;
|
||||||
private boolean pregenDone;
|
private boolean pregenDone;
|
||||||
private volatile boolean hotloadable = false;
|
private volatile boolean hotloadable = false;
|
||||||
|
private final TerrainTarget target;
|
||||||
|
|
||||||
public ContextualChunkGenerator()
|
public ContextualChunkGenerator(TerrainTarget target)
|
||||||
{
|
{
|
||||||
|
this.target = target;
|
||||||
pushLatch = new ChronoLatch(3000);
|
pushLatch = new ChronoLatch(3000);
|
||||||
tickLatch = new ChronoLatch(650);
|
tickLatch = new ChronoLatch(650);
|
||||||
perSecond = new ChronoLatch(1000);
|
perSecond = new ChronoLatch(1000);
|
||||||
@ -97,9 +96,9 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
noLoot = new KList<>(1285);
|
noLoot = new KList<>(1285);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract void onGenerate(RNG masterRandom, int x, int z, ChunkData data, BiomeGrid grid);
|
protected abstract void onGenerate(RNG masterRandom, int x, int z, TerrainChunk chunk);
|
||||||
|
|
||||||
protected abstract void onInit(World world, RNG masterRandom);
|
protected abstract void onInit(RNG masterRandom);
|
||||||
|
|
||||||
protected abstract void onTick(int ticks);
|
protected abstract void onTick(int ticks);
|
||||||
|
|
||||||
@ -150,21 +149,20 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
return isDev() ? Iris.globaldata : data;
|
return isDev() ? Iris.globaldata : data;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void init(World world, RNG rng)
|
private void init(RNG rng)
|
||||||
{
|
{
|
||||||
if(initialized)
|
if(initialized)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.world = world;
|
setData(new IrisDataManager(getTarget().getFolder()));
|
||||||
setData(new IrisDataManager(getWorld().getWorldFolder()));
|
setMasterRandom(new RNG(getTarget().getSeed()));
|
||||||
setMasterRandom(new RNG(world.getSeed()));
|
|
||||||
setMetrics(new IrisMetrics(128));
|
setMetrics(new IrisMetrics(128));
|
||||||
setInitialized(true);
|
setInitialized(true);
|
||||||
setTask(Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::tick, 0, 0));
|
setTask(Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::tick, 0, 0));
|
||||||
Bukkit.getServer().getPluginManager().registerEvents(this, Iris.instance);
|
Bukkit.getServer().getPluginManager().registerEvents(this, Iris.instance);
|
||||||
onInit(world, masterRandom);
|
onInit(masterRandom);
|
||||||
setHotloadable(true);
|
setHotloadable(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,7 +183,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
setGenerated(0);
|
setGenerated(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
checkHotload();
|
doCheckHotload();
|
||||||
|
|
||||||
if(getNoLoot().size() > 1024)
|
if(getNoLoot().size() > 1024)
|
||||||
{
|
{
|
||||||
@ -217,7 +215,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void on(BlockBreakEvent e)
|
public void on(BlockBreakEvent e)
|
||||||
{
|
{
|
||||||
if(!e.getBlock().getWorld().equals(getWorld()))
|
if(!getTarget().isWorld(e.getBlock().getWorld()))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -238,7 +236,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void on(BlockPlaceEvent e)
|
public void on(BlockPlaceEvent e)
|
||||||
{
|
{
|
||||||
if(!e.getBlock().getWorld().equals(getWorld()))
|
if(!getTarget().isWorld(e.getBlock().getWorld()))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -249,7 +247,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void on(BlockDropItemEvent e)
|
public void on(BlockDropItemEvent e)
|
||||||
{
|
{
|
||||||
if(!e.getBlock().getWorld().equals(getWorld()))
|
if(!getTarget().isWorld(e.getBlock().getWorld()))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -269,13 +267,13 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void on(PlayerTeleportEvent e)
|
public void on(PlayerTeleportEvent e)
|
||||||
{
|
{
|
||||||
if(e.getFrom().getWorld().equals(world) && !e.getTo().getWorld().equals(world))
|
if(getTarget().isWorld(e.getFrom().getWorld()) && !getTarget().isWorld(e.getTo().getWorld()))
|
||||||
{
|
{
|
||||||
tick();
|
tick();
|
||||||
onPlayerLeft(e.getPlayer());
|
onPlayerLeft(e.getPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!e.getFrom().getWorld().equals(world) && e.getTo().getWorld().equals(world))
|
if(!getTarget().isWorld(e.getFrom().getWorld()) && getTarget().isWorld(e.getTo().getWorld()))
|
||||||
{
|
{
|
||||||
tick();
|
tick();
|
||||||
onPlayerJoin(e.getPlayer());
|
onPlayerJoin(e.getPlayer());
|
||||||
@ -285,7 +283,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void on(PlayerQuitEvent e)
|
public void on(PlayerQuitEvent e)
|
||||||
{
|
{
|
||||||
if(e.getPlayer().getWorld().equals(world))
|
if(getTarget().isWorld(e.getPlayer().getWorld()))
|
||||||
{
|
{
|
||||||
tick();
|
tick();
|
||||||
onPlayerLeft(e.getPlayer());
|
onPlayerLeft(e.getPlayer());
|
||||||
@ -295,7 +293,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void on(PlayerJoinEvent e)
|
public void on(PlayerJoinEvent e)
|
||||||
{
|
{
|
||||||
if(e.getPlayer().getWorld().equals(world))
|
if(getTarget().isWorld(e.getPlayer().getWorld()))
|
||||||
{
|
{
|
||||||
tick();
|
tick();
|
||||||
onPlayerJoin(e.getPlayer());
|
onPlayerJoin(e.getPlayer());
|
||||||
@ -305,7 +303,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void on(ChunkLoadEvent e)
|
public void on(ChunkLoadEvent e)
|
||||||
{
|
{
|
||||||
if(e.getWorld().equals(world))
|
if(getTarget().isWorld(e.getWorld()))
|
||||||
{
|
{
|
||||||
tick();
|
tick();
|
||||||
onChunkLoaded(e.getChunk());
|
onChunkLoaded(e.getChunk());
|
||||||
@ -315,7 +313,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void on(ChunkUnloadEvent e)
|
public void on(ChunkUnloadEvent e)
|
||||||
{
|
{
|
||||||
if(e.getWorld().equals(world))
|
if(getTarget().isWorld(e.getWorld()))
|
||||||
{
|
{
|
||||||
tick();
|
tick();
|
||||||
onChunkUnloaded(e.getChunk());
|
onChunkUnloaded(e.getChunk());
|
||||||
@ -325,7 +323,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void on(WorldUnloadEvent e)
|
public void on(WorldUnloadEvent e)
|
||||||
{
|
{
|
||||||
if(world != null && e.getWorld().equals(world))
|
if(getTarget().isWorld(e.getWorld()))
|
||||||
{
|
{
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
@ -345,16 +343,8 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
onClose();
|
onClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
protected void generateFailure(Random no, int x, int z, TerrainChunk chunk)
|
||||||
public boolean canSpawn(World world, int x, int z)
|
|
||||||
{
|
{
|
||||||
return super.canSpawn(world, x, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ChunkData generateChunkDataFailure(World world, Random no, int x, int z, BiomeGrid biomeGrid)
|
|
||||||
{
|
|
||||||
ChunkData c = Bukkit.createChunkData(world);
|
|
||||||
|
|
||||||
for(int i = 0; i < 16; i++)
|
for(int i = 0; i < 16; i++)
|
||||||
{
|
{
|
||||||
for(int j = 0; j < 16; j++)
|
for(int j = 0; j < 16; j++)
|
||||||
@ -363,46 +353,19 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
|
|
||||||
if(j == i || j + i == 16)
|
if(j == i || j + i == 16)
|
||||||
{
|
{
|
||||||
c.setBlock(i, h, j, B.getBlockData("RED_TERRACOTTA"));
|
chunk.setBlock(i, h, j, B.getBlockData("RED_TERRACOTTA"));
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
c.setBlock(i, h, j, B.getBlockData("BLACK_TERRACOTTA"));
|
chunk.setBlock(i, h, j, B.getBlockData("BLACK_TERRACOTTA"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ChunkData generateChunkFastPregen(World world, Random no, int x, int z, BiomeGrid biomeGrid)
|
|
||||||
{
|
|
||||||
ChunkData c = Bukkit.createChunkData(world);
|
|
||||||
|
|
||||||
for(int i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
for(int j = 0; j < 16; j++)
|
|
||||||
{
|
|
||||||
int h = 0;
|
|
||||||
|
|
||||||
if(j == i || j + i == 16)
|
|
||||||
{
|
|
||||||
c.setBlock(i, h, j, B.getBlockData("BLUE_TERRACOTTA"));
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
c.setBlock(i, h, j, B.getBlockData("WHITE_TERRACOTTA"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ChunkData generateChunkData(World world, Random no, int x, int z, BiomeGrid biomeGrid)
|
public void generate(Random no, int x, int z, TerrainChunk terrain)
|
||||||
{
|
{
|
||||||
setHotloadable(false);
|
setHotloadable(false);
|
||||||
if(!isDev())
|
if(!isDev())
|
||||||
@ -413,32 +376,21 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
|
|
||||||
if(failing)
|
if(failing)
|
||||||
{
|
{
|
||||||
return generateChunkDataFailure(world, no, x, z, biomeGrid);
|
generateFailure(no, x, z, terrain);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
RNG random = new RNG(world.getSeed());
|
RNG random = new RNG(getTarget().getSeed());
|
||||||
init(world, random.nextParallelRNG(0));
|
init(random.nextParallelRNG(0));
|
||||||
|
onGenerate(random, x, z, terrain);
|
||||||
ChunkData c = Bukkit.createChunkData(world);
|
|
||||||
|
|
||||||
if(!pregenDone && fastPregen)
|
|
||||||
{
|
|
||||||
c = generateChunkFastPregen(world, no, x, z, biomeGrid);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
onGenerate(random, x, z, c, biomeGrid);
|
|
||||||
}
|
|
||||||
|
|
||||||
generated++;
|
generated++;
|
||||||
long hits = CNG.hits;
|
long hits = CNG.hits;
|
||||||
CNG.hits = 0;
|
CNG.hits = 0;
|
||||||
Iris.instance.hit(hits);
|
Iris.instance.hit(hits);
|
||||||
setHotloadable(true);
|
setHotloadable(true);
|
||||||
return c;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
catch(Throwable e)
|
catch(Throwable e)
|
||||||
@ -447,36 +399,23 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
setHotloadable(true);
|
setHotloadable(true);
|
||||||
return generateChunkDataFailure(world, no, x, z, biomeGrid);
|
generateFailure(no, x, z, terrain);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkHotload()
|
private void doCheckHotload()
|
||||||
{
|
|
||||||
if(M.ms() - getHlast() < 1000)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(getWorld() != null)
|
|
||||||
{
|
|
||||||
checkHotload(getWorld());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkHotload(World world)
|
|
||||||
{
|
{
|
||||||
if(!isHotloadable())
|
if(!isHotloadable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(getPushLatch().flip())
|
if(M.ms() - getHlast() < 1000)
|
||||||
{
|
{
|
||||||
if(getWorld() == null)
|
return;
|
||||||
{
|
|
||||||
setWorld(world);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(getPushLatch().flip())
|
||||||
|
{
|
||||||
Iris.hotloader.check((IrisContext) this);
|
Iris.hotloader.check((IrisContext) this);
|
||||||
|
|
||||||
if(this instanceof IrisContext)
|
if(this instanceof IrisContext)
|
||||||
@ -511,7 +450,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
Iris.error("ERROR! Failed to generate chunk! Iris has entered a failed state!");
|
Iris.error("ERROR! Failed to generate chunk! Iris has entered a failed state!");
|
||||||
Iris.error("---------------------------------------------------------------------------------------------------------");
|
Iris.error("---------------------------------------------------------------------------------------------------------");
|
||||||
|
|
||||||
for(Player i : world.getPlayers())
|
for(Player i : getTarget().getPlayers())
|
||||||
{
|
{
|
||||||
Iris.instance.imsg(i, C.DARK_RED + "Iris Generator has crashed!");
|
Iris.instance.imsg(i, C.DARK_RED + "Iris Generator has crashed!");
|
||||||
Iris.instance.imsg(i, C.RED + "- Check the console for the error.");
|
Iris.instance.imsg(i, C.RED + "- Check the console for the error.");
|
||||||
@ -523,18 +462,6 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
|||||||
onFailure(e);
|
onFailure(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<BlockPopulator> getDefaultPopulators(World world)
|
|
||||||
{
|
|
||||||
return super.getDefaultPopulators(world);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Location getFixedSpawnLocation(World world, Random random)
|
|
||||||
{
|
|
||||||
return super.getFixedSpawnLocation(world, random);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isParallelCapable()
|
public boolean isParallelCapable()
|
||||||
{
|
{
|
||||||
|
@ -3,11 +3,11 @@ package com.volmit.iris.gen;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.object.InferredType;
|
import com.volmit.iris.object.InferredType;
|
||||||
import com.volmit.iris.object.IrisBiome;
|
import com.volmit.iris.object.IrisBiome;
|
||||||
import com.volmit.iris.object.IrisDimension;
|
import com.volmit.iris.object.IrisDimension;
|
||||||
@ -28,27 +28,14 @@ public abstract class DimensionChunkGenerator extends ContextualChunkGenerator
|
|||||||
protected static final BlockData BEDROCK = Material.BEDROCK.createBlockData();
|
protected static final BlockData BEDROCK = Material.BEDROCK.createBlockData();
|
||||||
protected static final BlockData WATER = Material.WATER.createBlockData();
|
protected static final BlockData WATER = Material.WATER.createBlockData();
|
||||||
|
|
||||||
public DimensionChunkGenerator(String dimensionName)
|
public DimensionChunkGenerator(TerrainTarget t, String dimensionName)
|
||||||
{
|
{
|
||||||
super();
|
super(t);
|
||||||
setDimensionName(dimensionName);
|
setDimensionName(dimensionName);
|
||||||
}
|
|
||||||
|
|
||||||
public void onPlayerLeft(Player p)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onTick(int m)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onInit(World world, RNG masterRandom)
|
|
||||||
{
|
|
||||||
if(getDimensionName().isEmpty())
|
if(getDimensionName().isEmpty())
|
||||||
{
|
{
|
||||||
File folder = new File(world.getWorldFolder(), "iris/dimensions");
|
File folder = new File(getTarget().getFolder(), "iris/dimensions");
|
||||||
|
|
||||||
if(!folder.exists())
|
if(!folder.exists())
|
||||||
{
|
{
|
||||||
@ -71,9 +58,32 @@ public abstract class DimensionChunkGenerator extends ContextualChunkGenerator
|
|||||||
fail(new RuntimeException("Missing dimension folder/file in " + folder.getAbsolutePath()));
|
fail(new RuntimeException("Missing dimension folder/file in " + folder.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName());
|
getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
catch(Throwable e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPlayerLeft(Player p)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onTick(int m)
|
||||||
|
{
|
||||||
|
getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onInit(RNG masterRandom)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public IrisDimension getDimension()
|
public IrisDimension getDimension()
|
||||||
{
|
{
|
||||||
IrisDimension d = loadDimension(getDimensionName());
|
IrisDimension d = loadDimension(getDimensionName());
|
||||||
|
@ -7,7 +7,6 @@ import java.util.Random;
|
|||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.block.BlockDropItemEvent;
|
import org.bukkit.event.block.BlockDropItemEvent;
|
||||||
@ -18,6 +17,9 @@ import com.volmit.iris.Iris;
|
|||||||
import com.volmit.iris.IrisContext;
|
import com.volmit.iris.IrisContext;
|
||||||
import com.volmit.iris.IrisSettings;
|
import com.volmit.iris.IrisSettings;
|
||||||
import com.volmit.iris.gen.atomics.AtomicRegionData;
|
import com.volmit.iris.gen.atomics.AtomicRegionData;
|
||||||
|
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainChunk;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.gui.Renderer;
|
import com.volmit.iris.gui.Renderer;
|
||||||
import com.volmit.iris.noise.CNG;
|
import com.volmit.iris.noise.CNG;
|
||||||
import com.volmit.iris.object.IrisBiome;
|
import com.volmit.iris.object.IrisBiome;
|
||||||
@ -43,19 +45,24 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
|||||||
private IrisRegion hr = null;
|
private IrisRegion hr = null;
|
||||||
private boolean spawnable = false;
|
private boolean spawnable = false;
|
||||||
|
|
||||||
public IrisChunkGenerator(String dimensionName, int threads)
|
public IrisChunkGenerator(IrisGenConfiguration config)
|
||||||
{
|
{
|
||||||
super(dimensionName, threads);
|
super(config.getTarget(), config.getDimension(), config.getThreads());
|
||||||
}
|
}
|
||||||
|
|
||||||
public IrisChunkGenerator(String dimensionName)
|
public IrisChunkGenerator(TerrainTarget t, String dimensionName, int threads)
|
||||||
{
|
{
|
||||||
super(dimensionName, 16);
|
super(t, dimensionName, threads);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IrisChunkGenerator(int tc)
|
public IrisChunkGenerator(TerrainTarget t, String dimensionName)
|
||||||
{
|
{
|
||||||
super("", tc);
|
super(t, dimensionName, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IrisChunkGenerator(TerrainTarget t, int tc)
|
||||||
|
{
|
||||||
|
super(t, "", tc);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void hotload()
|
public void hotload()
|
||||||
@ -73,26 +80,25 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ChunkData generateChunkData(World world, Random no, int x, int z, BiomeGrid biomeGrid)
|
public void generate(Random no, int x, int z, TerrainChunk terrain)
|
||||||
{
|
{
|
||||||
PrecisionStopwatch s = PrecisionStopwatch.start();
|
PrecisionStopwatch s = PrecisionStopwatch.start();
|
||||||
ChunkData c = super.generateChunkData(world, no, x, z, biomeGrid);
|
super.generate(no, x, z, terrain);
|
||||||
s.end();
|
s.end();
|
||||||
getMetrics().getTotal().put(s.getMilliseconds());
|
getMetrics().getTotal().put(s.getMilliseconds());
|
||||||
return c;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
|
protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
|
||||||
{
|
{
|
||||||
super.onGenerate(random, x, z, data, grid);
|
super.onGenerate(random, x, z, terrain);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onInit(World world, RNG rng)
|
public void onInit(RNG rng)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
super.onInit(world, rng);
|
super.onInit(rng);
|
||||||
}
|
}
|
||||||
|
|
||||||
catch(Throwable e)
|
catch(Throwable e)
|
||||||
@ -124,7 +130,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
|||||||
{
|
{
|
||||||
spawnable = true;
|
spawnable = true;
|
||||||
super.onTick(ticks);
|
super.onTick(ticks);
|
||||||
for(Player i : getWorld().getPlayers())
|
for(Player i : getTarget().getPlayers())
|
||||||
{
|
{
|
||||||
Location l = i.getLocation();
|
Location l = i.getLocation();
|
||||||
IrisRegion r = sampleRegion(l.getBlockX(), l.getBlockZ());
|
IrisRegion r = sampleRegion(l.getBlockX(), l.getBlockZ());
|
||||||
@ -160,7 +166,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
|||||||
}
|
}
|
||||||
|
|
||||||
setSliverCache(null);
|
setSliverCache(null);
|
||||||
Iris.info("Closing Iris Dimension " + getWorld().getName());
|
Iris.info("Closing Iris Dimension " + getTarget().getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -231,35 +237,6 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
|||||||
return bytes / 2;
|
return bytes / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean shouldGenerateCaves()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean shouldGenerateDecorations()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean shouldGenerateMobs()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean shouldGenerateStructures()
|
|
||||||
{
|
|
||||||
if(!isInitialized())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return getDimension().isVanillaStructures();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Renderer createRenderer()
|
public Renderer createRenderer()
|
||||||
{
|
{
|
||||||
return (x, z) -> render(x, z);
|
return (x, z) -> render(x, z);
|
||||||
@ -514,4 +491,36 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canSpawn(int x, int z)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateCaves()
|
||||||
|
{
|
||||||
|
return getDimension().isVanillaCaves();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateVanillaStructures()
|
||||||
|
{
|
||||||
|
return getDimension().isVanillaStructures();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateMobs()
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateDecorations()
|
||||||
|
{
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ package com.volmit.iris.gen;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.generator.BlockPopulator;
|
import org.bukkit.generator.BlockPopulator;
|
||||||
|
|
||||||
@ -13,6 +12,8 @@ import com.volmit.iris.gen.atomics.AtomicWorldData;
|
|||||||
import com.volmit.iris.gen.atomics.MasterLock;
|
import com.volmit.iris.gen.atomics.MasterLock;
|
||||||
import com.volmit.iris.gen.layer.GenLayerText;
|
import com.volmit.iris.gen.layer.GenLayerText;
|
||||||
import com.volmit.iris.gen.layer.GenLayerUpdate;
|
import com.volmit.iris.gen.layer.GenLayerUpdate;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainChunk;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.object.IrisBiome;
|
import com.volmit.iris.object.IrisBiome;
|
||||||
import com.volmit.iris.object.IrisBiomeMutation;
|
import com.volmit.iris.object.IrisBiomeMutation;
|
||||||
import com.volmit.iris.object.IrisObjectPlacement;
|
import com.volmit.iris.object.IrisObjectPlacement;
|
||||||
@ -49,18 +50,18 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
|
|||||||
private GenLayerText glText;
|
private GenLayerText glText;
|
||||||
private int sliverBuffer;
|
private int sliverBuffer;
|
||||||
|
|
||||||
public ParallaxChunkGenerator(String dimensionName, int threads)
|
public ParallaxChunkGenerator(TerrainTarget t, String dimensionName, int threads)
|
||||||
{
|
{
|
||||||
super(dimensionName, threads);
|
super(t, dimensionName, threads);
|
||||||
setSliverCache(new KMap<>());
|
setSliverCache(new KMap<>());
|
||||||
setSliverBuffer(sliverBuffer);
|
setSliverBuffer(sliverBuffer);
|
||||||
setMasterLock(new MasterLock());
|
setMasterLock(new MasterLock());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onInit(World world, RNG rng)
|
public void onInit(RNG rng)
|
||||||
{
|
{
|
||||||
super.onInit(world, rng);
|
super.onInit(rng);
|
||||||
setParallaxMap(new AtomicWorldData(world));
|
setParallaxMap(new AtomicWorldData(getTarget()));
|
||||||
setGlText(new GenLayerText(this, rng.nextParallelRNG(32485)));
|
setGlText(new GenLayerText(this, rng.nextParallelRNG(32485)));
|
||||||
setGlUpdate(null);
|
setGlUpdate(null);
|
||||||
J.a(() -> getDimension().getParallaxSize(this));
|
J.a(() -> getDimension().getParallaxSize(this));
|
||||||
@ -158,13 +159,13 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<BlockPopulator> getDefaultPopulators(World world)
|
public List<BlockPopulator> getPopulators()
|
||||||
{
|
{
|
||||||
List<BlockPopulator> g = super.getDefaultPopulators(world);
|
List<BlockPopulator> g = new KList<>();
|
||||||
|
|
||||||
if(getGlUpdate() == null)
|
if(getGlUpdate() == null)
|
||||||
{
|
{
|
||||||
setGlUpdate(new GenLayerUpdate(this, world));
|
setGlUpdate(new GenLayerUpdate(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
g.add(getGlUpdate());
|
g.add(getGlUpdate());
|
||||||
@ -172,20 +173,20 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
|
protected void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
|
||||||
{
|
{
|
||||||
if(getSliverCache().size() > 20000)
|
if(getSliverCache().size() > 20000)
|
||||||
{
|
{
|
||||||
getSliverCache().clear();
|
getSliverCache().clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
super.onPostGenerate(random, x, z, data, grid, height, biomeMap, map);
|
super.onPostGenerate(random, x, z, terrain, height, biomeMap, map);
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
|
|
||||||
if(getDimension().isPlaceObjects())
|
if(getDimension().isPlaceObjects())
|
||||||
{
|
{
|
||||||
onGenerateParallax(random, x, z);
|
onGenerateParallax(random, x, z);
|
||||||
getParallaxChunk(x, z).inject(data);
|
getParallaxChunk(x, z).inject(terrain);
|
||||||
getParallaxChunk(x, z).injectUpdates(map);
|
getParallaxChunk(x, z).injectUpdates(map);
|
||||||
getParallaxChunk(x, z).setWorldGenerated(true);
|
getParallaxChunk(x, z).setWorldGenerated(true);
|
||||||
}
|
}
|
||||||
@ -194,7 +195,7 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
|
|||||||
getMasterLock().clear();
|
getMasterLock().clear();
|
||||||
p.end();
|
p.end();
|
||||||
getMetrics().getParallax().put(p.getMilliseconds());
|
getMetrics().getParallax().put(p.getMilliseconds());
|
||||||
super.onPostParallaxPostGenerate(random, x, z, data, grid, height, biomeMap, map);
|
super.onPostParallaxPostGenerate(random, x, z, terrain, height, biomeMap, map);
|
||||||
getParallaxMap().clean(getTicks());
|
getParallaxMap().clean(getTicks());
|
||||||
getData().getObjectLoader().clean();
|
getData().getObjectLoader().clean();
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package com.volmit.iris.gen;
|
package com.volmit.iris.gen;
|
||||||
|
|
||||||
import org.bukkit.World;
|
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.gen.atomics.AtomicSliver;
|
import com.volmit.iris.gen.atomics.AtomicSliver;
|
||||||
import com.volmit.iris.gen.atomics.AtomicSliverMap;
|
import com.volmit.iris.gen.atomics.AtomicSliverMap;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainChunk;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.util.BiomeMap;
|
import com.volmit.iris.util.BiomeMap;
|
||||||
import com.volmit.iris.util.GroupedExecutor;
|
import com.volmit.iris.util.GroupedExecutor;
|
||||||
import com.volmit.iris.util.HeightMap;
|
import com.volmit.iris.util.HeightMap;
|
||||||
@ -22,9 +22,9 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
|
|||||||
private int threads;
|
private int threads;
|
||||||
private boolean cachingAllowed;
|
private boolean cachingAllowed;
|
||||||
|
|
||||||
public ParallelChunkGenerator(String dimensionName, int threads)
|
public ParallelChunkGenerator(TerrainTarget t, String dimensionName, int threads)
|
||||||
{
|
{
|
||||||
super(dimensionName);
|
super(t, dimensionName);
|
||||||
setThreads(threads);
|
setThreads(threads);
|
||||||
setCachingAllowed(false);
|
setCachingAllowed(false);
|
||||||
}
|
}
|
||||||
@ -33,7 +33,7 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
|
|||||||
{
|
{
|
||||||
setThreads(tc);
|
setThreads(tc);
|
||||||
GroupedExecutor e = getAccelerant();
|
GroupedExecutor e = getAccelerant();
|
||||||
setAccelerant(new GroupedExecutor(threads, Thread.MAX_PRIORITY, "Iris Generator - " + getWorld().getName()));
|
setAccelerant(new GroupedExecutor(threads, Thread.MAX_PRIORITY, "Iris Generator - " + getTarget().getName()));
|
||||||
;
|
;
|
||||||
Iris.executors.add(getAccelerant());
|
Iris.executors.add(getAccelerant());
|
||||||
|
|
||||||
@ -54,16 +54,16 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
|
|||||||
|
|
||||||
protected abstract int onSampleColumnHeight(int cx, int cz, int wx, int wz, int x, int z);
|
protected abstract int onSampleColumnHeight(int cx, int cz, int wx, int wz, int x, int z);
|
||||||
|
|
||||||
protected abstract void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
|
protected abstract void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
|
||||||
|
|
||||||
protected abstract void onPreGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
|
protected abstract void onPreGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
|
||||||
|
|
||||||
protected int sampleHeight(int x, int z)
|
protected int sampleHeight(int x, int z)
|
||||||
{
|
{
|
||||||
return onSampleColumnHeight(x >> 4, z >> 4, x, z, x & 15, z & 15);
|
return onSampleColumnHeight(x >> 4, z >> 4, x, z, x & 15, z & 15);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
|
protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
|
||||||
{
|
{
|
||||||
getCache().targetChunk(x, z);
|
getCache().targetChunk(x, z);
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
@ -73,7 +73,7 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
|
|||||||
BiomeMap biomeMap = new BiomeMap();
|
BiomeMap biomeMap = new BiomeMap();
|
||||||
int ii, jj;
|
int ii, jj;
|
||||||
|
|
||||||
onPreGenerate(random, x, z, data, grid, height, biomeMap, map);
|
onPreGenerate(random, x, z, terrain, height, biomeMap, map);
|
||||||
|
|
||||||
for(ii = 0; ii < 16; ii++)
|
for(ii = 0; ii < 16; ii++)
|
||||||
{
|
{
|
||||||
@ -101,10 +101,10 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
accelerant.waitFor(key);
|
accelerant.waitFor(key);
|
||||||
map.write(data, grid, height);
|
map.write(terrain, terrain, height);
|
||||||
getMetrics().getTerrain().put(p.getMilliseconds());
|
getMetrics().getTerrain().put(p.getMilliseconds());
|
||||||
p = PrecisionStopwatch.start();
|
p = PrecisionStopwatch.start();
|
||||||
onPostGenerate(random, x, z, data, grid, height, biomeMap, map);
|
onPostGenerate(random, x, z, terrain, height, biomeMap, map);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onClose()
|
protected void onClose()
|
||||||
@ -113,9 +113,9 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
|
|||||||
Iris.executors.remove(accelerant);
|
Iris.executors.remove(accelerant);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onInit(World world, RNG rng)
|
public void onInit(RNG rng)
|
||||||
{
|
{
|
||||||
super.onInit(world, rng);
|
super.onInit(rng);
|
||||||
changeThreadCount(getThreads());
|
changeThreadCount(getThreads());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.volmit.iris.gen;
|
package com.volmit.iris.gen;
|
||||||
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.gen.post.PostFloatingNibDeleter;
|
import com.volmit.iris.gen.post.PostFloatingNibDeleter;
|
||||||
@ -11,6 +11,8 @@ import com.volmit.iris.gen.post.PostPotholeFiller;
|
|||||||
import com.volmit.iris.gen.post.PostSlabber;
|
import com.volmit.iris.gen.post.PostSlabber;
|
||||||
import com.volmit.iris.gen.post.PostWallPatcher;
|
import com.volmit.iris.gen.post.PostWallPatcher;
|
||||||
import com.volmit.iris.gen.post.PostWaterlogger;
|
import com.volmit.iris.gen.post.PostWaterlogger;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainChunk;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.util.CaveResult;
|
import com.volmit.iris.util.CaveResult;
|
||||||
import com.volmit.iris.util.IPostBlockAccess;
|
import com.volmit.iris.util.IPostBlockAccess;
|
||||||
import com.volmit.iris.util.IrisLock;
|
import com.volmit.iris.util.IrisLock;
|
||||||
@ -31,22 +33,22 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
|
|||||||
private int minPhase;
|
private int minPhase;
|
||||||
private int maxPhase;
|
private int maxPhase;
|
||||||
|
|
||||||
public PostBlockChunkGenerator(String dimensionName, int threads)
|
public PostBlockChunkGenerator(TerrainTarget t, String dimensionName, int threads)
|
||||||
{
|
{
|
||||||
super(dimensionName, threads);
|
super(t, dimensionName, threads);
|
||||||
setPostKey("post-" + dimensionName);
|
setPostKey("post-" + dimensionName);
|
||||||
setPostLock(new IrisLock("PostChunkGenerator"));
|
setPostLock(new IrisLock("PostChunkGenerator"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onInit(World world, RNG rng)
|
public void onInit(RNG rng)
|
||||||
{
|
{
|
||||||
super.onInit(world, rng);
|
super.onInit(rng);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
|
protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
|
||||||
{
|
{
|
||||||
super.onGenerate(random, x, z, data, grid);
|
super.onGenerate(random, x, z, terrain);
|
||||||
|
|
||||||
if(!getDimension().isPostProcessing())
|
if(!getDimension().isPostProcessing())
|
||||||
{
|
{
|
||||||
@ -76,7 +78,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
|
|||||||
{
|
{
|
||||||
if(f.getPhase() == hh)
|
if(f.getPhase() == hh)
|
||||||
{
|
{
|
||||||
f.onPost(rxx, rzz, x, z, data);
|
f.onPost(rxx, rzz, x, z, terrain);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.volmit.iris.gen;
|
package com.volmit.iris.gen;
|
||||||
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.block.data.Bisected;
|
import org.bukkit.block.data.Bisected;
|
||||||
import org.bukkit.block.data.Bisected.Half;
|
import org.bukkit.block.data.Bisected.Half;
|
||||||
@ -13,6 +12,8 @@ import com.volmit.iris.gen.atomics.AtomicSliverMap;
|
|||||||
import com.volmit.iris.gen.layer.GenLayerBiome;
|
import com.volmit.iris.gen.layer.GenLayerBiome;
|
||||||
import com.volmit.iris.gen.layer.GenLayerCarve;
|
import com.volmit.iris.gen.layer.GenLayerCarve;
|
||||||
import com.volmit.iris.gen.layer.GenLayerCave;
|
import com.volmit.iris.gen.layer.GenLayerCave;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainChunk;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.noise.CNG;
|
import com.volmit.iris.noise.CNG;
|
||||||
import com.volmit.iris.object.DecorationPart;
|
import com.volmit.iris.object.DecorationPart;
|
||||||
import com.volmit.iris.object.InferredType;
|
import com.volmit.iris.object.InferredType;
|
||||||
@ -53,17 +54,17 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
|
|||||||
private CNG masterFracture;
|
private CNG masterFracture;
|
||||||
private ChronoLatch cwarn = new ChronoLatch(1000);
|
private ChronoLatch cwarn = new ChronoLatch(1000);
|
||||||
|
|
||||||
public TerrainChunkGenerator(String dimensionName, int threads)
|
public TerrainChunkGenerator(TerrainTarget t, String dimensionName, int threads)
|
||||||
{
|
{
|
||||||
super(dimensionName, threads);
|
super(t, dimensionName, threads);
|
||||||
setGenerators(new KMap<>());
|
setGenerators(new KMap<>());
|
||||||
setRegionLock(new IrisLock("BiomeChunkGenerator"));
|
setRegionLock(new IrisLock("BiomeChunkGenerator"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInit(World world, RNG rng)
|
public void onInit(RNG rng)
|
||||||
{
|
{
|
||||||
super.onInit(world, rng);
|
super.onInit(rng);
|
||||||
loadGenerators();
|
loadGenerators();
|
||||||
buildGenLayers(getMasterRandom());
|
buildGenLayers(getMasterRandom());
|
||||||
}
|
}
|
||||||
@ -113,7 +114,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPreGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
|
protected void onPreGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -336,23 +337,23 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
|
protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
|
||||||
{
|
{
|
||||||
super.onGenerate(random, x, z, data, grid);
|
super.onGenerate(random, x, z, terrain);
|
||||||
RNG ro = random.nextParallelRNG((x * x * x) - z);
|
RNG ro = random.nextParallelRNG((x * x * x) - z);
|
||||||
IrisRegion region = sampleRegion((x * 16) + 7, (z * 16) + 7);
|
IrisRegion region = sampleRegion((x * 16) + 7, (z * 16) + 7);
|
||||||
IrisBiome biome = sampleTrueBiome((x * 16) + 7, (z * 16) + 7);
|
IrisBiome biome = sampleTrueBiome((x * 16) + 7, (z * 16) + 7);
|
||||||
|
|
||||||
for(IrisDepositGenerator k : getDimension().getDeposits())
|
for(IrisDepositGenerator k : getDimension().getDeposits())
|
||||||
{
|
{
|
||||||
k.generate(data, ro, this, x, z);
|
k.generate(terrain, ro, this, x, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(IrisDepositGenerator k : region.getDeposits())
|
for(IrisDepositGenerator k : region.getDeposits())
|
||||||
{
|
{
|
||||||
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++)
|
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++)
|
||||||
{
|
{
|
||||||
k.generate(data, ro, this, x, z);
|
k.generate(terrain, ro, this, x, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -360,7 +361,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
|
|||||||
{
|
{
|
||||||
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++)
|
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++)
|
||||||
{
|
{
|
||||||
k.generate(data, ro, this, x, z);
|
k.generate(terrain, ro, this, x, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -546,17 +547,17 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
|
protected void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
|
||||||
{
|
{
|
||||||
onPreParallaxPostGenerate(random, x, z, data, grid, height, biomeMap, map);
|
onPreParallaxPostGenerate(random, x, z, terrain, height, biomeMap, map);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onPreParallaxPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
|
protected void onPreParallaxPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onPostParallaxPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
|
protected void onPostParallaxPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -815,7 +816,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
|
|||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
return M.lerp(lo, hi, gen.getHeight(rx, rz, getWorld().getSeed() + 239945));
|
return M.lerp(lo, hi, gen.getHeight(rx, rz, getTarget().getSeed() + 239945));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void loadGenerators()
|
protected void loadGenerators()
|
||||||
|
@ -7,10 +7,9 @@ import java.io.InputStream;
|
|||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
|
|
||||||
import org.bukkit.World;
|
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.IrisSettings;
|
import com.volmit.iris.IrisSettings;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.util.ByteArrayTag;
|
import com.volmit.iris.util.ByteArrayTag;
|
||||||
import com.volmit.iris.util.CompoundTag;
|
import com.volmit.iris.util.CompoundTag;
|
||||||
import com.volmit.iris.util.CustomOutputStream;
|
import com.volmit.iris.util.CustomOutputStream;
|
||||||
@ -21,10 +20,10 @@ import com.volmit.iris.util.Tag;
|
|||||||
|
|
||||||
public class AtomicRegionData
|
public class AtomicRegionData
|
||||||
{
|
{
|
||||||
private final World world;
|
private final TerrainTarget world;
|
||||||
private Tag[] tag;
|
private Tag[] tag;
|
||||||
|
|
||||||
public AtomicRegionData(World world)
|
public AtomicRegionData(TerrainTarget world)
|
||||||
{
|
{
|
||||||
this.world = world;
|
this.world = world;
|
||||||
tag = new Tag[1024];
|
tag = new Tag[1024];
|
||||||
@ -148,7 +147,7 @@ public class AtomicRegionData
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public World getWorld()
|
public TerrainTarget getWorld()
|
||||||
{
|
{
|
||||||
return world;
|
return world;
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,8 @@ import java.io.FileInputStream;
|
|||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.bukkit.World;
|
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||||
import com.volmit.iris.util.ChunkPosition;
|
import com.volmit.iris.util.ChunkPosition;
|
||||||
import com.volmit.iris.util.KList;
|
import com.volmit.iris.util.KList;
|
||||||
import com.volmit.iris.util.KMap;
|
import com.volmit.iris.util.KMap;
|
||||||
@ -15,7 +14,7 @@ import com.volmit.iris.util.M;
|
|||||||
|
|
||||||
public class AtomicWorldData
|
public class AtomicWorldData
|
||||||
{
|
{
|
||||||
private World world;
|
private TerrainTarget world;
|
||||||
private KMap<ChunkPosition, AtomicSliverMap> loadedChunks;
|
private KMap<ChunkPosition, AtomicSliverMap> loadedChunks;
|
||||||
private KMap<ChunkPosition, AtomicRegionData> loadedSections;
|
private KMap<ChunkPosition, AtomicRegionData> loadedSections;
|
||||||
private KMap<ChunkPosition, Long> lastRegion;
|
private KMap<ChunkPosition, Long> lastRegion;
|
||||||
@ -24,7 +23,7 @@ public class AtomicWorldData
|
|||||||
private KList<ChunkPosition> unloadChunks;
|
private KList<ChunkPosition> unloadChunks;
|
||||||
private long last = M.ms();
|
private long last = M.ms();
|
||||||
|
|
||||||
public AtomicWorldData(World world)
|
public AtomicWorldData(TerrainTarget world)
|
||||||
{
|
{
|
||||||
this.world = world;
|
this.world = world;
|
||||||
loadedSections = new KMap<>();
|
loadedSections = new KMap<>();
|
||||||
@ -254,7 +253,7 @@ public class AtomicWorldData
|
|||||||
|
|
||||||
public File getSubregionFolder()
|
public File getSubregionFolder()
|
||||||
{
|
{
|
||||||
return new File(world.getWorldFolder(), "region-parallax");
|
return new File(world.getFolder(), "parallax");
|
||||||
}
|
}
|
||||||
|
|
||||||
public KMap<ChunkPosition, AtomicSliverMap> getLoadedChunks()
|
public KMap<ChunkPosition, AtomicSliverMap> getLoadedChunks()
|
||||||
|
@ -32,10 +32,10 @@ public class GenLayerUpdate extends BlockPopulator
|
|||||||
private ParallaxChunkGenerator gen;
|
private ParallaxChunkGenerator gen;
|
||||||
private RNG rng;
|
private RNG rng;
|
||||||
|
|
||||||
public GenLayerUpdate(ParallaxChunkGenerator gen, World w)
|
public GenLayerUpdate(ParallaxChunkGenerator gen)
|
||||||
{
|
{
|
||||||
this.gen = gen;
|
this.gen = gen;
|
||||||
this.rng = new RNG(w.getSeed() + 4996788).nextParallelRNG(-98618289);
|
this.rng = new RNG(gen.getTarget().getSeed() + 4996788).nextParallelRNG(-98618289);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
48
src/main/java/com/volmit/iris/gen/nms/NMSCreator.java
Normal file
48
src/main/java/com/volmit/iris/gen/nms/NMSCreator.java
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package com.volmit.iris.gen.nms;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.WorldCreator;
|
||||||
|
|
||||||
|
import com.volmit.iris.Iris;
|
||||||
|
|
||||||
|
public class NMSCreator
|
||||||
|
{
|
||||||
|
public static World createWorld(WorldCreator creator)
|
||||||
|
{
|
||||||
|
return createWorld(creator, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static World createWorld(WorldCreator creator, boolean loadSpawn)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String code = Iris.nmsTag();
|
||||||
|
|
||||||
|
if(code.equals("v1_16_R2"))
|
||||||
|
{
|
||||||
|
return NMSCreator162.createWorld(creator, loadSpawn);
|
||||||
|
}
|
||||||
|
else if(code.equals("v1_16_R1"))
|
||||||
|
{
|
||||||
|
return NMSCreator161.createWorld(creator, loadSpawn);
|
||||||
|
}
|
||||||
|
else if(code.equals("v1_15_R1"))
|
||||||
|
{
|
||||||
|
return NMSCreator151.createWorld(creator, loadSpawn);
|
||||||
|
}
|
||||||
|
else if(code.equals("v1_14_R1"))
|
||||||
|
{
|
||||||
|
return NMSCreator141.createWorld(creator, loadSpawn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
catch(Throwable e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
Iris.warn("Failed to load NMS Spawn for MC:" + Iris.nmsTag() + ". Using Bukkit...");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Bukkit.createWorld(creator);
|
||||||
|
}
|
||||||
|
}
|
134
src/main/java/com/volmit/iris/gen/nms/NMSCreator141.java
Normal file
134
src/main/java/com/volmit/iris/gen/nms/NMSCreator141.java
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
package com.volmit.iris.gen.nms;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.WorldCreator;
|
||||||
|
import org.bukkit.craftbukkit.v1_14_R1.CraftServer;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.world.WorldInitEvent;
|
||||||
|
import org.bukkit.event.world.WorldLoadEvent;
|
||||||
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
|
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
import com.volmit.iris.util.V;
|
||||||
|
|
||||||
|
import net.minecraft.server.v1_14_R1.DedicatedServer;
|
||||||
|
import net.minecraft.server.v1_14_R1.DimensionManager;
|
||||||
|
import net.minecraft.server.v1_14_R1.EnumDifficulty;
|
||||||
|
import net.minecraft.server.v1_14_R1.EnumGamemode;
|
||||||
|
import net.minecraft.server.v1_14_R1.GameProfilerFiller;
|
||||||
|
import net.minecraft.server.v1_14_R1.MinecraftServer;
|
||||||
|
import net.minecraft.server.v1_14_R1.WorldData;
|
||||||
|
import net.minecraft.server.v1_14_R1.WorldNBTStorage;
|
||||||
|
import net.minecraft.server.v1_14_R1.WorldProvider;
|
||||||
|
import net.minecraft.server.v1_14_R1.WorldServer;
|
||||||
|
import net.minecraft.server.v1_14_R1.WorldSettings;
|
||||||
|
|
||||||
|
public class NMSCreator141
|
||||||
|
{
|
||||||
|
@SuppressWarnings({"resource", "deprecation"})
|
||||||
|
public static World createWorld(WorldCreator creator, boolean loadSpawn)
|
||||||
|
{
|
||||||
|
CraftServer server = ((CraftServer) Bukkit.getServer());
|
||||||
|
Map<String, World> worlds = new V(server).get("worlds");
|
||||||
|
DedicatedServer console = new V(server).get("console");
|
||||||
|
WorldSettings worldSettings;
|
||||||
|
Preconditions.checkState((boolean) (!console.worldServer.isEmpty()), (Object) "Cannot create additional worlds on STARTUP");
|
||||||
|
Validate.notNull((Object) creator, (String) "Creator may not be null");
|
||||||
|
String name = creator.name();
|
||||||
|
ChunkGenerator generator = creator.generator();
|
||||||
|
File folder = new File(server.getWorldContainer(), name);
|
||||||
|
World world = server.getWorld(name);
|
||||||
|
net.minecraft.server.v1_14_R1.WorldType type = net.minecraft.server.v1_14_R1.WorldType.getType((String) creator.type().getName());
|
||||||
|
boolean generateStructures = creator.generateStructures();
|
||||||
|
if(world != null)
|
||||||
|
{
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
if(folder.exists() && !folder.isDirectory())
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
|
||||||
|
}
|
||||||
|
if(generator == null)
|
||||||
|
{
|
||||||
|
generator = server.getGenerator(name);
|
||||||
|
}
|
||||||
|
console.convertWorld(name);
|
||||||
|
int dimension = 10 + console.worldServer.size();
|
||||||
|
boolean used = false;
|
||||||
|
block0: do
|
||||||
|
{
|
||||||
|
for(WorldServer ss : console.getWorlds())
|
||||||
|
{
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
boolean bl = used = ss.getWorldProvider().getDimensionManager().getDimensionID() == dimension;
|
||||||
|
if(!used)
|
||||||
|
continue;
|
||||||
|
++dimension;
|
||||||
|
continue block0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(used);
|
||||||
|
boolean hardcore = false;
|
||||||
|
WorldNBTStorage sdm = new WorldNBTStorage(server.getWorldContainer(), name, (MinecraftServer) server.getServer(), server.getHandle().getServer().dataConverterManager);
|
||||||
|
WorldData worlddata = sdm.getWorldData();
|
||||||
|
if(worlddata == null)
|
||||||
|
{
|
||||||
|
worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById((int) server.getDefaultGameMode().getValue()), generateStructures, hardcore, type);
|
||||||
|
JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings());
|
||||||
|
if(parsedSettings.isJsonObject())
|
||||||
|
{
|
||||||
|
worldSettings.setGeneratorSettings((JsonElement) parsedSettings.getAsJsonObject());
|
||||||
|
}
|
||||||
|
worlddata = new WorldData(worldSettings, name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
worlddata.setName(name);
|
||||||
|
worldSettings = new WorldSettings(worlddata);
|
||||||
|
}
|
||||||
|
DimensionManager actualDimension = DimensionManager.a((int) creator.environment().getId());
|
||||||
|
DimensionManager internalDimension = DimensionManager.register((String) name.toLowerCase(Locale.ENGLISH), (DimensionManager) new DimensionManager(dimension, actualDimension.getSuffix(), actualDimension.folder, (w, manager) -> (WorldProvider) manager.providerFactory.apply(w, manager), actualDimension.hasSkyLight(), actualDimension));
|
||||||
|
//@builder
|
||||||
|
WorldServer internal = new WorldServer(
|
||||||
|
(MinecraftServer)console,
|
||||||
|
console.executorService,
|
||||||
|
sdm,
|
||||||
|
worlddata,
|
||||||
|
internalDimension,
|
||||||
|
(GameProfilerFiller)console.getMethodProfiler(),
|
||||||
|
server.getServer().worldLoadListenerFactory.create(11),
|
||||||
|
creator.environment(),
|
||||||
|
generator);
|
||||||
|
//@done
|
||||||
|
if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
console.initWorld(internal, worlddata, worldSettings);
|
||||||
|
internal.worldData.setDifficulty(EnumDifficulty.EASY);
|
||||||
|
internal.setSpawnFlags(true, true);
|
||||||
|
console.worldServer.put(internal.getWorldProvider().getDimensionManager(), internal);
|
||||||
|
server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
|
||||||
|
|
||||||
|
if(loadSpawn)
|
||||||
|
{
|
||||||
|
server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
|
||||||
|
}
|
||||||
|
|
||||||
|
server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
|
||||||
|
return internal.getWorld();
|
||||||
|
}
|
||||||
|
}
|
134
src/main/java/com/volmit/iris/gen/nms/NMSCreator151.java
Normal file
134
src/main/java/com/volmit/iris/gen/nms/NMSCreator151.java
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
package com.volmit.iris.gen.nms;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.WorldCreator;
|
||||||
|
import org.bukkit.craftbukkit.v1_15_R1.CraftServer;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.world.WorldInitEvent;
|
||||||
|
import org.bukkit.event.world.WorldLoadEvent;
|
||||||
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
|
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
import com.volmit.iris.util.V;
|
||||||
|
|
||||||
|
import net.minecraft.server.v1_15_R1.DedicatedServer;
|
||||||
|
import net.minecraft.server.v1_15_R1.DimensionManager;
|
||||||
|
import net.minecraft.server.v1_15_R1.EnumDifficulty;
|
||||||
|
import net.minecraft.server.v1_15_R1.EnumGamemode;
|
||||||
|
import net.minecraft.server.v1_15_R1.GameProfilerFiller;
|
||||||
|
import net.minecraft.server.v1_15_R1.MinecraftServer;
|
||||||
|
import net.minecraft.server.v1_15_R1.WorldData;
|
||||||
|
import net.minecraft.server.v1_15_R1.WorldNBTStorage;
|
||||||
|
import net.minecraft.server.v1_15_R1.WorldProvider;
|
||||||
|
import net.minecraft.server.v1_15_R1.WorldServer;
|
||||||
|
import net.minecraft.server.v1_15_R1.WorldSettings;
|
||||||
|
|
||||||
|
public class NMSCreator151
|
||||||
|
{
|
||||||
|
@SuppressWarnings({"resource", "deprecation"})
|
||||||
|
public static World createWorld(WorldCreator creator, boolean loadSpawn)
|
||||||
|
{
|
||||||
|
CraftServer server = ((CraftServer) Bukkit.getServer());
|
||||||
|
Map<String, World> worlds = new V(server).get("worlds");
|
||||||
|
DedicatedServer console = new V(server).get("console");
|
||||||
|
WorldSettings worldSettings;
|
||||||
|
Preconditions.checkState((boolean) (!console.worldServer.isEmpty()), (Object) "Cannot create additional worlds on STARTUP");
|
||||||
|
Validate.notNull((Object) creator, (String) "Creator may not be null");
|
||||||
|
String name = creator.name();
|
||||||
|
ChunkGenerator generator = creator.generator();
|
||||||
|
File folder = new File(server.getWorldContainer(), name);
|
||||||
|
World world = server.getWorld(name);
|
||||||
|
net.minecraft.server.v1_15_R1.WorldType type = net.minecraft.server.v1_15_R1.WorldType.getType((String) creator.type().getName());
|
||||||
|
boolean generateStructures = creator.generateStructures();
|
||||||
|
if(world != null)
|
||||||
|
{
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
if(folder.exists() && !folder.isDirectory())
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
|
||||||
|
}
|
||||||
|
if(generator == null)
|
||||||
|
{
|
||||||
|
generator = server.getGenerator(name);
|
||||||
|
}
|
||||||
|
console.convertWorld(name);
|
||||||
|
int dimension = 10 + console.worldServer.size();
|
||||||
|
boolean used = false;
|
||||||
|
block0: do
|
||||||
|
{
|
||||||
|
for(WorldServer ss : console.getWorlds())
|
||||||
|
{
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
boolean bl = used = ss.getWorldProvider().getDimensionManager().getDimensionID() == dimension;
|
||||||
|
if(!used)
|
||||||
|
continue;
|
||||||
|
++dimension;
|
||||||
|
continue block0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(used);
|
||||||
|
boolean hardcore = false;
|
||||||
|
WorldNBTStorage sdm = new WorldNBTStorage(server.getWorldContainer(), name, (MinecraftServer) server.getServer(), server.getHandle().getServer().dataConverterManager);
|
||||||
|
WorldData worlddata = sdm.getWorldData();
|
||||||
|
if(worlddata == null)
|
||||||
|
{
|
||||||
|
worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById((int) server.getDefaultGameMode().getValue()), generateStructures, hardcore, type);
|
||||||
|
JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings());
|
||||||
|
if(parsedSettings.isJsonObject())
|
||||||
|
{
|
||||||
|
worldSettings.setGeneratorSettings((JsonElement) parsedSettings.getAsJsonObject());
|
||||||
|
}
|
||||||
|
worlddata = new WorldData(worldSettings, name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
worlddata.setName(name);
|
||||||
|
worldSettings = new WorldSettings(worlddata);
|
||||||
|
}
|
||||||
|
DimensionManager actualDimension = DimensionManager.a((int) creator.environment().getId());
|
||||||
|
DimensionManager internalDimension = DimensionManager.register((String) name.toLowerCase(Locale.ENGLISH), (DimensionManager) new DimensionManager(dimension, actualDimension.getSuffix(), actualDimension.folder, (w, manager) -> (WorldProvider) manager.providerFactory.apply(w, manager), actualDimension.hasSkyLight(), actualDimension.getGenLayerZoomer(), actualDimension));
|
||||||
|
//@builder
|
||||||
|
WorldServer internal = new WorldServer(
|
||||||
|
(MinecraftServer)console,
|
||||||
|
console.executorService,
|
||||||
|
sdm,
|
||||||
|
worlddata,
|
||||||
|
internalDimension,
|
||||||
|
(GameProfilerFiller)console.getMethodProfiler(),
|
||||||
|
server.getServer().worldLoadListenerFactory.create(11),
|
||||||
|
creator.environment(),
|
||||||
|
generator);
|
||||||
|
//@done
|
||||||
|
if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
console.initWorld(internal, worlddata, worldSettings);
|
||||||
|
internal.worldData.setDifficulty(EnumDifficulty.EASY);
|
||||||
|
internal.setSpawnFlags(true, true);
|
||||||
|
console.worldServer.put(internal.getWorldProvider().getDimensionManager(), internal);
|
||||||
|
server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
|
||||||
|
|
||||||
|
if(loadSpawn)
|
||||||
|
{
|
||||||
|
server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
|
||||||
|
}
|
||||||
|
|
||||||
|
server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
|
||||||
|
return internal.getWorld();
|
||||||
|
}
|
||||||
|
}
|
208
src/main/java/com/volmit/iris/gen/nms/NMSCreator161.java
Normal file
208
src/main/java/com/volmit/iris/gen/nms/NMSCreator161.java
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
package com.volmit.iris.gen.nms;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.WorldCreator;
|
||||||
|
import org.bukkit.craftbukkit.v1_16_R1.CraftServer;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.world.WorldInitEvent;
|
||||||
|
import org.bukkit.event.world.WorldLoadEvent;
|
||||||
|
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.mojang.serialization.DynamicOps;
|
||||||
|
import com.mojang.serialization.Lifecycle;
|
||||||
|
import com.volmit.iris.util.V;
|
||||||
|
|
||||||
|
import net.minecraft.server.v1_16_R1.BiomeManager;
|
||||||
|
import net.minecraft.server.v1_16_R1.Convertable;
|
||||||
|
import net.minecraft.server.v1_16_R1.DedicatedServer;
|
||||||
|
import net.minecraft.server.v1_16_R1.DimensionManager;
|
||||||
|
import net.minecraft.server.v1_16_R1.DynamicOpsNBT;
|
||||||
|
import net.minecraft.server.v1_16_R1.EnumDifficulty;
|
||||||
|
import net.minecraft.server.v1_16_R1.EnumGamemode;
|
||||||
|
import net.minecraft.server.v1_16_R1.GameRules;
|
||||||
|
import net.minecraft.server.v1_16_R1.GeneratorSettings;
|
||||||
|
import net.minecraft.server.v1_16_R1.IRegistry;
|
||||||
|
import net.minecraft.server.v1_16_R1.IWorldDataServer;
|
||||||
|
import net.minecraft.server.v1_16_R1.MinecraftKey;
|
||||||
|
import net.minecraft.server.v1_16_R1.MinecraftServer;
|
||||||
|
import net.minecraft.server.v1_16_R1.MobSpawner;
|
||||||
|
import net.minecraft.server.v1_16_R1.MobSpawnerCat;
|
||||||
|
import net.minecraft.server.v1_16_R1.MobSpawnerPatrol;
|
||||||
|
import net.minecraft.server.v1_16_R1.MobSpawnerPhantom;
|
||||||
|
import net.minecraft.server.v1_16_R1.MobSpawnerTrader;
|
||||||
|
import net.minecraft.server.v1_16_R1.NBTBase;
|
||||||
|
import net.minecraft.server.v1_16_R1.RegistryMaterials;
|
||||||
|
import net.minecraft.server.v1_16_R1.RegistryReadOps;
|
||||||
|
import net.minecraft.server.v1_16_R1.ResourceKey;
|
||||||
|
import net.minecraft.server.v1_16_R1.SaveData;
|
||||||
|
import net.minecraft.server.v1_16_R1.VillageSiege;
|
||||||
|
import net.minecraft.server.v1_16_R1.WorldDataServer;
|
||||||
|
import net.minecraft.server.v1_16_R1.WorldDimension;
|
||||||
|
import net.minecraft.server.v1_16_R1.WorldServer;
|
||||||
|
import net.minecraft.server.v1_16_R1.WorldSettings;
|
||||||
|
|
||||||
|
public class NMSCreator161
|
||||||
|
{
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes", "resource"})
|
||||||
|
public static World createWorld(WorldCreator creator, boolean loadSpawn)
|
||||||
|
{
|
||||||
|
CraftServer server = ((CraftServer) Bukkit.getServer());
|
||||||
|
Map<String, World> worlds = new V(server).get("worlds");
|
||||||
|
DedicatedServer console = new V(server).get("console");
|
||||||
|
Preconditions.checkState(!console.worldServer.isEmpty(), (Object) "Cannot create additional worlds on STARTUP");
|
||||||
|
Validate.notNull((Object) creator, "Creator may not be null");
|
||||||
|
final String name = creator.name();
|
||||||
|
org.bukkit.generator.ChunkGenerator generator = creator.generator();
|
||||||
|
final File folder = new File(server.getWorldContainer(), name);
|
||||||
|
final World world = server.getWorld(name);
|
||||||
|
|
||||||
|
if(world != null)
|
||||||
|
{
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(folder.exists() && !folder.isDirectory())
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(generator == null)
|
||||||
|
{
|
||||||
|
generator = server.getGenerator(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceKey<WorldDimension> actualDimension = null;
|
||||||
|
switch(creator.environment())
|
||||||
|
{
|
||||||
|
case NORMAL:
|
||||||
|
{
|
||||||
|
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.OVERWORLD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NETHER:
|
||||||
|
{
|
||||||
|
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.THE_NETHER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case THE_END:
|
||||||
|
{
|
||||||
|
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.THE_END;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Illegal dimension");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Convertable.ConversionSession worldSession;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
worldSession = Convertable.a(server.getWorldContainer().toPath()).c(name, (ResourceKey) actualDimension);
|
||||||
|
}
|
||||||
|
catch(IOException ex)
|
||||||
|
{
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
MinecraftServer.convertWorld(worldSession);
|
||||||
|
final boolean hardcore = creator.hardcore();
|
||||||
|
final RegistryReadOps<NBTBase> registryreadops = (RegistryReadOps<NBTBase>) RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, console.dataPackResources.h(), console.f);
|
||||||
|
WorldDataServer worlddata = (WorldDataServer) worldSession.a((DynamicOps) registryreadops, console.datapackconfiguration);
|
||||||
|
if(worlddata == null)
|
||||||
|
{
|
||||||
|
final Properties properties = new Properties();
|
||||||
|
properties.put("generator-settings", Objects.toString(creator.generatorSettings()));
|
||||||
|
properties.put("level-seed", Objects.toString(creator.seed()));
|
||||||
|
properties.put("generate-structures", Objects.toString(creator.generateStructures()));
|
||||||
|
properties.put("level-type", Objects.toString(creator.type().getName()));
|
||||||
|
GeneratorSettings generatorsettings = GeneratorSettings.a((Properties) properties);
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
final WorldSettings worldSettings = new WorldSettings(name, EnumGamemode.getById(server.getDefaultGameMode().getValue()), hardcore, EnumDifficulty.EASY, false, new GameRules(), console.datapackconfiguration);
|
||||||
|
worlddata = new WorldDataServer(worldSettings, generatorsettings, Lifecycle.stable());
|
||||||
|
}
|
||||||
|
worlddata.checkName(name);
|
||||||
|
worlddata.a(console.getServerModName(), console.getModded().isPresent());
|
||||||
|
final long j = BiomeManager.a(creator.seed());
|
||||||
|
final List<MobSpawner> list = (List<MobSpawner>) ImmutableList.of((MobSpawner) new MobSpawnerPhantom(), (MobSpawner) new MobSpawnerPatrol(), (MobSpawner) new MobSpawnerCat(), (MobSpawner) new VillageSiege(), (MobSpawner) new MobSpawnerTrader((IWorldDataServer) worlddata));
|
||||||
|
RegistryMaterials registrymaterials = worlddata.getGeneratorSettings().e();
|
||||||
|
final WorldDimension worlddimension = (WorldDimension) registrymaterials.a((ResourceKey) actualDimension);
|
||||||
|
DimensionManager dimensionmanager;
|
||||||
|
net.minecraft.server.v1_16_R1.ChunkGenerator chunkgenerator;
|
||||||
|
|
||||||
|
if(worlddimension == null)
|
||||||
|
{
|
||||||
|
dimensionmanager = DimensionManager.a();
|
||||||
|
chunkgenerator = GeneratorSettings.a((long) new Random().nextLong());
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dimensionmanager = worlddimension.b();
|
||||||
|
chunkgenerator = worlddimension.c();
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceKey typeKey = (ResourceKey) console.f.a().c(dimensionmanager).orElseThrow(() -> new IllegalStateException("Unregistered dimension type: " + (Object) dimensionmanager));
|
||||||
|
ResourceKey worldKey = ResourceKey.a((ResourceKey) IRegistry.ae, (MinecraftKey) new MinecraftKey(name.toLowerCase(Locale.ENGLISH)));
|
||||||
|
|
||||||
|
//@builder
|
||||||
|
WorldServer internal = new WorldServer(
|
||||||
|
(MinecraftServer)console,
|
||||||
|
console.executorService,
|
||||||
|
worldSession,
|
||||||
|
(IWorldDataServer)worlddata,
|
||||||
|
worldKey,
|
||||||
|
typeKey,
|
||||||
|
dimensionmanager,
|
||||||
|
server.getServer().worldLoadListenerFactory.create(11),
|
||||||
|
chunkgenerator,
|
||||||
|
worlddata.getGeneratorSettings().isDebugWorld(),
|
||||||
|
j,
|
||||||
|
(List)(creator.environment() == World.Environment.NORMAL ? list : ImmutableList.of()),
|
||||||
|
true,
|
||||||
|
creator.environment(),
|
||||||
|
generator);
|
||||||
|
|
||||||
|
//@done
|
||||||
|
if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
internal.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
catch(IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
console.initWorld(internal, (IWorldDataServer) worlddata, (SaveData) worlddata, worlddata.getGeneratorSettings());
|
||||||
|
internal.setSpawnFlags(true, true);
|
||||||
|
console.worldServer.put(internal.getDimensionKey(), internal);
|
||||||
|
server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
|
||||||
|
if(loadSpawn)
|
||||||
|
{
|
||||||
|
server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
|
||||||
|
}
|
||||||
|
|
||||||
|
server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
|
||||||
|
return (World) internal.getWorld();
|
||||||
|
}
|
||||||
|
}
|
209
src/main/java/com/volmit/iris/gen/nms/NMSCreator162.java
Normal file
209
src/main/java/com/volmit/iris/gen/nms/NMSCreator162.java
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
package com.volmit.iris.gen.nms;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.WorldCreator;
|
||||||
|
import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.world.WorldInitEvent;
|
||||||
|
import org.bukkit.event.world.WorldLoadEvent;
|
||||||
|
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.mojang.serialization.DynamicOps;
|
||||||
|
import com.mojang.serialization.Lifecycle;
|
||||||
|
import com.volmit.iris.util.V;
|
||||||
|
|
||||||
|
import net.minecraft.server.v1_16_R2.BiomeBase;
|
||||||
|
import net.minecraft.server.v1_16_R2.BiomeManager;
|
||||||
|
import net.minecraft.server.v1_16_R2.Convertable;
|
||||||
|
import net.minecraft.server.v1_16_R2.DataConverterRegistry;
|
||||||
|
import net.minecraft.server.v1_16_R2.DedicatedServer;
|
||||||
|
import net.minecraft.server.v1_16_R2.DimensionManager;
|
||||||
|
import net.minecraft.server.v1_16_R2.DynamicOpsNBT;
|
||||||
|
import net.minecraft.server.v1_16_R2.EnumDifficulty;
|
||||||
|
import net.minecraft.server.v1_16_R2.EnumGamemode;
|
||||||
|
import net.minecraft.server.v1_16_R2.GameRules;
|
||||||
|
import net.minecraft.server.v1_16_R2.GeneratorSettingBase;
|
||||||
|
import net.minecraft.server.v1_16_R2.GeneratorSettings;
|
||||||
|
import net.minecraft.server.v1_16_R2.IRegistry;
|
||||||
|
import net.minecraft.server.v1_16_R2.IWorldDataServer;
|
||||||
|
import net.minecraft.server.v1_16_R2.MinecraftKey;
|
||||||
|
import net.minecraft.server.v1_16_R2.MinecraftServer;
|
||||||
|
import net.minecraft.server.v1_16_R2.MobSpawner;
|
||||||
|
import net.minecraft.server.v1_16_R2.MobSpawnerCat;
|
||||||
|
import net.minecraft.server.v1_16_R2.MobSpawnerPatrol;
|
||||||
|
import net.minecraft.server.v1_16_R2.MobSpawnerPhantom;
|
||||||
|
import net.minecraft.server.v1_16_R2.MobSpawnerTrader;
|
||||||
|
import net.minecraft.server.v1_16_R2.NBTBase;
|
||||||
|
import net.minecraft.server.v1_16_R2.RegistryMaterials;
|
||||||
|
import net.minecraft.server.v1_16_R2.RegistryReadOps;
|
||||||
|
import net.minecraft.server.v1_16_R2.ResourceKey;
|
||||||
|
import net.minecraft.server.v1_16_R2.SaveData;
|
||||||
|
import net.minecraft.server.v1_16_R2.VillageSiege;
|
||||||
|
import net.minecraft.server.v1_16_R2.WorldDataServer;
|
||||||
|
import net.minecraft.server.v1_16_R2.WorldDimension;
|
||||||
|
import net.minecraft.server.v1_16_R2.WorldServer;
|
||||||
|
import net.minecraft.server.v1_16_R2.WorldSettings;
|
||||||
|
|
||||||
|
public class NMSCreator162
|
||||||
|
{
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes", "resource"})
|
||||||
|
public static World createWorld(WorldCreator creator, boolean loadSpawn)
|
||||||
|
{
|
||||||
|
CraftServer server = ((CraftServer) Bukkit.getServer());
|
||||||
|
Map<String, World> worlds = new V(server).get("worlds");
|
||||||
|
DedicatedServer console = new V(server).get("console");
|
||||||
|
Preconditions.checkState(!console.worldServer.isEmpty(), (Object) "Cannot create additional worlds on STARTUP");
|
||||||
|
Validate.notNull((Object) creator, "Creator may not be null");
|
||||||
|
final String name = creator.name();
|
||||||
|
org.bukkit.generator.ChunkGenerator generator = creator.generator();
|
||||||
|
final File folder = new File(server.getWorldContainer(), name);
|
||||||
|
final World world = server.getWorld(name);
|
||||||
|
|
||||||
|
if(world != null)
|
||||||
|
{
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(folder.exists() && !folder.isDirectory())
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(generator == null)
|
||||||
|
{
|
||||||
|
generator = server.getGenerator(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceKey<WorldDimension> actualDimension = null;
|
||||||
|
switch(creator.environment())
|
||||||
|
{
|
||||||
|
case NORMAL:
|
||||||
|
{
|
||||||
|
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.OVERWORLD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NETHER:
|
||||||
|
{
|
||||||
|
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.THE_NETHER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case THE_END:
|
||||||
|
{
|
||||||
|
actualDimension = (ResourceKey<WorldDimension>) WorldDimension.THE_END;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Illegal dimension");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Convertable.ConversionSession worldSession;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
worldSession = Convertable.a(server.getWorldContainer().toPath()).c(name, (ResourceKey) actualDimension);
|
||||||
|
}
|
||||||
|
catch(IOException ex)
|
||||||
|
{
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
MinecraftServer.convertWorld(worldSession);
|
||||||
|
final boolean hardcore = creator.hardcore();
|
||||||
|
final RegistryReadOps<NBTBase> registryreadops = (RegistryReadOps<NBTBase>) RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, console.dataPackResources.h(), console.f);
|
||||||
|
WorldDataServer worlddata = (WorldDataServer) worldSession.a((DynamicOps) registryreadops, console.datapackconfiguration);
|
||||||
|
if(worlddata == null)
|
||||||
|
{
|
||||||
|
final Properties properties = new Properties();
|
||||||
|
properties.put("generator-settings", Objects.toString(creator.generatorSettings()));
|
||||||
|
properties.put("level-seed", Objects.toString(creator.seed()));
|
||||||
|
properties.put("generate-structures", Objects.toString(creator.generateStructures()));
|
||||||
|
properties.put("level-type", Objects.toString(creator.type().getName()));
|
||||||
|
final GeneratorSettings generatorsettings = GeneratorSettings.a(console.aX(), properties);
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
final WorldSettings worldSettings = new WorldSettings(name, EnumGamemode.getById(server.getDefaultGameMode().getValue()), hardcore, EnumDifficulty.EASY, false, new GameRules(), console.datapackconfiguration);
|
||||||
|
worlddata = new WorldDataServer(worldSettings, generatorsettings, Lifecycle.stable());
|
||||||
|
}
|
||||||
|
worlddata.checkName(name);
|
||||||
|
worlddata.a(console.getServerModName(), console.getModded().isPresent());
|
||||||
|
if(console.options.has("forceUpgrade"))
|
||||||
|
{
|
||||||
|
net.minecraft.server.v1_16_R2.Main.convertWorld(worldSession, DataConverterRegistry.a(), console.options.has("eraseCache"), () -> true, (ImmutableSet) worlddata.getGeneratorSettings().d().d().stream().map(entry -> ResourceKey.a(IRegistry.K, entry.getKey().a())).collect(ImmutableSet.toImmutableSet()));
|
||||||
|
}
|
||||||
|
final long j = BiomeManager.a(creator.seed());
|
||||||
|
final List<MobSpawner> list = (List<MobSpawner>) ImmutableList.of((MobSpawner) new MobSpawnerPhantom(), (MobSpawner) new MobSpawnerPatrol(), (MobSpawner) new MobSpawnerCat(), (MobSpawner) new VillageSiege(), (MobSpawner) new MobSpawnerTrader((IWorldDataServer) worlddata));
|
||||||
|
final RegistryMaterials<WorldDimension> registrymaterials = (RegistryMaterials<WorldDimension>) worlddata.getGeneratorSettings().d();
|
||||||
|
final WorldDimension worlddimension = (WorldDimension) registrymaterials.a((ResourceKey) actualDimension);
|
||||||
|
DimensionManager dimensionmanager;
|
||||||
|
net.minecraft.server.v1_16_R2.ChunkGenerator chunkgenerator;
|
||||||
|
|
||||||
|
if(worlddimension == null)
|
||||||
|
{
|
||||||
|
dimensionmanager = (DimensionManager) console.f.a().d(DimensionManager.OVERWORLD);
|
||||||
|
chunkgenerator = (net.minecraft.server.v1_16_R2.ChunkGenerator) GeneratorSettings.a((IRegistry<BiomeBase>) console.f.b(IRegistry.ay), (IRegistry<GeneratorSettingBase>) console.f.b(IRegistry.ar), new Random().nextLong());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dimensionmanager = worlddimension.b();
|
||||||
|
chunkgenerator = worlddimension.c();
|
||||||
|
}
|
||||||
|
|
||||||
|
final ResourceKey<net.minecraft.server.v1_16_R2.World> worldKey = (ResourceKey<net.minecraft.server.v1_16_R2.World>) ResourceKey.a(IRegistry.L, new MinecraftKey(name.toLowerCase(Locale.ENGLISH)));
|
||||||
|
//@builder
|
||||||
|
final WorldServer internal = new WorldServer((MinecraftServer) console,
|
||||||
|
console.executorService, worldSession,
|
||||||
|
(IWorldDataServer) worlddata,
|
||||||
|
(ResourceKey) worldKey,
|
||||||
|
dimensionmanager,
|
||||||
|
server.getServer().worldLoadListenerFactory.create(11),
|
||||||
|
chunkgenerator,
|
||||||
|
worlddata.getGeneratorSettings().isDebugWorld(),
|
||||||
|
j,
|
||||||
|
(List) ((creator.environment() == World.Environment.NORMAL) ? list : ImmutableList.of()),
|
||||||
|
true,
|
||||||
|
creator.environment(),
|
||||||
|
generator);
|
||||||
|
//@done
|
||||||
|
if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
internal.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
catch(IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
console.initWorld(internal, (IWorldDataServer) worlddata, (SaveData) worlddata, worlddata.getGeneratorSettings());
|
||||||
|
internal.setSpawnFlags(true, true);
|
||||||
|
console.worldServer.put(internal.getDimensionKey(), internal);
|
||||||
|
server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
|
||||||
|
if(loadSpawn)
|
||||||
|
{
|
||||||
|
server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
|
||||||
|
}
|
||||||
|
|
||||||
|
server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
|
||||||
|
return (World) internal.getWorld();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,93 @@
|
|||||||
|
package com.volmit.iris.gen.provisions;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.generator.BlockPopulator;
|
||||||
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
|
|
||||||
|
import com.volmit.iris.gen.scaffold.HeightedFakeWorld;
|
||||||
|
import com.volmit.iris.gen.scaffold.Provisioned;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainChunk;
|
||||||
|
import com.volmit.iris.gen.scaffold.TerrainProvider;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class ProvisionBukkit extends ChunkGenerator implements Provisioned
|
||||||
|
{
|
||||||
|
private HeightedFakeWorld fakeworld = null;
|
||||||
|
private boolean worldSet = false;
|
||||||
|
private final TerrainProvider provider;
|
||||||
|
|
||||||
|
public ProvisionBukkit(TerrainProvider provider)
|
||||||
|
{
|
||||||
|
this.provider = provider;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome)
|
||||||
|
{
|
||||||
|
if(!worldSet)
|
||||||
|
{
|
||||||
|
worldSet = true;
|
||||||
|
provider.getTarget().setRealWorld(world);
|
||||||
|
}
|
||||||
|
|
||||||
|
TerrainChunk terrain = TerrainChunk.create(world, biome);
|
||||||
|
getProvider().generate(random, x, z, terrain);
|
||||||
|
return terrain.getRaw();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canSpawn(World world, int x, int z)
|
||||||
|
{
|
||||||
|
return provider.canSpawn(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BlockPopulator> getDefaultPopulators(World world)
|
||||||
|
{
|
||||||
|
return provider.getPopulators();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Location getFixedSpawnLocation(World world, Random random)
|
||||||
|
{
|
||||||
|
return super.getFixedSpawnLocation(world, random);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isParallelCapable()
|
||||||
|
{
|
||||||
|
return provider.isParallelCapable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateCaves()
|
||||||
|
{
|
||||||
|
return provider.shouldGenerateCaves();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateDecorations()
|
||||||
|
{
|
||||||
|
return super.shouldGenerateDecorations();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateMobs()
|
||||||
|
{
|
||||||
|
return provider.shouldGenerateMobs();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldGenerateStructures()
|
||||||
|
{
|
||||||
|
return provider.shouldGenerateVanillaStructures();
|
||||||
|
}
|
||||||
|
}
|
@ -1,66 +0,0 @@
|
|||||||
package com.volmit.iris.gen.bindings;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.generator.BlockPopulator;
|
|
||||||
import org.bukkit.generator.ChunkGenerator;
|
|
||||||
|
|
||||||
public abstract class BukkitTerrainProvider extends ChunkGenerator implements TerrainProvider
|
|
||||||
{
|
|
||||||
private final TerrainTarget target;
|
|
||||||
|
|
||||||
public BukkitTerrainProvider(TerrainTarget target)
|
|
||||||
{
|
|
||||||
this.target = target;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract void generate(Random random, int x, int z, TerrainChunk chunk);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome)
|
|
||||||
{
|
|
||||||
TerrainChunk terrain = TerrainChunk.create(world);
|
|
||||||
generate(random, x, z, terrain);
|
|
||||||
return terrain;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract boolean canSpawn(World world, int x, int z);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canSpawnDefault(World world, int x, int z)
|
|
||||||
{
|
|
||||||
return super.canSpawn(world, x, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract List<BlockPopulator> getDefaultPopulators(World world);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract Location getFixedSpawnLocation(World world, Random random);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract boolean isParallelCapable();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract boolean shouldGenerateCaves();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract boolean shouldGenerateDecorations();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract boolean shouldGenerateMobs();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract boolean shouldGenerateStructures();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TerrainTarget getTarget()
|
|
||||||
{
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
}
|
|
1305
src/main/java/com/volmit/iris/gen/scaffold/HeightedFakeWorld.java
Normal file
1305
src/main/java/com/volmit/iris/gen/scaffold/HeightedFakeWorld.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
|||||||
package com.volmit.iris.gen.bindings;
|
package com.volmit.iris.gen.scaffold;
|
||||||
|
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.volmit.iris.gen.scaffold;
|
||||||
|
|
||||||
|
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
public class IrisGenConfiguration
|
||||||
|
{
|
||||||
|
private TerrainTarget target;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private int threads = 16;
|
||||||
|
|
||||||
|
@Builder.Default
|
||||||
|
private String dimension = "";
|
||||||
|
|
||||||
|
public IrisChunkGenerator buildGenerator()
|
||||||
|
{
|
||||||
|
return new IrisChunkGenerator(this);
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,10 @@
|
|||||||
package com.volmit.iris.gen.bindings;
|
package com.volmit.iris.gen.scaffold;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||||
import org.bukkit.material.MaterialData;
|
import org.bukkit.material.MaterialData;
|
||||||
|
|
||||||
@ -16,39 +16,26 @@ public class IrisTerrainChunk implements TerrainChunk
|
|||||||
private final Biome[] biome2D;
|
private final Biome[] biome2D;
|
||||||
private final IrisBiomeStorage biome3D;
|
private final IrisBiomeStorage biome3D;
|
||||||
private final ChunkData rawChunkData;
|
private final ChunkData rawChunkData;
|
||||||
private final Constructor<?> construct = buildConstruct();
|
private final BiomeGrid storage;
|
||||||
|
|
||||||
public IrisTerrainChunk(int maxHeight)
|
public IrisTerrainChunk(int maxHeight)
|
||||||
{
|
{
|
||||||
|
this(null, maxHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IrisTerrainChunk(BiomeGrid storage, int maxHeight)
|
||||||
|
{
|
||||||
|
this.storage = storage;
|
||||||
rawChunkData = createChunkData(maxHeight);
|
rawChunkData = createChunkData(maxHeight);
|
||||||
biome2D = Iris.biome3d ? null : new Biome[256];
|
biome2D = storage != null ? null : Iris.biome3d ? null : new Biome[256];
|
||||||
biome3D = Iris.biome3d ? new IrisBiomeStorage() : null;
|
biome3D = storage != null ? null : Iris.biome3d ? new IrisBiomeStorage() : null;
|
||||||
}
|
|
||||||
|
|
||||||
private Constructor<?> buildConstruct()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Class<?> chunkDatazz = Class.forName("org.bukkit.craftbukkit." + Iris.nmsTag() + ".generator.CraftChunkData");
|
|
||||||
Constructor<?> construct = chunkDatazz.getConstructor(int.class);
|
|
||||||
construct.setAccessible(true);
|
|
||||||
return construct;
|
|
||||||
}
|
|
||||||
|
|
||||||
catch(Throwable e)
|
|
||||||
{
|
|
||||||
Iris.error("Failed create construct for ChunkData(int)");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ChunkData createChunkData(int maxHeight)
|
private ChunkData createChunkData(int maxHeight)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return (ChunkData) construct.newInstance(maxHeight);
|
return Bukkit.createChunkData(new HeightedFakeWorld(maxHeight));
|
||||||
}
|
}
|
||||||
|
|
||||||
catch(Throwable e)
|
catch(Throwable e)
|
||||||
@ -62,6 +49,11 @@ public class IrisTerrainChunk implements TerrainChunk
|
|||||||
@Override
|
@Override
|
||||||
public Biome getBiome(int x, int z)
|
public Biome getBiome(int x, int z)
|
||||||
{
|
{
|
||||||
|
if(storage != null)
|
||||||
|
{
|
||||||
|
return storage.getBiome(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
if(biome2D != null)
|
if(biome2D != null)
|
||||||
{
|
{
|
||||||
return biome2D[(z << 4) | x];
|
return biome2D[(z << 4) | x];
|
||||||
@ -73,6 +65,11 @@ public class IrisTerrainChunk implements TerrainChunk
|
|||||||
@Override
|
@Override
|
||||||
public Biome getBiome(int x, int y, int z)
|
public Biome getBiome(int x, int y, int z)
|
||||||
{
|
{
|
||||||
|
if(storage != null)
|
||||||
|
{
|
||||||
|
return storage.getBiome(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
if(biome2D != null)
|
if(biome2D != null)
|
||||||
{
|
{
|
||||||
return biome2D[(z << 4) | x];
|
return biome2D[(z << 4) | x];
|
||||||
@ -84,6 +81,12 @@ public class IrisTerrainChunk implements TerrainChunk
|
|||||||
@Override
|
@Override
|
||||||
public void setBiome(int x, int z, Biome bio)
|
public void setBiome(int x, int z, Biome bio)
|
||||||
{
|
{
|
||||||
|
if(storage != null)
|
||||||
|
{
|
||||||
|
storage.setBiome(x, z, bio);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(biome2D != null)
|
if(biome2D != null)
|
||||||
{
|
{
|
||||||
biome2D[(z << 4) | x] = bio;
|
biome2D[(z << 4) | x] = bio;
|
||||||
@ -96,6 +99,12 @@ public class IrisTerrainChunk implements TerrainChunk
|
|||||||
@Override
|
@Override
|
||||||
public void setBiome(int x, int y, int z, Biome bio)
|
public void setBiome(int x, int y, int z, Biome bio)
|
||||||
{
|
{
|
||||||
|
if(storage != null)
|
||||||
|
{
|
||||||
|
storage.setBiome(x, y, z, bio);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(biome2D != null)
|
if(biome2D != null)
|
||||||
{
|
{
|
||||||
biome2D[(z << 4) | x] = bio;
|
biome2D[(z << 4) | x] = bio;
|
||||||
@ -177,4 +186,10 @@ public class IrisTerrainChunk implements TerrainChunk
|
|||||||
{
|
{
|
||||||
return rawChunkData.getData(x, y, z);
|
return rawChunkData.getData(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ChunkData getRaw()
|
||||||
|
{
|
||||||
|
return rawChunkData;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
23
src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java
Normal file
23
src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package com.volmit.iris.gen.scaffold;
|
||||||
|
|
||||||
|
import org.bukkit.World;
|
||||||
|
|
||||||
|
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||||
|
|
||||||
|
public class IrisWorlds
|
||||||
|
{
|
||||||
|
public boolean isIrisWorld(World world)
|
||||||
|
{
|
||||||
|
return world.getGenerator() instanceof Provisioned;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IrisChunkGenerator getProvider(World world)
|
||||||
|
{
|
||||||
|
if(isIrisWorld(world))
|
||||||
|
{
|
||||||
|
return (IrisChunkGenerator) ((Provisioned) world.getGenerator()).getProvider();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
package com.volmit.iris.gen.scaffold;
|
||||||
|
|
||||||
|
public interface Provisioned
|
||||||
|
{
|
||||||
|
public TerrainProvider getProvider();
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package com.volmit.iris.gen.bindings;
|
package com.volmit.iris.gen.scaffold;
|
||||||
|
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
@ -18,6 +18,16 @@ public interface TerrainChunk extends BiomeGrid, ChunkData
|
|||||||
return new IrisTerrainChunk(maxHeight);
|
return new IrisTerrainChunk(maxHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static TerrainChunk create(World world, BiomeGrid grid)
|
||||||
|
{
|
||||||
|
return create(world.getMaxHeight(), grid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TerrainChunk create(int maxHeight, BiomeGrid grid)
|
||||||
|
{
|
||||||
|
return new IrisTerrainChunk(grid, maxHeight);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get biome at x, z within chunk being generated
|
* Get biome at x, z within chunk being generated
|
||||||
*
|
*
|
||||||
@ -114,4 +124,6 @@ public interface TerrainChunk extends BiomeGrid, ChunkData
|
|||||||
* outside the chunk's bounds
|
* outside the chunk's bounds
|
||||||
*/
|
*/
|
||||||
public BlockData getBlockData(int x, int y, int z);
|
public BlockData getBlockData(int x, int y, int z);
|
||||||
|
|
||||||
|
public ChunkData getRaw();
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
package com.volmit.iris.gen.bindings;
|
package com.volmit.iris.gen.scaffold;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.generator.BlockPopulator;
|
import org.bukkit.generator.BlockPopulator;
|
||||||
|
|
||||||
public interface TerrainProvider
|
public interface TerrainProvider
|
||||||
@ -13,21 +11,17 @@ public interface TerrainProvider
|
|||||||
|
|
||||||
public void generate(Random random, int x, int z, TerrainChunk chunk);
|
public void generate(Random random, int x, int z, TerrainChunk chunk);
|
||||||
|
|
||||||
public boolean canSpawn(World world, int x, int z);
|
public boolean canSpawn(int x, int z);
|
||||||
|
|
||||||
public boolean canSpawnDefault(World world, int x, int z);
|
public List<BlockPopulator> getPopulators();
|
||||||
|
|
||||||
public List<BlockPopulator> getDefaultPopulators(World world);
|
|
||||||
|
|
||||||
public Location getFixedSpawnLocation(World world, Random random);
|
|
||||||
|
|
||||||
public boolean isParallelCapable();
|
public boolean isParallelCapable();
|
||||||
|
|
||||||
|
public boolean shouldGenerateMobs();
|
||||||
|
|
||||||
public boolean shouldGenerateCaves();
|
public boolean shouldGenerateCaves();
|
||||||
|
|
||||||
public boolean shouldGenerateDecorations();
|
public boolean shouldGenerateDecorations();
|
||||||
|
|
||||||
public boolean shouldGenerateMobs();
|
public boolean shouldGenerateVanillaStructures();
|
||||||
|
|
||||||
public boolean shouldGenerateStructures();
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,13 @@
|
|||||||
package com.volmit.iris.gen.bindings;
|
package com.volmit.iris.gen.scaffold;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.World.Environment;
|
import org.bukkit.World.Environment;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.volmit.iris.util.KList;
|
||||||
|
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -16,6 +20,20 @@ public class TerrainTarget
|
|||||||
private Environment environment;
|
private Environment environment;
|
||||||
private String name;
|
private String name;
|
||||||
private File folder;
|
private File folder;
|
||||||
|
private static final KList<Player> emptyPlayers = new KList<>();
|
||||||
|
private World realWorld;
|
||||||
|
|
||||||
|
public void setRealWorld(World realWorld)
|
||||||
|
{
|
||||||
|
if(this.realWorld == null || realWorld != this.realWorld)
|
||||||
|
{
|
||||||
|
this.realWorld = realWorld;
|
||||||
|
this.seed = realWorld.getSeed();
|
||||||
|
this.folder = realWorld.getWorldFolder();
|
||||||
|
this.environment = realWorld.getEnvironment();
|
||||||
|
this.name = realWorld.getName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static TerrainTarget from(World world)
|
public static TerrainTarget from(World world)
|
||||||
{
|
{
|
||||||
@ -25,7 +43,61 @@ public class TerrainTarget
|
|||||||
.seed(world.getSeed())
|
.seed(world.getSeed())
|
||||||
.folder(world.getWorldFolder())
|
.folder(world.getWorldFolder())
|
||||||
.name(world.getName())
|
.name(world.getName())
|
||||||
|
.realWorld(world)
|
||||||
.build();
|
.build();
|
||||||
//@done
|
//@done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Player> getPlayers()
|
||||||
|
{
|
||||||
|
return realWorld != null ? realWorld.getPlayers() : emptyPlayers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isWorld(World world)
|
||||||
|
{
|
||||||
|
return world.getName().equals(getName()) && world.getSeed() == getSeed() && getEnvironment().equals(world.getEnvironment()) && world.getWorldFolder().equals(getFolder());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj)
|
||||||
|
{
|
||||||
|
if(this == obj)
|
||||||
|
return true;
|
||||||
|
if(obj == null)
|
||||||
|
return false;
|
||||||
|
if(getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
TerrainTarget other = (TerrainTarget) obj;
|
||||||
|
if(environment != other.environment)
|
||||||
|
return false;
|
||||||
|
if(folder == null)
|
||||||
|
{
|
||||||
|
if(other.folder != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if(!folder.equals(other.folder))
|
||||||
|
return false;
|
||||||
|
if(name == null)
|
||||||
|
{
|
||||||
|
if(other.name != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if(!name.equals(other.name))
|
||||||
|
return false;
|
||||||
|
if(seed != other.seed)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((environment == null) ? 0 : environment.hashCode());
|
||||||
|
result = prime * result + ((folder == null) ? 0 : folder.hashCode());
|
||||||
|
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||||
|
result = prime * result + (int) (seed ^ (seed >>> 32));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,6 +82,17 @@ public class MultiverseCoreLink
|
|||||||
saveConfig();
|
saveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeFromConfig(String world)
|
||||||
|
{
|
||||||
|
if(!supported())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
getList().remove(world);
|
||||||
|
saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
public void saveConfig()
|
public void saveConfig()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -138,6 +138,10 @@ public class IrisDimension extends IrisRegistrant
|
|||||||
@Desc("Carve terrain or not")
|
@Desc("Carve terrain or not")
|
||||||
private boolean carving = true;
|
private boolean carving = true;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("Generate vanilla caves")
|
||||||
|
private boolean vanillaCaves = false;
|
||||||
|
|
||||||
@DontObfuscate
|
@DontObfuscate
|
||||||
@Desc("Generate vanilla structures")
|
@Desc("Generate vanilla structures")
|
||||||
private boolean vanillaStructures = false;
|
private boolean vanillaStructures = false;
|
||||||
|
@ -76,9 +76,9 @@ public class IrisEntitySpawn
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(rng.aquire(() -> new RNG(g.getWorld().getSeed() + 4)).i(1, getRarity()) == 1)
|
if(rng.aquire(() -> new RNG(g.getTarget().getSeed() + 4)).i(1, getRarity()) == 1)
|
||||||
{
|
{
|
||||||
return getRealEntity(g).spawn(g, at, rng.aquire(() -> new RNG(g.getWorld().getSeed() + 4)));
|
return getRealEntity(g).spawn(g, at, rng.aquire(() -> new RNG(g.getTarget().getSeed() + 4)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user