mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-19 02:36:59 +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>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<!-- NMS -->
|
||||
<dependency>
|
||||
<groupId>org.bukkit.craftbukkit</groupId>
|
||||
<artifactId>cb-1.16.2</artifactId>
|
||||
<version>1.16.2</version>
|
||||
<scope>provided</scope>
|
||||
</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 -->
|
||||
<dependency>
|
||||
<groupId>org.bstats</groupId>
|
||||
|
@ -4,15 +4,14 @@ import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.net.URL;
|
||||
|
||||
import org.bstats.bukkit.Metrics;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.World.Environment;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.generator.ChunkGenerator;
|
||||
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.PostWallPatcher;
|
||||
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.util.C;
|
||||
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.KList;
|
||||
import com.volmit.iris.util.MortarPlugin;
|
||||
import com.volmit.iris.util.NMSVersion;
|
||||
import com.volmit.iris.util.Permission;
|
||||
|
||||
public class Iris extends MortarPlugin
|
||||
@ -86,6 +87,16 @@ public class Iris extends MortarPlugin
|
||||
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()
|
||||
{
|
||||
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())
|
||||
{
|
||||
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
|
||||
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)
|
||||
|
@ -9,6 +9,7 @@ import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
||||
|
||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||
import com.volmit.iris.noise.CNG;
|
||||
import com.volmit.iris.object.IrisBiome;
|
||||
import com.volmit.iris.util.BoardManager;
|
||||
@ -54,7 +55,7 @@ public class IrisBoardManager implements BoardProvider, Listener
|
||||
@DontObfuscate
|
||||
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)
|
||||
@ -88,7 +89,7 @@ public class IrisBoardManager implements BoardProvider, Listener
|
||||
return v;
|
||||
}
|
||||
|
||||
IrisChunkGenerator g = (IrisChunkGenerator) player.getWorld().getGenerator();
|
||||
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) player.getWorld().getGenerator()).getProvider();
|
||||
|
||||
if(cl.flip())
|
||||
{
|
||||
|
@ -1,7 +1,6 @@
|
||||
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.IrisDimension;
|
||||
import com.volmit.iris.object.IrisRegion;
|
||||
@ -9,17 +8,19 @@ import com.volmit.iris.util.KMap;
|
||||
|
||||
public interface IrisContext
|
||||
{
|
||||
static KMap<World, IrisContext> contexts = new KMap<>();
|
||||
static KMap<TerrainTarget, IrisContext> contexts = new KMap<>();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
public TerrainTarget getTarget();
|
||||
|
||||
public IrisBiome getBiome(int x, int z);
|
||||
|
||||
@ -31,7 +32,5 @@ public interface IrisContext
|
||||
|
||||
public int getHeight(int x, int z);
|
||||
|
||||
public World getWorld();
|
||||
|
||||
public void onHotloaded();
|
||||
}
|
||||
|
@ -27,7 +27,11 @@ import org.zeroturnaround.zip.commons.FileUtils;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonSyntaxException;
|
||||
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.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.Envelope;
|
||||
import com.volmit.iris.object.InterpolationMethod;
|
||||
@ -316,7 +320,11 @@ public class ProjectManager
|
||||
|
||||
Iris.globaldata.dump();
|
||||
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;
|
||||
gx.setDev(true);
|
||||
sender.sendMessage("Generating with " + IrisSettings.get().threads + " threads per chunk");
|
||||
@ -365,13 +373,14 @@ public class ProjectManager
|
||||
});
|
||||
|
||||
//@builder
|
||||
World world = Bukkit.createWorld(new WorldCreator("iris/" + UUID.randomUUID())
|
||||
World world = NMSCreator.createWorld(new WorldCreator(wfp)
|
||||
.seed(1337)
|
||||
.generator(gx)
|
||||
.generator(gen)
|
||||
.generateStructures(d.isVanillaStructures())
|
||||
.type(WorldType.NORMAL)
|
||||
.environment(d.getEnvironment()));
|
||||
.environment(d.getEnvironment()), false);
|
||||
//@done
|
||||
gx.getTarget().setRealWorld(world);
|
||||
Iris.linkMultiverseCore.removeFromConfig(world);
|
||||
|
||||
done.set(true);
|
||||
@ -400,9 +409,9 @@ public class ProjectManager
|
||||
if(isProjectOpen())
|
||||
{
|
||||
currentProject.close();
|
||||
File folder = currentProject.getWorld().getWorldFolder();
|
||||
Iris.linkMultiverseCore.removeFromConfig(currentProject.getWorld());
|
||||
Bukkit.unloadWorld(currentProject.getWorld(), false);
|
||||
File folder = currentProject.getTarget().getFolder();
|
||||
Iris.linkMultiverseCore.removeFromConfig(currentProject.getTarget().getName());
|
||||
Bukkit.unloadWorld(currentProject.getTarget().getName(), false);
|
||||
currentProject = null;
|
||||
Iris.globaldata.dump();
|
||||
Iris.globaldata.preferFolder(null);
|
||||
|
@ -5,6 +5,7 @@ import org.bukkit.entity.Player;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||
import com.volmit.iris.util.MortarCommand;
|
||||
import com.volmit.iris.util.MortarSender;
|
||||
|
||||
@ -26,13 +27,13 @@ public class CommandIrisCTC extends MortarCommand
|
||||
Player p = sender.player();
|
||||
World world = p.getWorld();
|
||||
|
||||
if(!(world.getGenerator() instanceof IrisChunkGenerator))
|
||||
if(!(world.getGenerator() instanceof ProvisionBukkit))
|
||||
{
|
||||
sender.sendMessage("You must be in an iris world.");
|
||||
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);
|
||||
g.changeThreadCount(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.IrisSettings;
|
||||
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.util.Form;
|
||||
import com.volmit.iris.util.IO;
|
||||
@ -138,7 +142,20 @@ public class CommandIrisCreate extends MortarCommand
|
||||
}
|
||||
|
||||
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");
|
||||
O<Boolean> done = new O<Boolean>();
|
||||
@ -151,7 +168,7 @@ public class CommandIrisCreate extends MortarCommand
|
||||
while(!done.get())
|
||||
{
|
||||
boolean derp = false;
|
||||
double v = (double) gen.getGenerated() / (double) req;
|
||||
double v = (double) ((IrisChunkGenerator) gen.getProvider()).getGenerated() / (double) req;
|
||||
|
||||
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);
|
||||
sender.sendMessage(worldName + " Spawn Area generated.");
|
||||
|
||||
|
@ -6,6 +6,7 @@ import org.bukkit.entity.Player;
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.IrisMetrics;
|
||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||
import com.volmit.iris.util.C;
|
||||
import com.volmit.iris.util.Form;
|
||||
import com.volmit.iris.util.MortarCommand;
|
||||
@ -28,7 +29,13 @@ public class CommandIrisMetrics extends MortarCommand
|
||||
{
|
||||
Player p = sender.player();
|
||||
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();
|
||||
sender.sendMessage("Thread Count: " + C.BOLD + "" + C.WHITE + g.getThreads());
|
||||
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())
|
||||
{
|
||||
if(i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getCurrentProject().getWorld().getWorldFolder().getAbsolutePath()))
|
||||
if(i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getCurrentProject().getTarget().getFolder().getAbsolutePath()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -51,7 +51,7 @@ public class CommandIrisStudioClose extends MortarCommand
|
||||
|
||||
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!");
|
||||
}
|
||||
@ -59,7 +59,7 @@ public class CommandIrisStudioClose extends MortarCommand
|
||||
|
||||
else
|
||||
{
|
||||
for(Player i : Iris.proj.getCurrentProject().getWorld().getPlayers())
|
||||
for(Player i : Iris.proj.getCurrentProject().getTarget().getPlayers())
|
||||
{
|
||||
i.teleport(f.getSpawnLocation());
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import org.bukkit.entity.Player;
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.IrisSettings;
|
||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||
import com.volmit.iris.object.IrisBiome;
|
||||
import com.volmit.iris.util.MortarCommand;
|
||||
import com.volmit.iris.util.MortarSender;
|
||||
@ -30,7 +31,7 @@ public class CommandIrisStudioGoto extends MortarCommand
|
||||
sender.sendMessage("To use Iris Studio, please enable studio in Iris/settings.json");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
if(args.length < 1)
|
||||
{
|
||||
sender.sendMessage("/iris world goto " + getArgsUsage());
|
||||
@ -42,13 +43,13 @@ public class CommandIrisStudioGoto extends MortarCommand
|
||||
Player p = sender.player();
|
||||
World world = p.getWorld();
|
||||
|
||||
if(!(world.getGenerator() instanceof IrisChunkGenerator))
|
||||
if(!(world.getGenerator() instanceof ProvisionBukkit))
|
||||
{
|
||||
sender.sendMessage("You must be in an iris world.");
|
||||
return true;
|
||||
}
|
||||
|
||||
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
|
||||
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
|
||||
int tries = 10000;
|
||||
boolean cave = false;
|
||||
IrisBiome biome2 = null;
|
||||
|
@ -6,6 +6,7 @@ import org.bukkit.entity.Player;
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.IrisSettings;
|
||||
import com.volmit.iris.gen.IrisChunkGenerator;
|
||||
import com.volmit.iris.gen.provisions.ProvisionBukkit;
|
||||
import com.volmit.iris.util.MortarCommand;
|
||||
import com.volmit.iris.util.MortarSender;
|
||||
|
||||
@ -27,19 +28,18 @@ public class CommandIrisStudioHotload extends MortarCommand
|
||||
sender.sendMessage("To use Iris Studio, please enable studio in Iris/settings.json");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
if(sender.isPlayer())
|
||||
{
|
||||
Player p = sender.player();
|
||||
World world = p.getWorld();
|
||||
|
||||
if(!(world.getGenerator() instanceof IrisChunkGenerator))
|
||||
if(!(world.getGenerator() instanceof ProvisionBukkit))
|
||||
{
|
||||
sender.sendMessage("You must be in an iris world.");
|
||||
return true;
|
||||
}
|
||||
|
||||
IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
|
||||
IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
|
||||
g.onHotload();
|
||||
sender.sendMessage("Hotloaded!");
|
||||
return true;
|
||||
|
@ -1,14 +1,7 @@
|
||||
package com.volmit.iris.command;
|
||||
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
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.Form;
|
||||
import com.volmit.iris.util.MortarCommand;
|
||||
import com.volmit.iris.util.MortarSender;
|
||||
|
||||
@ -32,26 +25,7 @@ public class CommandIrisWhat extends MortarCommand
|
||||
@Override
|
||||
public boolean handle(MortarSender sender, String[] args)
|
||||
{
|
||||
if(sender.isPlayer())
|
||||
{
|
||||
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.");
|
||||
}
|
||||
|
||||
printHelp(sender);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1,13 +1,10 @@
|
||||
package com.volmit.iris.gen;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
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.ChunkUnloadEvent;
|
||||
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.IrisContext;
|
||||
@ -32,6 +27,9 @@ import com.volmit.iris.IrisDataManager;
|
||||
import com.volmit.iris.IrisMetrics;
|
||||
import com.volmit.iris.gen.atomics.AtomicCache;
|
||||
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.object.IrisBiome;
|
||||
import com.volmit.iris.object.IrisDimension;
|
||||
@ -53,7 +51,7 @@ import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
public abstract class ContextualChunkGenerator extends ChunkGenerator implements Listener
|
||||
public abstract class ContextualChunkGenerator implements TerrainProvider, Listener
|
||||
{
|
||||
private KList<BlockPosition> noLoot;
|
||||
private BlockPosition allowLoot;
|
||||
@ -69,16 +67,17 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
private ChronoLatch pushLatch;
|
||||
private AtomicCache<IrisDimension> dimCache;
|
||||
private IrisMetrics metrics;
|
||||
private World world;
|
||||
private int generated;
|
||||
private int ticks;
|
||||
private long hlast;
|
||||
private boolean fastPregen = false;
|
||||
private boolean pregenDone;
|
||||
private volatile boolean hotloadable = false;
|
||||
private final TerrainTarget target;
|
||||
|
||||
public ContextualChunkGenerator()
|
||||
public ContextualChunkGenerator(TerrainTarget target)
|
||||
{
|
||||
this.target = target;
|
||||
pushLatch = new ChronoLatch(3000);
|
||||
tickLatch = new ChronoLatch(650);
|
||||
perSecond = new ChronoLatch(1000);
|
||||
@ -97,9 +96,9 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
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);
|
||||
|
||||
@ -150,21 +149,20 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
return isDev() ? Iris.globaldata : data;
|
||||
}
|
||||
|
||||
private void init(World world, RNG rng)
|
||||
private void init(RNG rng)
|
||||
{
|
||||
if(initialized)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
this.world = world;
|
||||
setData(new IrisDataManager(getWorld().getWorldFolder()));
|
||||
setMasterRandom(new RNG(world.getSeed()));
|
||||
setData(new IrisDataManager(getTarget().getFolder()));
|
||||
setMasterRandom(new RNG(getTarget().getSeed()));
|
||||
setMetrics(new IrisMetrics(128));
|
||||
setInitialized(true);
|
||||
setTask(Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::tick, 0, 0));
|
||||
Bukkit.getServer().getPluginManager().registerEvents(this, Iris.instance);
|
||||
onInit(world, masterRandom);
|
||||
onInit(masterRandom);
|
||||
setHotloadable(true);
|
||||
}
|
||||
|
||||
@ -185,7 +183,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
setGenerated(0);
|
||||
}
|
||||
|
||||
checkHotload();
|
||||
doCheckHotload();
|
||||
|
||||
if(getNoLoot().size() > 1024)
|
||||
{
|
||||
@ -217,7 +215,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void on(BlockBreakEvent e)
|
||||
{
|
||||
if(!e.getBlock().getWorld().equals(getWorld()))
|
||||
if(!getTarget().isWorld(e.getBlock().getWorld()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -238,7 +236,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void on(BlockPlaceEvent e)
|
||||
{
|
||||
if(!e.getBlock().getWorld().equals(getWorld()))
|
||||
if(!getTarget().isWorld(e.getBlock().getWorld()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -249,7 +247,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void on(BlockDropItemEvent e)
|
||||
{
|
||||
if(!e.getBlock().getWorld().equals(getWorld()))
|
||||
if(!getTarget().isWorld(e.getBlock().getWorld()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -269,13 +267,13 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
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();
|
||||
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();
|
||||
onPlayerJoin(e.getPlayer());
|
||||
@ -285,7 +283,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void on(PlayerQuitEvent e)
|
||||
{
|
||||
if(e.getPlayer().getWorld().equals(world))
|
||||
if(getTarget().isWorld(e.getPlayer().getWorld()))
|
||||
{
|
||||
tick();
|
||||
onPlayerLeft(e.getPlayer());
|
||||
@ -295,7 +293,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void on(PlayerJoinEvent e)
|
||||
{
|
||||
if(e.getPlayer().getWorld().equals(world))
|
||||
if(getTarget().isWorld(e.getPlayer().getWorld()))
|
||||
{
|
||||
tick();
|
||||
onPlayerJoin(e.getPlayer());
|
||||
@ -305,7 +303,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void on(ChunkLoadEvent e)
|
||||
{
|
||||
if(e.getWorld().equals(world))
|
||||
if(getTarget().isWorld(e.getWorld()))
|
||||
{
|
||||
tick();
|
||||
onChunkLoaded(e.getChunk());
|
||||
@ -315,7 +313,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void on(ChunkUnloadEvent e)
|
||||
{
|
||||
if(e.getWorld().equals(world))
|
||||
if(getTarget().isWorld(e.getWorld()))
|
||||
{
|
||||
tick();
|
||||
onChunkUnloaded(e.getChunk());
|
||||
@ -325,7 +323,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void on(WorldUnloadEvent e)
|
||||
{
|
||||
if(world != null && e.getWorld().equals(world))
|
||||
if(getTarget().isWorld(e.getWorld()))
|
||||
{
|
||||
close();
|
||||
}
|
||||
@ -345,16 +343,8 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
onClose();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canSpawn(World world, int x, int z)
|
||||
protected void generateFailure(Random no, int x, int z, TerrainChunk chunk)
|
||||
{
|
||||
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 j = 0; j < 16; j++)
|
||||
@ -363,46 +353,19 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
|
||||
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
|
||||
{
|
||||
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
|
||||
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);
|
||||
if(!isDev())
|
||||
@ -413,32 +376,21 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
|
||||
if(failing)
|
||||
{
|
||||
return generateChunkDataFailure(world, no, x, z, biomeGrid);
|
||||
generateFailure(no, x, z, terrain);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
RNG random = new RNG(world.getSeed());
|
||||
init(world, random.nextParallelRNG(0));
|
||||
|
||||
ChunkData c = Bukkit.createChunkData(world);
|
||||
|
||||
if(!pregenDone && fastPregen)
|
||||
{
|
||||
c = generateChunkFastPregen(world, no, x, z, biomeGrid);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
onGenerate(random, x, z, c, biomeGrid);
|
||||
}
|
||||
|
||||
RNG random = new RNG(getTarget().getSeed());
|
||||
init(random.nextParallelRNG(0));
|
||||
onGenerate(random, x, z, terrain);
|
||||
generated++;
|
||||
long hits = CNG.hits;
|
||||
CNG.hits = 0;
|
||||
Iris.instance.hit(hits);
|
||||
setHotloadable(true);
|
||||
return c;
|
||||
return;
|
||||
}
|
||||
|
||||
catch(Throwable e)
|
||||
@ -447,36 +399,23 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
}
|
||||
|
||||
setHotloadable(true);
|
||||
return generateChunkDataFailure(world, no, x, z, biomeGrid);
|
||||
generateFailure(no, x, z, terrain);
|
||||
}
|
||||
|
||||
public void checkHotload()
|
||||
{
|
||||
if(M.ms() - getHlast() < 1000)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(getWorld() != null)
|
||||
{
|
||||
checkHotload(getWorld());
|
||||
}
|
||||
}
|
||||
|
||||
private void checkHotload(World world)
|
||||
private void doCheckHotload()
|
||||
{
|
||||
if(!isHotloadable())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(M.ms() - getHlast() < 1000)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(getPushLatch().flip())
|
||||
{
|
||||
if(getWorld() == null)
|
||||
{
|
||||
setWorld(world);
|
||||
}
|
||||
|
||||
Iris.hotloader.check((IrisContext) this);
|
||||
|
||||
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("---------------------------------------------------------------------------------------------------------");
|
||||
|
||||
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.RED + "- Check the console for the error.");
|
||||
@ -523,18 +462,6 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
|
||||
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
|
||||
public boolean isParallelCapable()
|
||||
{
|
||||
|
@ -3,11 +3,11 @@ package com.volmit.iris.gen;
|
||||
import java.io.File;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||
import com.volmit.iris.object.InferredType;
|
||||
import com.volmit.iris.object.IrisBiome;
|
||||
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 WATER = Material.WATER.createBlockData();
|
||||
|
||||
public DimensionChunkGenerator(String dimensionName)
|
||||
public DimensionChunkGenerator(TerrainTarget t, String dimensionName)
|
||||
{
|
||||
super();
|
||||
super(t);
|
||||
setDimensionName(dimensionName);
|
||||
}
|
||||
|
||||
public void onPlayerLeft(Player p)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void onTick(int m)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void onInit(World world, RNG masterRandom)
|
||||
{
|
||||
if(getDimensionName().isEmpty())
|
||||
{
|
||||
File folder = new File(world.getWorldFolder(), "iris/dimensions");
|
||||
File folder = new File(getTarget().getFolder(), "iris/dimensions");
|
||||
|
||||
if(!folder.exists())
|
||||
{
|
||||
@ -71,9 +58,32 @@ public abstract class DimensionChunkGenerator extends ContextualChunkGenerator
|
||||
fail(new RuntimeException("Missing dimension folder/file in " + folder.getAbsolutePath()));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
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()
|
||||
{
|
||||
IrisDimension d = loadDimension(getDimensionName());
|
||||
|
@ -7,7 +7,6 @@ import java.util.Random;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.block.BlockDropItemEvent;
|
||||
@ -18,6 +17,9 @@ import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.IrisContext;
|
||||
import com.volmit.iris.IrisSettings;
|
||||
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.noise.CNG;
|
||||
import com.volmit.iris.object.IrisBiome;
|
||||
@ -43,19 +45,24 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
||||
private IrisRegion hr = null;
|
||||
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()
|
||||
@ -73,26 +80,25 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
||||
}
|
||||
|
||||
@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();
|
||||
ChunkData c = super.generateChunkData(world, no, x, z, biomeGrid);
|
||||
super.generate(no, x, z, terrain);
|
||||
s.end();
|
||||
getMetrics().getTotal().put(s.getMilliseconds());
|
||||
return c;
|
||||
}
|
||||
|
||||
@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
|
||||
{
|
||||
super.onInit(world, rng);
|
||||
super.onInit(rng);
|
||||
}
|
||||
|
||||
catch(Throwable e)
|
||||
@ -124,7 +130,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
||||
{
|
||||
spawnable = true;
|
||||
super.onTick(ticks);
|
||||
for(Player i : getWorld().getPlayers())
|
||||
for(Player i : getTarget().getPlayers())
|
||||
{
|
||||
Location l = i.getLocation();
|
||||
IrisRegion r = sampleRegion(l.getBlockX(), l.getBlockZ());
|
||||
@ -160,7 +166,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
||||
}
|
||||
|
||||
setSliverCache(null);
|
||||
Iris.info("Closing Iris Dimension " + getWorld().getName());
|
||||
Iris.info("Closing Iris Dimension " + getTarget().getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -231,35 +237,6 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
||||
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()
|
||||
{
|
||||
return (x, z) -> render(x, z);
|
||||
@ -514,4 +491,36 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
|
||||
|
||||
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.util.List;
|
||||
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
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.layer.GenLayerText;
|
||||
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.IrisBiomeMutation;
|
||||
import com.volmit.iris.object.IrisObjectPlacement;
|
||||
@ -49,18 +50,18 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
|
||||
private GenLayerText glText;
|
||||
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<>());
|
||||
setSliverBuffer(sliverBuffer);
|
||||
setMasterLock(new MasterLock());
|
||||
}
|
||||
|
||||
public void onInit(World world, RNG rng)
|
||||
public void onInit(RNG rng)
|
||||
{
|
||||
super.onInit(world, rng);
|
||||
setParallaxMap(new AtomicWorldData(world));
|
||||
super.onInit(rng);
|
||||
setParallaxMap(new AtomicWorldData(getTarget()));
|
||||
setGlText(new GenLayerText(this, rng.nextParallelRNG(32485)));
|
||||
setGlUpdate(null);
|
||||
J.a(() -> getDimension().getParallaxSize(this));
|
||||
@ -156,15 +157,15 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
|
||||
|
||||
return new AtomicSliverMap();
|
||||
}
|
||||
|
||||
|
||||
@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)
|
||||
{
|
||||
setGlUpdate(new GenLayerUpdate(this, world));
|
||||
setGlUpdate(new GenLayerUpdate(this));
|
||||
}
|
||||
|
||||
g.add(getGlUpdate());
|
||||
@ -172,20 +173,20 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
|
||||
}
|
||||
|
||||
@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)
|
||||
{
|
||||
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();
|
||||
|
||||
if(getDimension().isPlaceObjects())
|
||||
{
|
||||
onGenerateParallax(random, x, z);
|
||||
getParallaxChunk(x, z).inject(data);
|
||||
getParallaxChunk(x, z).inject(terrain);
|
||||
getParallaxChunk(x, z).injectUpdates(map);
|
||||
getParallaxChunk(x, z).setWorldGenerated(true);
|
||||
}
|
||||
@ -194,7 +195,7 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
|
||||
getMasterLock().clear();
|
||||
p.end();
|
||||
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());
|
||||
getData().getObjectLoader().clean();
|
||||
}
|
||||
|
@ -1,10 +1,10 @@
|
||||
package com.volmit.iris.gen;
|
||||
|
||||
import org.bukkit.World;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.gen.atomics.AtomicSliver;
|
||||
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.GroupedExecutor;
|
||||
import com.volmit.iris.util.HeightMap;
|
||||
@ -22,9 +22,9 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
|
||||
private int threads;
|
||||
private boolean cachingAllowed;
|
||||
|
||||
public ParallelChunkGenerator(String dimensionName, int threads)
|
||||
public ParallelChunkGenerator(TerrainTarget t, String dimensionName, int threads)
|
||||
{
|
||||
super(dimensionName);
|
||||
super(t, dimensionName);
|
||||
setThreads(threads);
|
||||
setCachingAllowed(false);
|
||||
}
|
||||
@ -33,7 +33,7 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
|
||||
{
|
||||
setThreads(tc);
|
||||
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());
|
||||
|
||||
@ -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 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)
|
||||
{
|
||||
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);
|
||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||
@ -73,7 +73,7 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
|
||||
BiomeMap biomeMap = new BiomeMap();
|
||||
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++)
|
||||
{
|
||||
@ -101,10 +101,10 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
|
||||
}
|
||||
|
||||
accelerant.waitFor(key);
|
||||
map.write(data, grid, height);
|
||||
map.write(terrain, terrain, height);
|
||||
getMetrics().getTerrain().put(p.getMilliseconds());
|
||||
p = PrecisionStopwatch.start();
|
||||
onPostGenerate(random, x, z, data, grid, height, biomeMap, map);
|
||||
onPostGenerate(random, x, z, terrain, height, biomeMap, map);
|
||||
}
|
||||
|
||||
protected void onClose()
|
||||
@ -113,9 +113,9 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
|
||||
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());
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.volmit.iris.gen;
|
||||
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
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.PostWallPatcher;
|
||||
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.IPostBlockAccess;
|
||||
import com.volmit.iris.util.IrisLock;
|
||||
@ -31,22 +33,22 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
|
||||
private int minPhase;
|
||||
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);
|
||||
setPostLock(new IrisLock("PostChunkGenerator"));
|
||||
}
|
||||
|
||||
public void onInit(World world, RNG rng)
|
||||
public void onInit(RNG rng)
|
||||
{
|
||||
super.onInit(world, rng);
|
||||
super.onInit(rng);
|
||||
}
|
||||
|
||||
@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())
|
||||
{
|
||||
@ -76,7 +78,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
|
||||
{
|
||||
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;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.block.data.Bisected;
|
||||
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.GenLayerCarve;
|
||||
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.object.DecorationPart;
|
||||
import com.volmit.iris.object.InferredType;
|
||||
@ -53,17 +54,17 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
|
||||
private CNG masterFracture;
|
||||
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<>());
|
||||
setRegionLock(new IrisLock("BiomeChunkGenerator"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInit(World world, RNG rng)
|
||||
public void onInit(RNG rng)
|
||||
{
|
||||
super.onInit(world, rng);
|
||||
super.onInit(rng);
|
||||
loadGenerators();
|
||||
buildGenLayers(getMasterRandom());
|
||||
}
|
||||
@ -113,7 +114,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
|
||||
}
|
||||
|
||||
@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
|
||||
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);
|
||||
IrisRegion region = sampleRegion((x * 16) + 7, (z * 16) + 7);
|
||||
IrisBiome biome = sampleTrueBiome((x * 16) + 7, (z * 16) + 7);
|
||||
|
||||
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(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++)
|
||||
{
|
||||
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
|
||||
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 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()
|
||||
|
@ -7,10 +7,9 @@ import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
import org.bukkit.World;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.IrisSettings;
|
||||
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||
import com.volmit.iris.util.ByteArrayTag;
|
||||
import com.volmit.iris.util.CompoundTag;
|
||||
import com.volmit.iris.util.CustomOutputStream;
|
||||
@ -21,10 +20,10 @@ import com.volmit.iris.util.Tag;
|
||||
|
||||
public class AtomicRegionData
|
||||
{
|
||||
private final World world;
|
||||
private final TerrainTarget world;
|
||||
private Tag[] tag;
|
||||
|
||||
public AtomicRegionData(World world)
|
||||
public AtomicRegionData(TerrainTarget world)
|
||||
{
|
||||
this.world = world;
|
||||
tag = new Tag[1024];
|
||||
@ -148,7 +147,7 @@ public class AtomicRegionData
|
||||
return data;
|
||||
}
|
||||
|
||||
public World getWorld()
|
||||
public TerrainTarget getWorld()
|
||||
{
|
||||
return world;
|
||||
}
|
||||
|
@ -5,9 +5,8 @@ import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.bukkit.World;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.gen.scaffold.TerrainTarget;
|
||||
import com.volmit.iris.util.ChunkPosition;
|
||||
import com.volmit.iris.util.KList;
|
||||
import com.volmit.iris.util.KMap;
|
||||
@ -15,7 +14,7 @@ import com.volmit.iris.util.M;
|
||||
|
||||
public class AtomicWorldData
|
||||
{
|
||||
private World world;
|
||||
private TerrainTarget world;
|
||||
private KMap<ChunkPosition, AtomicSliverMap> loadedChunks;
|
||||
private KMap<ChunkPosition, AtomicRegionData> loadedSections;
|
||||
private KMap<ChunkPosition, Long> lastRegion;
|
||||
@ -24,7 +23,7 @@ public class AtomicWorldData
|
||||
private KList<ChunkPosition> unloadChunks;
|
||||
private long last = M.ms();
|
||||
|
||||
public AtomicWorldData(World world)
|
||||
public AtomicWorldData(TerrainTarget world)
|
||||
{
|
||||
this.world = world;
|
||||
loadedSections = new KMap<>();
|
||||
@ -254,7 +253,7 @@ public class AtomicWorldData
|
||||
|
||||
public File getSubregionFolder()
|
||||
{
|
||||
return new File(world.getWorldFolder(), "region-parallax");
|
||||
return new File(world.getFolder(), "parallax");
|
||||
}
|
||||
|
||||
public KMap<ChunkPosition, AtomicSliverMap> getLoadedChunks()
|
||||
|
@ -32,10 +32,10 @@ public class GenLayerUpdate extends BlockPopulator
|
||||
private ParallaxChunkGenerator gen;
|
||||
private RNG rng;
|
||||
|
||||
public GenLayerUpdate(ParallaxChunkGenerator gen, World w)
|
||||
public GenLayerUpdate(ParallaxChunkGenerator gen)
|
||||
{
|
||||
this.gen = gen;
|
||||
this.rng = new RNG(w.getSeed() + 4996788).nextParallelRNG(-98618289);
|
||||
this.rng = new RNG(gen.getTarget().getSeed() + 4996788).nextParallelRNG(-98618289);
|
||||
}
|
||||
|
||||
@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.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;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
package com.volmit.iris.gen.scaffold;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
|
||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||
import org.bukkit.material.MaterialData;
|
||||
|
||||
@ -16,39 +16,26 @@ public class IrisTerrainChunk implements TerrainChunk
|
||||
private final Biome[] biome2D;
|
||||
private final IrisBiomeStorage biome3D;
|
||||
private final ChunkData rawChunkData;
|
||||
private final Constructor<?> construct = buildConstruct();
|
||||
private final BiomeGrid storage;
|
||||
|
||||
public IrisTerrainChunk(int maxHeight)
|
||||
{
|
||||
rawChunkData = createChunkData(maxHeight);
|
||||
biome2D = Iris.biome3d ? null : new Biome[256];
|
||||
biome3D = Iris.biome3d ? new IrisBiomeStorage() : null;
|
||||
this(null, maxHeight);
|
||||
}
|
||||
|
||||
private Constructor<?> buildConstruct()
|
||||
public IrisTerrainChunk(BiomeGrid storage, int maxHeight)
|
||||
{
|
||||
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;
|
||||
this.storage = storage;
|
||||
rawChunkData = createChunkData(maxHeight);
|
||||
biome2D = storage != null ? null : Iris.biome3d ? null : new Biome[256];
|
||||
biome3D = storage != null ? null : Iris.biome3d ? new IrisBiomeStorage() : null;
|
||||
}
|
||||
|
||||
private ChunkData createChunkData(int maxHeight)
|
||||
{
|
||||
try
|
||||
{
|
||||
return (ChunkData) construct.newInstance(maxHeight);
|
||||
return Bukkit.createChunkData(new HeightedFakeWorld(maxHeight));
|
||||
}
|
||||
|
||||
catch(Throwable e)
|
||||
@ -62,6 +49,11 @@ public class IrisTerrainChunk implements TerrainChunk
|
||||
@Override
|
||||
public Biome getBiome(int x, int z)
|
||||
{
|
||||
if(storage != null)
|
||||
{
|
||||
return storage.getBiome(x, z);
|
||||
}
|
||||
|
||||
if(biome2D != null)
|
||||
{
|
||||
return biome2D[(z << 4) | x];
|
||||
@ -73,6 +65,11 @@ public class IrisTerrainChunk implements TerrainChunk
|
||||
@Override
|
||||
public Biome getBiome(int x, int y, int z)
|
||||
{
|
||||
if(storage != null)
|
||||
{
|
||||
return storage.getBiome(x, y, z);
|
||||
}
|
||||
|
||||
if(biome2D != null)
|
||||
{
|
||||
return biome2D[(z << 4) | x];
|
||||
@ -84,6 +81,12 @@ public class IrisTerrainChunk implements TerrainChunk
|
||||
@Override
|
||||
public void setBiome(int x, int z, Biome bio)
|
||||
{
|
||||
if(storage != null)
|
||||
{
|
||||
storage.setBiome(x, z, bio);
|
||||
return;
|
||||
}
|
||||
|
||||
if(biome2D != null)
|
||||
{
|
||||
biome2D[(z << 4) | x] = bio;
|
||||
@ -96,6 +99,12 @@ public class IrisTerrainChunk implements TerrainChunk
|
||||
@Override
|
||||
public void setBiome(int x, int y, int z, Biome bio)
|
||||
{
|
||||
if(storage != null)
|
||||
{
|
||||
storage.setBiome(x, y, z, bio);
|
||||
return;
|
||||
}
|
||||
|
||||
if(biome2D != null)
|
||||
{
|
||||
biome2D[(z << 4) | x] = bio;
|
||||
@ -177,4 +186,10 @@ public class IrisTerrainChunk implements TerrainChunk
|
||||
{
|
||||
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.block.Biome;
|
||||
@ -18,6 +18,16 @@ public interface TerrainChunk extends BiomeGrid, ChunkData
|
||||
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
|
||||
*
|
||||
@ -114,4 +124,6 @@ public interface TerrainChunk extends BiomeGrid, ChunkData
|
||||
* outside the chunk's bounds
|
||||
*/
|
||||
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.Random;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.generator.BlockPopulator;
|
||||
|
||||
public interface TerrainProvider
|
||||
@ -13,21 +11,17 @@ public interface TerrainProvider
|
||||
|
||||
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> getDefaultPopulators(World world);
|
||||
|
||||
public Location getFixedSpawnLocation(World world, Random random);
|
||||
public List<BlockPopulator> getPopulators();
|
||||
|
||||
public boolean isParallelCapable();
|
||||
|
||||
public boolean shouldGenerateMobs();
|
||||
|
||||
public boolean shouldGenerateCaves();
|
||||
|
||||
|
||||
public boolean shouldGenerateDecorations();
|
||||
|
||||
public boolean shouldGenerateMobs();
|
||||
|
||||
public boolean shouldGenerateStructures();
|
||||
public boolean shouldGenerateVanillaStructures();
|
||||
}
|
||||
|
@ -1,9 +1,13 @@
|
||||
package com.volmit.iris.gen.bindings;
|
||||
package com.volmit.iris.gen.scaffold;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.World.Environment;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.volmit.iris.util.KList;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
@ -16,6 +20,20 @@ public class TerrainTarget
|
||||
private Environment environment;
|
||||
private String name;
|
||||
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)
|
||||
{
|
||||
@ -25,7 +43,61 @@ public class TerrainTarget
|
||||
.seed(world.getSeed())
|
||||
.folder(world.getWorldFolder())
|
||||
.name(world.getName())
|
||||
.realWorld(world)
|
||||
.build();
|
||||
//@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;
|
||||
}
|
||||
}
|
||||
|
@ -81,6 +81,17 @@ public class MultiverseCoreLink
|
||||
getList().remove(world.getName());
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
public void removeFromConfig(String world)
|
||||
{
|
||||
if(!supported())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
getList().remove(world);
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
public void saveConfig()
|
||||
{
|
||||
|
@ -137,6 +137,10 @@ public class IrisDimension extends IrisRegistrant
|
||||
@DontObfuscate
|
||||
@Desc("Carve terrain or not")
|
||||
private boolean carving = true;
|
||||
|
||||
@DontObfuscate
|
||||
@Desc("Generate vanilla caves")
|
||||
private boolean vanillaCaves = false;
|
||||
|
||||
@DontObfuscate
|
||||
@Desc("Generate vanilla structures")
|
||||
|
@ -76,9 +76,9 @@ public class IrisEntitySpawn
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user